diff --git a/collada_urdf/src/urdf_to_collada.cpp b/collada_urdf/src/urdf_to_collada.cpp index 2afc41b..a79a5f4 100644 --- a/collada_urdf/src/urdf_to_collada.cpp +++ b/collada_urdf/src/urdf_to_collada.cpp @@ -104,7 +104,7 @@ public: //domLibrary_articulated_systemsRef articulatedSystemsLib_; map geometry_ids_; // link.name -> geometry.id - map joint_ids_; // joint.name -> joint.sid + map joint_sids_; // joint.name -> joint.sid public: ColladaWriter(urdf::Model* robot) : robot_(robot) { @@ -157,7 +157,7 @@ public: kinematicsScenesLib_ = daeSafeCast(dom_->createAndPlace(COLLADA_ELEMENT_LIBRARY_KINEMATICS_SCENES)); kinematicsScenesLib_->setId("kscenes"); kinematicsModelsLib_ = daeSafeCast(dom_->createAndPlace(COLLADA_ELEMENT_LIBRARY_KINEMATICS_MODELS)); - kinematicsModelsLib_->setId("kinematics_models"); + kinematicsModelsLib_->setId("kmodels"); jointsLib_ = daeSafeCast(dom_->createAndPlace(COLLADA_ELEMENT_LIBRARY_JOINTS)); jointsLib_->setId("joints"); @@ -222,11 +222,10 @@ public: SCENE scene = createScene(); setupPhysics(scene); - addScene(scene); addGeometries(); addJoints(); - addKinematics(); + addKinematics(scene); addVisuals(scene); collada_->writeAll(); @@ -245,32 +244,6 @@ public: // } - void addScene(SCENE scene) { - boost::shared_ptr urdf_root = robot_->getRoot(); - - // - domKinematics_modelRef kmodel = daeSafeCast(kinematicsModelsLib_->createAndPlace(COLLADA_ELEMENT_KINEMATICS_MODEL)); - kmodel->setId("k1"); - kmodel->setName(urdf_root->name.c_str()); - - // - domInstance_kinematics_modelRef ikm = daeSafeCast(scene.kscene->createAndPlace(COLLADA_ELEMENT_INSTANCE_KINEMATICS_MODEL)); - string model_id = kmodel->getID(); - string inst_model_sid = string("inst_") + model_id; - ikm->setUrl((string("#") + model_id).c_str()); - ikm->setSid(inst_model_sid.c_str()); - { - // - domKinematics_newparamRef newparam = daeSafeCast(ikm->createAndPlace(COLLADA_ELEMENT_NEWPARAM)); - newparam->setSid("kscene.inst_k1"); - { - // kscene/inst_k1 - daeSafeCast(newparam->createAndPlace(COLLADA_ELEMENT_SIDREF))->setValue("kscene/inst_k1"); - } - // - } - } - void addGeometries() { int link_num = 0; @@ -529,13 +502,17 @@ public: } void addJoints() { + int joint_num = 0; for (map >::const_iterator i = robot_->joints_.begin(); i != robot_->joints_.end(); i++) { boost::shared_ptr urdf_joint = i->second; // domJointRef joint = daeSafeCast(jointsLib_->createAndPlace(COLLADA_ELEMENT_JOINT)); - joint->setId(urdf_joint->name.c_str()); + string joint_sid = string("joint") + boost::lexical_cast(joint_num); + joint_num++; joint->setName(urdf_joint->name.c_str()); + joint->setSid(joint_sid.c_str()); + joint_sids_[urdf_joint->name] = joint_sid; switch (urdf_joint->type) { case urdf::Joint::REVOLUTE: { @@ -657,26 +634,80 @@ public: } } - void addKinematics() + void addKinematics(SCENE scene) { // - domKinematics_modelRef model = daeSafeCast(kinematicsModelsLib_->createAndPlace(COLLADA_ELEMENT_KINEMATICS_MODEL)); - model->setId("k1"); + domKinematics_modelRef kmodel = daeSafeCast(kinematicsModelsLib_->createAndPlace(COLLADA_ELEMENT_KINEMATICS_MODEL)); + kmodel->setId("k1"); + kmodel->setName(robot_->getName().c_str()); { // - domKinematics_model_techniqueRef technique = daeSafeCast(model->createAndPlace(COLLADA_ELEMENT_TECHNIQUE_COMMON)); - for (map >::const_iterator i = robot_->links_.begin(); i != robot_->links_.end(); i++) { - boost::shared_ptr urdf_link = i->second; + domKinematics_model_techniqueRef technique = daeSafeCast(kmodel->createAndPlace(COLLADA_ELEMENT_TECHNIQUE_COMMON)); + for (map >::const_iterator i = robot_->joints_.begin(); i != robot_->joints_.end(); i++) { + boost::shared_ptr urdf_joint = i->second; - // + // domInstance_jointRef instance_joint = daeSafeCast(technique->createAndPlace(COLLADA_ELEMENT_INSTANCE_JOINT)); - instance_joint->setUrl("#joint_1"); + string joint_id = joint_sids_[urdf_joint->name]; + string instance_joint_url = string("#") + joint_id; + instance_joint->setUrl(instance_joint_url.c_str()); + // } // + // int link_num = 0; addKinematicLink(robot_->getRoot(), technique, link_num); + // } + // + + // + domInstance_kinematics_modelRef ikm = daeSafeCast(scene.kscene->createAndPlace(COLLADA_ELEMENT_INSTANCE_KINEMATICS_MODEL)); + string model_id = kmodel->getID(); + string inst_model_sid = string("inst_") + model_id; + ikm->setUrl((string("#") + model_id).c_str()); + ikm->setSid(inst_model_sid.c_str()); + { + // + domKinematics_newparamRef newparam_model = daeSafeCast(ikm->createAndPlace(COLLADA_ELEMENT_NEWPARAM)); + string newparam_model_sid = string("kscene.inst_") + model_id; + newparam_model->setSid(newparam_model_sid.c_str()); + { + // kscene/inst_k1 + string model_sidref = string("kscene/inst_") + model_id; + daeSafeCast(newparam_model->createAndPlace(COLLADA_ELEMENT_SIDREF))->setValue(model_sidref.c_str()); + } + // + + for (map >::const_iterator i = robot_->joints_.begin(); i != robot_->joints_.end(); i++) { + boost::shared_ptr urdf_joint = i->second; + + string joint_sid = joint_sids_[urdf_joint->name]; + + // + domKinematics_newparamRef newparam = daeSafeCast(ikm->createAndPlace(COLLADA_ELEMENT_NEWPARAM)); + string newparam_sid = string("kscene.inst_") + model_id + string(".") + joint_sid + string(".axis0"); + newparam->setSid(newparam_sid.c_str()); + { + // kscene/inst_k1/joint0/axis0 + string sidref = string("kscene/inst_") + model_id + string("/") + joint_sid + string("/axis0"); + daeSafeCast(newparam->createAndPlace(COLLADA_ELEMENT_SIDREF))->setValue(sidref.c_str()); + } + // + + // + domKinematics_newparamRef newparam_value = daeSafeCast(ikm->createAndPlace(COLLADA_ELEMENT_NEWPARAM)); + string newparam_value_sid = string("kscene.inst_") + model_id + string(".") + joint_sid + string(".axis0_value"); + newparam_value->setSid(newparam_value_sid.c_str()); + { + // 0 + daeSafeCast(newparam_value->createAndPlace(COLLADA_ELEMENT_FLOAT))->setValue(0.0f); + } + // + } + } + // } void addKinematicLink(boost::shared_ptr urdf_link, daeElementRef parent, int& link_num) { @@ -733,17 +764,37 @@ public: // x y z angle domRotateRef joint_rotate = addRotate(node, urdf_link->parent_joint->parent_to_joint_origin_transform.rotation); - joint_rotate->setSid("node_joint0_axis0"); // @todo use joint_num + string joint_sid = joint_sids_[urdf_link->parent_joint->name]; + string joint_rotate_sid = string("node_") + joint_sid + string("_axis0"); + joint_rotate->setSid(joint_rotate_sid.c_str()); } // - domInstance_geometryRef instance_geometry = daeSafeCast(node->createAndPlace(COLLADA_ELEMENT_INSTANCE_GEOMETRY)); - instance_geometry->setUrl("#g1.link0.geom"); // @todo use link_num - { - // @todo - // @todo - // @todo + map::const_iterator i = geometry_ids_.find(urdf_link->name); + if (i != geometry_ids_.end()) { + domInstance_geometryRef instance_geometry = daeSafeCast(node->createAndPlace(COLLADA_ELEMENT_INSTANCE_GEOMETRY)); + string geometry_id = geometry_ids_[urdf_link->name]; + string instance_geometry_url = string("#") + geometry_id; + instance_geometry->setUrl(instance_geometry_url.c_str()); + { + // + domBind_materialRef bind_material = daeSafeCast(instance_geometry->createAndPlace(COLLADA_ELEMENT_BIND_MATERIAL)); + { + // + domBind_material::domTechnique_commonRef technique_common = daeSafeCast(bind_material->createAndPlace(COLLADA_ELEMENT_TECHNIQUE_COMMON)); + { + // + domInstance_materialRef instance_material = daeSafeCast(technique_common->createAndPlace(COLLADA_ELEMENT_INSTANCE_MATERIAL)); + instance_material->setTarget((instance_geometry_url + string(".mat")).c_str()); + instance_material->setSymbol("mat0"); + // + } + // + } + // + } } + // // for (vector >::const_iterator i = urdf_link->child_links.begin(); i != urdf_link->child_links.end(); i++)