Fix [#31544]: iTaSC assertion when creating armature with no joint. This degenerated case can be obtained by having a single bone in the IK chain and locking all 3 axis. This case was causing an assert in the KDL library. The bug is fixed by simply not creating the IK scene in this case.

This commit is contained in:
Benoit Bolsee 2012-06-04 22:29:17 +00:00
parent 0d3b19e734
commit 8db6e682e9
8 changed files with 16 additions and 10 deletions

@ -369,11 +369,13 @@ int Armature::addEndEffector(const std::string& name)
return m_neffector++;
}
void Armature::finalize()
bool Armature::finalize()
{
unsigned int i, j, c;
if (m_finalized)
return;
return true;
if (m_njoint == 0)
return false;
initialize(m_njoint, m_noutput, m_neffector);
for (i=c=0; i<m_nconstraint; i++) {
JointConstraint_struct* pConstraint = m_constraints[i];
@ -410,6 +412,7 @@ void Armature::finalize()
if (m_armlength < KDL::epsilon)
m_armlength = KDL::epsilon;
m_finalized = true;
return true;
}
void Armature::pushCache(const Timestamp& timestamp)

@ -31,7 +31,7 @@ public:
bool getSegment(const std::string& segment_name, const unsigned int q_size, const Joint* &p_joint, double &q_rest, double &q, const Frame* &p_tip);
bool getRelativeFrame(Frame& result, const std::string& segment_name, const std::string& base_name=m_root);
virtual void finalize();
virtual bool finalize();
virtual int addEndEffector(const std::string& name);
virtual const Frame& getPose(const unsigned int end_effector);

@ -53,12 +53,13 @@ int FixedObject::addEndEffector(const std::string& name)
return -1;
}
void FixedObject::finalize()
bool FixedObject::finalize()
{
if (m_finalized)
return;
return true;
initialize(0, m_nframe);
m_finalized = true;
return true;
}
const Frame& FixedObject::getPose(const unsigned int frameIndex)

@ -23,7 +23,7 @@ public:
virtual void updateCoordinates(const Timestamp& timestamp) {};
virtual int addEndEffector(const std::string& name);
virtual void finalize();
virtual bool finalize();
virtual const Frame& getPose(const unsigned int frameIndex);
virtual void updateKinematics(const Timestamp& timestamp) {};
virtual void pushCache(const Timestamp& timestamp) {};

@ -27,9 +27,10 @@ MovingFrame::~MovingFrame()
{
}
void MovingFrame::finalize()
bool MovingFrame::finalize()
{
updateJacobian();
return true;
}
void MovingFrame::initCache(Cache *_cache)

@ -28,7 +28,7 @@ public:
virtual void updateKinematics(const Timestamp& timestamp);
virtual void pushCache(const Timestamp& timestamp);
virtual void initCache(Cache *_cache);
virtual void finalize();
virtual bool finalize();
protected:
virtual void updateJacobian();

@ -33,7 +33,7 @@ public:
virtual ~Object(){};
virtual int addEndEffector(const std::string& name){return 0;};
virtual void finalize(){};
virtual bool finalize(){return true;};
virtual const KDL::Frame& getPose(const unsigned int end_effector=0){return m_internalPose;};
virtual const ObjectType getType(){return m_type;};
virtual const unsigned int getNrOfCoordinates(){return 0;};

@ -91,7 +91,8 @@ bool Scene::setParam(SceneParam paramId, double value)
bool Scene::addObject(const std::string& name, Object* object, UncontrolledObject* base, const std::string& baseFrame)
{
// finalize the object before adding
object->finalize();
if (!object->finalize())
return false;
//Check if Object is controlled or uncontrolled.
if(object->getType()==Object::Controlled){
int baseFrameIndex = base->addEndEffector(baseFrame);