opensurgsim
Classes | Public Member Functions | Protected Member Functions | Protected Attributes | List of all members
SurgSim::Blocks::KnotIdentificationBehavior Class Reference

The KnotIdentificationBehavior detects and identifies a knot in a fem1d representation. More...

#include <KnotIdentificationBehavior.h>

Inheritance diagram for SurgSim::Blocks::KnotIdentificationBehavior:
SurgSim::Framework::Behavior SurgSim::Framework::Component SurgSim::Framework::Accessible SurgSim::Framework::FactoryBase1< Component, std::string > SurgSim::Blocks::MockKnotIdentificationBehavior

Classes

struct  Crossing
 struct to store a Crossing. More...
 
struct  ReidmeisterMove3Data
 struct with variables for tracking Reidmeister move 3. More...
 

Public Member Functions

 KnotIdentificationBehavior (const std::string &name)
 
void setFem1d (const std::shared_ptr< SurgSim::Framework::Component > &fem1d)
 
const std::shared_ptr< SurgSim::Physics::Fem1DRepresentation > & getFem1d () const
 
const std::string & getKnotName ()
 
void update (double dt) override
 Update the behavior. More...
 
int getTargetManagerType () const override
 Specifies which manger will handle this behavior.
 
bool doInitialize () override
 Interface to be implemented by derived classes. More...
 
bool doWakeUp () override
 Interface to be implemented by derived classes. More...
 
void addKnownKnotCode (const std::string &name, const std::vector< int > &code, const std::vector< int > &signs)
 Function to add a known knot code to the list. More...
 
void clearKnownKnotCodes ()
 Function to clear the known knot code list.
 
- Public Member Functions inherited from SurgSim::Framework::Behavior
 Behavior (const std::string &name)
 
- Public Member Functions inherited from SurgSim::Framework::Component
 Component (const std::string &name)
 Constructor. More...
 
virtual ~Component ()
 Destructor.
 
std::string getName () const
 Gets component name. More...
 
std::string getFullName () const
 Gets a string containing the name of the Component and (if it has one) its SceneElement. More...
 
void setName (const std::string &name)
 Sets the name of component. More...
 
boost::uuids::uuid getUuid () const
 Gets the id of the component.
 
bool isInitialized () const
 
bool initialize (const std::weak_ptr< Runtime > &runtime)
 Initialize this component, this needs to be called before wakeUp() can be called. More...
 
bool isAwake () const
 
bool wakeUp ()
 Wakeup this component, this will be called when the component is inserted into the ComponentManager that is responsible for handling this component. More...
 
void retire ()
 Retire this component, this will be called when the component is removed from the ComponentManager that is responsible for handling this component. More...
 
void setScene (std::weak_ptr< Scene > scene)
 Sets the scene. More...
 
std::shared_ptr< ScenegetScene ()
 Gets the scene. More...
 
void setSceneElement (std::weak_ptr< SceneElement > sceneElement)
 Sets the scene element. More...
 
std::shared_ptr< SceneElementgetSceneElement ()
 Gets the scene element. More...
 
std::shared_ptr< const SceneElementgetSceneElement () const
 Gets the scene element, constant version. More...
 
std::shared_ptr< RuntimegetRuntime () const
 Get the runtime which contains this component. More...
 
virtual std::string getClassName () const
 The class name for this class, this being the base class it should return SurgSim::Framework::Component but this would make missing implemenentations of this hard to catch, therefore this calls SURGSIM_FAILURE. More...
 
std::shared_ptr< ComponentgetSharedPtr ()
 Gets a shared pointer to this component. More...
 
virtual void doRetire ()
 Interface to be implemented by derived classes Has a default implementation, does nothing.
 
bool isActive () const
 
virtual void setLocalActive (bool val)
 Set the component's active state. More...
 
bool isLocalActive () const
 
- Public Member Functions inherited from SurgSim::Framework::Accessible
 Accessible ()
 Default Constructor.
 
 ~Accessible ()
 Destructor.
 
template<class T >
getValue (const std::string &name) const
 Retrieves the value with the name by executing the getter if it is found and tries to convert it to the given type. More...
 
boost::any getValue (const std::string &name) const
 Retrieves the value with the name by executing the getter if it is found. More...
 
template<class T >
bool getValue (const std::string &name, T *value) const
 Retrieves the value with the name by executing the getter if it is found, and converts it to the type of the output parameter. More...
 
void setValue (const std::string &name, const boost::any &value)
 Sets a value of a property that has setter. More...
 
bool isReadable (const std::string &name) const
 Check whether a property is readable. More...
 
bool isWriteable (const std::string &name) const
 Check whether a property is writable. More...
 
void setGetter (const std::string &name, GetterType func)
 Sets a getter for a given property. More...
 
void setSetter (const std::string &name, SetterType func)
 Sets a setter for a given property. More...
 
void setAccessors (const std::string &name, GetterType getter, SetterType setter)
 Sets the accessors getter and setter in one function. More...
 
void removeAccessors (const std::string &name)
 Removes all the accessors (getter and setter) for a given property. More...
 
void forwardProperty (const std::string &name, const Accessible &target, const std::string &targetProperty)
 Adds a property with the given name that uses the targets accessors, in effect forwarding the value to the target. More...
 
void setSerializable (const std::string &name, EncoderType encoder, DecoderType decoder)
 Sets the functions used to convert data from and to a YAML::Node. More...
 
void setDecoder (const std::string &name, DecoderType decoder)
 Sets the functions used to convert data from a YAML::Node. More...
 
YAML::Node encode () const
 Encode this Accessible to a YAML::Node. More...
 
void decode (const YAML::Node &node, const std::vector< std::string > &ignoredProperties=std::vector< std::string >())
 Decode this Accessible from a YAML::Node, will throw an exception if the data type cannot be converted. More...
 
std::vector< std::string > getProperties ()
 
template<>
boost::any getValue (const std::string &name) const
 

Protected Member Functions

std::string detectAndIdentifyKnot (const SurgSim::Math::Matrix33d &projection)
 
std::vector< CrossinggetGaussCode (const SurgSim::Math::Matrix33d &projection)
 
void buildNodeData (const Math::Vector3d &projectionX, const Math::Vector3d &projectionY, std::vector< SurgSim::Math::Vector3d > *nodes3d, std::vector< SurgSim::Math::Vector2d > *nodes2d, std::vector< SurgSim::Math::Vector3d > *segments3d)
 Build the node data needed to setup the knot identification. More...
 
std::vector< CrossingcalculateCrossings (const Math::Vector3d &projectionZ, const std::vector< SurgSim::Math::Vector3d > &nodes3d, const std::vector< SurgSim::Math::Vector2d > &nodes2d, const std::vector< SurgSim::Math::Vector3d > &segments3d)
 Calculate the crossings from the node data. More...
 
void performReidmeisterMoves (std::vector< Crossing > *gaussCode)
 Perform Reidmeister moves. More...
 
bool tryReidmeisterMove1 (std::vector< Crossing > *gaussCode, std::vector< int > *erased)
 Perform Reidmeister move 1. More...
 
bool tryReidmeisterMove2 (std::vector< Crossing > *gaussCode, std::vector< int > *erased)
 Perform Reidmeister move 2. More...
 
bool tryReidmeisterMove3 (std::vector< Crossing > *gaussCode, ReidmeisterMove3Data *data)
 Perform Reidmeister move 3. More...
 
void adjustGaussCodeForErasedCrossings (std::vector< Crossing > *gaussCode)
 Squeezes together the ids so that their absolute values are 1, 2, 3, etc. More...
 
std::string identifyKnot (const std::vector< Crossing > &gaussCode)
 Identify the knot. More...
 
- Protected Member Functions inherited from SurgSim::Framework::Component
virtual std::shared_ptr< PoseComponentgetPoseComponent ()
 Get the PoseComponent for this component. More...
 
virtual std::shared_ptr< const PoseComponentgetPoseComponent () const
 Get the PoseComponent for this component, constant access. More...
 

Protected Attributes

std::map< std::string, std::vector< std::vector< Crossing > > > m_knownLists
 Known knots, mapping the name to a vector of extended gauss codes.
 
std::shared_ptr< SurgSim::Physics::Fem1DRepresentationm_fem1d
 The fem1d within which the knot is checked for.
 
std::vector< SurgSim::Math::Matrix33dm_projections
 The list of projection matrices to try.
 
boost::mutex m_mutex
 Mutex for the knot name.
 
std::string m_knotName
 The name of the knot that was detected.
 

Additional Inherited Members

- Public Types inherited from SurgSim::Framework::Accessible
typedef std::function< boost::any(void)> GetterType
 
typedef std::function< void(boost::any)> SetterType
 
typedef std::function< YAML::Node(void)> EncoderType
 
typedef std::function< void(const YAML::Node *)> DecoderType
 
- Public Types inherited from SurgSim::Framework::FactoryBase1< Component, std::string >
typedef ObjectFactory1< Component, std::string > FactoryType
 
- Static Public Member Functions inherited from SurgSim::Framework::FactoryBase1< Component, std::string >
static FactoryTypegetFactory ()
 

Detailed Description

The KnotIdentificationBehavior detects and identifies a knot in a fem1d representation.

https://en.wikipedia.org/wiki/Reidemeister_move explains the idea of Reidmeister moves. The document below gives an overview of the algorithm used to detect the knot. https://docs.google.com/document/d/1a8hCCvtFuOapYsj81enORBiN9pcoCS7HIDioquto6LA This behavior may incorrectly identify knots, or fail to identify knots. This code does not correctly handle when three segments projected into 2D all cross at one point, and may fail when fem1d segments projected into 2D are degenerate. It will always fail to identify knots with extra loops or crossings.

Constructor & Destructor Documentation

§ KnotIdentificationBehavior()

SurgSim::Blocks::KnotIdentificationBehavior::KnotIdentificationBehavior ( const std::string &  name)
explicit
Parameters
nameThe name of this behavior

Member Function Documentation

§ addKnownKnotCode()

void SurgSim::Blocks::KnotIdentificationBehavior::addKnownKnotCode ( const std::string &  name,
const std::vector< int > &  code,
const std::vector< int > &  signs 
)

Function to add a known knot code to the list.

Parameters
nameThe name of the knot
codeThe gauss code of the knot
signsThe crossing signs of the knot. Orient the knot so that the crossing is in 2D and the under-crossing is traveling upwards. The crossing sign is +1 if the over-crossing is traveling left-to-right, otherwise -1.

§ adjustGaussCodeForErasedCrossings()

void SurgSim::Blocks::KnotIdentificationBehavior::adjustGaussCodeForErasedCrossings ( std::vector< Crossing > *  gaussCode)
protected

Squeezes together the ids so that their absolute values are 1, 2, 3, etc.

without gaps.

Parameters
[in,out]gaussCodeThe gauss code of the knot projection diagram.

§ buildNodeData()

void SurgSim::Blocks::KnotIdentificationBehavior::buildNodeData ( const Math::Vector3d projectionX,
const Math::Vector3d projectionY,
std::vector< SurgSim::Math::Vector3d > *  nodes3d,
std::vector< SurgSim::Math::Vector2d > *  nodes2d,
std::vector< SurgSim::Math::Vector3d > *  segments3d 
)
protected

Build the node data needed to setup the knot identification.

Parameters
projectionXThe x-axis of the projection matrix.
projectionYThe y-axis of the projection matrix.
nodes3d[out] The 3d positions of the nodes.
nodes2d[out] The 2d (projected) positions of the nodes.
segments3d[out] The 3d segments between the nodes.

§ calculateCrossings()

std::vector< KnotIdentificationBehavior::Crossing > SurgSim::Blocks::KnotIdentificationBehavior::calculateCrossings ( const Math::Vector3d projectionZ,
const std::vector< SurgSim::Math::Vector3d > &  nodes3d,
const std::vector< SurgSim::Math::Vector2d > &  nodes2d,
const std::vector< SurgSim::Math::Vector3d > &  segments3d 
)
protected

Calculate the crossings from the node data.

Parameters
projectionZThe z-axis of the projection matrix.
nodes3dThe 3d positions of the nodes.
nodes2dThe 2d (projected) positions of the nodes.
segments3dThe 3d segments between the nodes.
Returns
The crossings in the fem1d projection.

§ detectAndIdentifyKnot()

std::string SurgSim::Blocks::KnotIdentificationBehavior::detectAndIdentifyKnot ( const SurgSim::Math::Matrix33d projection)
protected
Parameters
projectionThe projection matrix to be used.
Returns
The name of the knot, "No Knot", or "Unknown Knot".

§ doInitialize()

bool SurgSim::Blocks::KnotIdentificationBehavior::doInitialize ( )
overridevirtual

Interface to be implemented by derived classes.

Returns
True if component is initialized successfully; otherwise, false.

Implements SurgSim::Framework::Component.

§ doWakeUp()

bool SurgSim::Blocks::KnotIdentificationBehavior::doWakeUp ( )
overridevirtual

Interface to be implemented by derived classes.

Returns
True if component is woken up successfully; otherwise, false.

Implements SurgSim::Framework::Component.

§ getFem1d()

const std::shared_ptr< Physics::Fem1DRepresentation > & SurgSim::Blocks::KnotIdentificationBehavior::getFem1d ( ) const
Returns
The fem1d within which the knot is checked for.

§ getGaussCode()

std::vector< KnotIdentificationBehavior::Crossing > SurgSim::Blocks::KnotIdentificationBehavior::getGaussCode ( const SurgSim::Math::Matrix33d projection)
protected
Parameters
projectionThe projection matrix to be used.
Returns
The gauss code of the knot projection diagram.

§ getKnotName()

const std::string & SurgSim::Blocks::KnotIdentificationBehavior::getKnotName ( )
Returns
The knot name.

§ identifyKnot()

std::string SurgSim::Blocks::KnotIdentificationBehavior::identifyKnot ( const std::vector< Crossing > &  gaussCode)
protected

Identify the knot.

Parameters
[in,out]gaussCodeThe reduced gauss code of the knot projection diagram.
Returns
The name of the knot, "No Knot", or "Unknown Knot".

§ performReidmeisterMoves()

void SurgSim::Blocks::KnotIdentificationBehavior::performReidmeisterMoves ( std::vector< Crossing > *  gaussCode)
protected

Perform Reidmeister moves.

Parameters
[in,out]gaussCodeThe gauss code of the knot projection diagram.

§ setFem1d()

void SurgSim::Blocks::KnotIdentificationBehavior::setFem1d ( const std::shared_ptr< SurgSim::Framework::Component > &  fem1d)
Parameters
fem1dThe fem1d within which the knot is checked for.

§ tryReidmeisterMove1()

bool SurgSim::Blocks::KnotIdentificationBehavior::tryReidmeisterMove1 ( std::vector< Crossing > *  gaussCode,
std::vector< int > *  erased 
)
protected

Perform Reidmeister move 1.

Parameters
[in,out]gaussCodeThe gauss code of the knot projection diagram.
erasedThe crossings that were erased during this move
Returns
True, if a move was done.

§ tryReidmeisterMove2()

bool SurgSim::Blocks::KnotIdentificationBehavior::tryReidmeisterMove2 ( std::vector< Crossing > *  gaussCode,
std::vector< int > *  erased 
)
protected

Perform Reidmeister move 2.

Parameters
[in,out]gaussCodeThe gauss code of the knot projection diagram.
erasedThe crossings that were erased during this move
Returns
True, if a move was done.

§ tryReidmeisterMove3()

bool SurgSim::Blocks::KnotIdentificationBehavior::tryReidmeisterMove3 ( std::vector< Crossing > *  gaussCode,
ReidmeisterMove3Data data 
)
protected

Perform Reidmeister move 3.

Parameters
[in,out]gaussCodeThe gauss code of the knot projection diagram.
data[in,out] The tracking data for this move.
Returns
True, if a move was done.

§ update()

void SurgSim::Blocks::KnotIdentificationBehavior::update ( double  dt)
overridevirtual

Update the behavior.

Parameters
dtThe length of time (seconds) between update calls.

Implements SurgSim::Framework::Behavior.


The documentation for this class was generated from the following files: