@@ -38,11 +38,12 @@ Structure::Structure(const std::string &name, const ScenePtr &scene) : Structure
3838
3939 dart::dynamics::FreeJoint::Properties joint;
4040 joint.mName = object;
41- joint.mT_ParentBodyToJoint = pose ;
41+ joint.mT_ParentBodyToJoint = robowflex::TF::identity () ;
4242
4343 auto shape = makeGeometry (geometry);
4444
4545 auto pair = addFreeFrame (joint, shape);
46+ setJointParentTransform (object, pose);
4647 setColor (pair.second , dart::Color::Blue (0.2 ));
4748 }
4849
@@ -117,6 +118,10 @@ void Structure::createShapeNode(dart::dynamics::BodyNode *body, const dart::dyna
117118 double mass = magic::DEFAULT_DENSITY * shape->getVolume ();
118119 inertia.setMass (mass);
119120 inertia.setMoment (shape->computeInertia (mass));
121+
122+ if (not inertia.verify (false ))
123+ inertia = dart::dynamics::Inertia ();
124+
120125 body->setInertia (inertia);
121126 body->setRestitutionCoeff (magic::DEFAULT_RESTITUTION);
122127
@@ -233,16 +238,11 @@ dart::dynamics::BodyNode *Structure::getFrame(const std::string &name) const
233238 return skeleton_->getBodyNode (name);
234239}
235240
236- dart::dynamics::BodyNode *Structure::getRootFrame () const
237- {
238- return skeleton_->getRootBodyNode ();
239- }
240-
241241void Structure::reparentFreeFrame (dart::dynamics::BodyNode *child, const std::string &parent)
242242{
243243 auto frame = getFrame (parent);
244244
245- Eigen::Isometry3d tf;
245+ RobotPose tf;
246246 if (frame)
247247 tf = child->getTransform (frame);
248248 else
@@ -253,6 +253,37 @@ void Structure::reparentFreeFrame(dart::dynamics::BodyNode *child, const std::st
253253 jt->setRelativeTransform (tf);
254254}
255255
256+ void Structure::setJointParentTransform (const std::string &name, const RobotPose &tf)
257+ {
258+ auto joint = skeleton_->getJoint (name);
259+ joint->setTransformFromParentBodyNode (tf);
260+ }
261+
262+ void Structure::updateCollisionObject (const std::string &name, const GeometryPtr &geometry,
263+ const robowflex::RobotPose &pose)
264+ {
265+ auto nodes = skeleton_->getBodyNodes (name); // Get all nodes with this name
266+ if (nodes.size () != 0 )
267+ setJointParentTransform (name, pose);
268+ else
269+ {
270+ dart::dynamics::FreeJoint::Properties joint;
271+ joint.mName = name;
272+ joint.mT_ParentBodyToJoint = robowflex::TF::identity ();
273+
274+ auto shape = makeGeometry (geometry);
275+
276+ auto pair = addFreeFrame (joint, shape);
277+ setJointParentTransform (name, pose);
278+ setColor (pair.second , dart::Color::Blue (0.2 ));
279+ }
280+ }
281+
282+ dart::dynamics::BodyNode *Structure::getRootFrame () const
283+ {
284+ return skeleton_->getRootBodyNode ();
285+ }
286+
256287dart::dynamics::ShapePtr robowflex::darts::makeGeometry (const GeometryPtr &geometry)
257288{
258289 const auto &dimensions = geometry->getDimensions ();
@@ -297,16 +328,27 @@ std::shared_ptr<dart::dynamics::SphereShape> robowflex::darts::makeSphere(double
297328
298329std::shared_ptr<dart::dynamics::MeshShape> robowflex::darts::makeMesh (const GeometryPtr &geometry)
299330{
300- static Assimp::Importer importer_;
331+ auto uri = geometry->getResource ();
332+ if (uri.empty ())
333+ {
334+ static Assimp::Importer importer_;
301335
302- auto shape = std::dynamic_pointer_cast<shapes::Mesh>(geometry->getShape ());
303- std::vector<char > buffer;
304- shapes::writeSTLBinary (shape.get (), buffer);
336+ auto shape = std::dynamic_pointer_cast<shapes::Mesh>(geometry->getShape ());
337+ std::vector<char > buffer;
338+ shapes::writeSTLBinary (shape.get (), buffer);
305339
306- auto aiscene = importer_.ReadFileFromMemory (buffer.data (), buffer.size (),
307- aiProcessPreset_TargetRealtime_MaxQuality, " STOL" );
340+ auto aiscene = importer_.ReadFileFromMemory (buffer.data (), buffer.size (),
341+ aiProcessPreset_TargetRealtime_MaxQuality, " STOL" );
308342
309- return std::make_shared<dart::dynamics::MeshShape>(geometry->getDimensions (), aiscene);
343+ auto mesh = std::make_shared<dart::dynamics::MeshShape>(geometry->getDimensions (), aiscene);
344+ return mesh;
345+ }
346+ else
347+ {
348+ auto aiscene = dart::dynamics::MeshShape::loadMesh (uri);
349+ auto mesh = std::make_shared<dart::dynamics::MeshShape>(geometry->getDimensions (), aiscene);
350+ return mesh;
351+ }
310352}
311353
312354std::shared_ptr<dart::dynamics::MeshShape> robowflex::darts::makeArcsegment (double low, double high,
0 commit comments