diff --git a/collada_urdf/src/urdf_to_collada.cpp b/collada_urdf/src/urdf_to_collada.cpp index 4011542..0c34424 100644 --- a/collada_urdf/src/urdf_to_collada.cpp +++ b/collada_urdf/src/urdf_to_collada.cpp @@ -36,6 +36,11 @@ // urdf_to_collada.cpp +/* +Issues: + - triangles material hard-coded to "mat0" +*/ + #include #include #include @@ -147,22 +152,21 @@ public: geometriesLib_ = daeSafeCast(dom_->createAndPlace(COLLADA_ELEMENT_LIBRARY_GEOMETRIES)); geometriesLib_->setId("geometries"); kinematicsScenesLib_ = daeSafeCast(dom_->createAndPlace(COLLADA_ELEMENT_LIBRARY_KINEMATICS_SCENES)); - kinematicsScenesLib_->setId("kinematics_scenes"); + kinematicsScenesLib_->setId("kscenes"); kinematicsModelsLib_ = daeSafeCast(dom_->createAndPlace(COLLADA_ELEMENT_LIBRARY_KINEMATICS_MODELS)); kinematicsModelsLib_->setId("kinematics_models"); jointsLib_ = daeSafeCast(dom_->createAndPlace(COLLADA_ELEMENT_LIBRARY_JOINTS)); jointsLib_->setId("joints"); - /* + physicsScenesLib_ = daeSafeCast(dom_->createAndPlace(COLLADA_ELEMENT_LIBRARY_PHYSICS_SCENES)); + physicsScenesLib_->setId("physics_scenes"); effectsLib_ = daeSafeCast(dom_->createAndPlace(COLLADA_ELEMENT_LIBRARY_EFFECTS)); effectsLib_->setId("effects"); materialsLib_ = daeSafeCast(dom_->createAndPlace(COLLADA_ELEMENT_LIBRARY_MATERIALS)); materialsLib_->setId("materials"); - articulatedSystemsLib_ = daeSafeCast(dom_->createAndPlace(COLLADA_ELEMENT_LIBRARY_ARTICULATED_SYSTEMS)); - articulatedSystemsLib_->setId("articulated_systems"); - physicsScenesLib_->setId("physics_scenes"); - physicsScenesLib_ = daeSafeCast(dom_->createAndPlace(COLLADA_ELEMENT_LIBRARY_PHYSICS_SCENES)); - */ + + //articulatedSystemsLib_ = daeSafeCast(dom_->createAndPlace(COLLADA_ELEMENT_LIBRARY_ARTICULATED_SYSTEMS)); + //articulatedSystemsLib_->setId("articulated_systems"); } virtual ~ColladaWriter() { @@ -184,23 +188,22 @@ public: // Create kinematics scene s.kscene = daeSafeCast(kinematicsScenesLib_->createAndPlace(COLLADA_ELEMENT_KINEMATICS_SCENE)); - s.kscene->setId("kinematics_scene"); + s.kscene->setId("kscene"); s.kscene->setName("URDF Kinematics Scene"); // Create instance kinematics scene s.kiscene = daeSafeCast(scene_->createAndPlace(COLLADA_ELEMENT_INSTANCE_KINEMATICS_SCENE)); s.kiscene->setUrl((string("#") + string(s.kscene->getID())).c_str()); - /* // Create physics scene s.pscene = daeSafeCast(physicsScenesLib_->createAndPlace(COLLADA_ELEMENT_PHYSICS_SCENE)); - s.pscene->setId("physics_scene"); + s.pscene->setId("pscene"); s.pscene->setName("URDF Physics Scene"); // Create instance physics scene s.piscene = daeSafeCast(scene_->createAndPlace(COLLADA_ELEMENT_INSTANCE_PHYSICS_SCENE)); s.piscene->setUrl((string("#") + string(s.pscene->getID())).c_str()); - */ + return s; } @@ -215,23 +218,71 @@ public: bool writeScene() { SCENE scene = createScene(); - /* - domPhysics_scene::domTechnique_commonRef common = daeSafeCast(scene.pscene->createAndPlace(COLLADA_ELEMENT_TECHNIQUE_COMMON)); - - // Create gravity - domTargetable_float3Ref g = daeSafeCast(common->createAndPlace(COLLADA_ELEMENT_GRAVITY)); - g->getValue().set3(0.0, 0.0, 1.0); - */ + setupPhysics(scene); + addScene(scene); + addGeometries(); addJoints(); addKinematics(); - addGeometries(); collada_->writeAll(); return true; } + void setupPhysics(SCENE scene) { + // + domPhysics_scene::domTechnique_commonRef common = daeSafeCast(scene.pscene->createAndPlace(COLLADA_ELEMENT_TECHNIQUE_COMMON)); + { + // 0 0 0 + domTargetable_float3Ref g = daeSafeCast(common->createAndPlace(COLLADA_ELEMENT_GRAVITY)); + g->getValue().set3(0.0, 0.0, 0.0); + } + // + } + + void addScene(SCENE scene) { + boost::shared_ptr urdf_root = robot_->getRoot(); + + // + domNodeRef root_node = daeSafeCast(scene.vscene->createAndPlace(COLLADA_ELEMENT_NODE)); + root_node->setId("v1"); + root_node->setName(urdf_root->name.c_str()); + + // + 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"); + } + // + } + + /* + for (map >::const_iterator i = robot_->links_.begin(); i != robot_->links_.end(); i++) { + boost::shared_ptr urdf_link = i->second; + + // + domNodeRef link_node = daeSafeCast(scene.vscene->createAndPlace(COLLADA_ELEMENT_NODE)); + root_node->setId("v1"); + root_node->setName(urdf_root->name.c_str()); + } + */ + } + void addGeometries() { int link_num = 0; @@ -430,7 +481,7 @@ public: for (unsigned int j = 0; j < aMesh->mNumFaces; j++) { aiFace* aFace = &(aMesh->mFaces[j]); for (unsigned int k = 0; k < aFace->mNumIndices; k++) { - int index = aFace->mIndices[k]; + //int index = aFace->mIndices[k]; // @todo add index //subMesh->AddIndex(aFace->mIndices[k]); } @@ -589,52 +640,55 @@ public: void addKinematics() { - // Create kinematics model + // domKinematics_modelRef model = daeSafeCast(kinematicsModelsLib_->createAndPlace(COLLADA_ELEMENT_KINEMATICS_MODEL)); - model->setId("kinematics_model"); + model->setId("k1"); + { + // + 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; + + // + domInstance_jointRef instance_joint = daeSafeCast(technique->createAndPlace(COLLADA_ELEMENT_INSTANCE_JOINT)); + instance_joint->setUrl("#joint_1"); + } + // - // Create kinematics model technique common - domKinematics_model_techniqueRef technique = daeSafeCast(model->createAndPlace(COLLADA_ELEMENT_TECHNIQUE_COMMON)); - - // Create the instance_joints - for (map >::const_iterator i = robot_->links_.begin(); i != robot_->links_.end(); i++) { - boost::shared_ptr urdf_link = i->second; - - domInstance_jointRef instance_joint = daeSafeCast(technique->createAndPlace(COLLADA_ELEMENT_INSTANCE_JOINT)); - instance_joint->setUrl("#joint_1"); + addLink(robot_->getRoot(), technique); } - - addLink(technique, robot_->getRoot()); } - void addLink(daeElementRef parent, boost::shared_ptr urdf_link) { - // Create link + void addLink(boost::shared_ptr urdf_link, daeElementRef parent) { + // domLinkRef link = daeSafeCast(parent->createAndPlace(COLLADA_ELEMENT_LINK)); link->setName(urdf_link->name.c_str()); - + // @todo link->setSid for (vector >::const_iterator i = urdf_link->child_joints.begin(); i != urdf_link->child_joints.end(); i++) { boost::shared_ptr urdf_joint = *i; - // Create attachment full + // domLink::domAttachment_fullRef attachment_full = daeSafeCast(link->createAndPlace(COLLADA_TYPE_ATTACHMENT_FULL)); attachment_full->setJoint(urdf_joint->name.c_str()); - - // Create translation, rotation - addTransformation(attachment_full, urdf_joint->parent_to_joint_origin_transform); - - // Create child links - addLink(attachment_full, robot_->getLink(urdf_joint->child_link_name)); + { + addTransformation(attachment_full, urdf_joint->parent_to_joint_origin_transform); + addLink(robot_->getLink(urdf_joint->child_link_name), attachment_full); + } + // } + // } void addTransformation(daeElementRef parent, const urdf::Pose& pose) { + // x y z domTranslateRef trans = daeSafeCast(parent->createAndPlace(COLLADA_ELEMENT_TRANSLATE)); trans->getValue().setCount(3); trans->getValue()[0] = pose.position.x; trans->getValue()[1] = pose.position.y; trans->getValue()[2] = pose.position.z; + // x y z w domRotateRef rot = daeSafeCast(parent->createAndPlace(COLLADA_ELEMENT_ROTATE)); rot->getValue().setCount(4); rot->getValue()[0] = pose.rotation.x;