From 01196304b675a12a373e073b761cc2cd574740de Mon Sep 17 00:00:00 2001 From: tfield Date: Mon, 17 May 2010 04:52:20 +0000 Subject: [PATCH] collada_urdf: trimming collada by not writing null transforms; shifted away from deprecated createAndPlace API; added option to add transform before an existing element --- .../include/collada_urdf/collada_writer.h | 4 +- collada_urdf/src/collada_writer.cpp | 232 ++++++++++-------- 2 files changed, 126 insertions(+), 110 deletions(-) diff --git a/collada_urdf/include/collada_urdf/collada_writer.h b/collada_urdf/include/collada_urdf/collada_writer.h index 6aada98..0c137df 100644 --- a/collada_urdf/include/collada_urdf/collada_writer.h +++ b/collada_urdf/include/collada_urdf/collada_writer.h @@ -110,8 +110,8 @@ private: void addBindings(SCENE const& scene); - domTranslateRef addTranslate(daeElementRef parent, urdf::Vector3 const& position); - domRotateRef addRotate(daeElementRef parent, urdf::Rotation const& r); + domTranslateRef addTranslate(daeElementRef parent, urdf::Vector3 const& position, daeElementRef before = NULL, bool ignore_zero_translations = false); + domRotateRef addRotate(daeElementRef parent, urdf::Rotation const& r, daeElementRef before = NULL, bool ignore_zero_rotations = false); std::string getTimeStampString() const; diff --git a/collada_urdf/src/collada_writer.cpp b/collada_urdf/src/collada_writer.cpp index 72c2013..9b8aa1f 100644 --- a/collada_urdf/src/collada_writer.cpp +++ b/collada_urdf/src/collada_writer.cpp @@ -106,45 +106,45 @@ void ColladaWriter::initDocument(string const& documentName) { dom_->setAttribute("xmlns:math", "http://www.w3.org/1998/Math/MathML"); // Create asset elements - domAssetRef asset = daeSafeCast(dom_->createAndPlace(COLLADA_ELEMENT_ASSET)); + domAssetRef asset = daeSafeCast(dom_->add(COLLADA_ELEMENT_ASSET)); { string date = getTimeStampString(); - domAsset::domCreatedRef created = daeSafeCast(asset->createAndPlace(COLLADA_ELEMENT_CREATED)); + domAsset::domCreatedRef created = daeSafeCast(asset->add(COLLADA_ELEMENT_CREATED)); created->setValue(date.c_str()); - domAsset::domModifiedRef modified = daeSafeCast(asset->createAndPlace(COLLADA_ELEMENT_MODIFIED)); + domAsset::domModifiedRef modified = daeSafeCast(asset->add(COLLADA_ELEMENT_MODIFIED)); modified->setValue(date.c_str()); - domAsset::domContributorRef contrib = daeSafeCast(asset->createAndPlace(COLLADA_TYPE_CONTRIBUTOR)); + domAsset::domContributorRef contrib = daeSafeCast(asset->add(COLLADA_ELEMENT_CONTRIBUTOR)); - domAsset::domContributor::domAuthoring_toolRef authoringtool = daeSafeCast(contrib->createAndPlace(COLLADA_ELEMENT_AUTHORING_TOOL)); + domAsset::domContributor::domAuthoring_toolRef authoringtool = daeSafeCast(contrib->add(COLLADA_ELEMENT_AUTHORING_TOOL)); authoringtool->setValue("URDF Collada Writer"); - domAsset::domUnitRef units = daeSafeCast(asset->createAndPlace(COLLADA_ELEMENT_UNIT)); + domAsset::domUnitRef units = daeSafeCast(asset->add(COLLADA_ELEMENT_UNIT)); units->setMeter(1); units->setName("meter"); - domAsset::domUp_axisRef zup = daeSafeCast(asset->createAndPlace(COLLADA_ELEMENT_UP_AXIS)); + domAsset::domUp_axisRef zup = daeSafeCast(asset->add(COLLADA_ELEMENT_UP_AXIS)); zup->setValue(UP_AXIS_Z_UP); } // Create top-level elements - scene_ = daeSafeCast(dom_->createAndPlace(COLLADA_ELEMENT_SCENE)); - visualScenesLib_ = daeSafeCast(dom_->createAndPlace(COLLADA_ELEMENT_LIBRARY_VISUAL_SCENES)); + scene_ = daeSafeCast(dom_->add(COLLADA_ELEMENT_SCENE)); + visualScenesLib_ = daeSafeCast(dom_->add(COLLADA_ELEMENT_LIBRARY_VISUAL_SCENES)); visualScenesLib_->setId("vscenes"); - geometriesLib_ = daeSafeCast(dom_->createAndPlace(COLLADA_ELEMENT_LIBRARY_GEOMETRIES)); + geometriesLib_ = daeSafeCast(dom_->add(COLLADA_ELEMENT_LIBRARY_GEOMETRIES)); geometriesLib_->setId("geometries"); - kinematicsScenesLib_ = daeSafeCast(dom_->createAndPlace(COLLADA_ELEMENT_LIBRARY_KINEMATICS_SCENES)); + kinematicsScenesLib_ = daeSafeCast(dom_->add(COLLADA_ELEMENT_LIBRARY_KINEMATICS_SCENES)); kinematicsScenesLib_->setId("kscenes"); - kinematicsModelsLib_ = daeSafeCast(dom_->createAndPlace(COLLADA_ELEMENT_LIBRARY_KINEMATICS_MODELS)); + kinematicsModelsLib_ = daeSafeCast(dom_->add(COLLADA_ELEMENT_LIBRARY_KINEMATICS_MODELS)); kinematicsModelsLib_->setId("kmodels"); - jointsLib_ = daeSafeCast(dom_->createAndPlace(COLLADA_ELEMENT_LIBRARY_JOINTS)); + jointsLib_ = daeSafeCast(dom_->add(COLLADA_ELEMENT_LIBRARY_JOINTS)); jointsLib_->setId("joints"); - physicsScenesLib_ = daeSafeCast(dom_->createAndPlace(COLLADA_ELEMENT_LIBRARY_PHYSICS_SCENES)); + physicsScenesLib_ = daeSafeCast(dom_->add(COLLADA_ELEMENT_LIBRARY_PHYSICS_SCENES)); physicsScenesLib_->setId("physics_scenes"); - effectsLib_ = daeSafeCast(dom_->createAndPlace(COLLADA_ELEMENT_LIBRARY_EFFECTS)); + effectsLib_ = daeSafeCast(dom_->add(COLLADA_ELEMENT_LIBRARY_EFFECTS)); effectsLib_->setId("effects"); - materialsLib_ = daeSafeCast(dom_->createAndPlace(COLLADA_ELEMENT_LIBRARY_MATERIALS)); + materialsLib_ = daeSafeCast(dom_->add(COLLADA_ELEMENT_LIBRARY_MATERIALS)); materialsLib_->setId("materials"); } @@ -152,30 +152,30 @@ ColladaWriter::SCENE ColladaWriter::createScene() { SCENE s; // Create visual scene - s.vscene = daeSafeCast(visualScenesLib_->createAndPlace(COLLADA_ELEMENT_VISUAL_SCENE)); + s.vscene = daeSafeCast(visualScenesLib_->add(COLLADA_ELEMENT_VISUAL_SCENE)); s.vscene->setId("vscene"); s.vscene->setName("URDF Visual Scene"); // Create instance visual scene - s.viscene = daeSafeCast(scene_->createAndPlace(COLLADA_ELEMENT_INSTANCE_VISUAL_SCENE)); + s.viscene = daeSafeCast(scene_->add(COLLADA_ELEMENT_INSTANCE_VISUAL_SCENE)); s.viscene->setUrl((string("#") + string(s.vscene->getID())).c_str()); // Create kinematics scene - s.kscene = daeSafeCast(kinematicsScenesLib_->createAndPlace(COLLADA_ELEMENT_KINEMATICS_SCENE)); + s.kscene = daeSafeCast(kinematicsScenesLib_->add(COLLADA_ELEMENT_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 = daeSafeCast(scene_->add(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 = daeSafeCast(physicsScenesLib_->add(COLLADA_ELEMENT_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 = daeSafeCast(scene_->add(COLLADA_ELEMENT_INSTANCE_PHYSICS_SCENE)); s.piscene->setUrl((string("#") + string(s.pscene->getID())).c_str()); return s; @@ -183,10 +183,10 @@ ColladaWriter::SCENE ColladaWriter::createScene() { void ColladaWriter::setupPhysics(SCENE const& scene) { // - domPhysics_scene::domTechnique_commonRef common = daeSafeCast(scene.pscene->createAndPlace(COLLADA_ELEMENT_TECHNIQUE_COMMON)); + domPhysics_scene::domTechnique_commonRef common = daeSafeCast(scene.pscene->add(COLLADA_ELEMENT_TECHNIQUE_COMMON)); { // 0 0 0 - domTargetable_float3Ref g = daeSafeCast(common->createAndPlace(COLLADA_ELEMENT_GRAVITY)); + domTargetable_float3Ref g = daeSafeCast(common->add(COLLADA_ELEMENT_GRAVITY)); g->getValue().set3(0.0, 0.0, 0.0); // } @@ -210,7 +210,7 @@ void ColladaWriter::addGeometries() { urdf::Vector3 scale = urdf_mesh->scale; // @todo use scale // - domGeometryRef geometry = daeSafeCast(geometriesLib_->createAndPlace(COLLADA_ELEMENT_GEOMETRY)); + domGeometryRef geometry = daeSafeCast(geometriesLib_->add(COLLADA_ELEMENT_GEOMETRY)); string geometry_id = string("g1.link") + boost::lexical_cast(link_num) + string(".geom0"); geometry->setId(geometry_id.c_str()); { @@ -296,18 +296,18 @@ bool ColladaWriter::loadMeshWithSTLLoader(resource_retriever::MemoryResource con void ColladaWriter::buildMeshFromSTLLoader(shared_ptr stl_mesh, daeElementRef parent, string const& geometry_id) { // - domMeshRef mesh = daeSafeCast(parent->createAndPlace(COLLADA_ELEMENT_MESH)); + domMeshRef mesh = daeSafeCast(parent->add(COLLADA_ELEMENT_MESH)); { unsigned int num_vertices = stl_mesh->vertices.size(); unsigned int num_indices = stl_mesh->indices.size(); unsigned int num_faces = num_indices / 3; // - domSourceRef positions_source = daeSafeCast(mesh->createAndPlace(COLLADA_ELEMENT_SOURCE)); + domSourceRef positions_source = daeSafeCast(mesh->add(COLLADA_ELEMENT_SOURCE)); positions_source->setId((geometry_id + string(".positions")).c_str()); { // - domFloat_arrayRef positions_array = daeSafeCast(positions_source->createAndPlace(COLLADA_ELEMENT_FLOAT_ARRAY)); + domFloat_arrayRef positions_array = daeSafeCast(positions_source->add(COLLADA_ELEMENT_FLOAT_ARRAY)); positions_array->setId((geometry_id + string(".positions-array")).c_str()); positions_array->setCount(num_vertices * 3); positions_array->setDigits(6); // 6 decimal places @@ -320,10 +320,10 @@ void ColladaWriter::buildMeshFromSTLLoader(shared_ptr stl_mesh, daeElement // // - domSource::domTechnique_commonRef source_tech = daeSafeCast(positions_source->createAndPlace(COLLADA_ELEMENT_TECHNIQUE_COMMON)); + domSource::domTechnique_commonRef source_tech = daeSafeCast(positions_source->add(COLLADA_ELEMENT_TECHNIQUE_COMMON)); { // - domAccessorRef accessor = daeSafeCast(source_tech->createAndPlace(COLLADA_ELEMENT_ACCESSOR)); + domAccessorRef accessor = daeSafeCast(source_tech->add(COLLADA_ELEMENT_ACCESSOR)); accessor->setCount(num_vertices / 3); accessor->setSource(xsAnyURI(*positions_array, string("#") + geometry_id + string(".positions-array"))); accessor->setStride(3); @@ -331,9 +331,9 @@ void ColladaWriter::buildMeshFromSTLLoader(shared_ptr stl_mesh, daeElement // // // - domParamRef px = daeSafeCast(accessor->createAndPlace(COLLADA_ELEMENT_PARAM)); px->setName("X"); px->setType("float"); - domParamRef py = daeSafeCast(accessor->createAndPlace(COLLADA_ELEMENT_PARAM)); py->setName("Y"); py->setType("float"); - domParamRef pz = daeSafeCast(accessor->createAndPlace(COLLADA_ELEMENT_PARAM)); pz->setName("Z"); pz->setType("float"); + domParamRef px = daeSafeCast(accessor->add(COLLADA_ELEMENT_PARAM)); px->setName("X"); px->setType("float"); + domParamRef py = daeSafeCast(accessor->add(COLLADA_ELEMENT_PARAM)); py->setName("Y"); py->setType("float"); + domParamRef pz = daeSafeCast(accessor->add(COLLADA_ELEMENT_PARAM)); pz->setName("Z"); pz->setType("float"); } // } @@ -341,30 +341,30 @@ void ColladaWriter::buildMeshFromSTLLoader(shared_ptr stl_mesh, daeElement } // - domVerticesRef vertices = daeSafeCast(mesh->createAndPlace(COLLADA_ELEMENT_VERTICES)); + domVerticesRef vertices = daeSafeCast(mesh->add(COLLADA_ELEMENT_VERTICES)); string vertices_id = geometry_id + string(".vertices"); vertices->setId(vertices_id.c_str()); { // - domInput_localRef vertices_input = daeSafeCast(vertices->createAndPlace(COLLADA_ELEMENT_INPUT)); + domInput_localRef vertices_input = daeSafeCast(vertices->add(COLLADA_ELEMENT_INPUT)); vertices_input->setSemantic("POSITION"); vertices_input->setSource(domUrifragment(*positions_source, string("#") + string(positions_source->getId()))); } // // - domTrianglesRef triangles = daeSafeCast(mesh->createAndPlace(COLLADA_ELEMENT_TRIANGLES)); + domTrianglesRef triangles = daeSafeCast(mesh->add(COLLADA_ELEMENT_TRIANGLES)); triangles->setCount(num_faces); triangles->setMaterial("mat0"); { // - domInput_local_offsetRef vertex_offset = daeSafeCast(triangles->createAndPlace(COLLADA_ELEMENT_INPUT)); + domInput_local_offsetRef vertex_offset = daeSafeCast(triangles->add(COLLADA_ELEMENT_INPUT)); vertex_offset->setSemantic("VERTEX"); vertex_offset->setOffset(0); vertex_offset->setSource(domUrifragment(*positions_source, string("#") + vertices_id)); { //

0 1 2 3 ... - domPRef indices = daeSafeCast(triangles->createAndPlace(COLLADA_ELEMENT_P)); + domPRef indices = daeSafeCast(triangles->add(COLLADA_ELEMENT_P)); indices->getValue().setCount(num_indices); for (unsigned int i = 0; i < num_indices; i++) indices->getValue()[i] = stl_mesh->indices[i]; @@ -382,7 +382,7 @@ void ColladaWriter::addJoints(daeElementRef parent) { shared_ptr urdf_joint = i->second; // - domJointRef joint = daeSafeCast(parent->createAndPlace(COLLADA_ELEMENT_JOINT)); + domJointRef joint = daeSafeCast(parent->add(COLLADA_ELEMENT_JOINT)); string joint_sid = string("joint") + boost::lexical_cast(joint_num); joint_num++; joint->setName(urdf_joint->name.c_str()); @@ -398,20 +398,15 @@ void ColladaWriter::addJoints(daeElementRef parent) { axis_z = 0.0; } - // @hack: OpenRAVE appears to flip joint axes - //axis_x *= -1.0; - //axis_y *= -1.0; - //axis_z *= -1.0; - switch (urdf_joint->type) { case urdf::Joint::REVOLUTE: { // - domAxis_constraintRef revolute = daeSafeCast(joint->createAndPlace(COLLADA_ELEMENT_REVOLUTE)); + domAxis_constraintRef revolute = daeSafeCast(joint->add(COLLADA_ELEMENT_REVOLUTE)); revolute->setSid("axis0"); { // - domAxisRef axis = daeSafeCast(revolute->createAndPlace(COLLADA_ELEMENT_AXIS)); + domAxisRef axis = daeSafeCast(revolute->add(COLLADA_ELEMENT_AXIS)); { axis->getValue().setCount(3); axis->getValue()[0] = axis_x; @@ -421,10 +416,10 @@ void ColladaWriter::addJoints(daeElementRef parent) { // // - domJoint_limitsRef limits = daeSafeCast(revolute->createAndPlace(COLLADA_TYPE_LIMITS)); + domJoint_limitsRef limits = daeSafeCast(revolute->add(COLLADA_ELEMENT_LIMITS)); { - daeSafeCast(limits->createAndPlace(COLLADA_ELEMENT_MIN))->getValue() = angles::to_degrees(urdf_joint->limits->lower); - daeSafeCast(limits->createAndPlace(COLLADA_ELEMENT_MAX))->getValue() = angles::to_degrees(urdf_joint->limits->upper); + daeSafeCast(limits->add(COLLADA_ELEMENT_MIN))->getValue() = angles::to_degrees(urdf_joint->limits->lower); + daeSafeCast(limits->add(COLLADA_ELEMENT_MAX))->getValue() = angles::to_degrees(urdf_joint->limits->upper); } // } @@ -435,11 +430,11 @@ void ColladaWriter::addJoints(daeElementRef parent) { // Model as a REVOLUTE joint without limits // - domAxis_constraintRef revolute = daeSafeCast(joint->createAndPlace(COLLADA_ELEMENT_REVOLUTE)); + domAxis_constraintRef revolute = daeSafeCast(joint->add(COLLADA_ELEMENT_REVOLUTE)); revolute->setSid("axis0"); { // - domAxisRef axis = daeSafeCast(revolute->createAndPlace(COLLADA_ELEMENT_AXIS)); + domAxisRef axis = daeSafeCast(revolute->add(COLLADA_ELEMENT_AXIS)); { axis->getValue().setCount(3); axis->getValue()[0] = axis_x; @@ -453,11 +448,11 @@ void ColladaWriter::addJoints(daeElementRef parent) { } case urdf::Joint::PRISMATIC: { // - domAxis_constraintRef prismatic = daeSafeCast(joint->createAndPlace(COLLADA_ELEMENT_PRISMATIC)); + domAxis_constraintRef prismatic = daeSafeCast(joint->add(COLLADA_ELEMENT_PRISMATIC)); prismatic->setSid("axis0"); { // - domAxisRef axis = daeSafeCast(prismatic->createAndPlace(COLLADA_ELEMENT_AXIS)); + domAxisRef axis = daeSafeCast(prismatic->add(COLLADA_ELEMENT_AXIS)); { axis->getValue().setCount(3); axis->getValue()[0] = axis_x; @@ -467,10 +462,10 @@ void ColladaWriter::addJoints(daeElementRef parent) { // // - domJoint_limitsRef limits = daeSafeCast(prismatic->createAndPlace(COLLADA_TYPE_LIMITS)); + domJoint_limitsRef limits = daeSafeCast(prismatic->add(COLLADA_ELEMENT_LIMITS)); { - daeSafeCast(limits->createAndPlace(COLLADA_ELEMENT_MIN))->getValue() = urdf_joint->limits->lower; - daeSafeCast(limits->createAndPlace(COLLADA_ELEMENT_MAX))->getValue() = urdf_joint->limits->upper; + daeSafeCast(limits->add(COLLADA_ELEMENT_MIN))->getValue() = urdf_joint->limits->lower; + daeSafeCast(limits->add(COLLADA_ELEMENT_MAX))->getValue() = urdf_joint->limits->upper; } // } @@ -480,11 +475,11 @@ void ColladaWriter::addJoints(daeElementRef parent) { case urdf::Joint::FIXED: { // Model as a REVOLUTE joint with no leeway - domAxis_constraintRef revolute = daeSafeCast(joint->createAndPlace(COLLADA_ELEMENT_REVOLUTE)); + domAxis_constraintRef revolute = daeSafeCast(joint->add(COLLADA_ELEMENT_REVOLUTE)); revolute->setSid("axis0"); { // - domAxisRef axis = daeSafeCast(revolute->createAndPlace(COLLADA_ELEMENT_AXIS)); + domAxisRef axis = daeSafeCast(revolute->add(COLLADA_ELEMENT_AXIS)); { axis->getValue().setCount(3); axis->getValue()[0] = axis_x; @@ -494,10 +489,10 @@ void ColladaWriter::addJoints(daeElementRef parent) { // // - domJoint_limitsRef limits = daeSafeCast(revolute->createAndPlace(COLLADA_TYPE_LIMITS)); + domJoint_limitsRef limits = daeSafeCast(revolute->add(COLLADA_ELEMENT_LIMITS)); { - daeSafeCast(limits->createAndPlace(COLLADA_ELEMENT_MIN))->getValue() = 0.0; - daeSafeCast(limits->createAndPlace(COLLADA_ELEMENT_MAX))->getValue() = 0.0; + daeSafeCast(limits->add(COLLADA_ELEMENT_MIN))->getValue() = 0.0; + daeSafeCast(limits->add(COLLADA_ELEMENT_MAX))->getValue() = 0.0; } // } @@ -530,9 +525,9 @@ void ColladaWriter::addBindings(SCENE const& scene) { // // - domBind_kinematics_modelRef kmodel_bind = daeSafeCast(scene.kiscene->createAndPlace(COLLADA_ELEMENT_BIND_KINEMATICS_MODEL)); + domBind_kinematics_modelRef kmodel_bind = daeSafeCast(scene.kiscene->add(COLLADA_ELEMENT_BIND_KINEMATICS_MODEL)); kmodel_bind->setNode("v1.node0"); // @todo - daeSafeCast(kmodel_bind->createAndPlace(COLLADA_ELEMENT_PARAM))->setValue(string(string(scene.kscene->getID()) + string(".") + inst_model_sid).c_str()); + daeSafeCast(kmodel_bind->add(COLLADA_ELEMENT_PARAM))->setValue(string(string(scene.kscene->getID()) + string(".") + inst_model_sid).c_str()); for (map >::const_iterator i = robot_.joints_.begin(); i != robot_.joints_.end(); i++) { shared_ptr urdf_joint = i->second; @@ -544,20 +539,20 @@ void ColladaWriter::addBindings(SCENE const& scene) { string joint_axis_value_sid = joint_axis_sid + string("_value"); // - domBind_joint_axisRef joint_bind = daeSafeCast(scene.kiscene->createAndPlace(COLLADA_ELEMENT_BIND_JOINT_AXIS)); + domBind_joint_axisRef joint_bind = daeSafeCast(scene.kiscene->add(COLLADA_ELEMENT_BIND_JOINT_AXIS)); string node_name = node_ids_[urdf_joint->name]; joint_bind->setTarget((node_name + string("/node_") + joint_sid + string("_") + axis_name).c_str()); { // - domCommon_sidref_or_paramRef axis_bind = daeSafeCast(joint_bind->createAndPlace(COLLADA_ELEMENT_AXIS)); + domCommon_sidref_or_paramRef axis_bind = daeSafeCast(joint_bind->add(COLLADA_ELEMENT_AXIS)); { - daeSafeCast(axis_bind->createAndPlace(COLLADA_TYPE_PARAM))->setValue(joint_axis_sid.c_str()); + daeSafeCast(axis_bind->add(COLLADA_ELEMENT_PARAM))->setValue(joint_axis_sid.c_str()); } // // - domCommon_float_or_paramRef value_bind = daeSafeCast(joint_bind->createAndPlace(COLLADA_ELEMENT_VALUE)); + domCommon_float_or_paramRef value_bind = daeSafeCast(joint_bind->add(COLLADA_ELEMENT_VALUE)); { - daeSafeCast(value_bind->createAndPlace(COLLADA_TYPE_PARAM))->setValue(joint_axis_value_sid.c_str()); + daeSafeCast(value_bind->add(COLLADA_ELEMENT_PARAM))->setValue(joint_axis_value_sid.c_str()); } } // @@ -566,12 +561,12 @@ void ColladaWriter::addBindings(SCENE const& scene) { void ColladaWriter::addKinematics(SCENE const& scene) { // - domKinematics_modelRef kmodel = daeSafeCast(kinematicsModelsLib_->createAndPlace(COLLADA_ELEMENT_KINEMATICS_MODEL)); + domKinematics_modelRef kmodel = daeSafeCast(kinematicsModelsLib_->add(COLLADA_ELEMENT_KINEMATICS_MODEL)); kmodel->setId("k1"); kmodel->setName(robot_.getName().c_str()); { // - domKinematics_model_techniqueRef technique = daeSafeCast(kmodel->createAndPlace(COLLADA_ELEMENT_TECHNIQUE_COMMON)); + domKinematics_model_techniqueRef technique = daeSafeCast(kmodel->add(COLLADA_ELEMENT_TECHNIQUE_COMMON)); addJoints(technique); // @@ -587,18 +582,18 @@ void ColladaWriter::addKinematics(SCENE const& scene) { string inst_model_sid = string("inst_") + model_id; // - domInstance_kinematics_modelRef ikm = daeSafeCast(scene.kscene->createAndPlace(COLLADA_ELEMENT_INSTANCE_KINEMATICS_MODEL)); + domInstance_kinematics_modelRef ikm = daeSafeCast(scene.kscene->add(COLLADA_ELEMENT_INSTANCE_KINEMATICS_MODEL)); ikm->setUrl((string("#") + model_id).c_str()); ikm->setSid(inst_model_sid.c_str()); { // - domKinematics_newparamRef newparam_model = daeSafeCast(ikm->createAndPlace(COLLADA_ELEMENT_NEWPARAM)); + domKinematics_newparamRef newparam_model = daeSafeCast(ikm->add(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()); + daeSafeCast(newparam_model->add(COLLADA_ELEMENT_SIDREF))->setValue(model_sidref.c_str()); } // @@ -612,23 +607,23 @@ void ColladaWriter::addKinematics(SCENE const& scene) { string axis_name = string("axis") + boost::lexical_cast(idof); // - domKinematics_newparamRef newparam = daeSafeCast(ikm->createAndPlace(COLLADA_ELEMENT_NEWPARAM)); + domKinematics_newparamRef newparam = daeSafeCast(ikm->add(COLLADA_ELEMENT_NEWPARAM)); string newparam_sid = string("kscene.inst_") + model_id + string(".") + joint_sid + string(".") + axis_name; newparam->setSid(newparam_sid.c_str()); { // kscene/inst_k1/joint0/axis0 string sidref = string("kscene/inst_") + model_id + string("/") + joint_sid + string("/") + axis_name; - daeSafeCast(newparam->createAndPlace(COLLADA_ELEMENT_SIDREF))->setValue(sidref.c_str()); + daeSafeCast(newparam->add(COLLADA_ELEMENT_SIDREF))->setValue(sidref.c_str()); } // // - domKinematics_newparamRef newparam_value = daeSafeCast(ikm->createAndPlace(COLLADA_ELEMENT_NEWPARAM)); + domKinematics_newparamRef newparam_value = daeSafeCast(ikm->add(COLLADA_ELEMENT_NEWPARAM)); string newparam_value_sid = string("kscene.inst_") + model_id + string(".") + joint_sid + string(".") + axis_name + string("_value"); newparam_value->setSid(newparam_value_sid.c_str()); { // 0 - daeSafeCast(newparam_value->createAndPlace(COLLADA_ELEMENT_FLOAT))->setValue(0.0f); + daeSafeCast(newparam_value->add(COLLADA_ELEMENT_FLOAT))->setValue(0.0f); } // } @@ -638,19 +633,22 @@ void ColladaWriter::addKinematics(SCENE const& scene) { void ColladaWriter::addKinematicLink(shared_ptr urdf_link, daeElementRef parent, int& link_num) { // - domLinkRef link = daeSafeCast(parent->createAndPlace(COLLADA_ELEMENT_LINK)); + domLinkRef link = daeSafeCast(parent->add(COLLADA_ELEMENT_LINK)); string link_sid = string("link") + boost::lexical_cast(link_num); link->setName(urdf_link->name.c_str()); link->setSid(link_sid.c_str()); link_num++; foreach(shared_ptr urdf_joint, urdf_link->child_joints) { - // - domLink::domAttachment_fullRef attachment_full = daeSafeCast(link->createAndPlace(COLLADA_TYPE_ATTACHMENT_FULL)); + // + domLink::domAttachment_fullRef attachment_full = daeSafeCast(link->add(COLLADA_ELEMENT_ATTACHMENT_FULL)); string attachment_joint = string("k1/") + joint_sids_[urdf_joint->name]; attachment_full->setJoint(attachment_joint.c_str()); { - addRotate(attachment_full, urdf_joint->parent_to_joint_origin_transform.rotation); - addTranslate(attachment_full, urdf_joint->parent_to_joint_origin_transform.position); + // x y z w + addRotate(attachment_full, urdf_joint->parent_to_joint_origin_transform.rotation, NULL, true); + // x y z + addTranslate(attachment_full, urdf_joint->parent_to_joint_origin_transform.position, NULL, true); + addKinematicLink(robot_.getLink(urdf_joint->child_link_name), attachment_full, link_num); } // @@ -660,7 +658,7 @@ void ColladaWriter::addKinematicLink(shared_ptr urdf_link, dae void ColladaWriter::addVisuals(SCENE const& scene) { // - domNodeRef root_node = daeSafeCast(scene.vscene->createAndPlace(COLLADA_ELEMENT_NODE)); + domNodeRef root_node = daeSafeCast(scene.vscene->add(COLLADA_ELEMENT_NODE)); root_node->setId("v1"); root_node->setName(robot_.getName().c_str()); { @@ -686,12 +684,12 @@ void ColladaWriter::addMaterials() { domEffectRef effect = addEffect(geometry_id, ambient, diffuse); // - domMaterialRef material = daeSafeCast(materialsLib_->createAndPlace(COLLADA_ELEMENT_MATERIAL)); + domMaterialRef material = daeSafeCast(materialsLib_->add(COLLADA_ELEMENT_MATERIAL)); string material_id = geometry_id + string(".mat"); material->setId(material_id.c_str()); { // - domInstance_effectRef instance_effect = daeSafeCast(material->createAndPlace(COLLADA_ELEMENT_INSTANCE_EFFECT)); + domInstance_effectRef instance_effect = daeSafeCast(material->add(COLLADA_ELEMENT_INSTANCE_EFFECT)); string effect_id(effect->getId()); instance_effect->setUrl((string("#") + effect_id).c_str()); } @@ -702,24 +700,24 @@ void ColladaWriter::addMaterials() { domEffectRef ColladaWriter::addEffect(string const& geometry_id, urdf::Color const& color_ambient, urdf::Color const& color_diffuse) { // - domEffectRef effect = daeSafeCast(effectsLib_->createAndPlace(COLLADA_ELEMENT_EFFECT)); + domEffectRef effect = daeSafeCast(effectsLib_->add(COLLADA_ELEMENT_EFFECT)); string effect_id = geometry_id + string(".eff"); effect->setId(effect_id.c_str()); { // - domProfile_commonRef profile = daeSafeCast(effect->createAndPlace(COLLADA_ELEMENT_PROFILE_COMMON)); + domProfile_commonRef profile = daeSafeCast(effect->add(COLLADA_ELEMENT_PROFILE_COMMON)); { // - domProfile_common::domTechniqueRef technique = daeSafeCast(profile->createAndPlace(COLLADA_ELEMENT_TECHNIQUE)); + domProfile_common::domTechniqueRef technique = daeSafeCast(profile->add(COLLADA_ELEMENT_TECHNIQUE)); { // - domProfile_common::domTechnique::domPhongRef phong = daeSafeCast(technique->createAndPlace(COLLADA_ELEMENT_PHONG)); + domProfile_common::domTechnique::domPhongRef phong = daeSafeCast(technique->add(COLLADA_ELEMENT_PHONG)); { // - domFx_common_color_or_textureRef ambient = daeSafeCast(phong->createAndPlace(COLLADA_ELEMENT_AMBIENT)); + domFx_common_color_or_textureRef ambient = daeSafeCast(phong->add(COLLADA_ELEMENT_AMBIENT)); { // r g b a - domFx_common_color_or_texture::domColorRef ambient_color = daeSafeCast(ambient->createAndPlace(COLLADA_ELEMENT_COLOR)); + domFx_common_color_or_texture::domColorRef ambient_color = daeSafeCast(ambient->add(COLLADA_ELEMENT_COLOR)); ambient_color->getValue().setCount(4); ambient_color->getValue()[0] = color_ambient.r; ambient_color->getValue()[1] = color_ambient.g; @@ -730,10 +728,10 @@ domEffectRef ColladaWriter::addEffect(string const& geometry_id, urdf::Color con // // - domFx_common_color_or_textureRef diffuse = daeSafeCast(phong->createAndPlace(COLLADA_ELEMENT_DIFFUSE)); + domFx_common_color_or_textureRef diffuse = daeSafeCast(phong->add(COLLADA_ELEMENT_DIFFUSE)); { // r g b a - domFx_common_color_or_texture::domColorRef diffuse_color = daeSafeCast(diffuse->createAndPlace(COLLADA_ELEMENT_COLOR)); + domFx_common_color_or_texture::domColorRef diffuse_color = daeSafeCast(diffuse->add(COLLADA_ELEMENT_COLOR)); diffuse_color->getValue().setCount(4); diffuse_color->getValue()[0] = color_diffuse.r; diffuse_color->getValue()[1] = color_diffuse.g; @@ -756,7 +754,7 @@ domEffectRef ColladaWriter::addEffect(string const& geometry_id, urdf::Color con void ColladaWriter::addVisualLink(shared_ptr urdf_link, daeElementRef parent, int& link_num) { // - domNodeRef node = daeSafeCast(parent->createAndPlace(COLLADA_ELEMENT_NODE)); + domNodeRef node = daeSafeCast(parent->add(COLLADA_ELEMENT_NODE)); string node_sid = string("node") + boost::lexical_cast(link_num); string node_id = string("v1.") + node_sid; node->setName(urdf_link->name.c_str()); @@ -769,13 +767,13 @@ void ColladaWriter::addVisualLink(shared_ptr urdf_link, daeEle { if (urdf_link->parent_joint != NULL) { // x y z w - addRotate(node, urdf_link->parent_joint->parent_to_joint_origin_transform.rotation); + addRotate(node, urdf_link->parent_joint->parent_to_joint_origin_transform.rotation, NULL, true); // x y z - addTranslate(node, urdf_link->parent_joint->parent_to_joint_origin_transform.position); + addTranslate(node, urdf_link->parent_joint->parent_to_joint_origin_transform.position, NULL, true); if (urdf_link->visual != NULL) { // - domNodeRef visual_node = daeSafeCast(node->createAndPlace(COLLADA_ELEMENT_NODE)); + domNodeRef visual_node = daeSafeCast(node->add(COLLADA_ELEMENT_NODE)); string visual_sid("visual"); string visual_id = node_id + "." + visual_sid; visual_node->setName("visual"); @@ -785,9 +783,9 @@ void ColladaWriter::addVisualLink(shared_ptr urdf_link, daeEle parent_node = visual_node; // x y z w - addRotate(parent_node, urdf_link->visual->origin.rotation); + addRotate(parent_node, urdf_link->visual->origin.rotation, NULL, true); // x y z - addTranslate(parent_node, urdf_link->visual->origin.position); + addTranslate(parent_node, urdf_link->visual->origin.position, NULL, true); } // x y z angle @@ -802,19 +800,19 @@ void ColladaWriter::addVisualLink(shared_ptr urdf_link, daeEle // map::const_iterator i = geometry_ids_.find(urdf_link->name); if (i != geometry_ids_.end()) { - domInstance_geometryRef instance_geometry = daeSafeCast(parent_node->createAndPlace(COLLADA_ELEMENT_INSTANCE_GEOMETRY)); + domInstance_geometryRef instance_geometry = daeSafeCast(parent_node->add(COLLADA_ELEMENT_INSTANCE_GEOMETRY)); string geometry_id = i->second; 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_materialRef bind_material = daeSafeCast(instance_geometry->add(COLLADA_ELEMENT_BIND_MATERIAL)); { // - domBind_material::domTechnique_commonRef technique_common = daeSafeCast(bind_material->createAndPlace(COLLADA_ELEMENT_TECHNIQUE_COMMON)); + domBind_material::domTechnique_commonRef technique_common = daeSafeCast(bind_material->add(COLLADA_ELEMENT_TECHNIQUE_COMMON)); { // - domInstance_materialRef instance_material = daeSafeCast(technique_common->createAndPlace(COLLADA_ELEMENT_INSTANCE_MATERIAL)); + domInstance_materialRef instance_material = daeSafeCast(technique_common->add(COLLADA_ELEMENT_INSTANCE_MATERIAL)); instance_material->setTarget((instance_geometry_url + string(".mat")).c_str()); instance_material->setSymbol("mat0"); // @@ -834,9 +832,18 @@ void ColladaWriter::addVisualLink(shared_ptr urdf_link, daeEle // } -domTranslateRef ColladaWriter::addTranslate(daeElementRef parent, urdf::Vector3 const& position) { +domTranslateRef ColladaWriter::addTranslate(daeElementRef parent, urdf::Vector3 const& position, daeElementRef before, bool ignore_zero_translations) { + if (ignore_zero_translations && position.x == 0.0 && position.y == 0.0 && position.z == 0.0) + return NULL; + // x y z - domTranslateRef trans = daeSafeCast(parent->createAndPlace(COLLADA_ELEMENT_TRANSLATE)); + domTranslateRef trans; + if (before) { + trans = daeSafeCast(parent->createElement(COLLADA_ELEMENT_TRANSLATE)); + parent->addBefore(trans, before); + } + else + trans = daeSafeCast(parent->add(COLLADA_ELEMENT_TRANSLATE)); trans->getValue().setCount(3); trans->getValue()[0] = position.x; trans->getValue()[1] = position.y; @@ -844,7 +851,7 @@ domTranslateRef ColladaWriter::addTranslate(daeElementRef parent, urdf::Vector3 return trans; } -domRotateRef ColladaWriter::addRotate(daeElementRef parent, urdf::Rotation const& r) { +domRotateRef ColladaWriter::addRotate(daeElementRef parent, urdf::Rotation const& r, daeElementRef before, bool ignore_zero_rotations) { double ax, ay, az, aa; // Convert from quaternion to axis-angle @@ -858,7 +865,10 @@ domRotateRef ColladaWriter::addRotate(daeElementRef parent, urdf::Rotation const az = r.z * inv_len; } else { - // Angle is 0 (mod 2*pi), so any axis will do + if (ignore_zero_rotations) + return NULL; + + // Angle is 0 (mod 2*pi), so no need to add rotate node aa = 0.0; ax = 1.0; ay = 0.0; @@ -866,7 +876,13 @@ domRotateRef ColladaWriter::addRotate(daeElementRef parent, urdf::Rotation const } // x y z w - domRotateRef rot = daeSafeCast(parent->createAndPlace(COLLADA_ELEMENT_ROTATE)); + domRotateRef rot; + if (before) { + rot = daeSafeCast(parent->createElement(COLLADA_ELEMENT_ROTATE)); + parent->addBefore(rot, before); + } + else + rot = daeSafeCast(parent->add(COLLADA_ELEMENT_ROTATE)); rot->getValue().setCount(4); rot->getValue()[0] = ax; rot->getValue()[1] = ay;