diff --git a/VirtualRobot/BoundingBox.cpp b/VirtualRobot/BoundingBox.cpp index 6102408f982a95de75a29a5bc06f7377fbeebb67..f2d8a7338fcd1a9e20c97fa6669967b00d9828d3 100644 --- a/VirtualRobot/BoundingBox.cpp +++ b/VirtualRobot/BoundingBox.cpp @@ -144,5 +144,14 @@ void BoundingBox::transform( Eigen::Matrix4f &pose ) } } +void BoundingBox::scale( Eigen::Vector3f &scaleFactor ) +{ + for (int i=0;i<3;i++) + { + min(i) *= scaleFactor(i); + max(i) *= scaleFactor(i); + } +} + } diff --git a/VirtualRobot/BoundingBox.h b/VirtualRobot/BoundingBox.h index 692a76cd4d18e57f9064aede0aa8b467f06ec457..c5d644e0a3083c45324b15f183692f633f1cfcd1 100644 --- a/VirtualRobot/BoundingBox.h +++ b/VirtualRobot/BoundingBox.h @@ -88,6 +88,8 @@ public: */ void transform(Eigen::Matrix4f &pose); + void scale (Eigen::Vector3f &scaleFactor); + protected: Eigen::Vector3f min; Eigen::Vector3f max; diff --git a/VirtualRobot/CollisionDetection/CollisionModel.cpp b/VirtualRobot/CollisionDetection/CollisionModel.cpp index 0a8bde0d5ca45621cf458d7eb18c0ec7d4178c5a..f59be1f33d23918ff78490bd78fd681fb67e3f91 100644 --- a/VirtualRobot/CollisionDetection/CollisionModel.cpp +++ b/VirtualRobot/CollisionDetection/CollisionModel.cpp @@ -26,7 +26,6 @@ CollisionModel::CollisionModel(VisualizationNodePtr visu, const std::string &nam VR_WARNING << "no col checker..." << endl; } - TriMeshModelPtr model; visualization = visu; updateVisualization = true; if (visualization) @@ -250,6 +249,22 @@ bool CollisionModel::saveModel( const std::string &modelPath, const std::string return true; // no model given } +void CollisionModel::scale( Eigen::Vector3f &scaleFactor ) +{ + if (model) + { + TriMeshModelPtr modelScaled = model->clone(scaleFactor); + bbox = modelScaled->boundingBox; +#if defined(VR_COLLISION_DETECTION_PQP) + collisionModelImplementation.reset(new CollisionModelPQP(modelScaled, colChecker,id)); +#else + collisionModelImplementation.reset(new CollisionModelDummy(modelScaled, colChecker,id)); +#endif + } + if (visualization) + visualization->scale(scaleFactor); +} + /* void CollisionModel::GetAABB( SbBox3f& store_aabb ) { diff --git a/VirtualRobot/CollisionDetection/CollisionModel.h b/VirtualRobot/CollisionDetection/CollisionModel.h index c94433de87667a5168dc7a41f972b335be8bf626..f0cbff97a8926a3878a10ae8c42a526140d30ff0 100644 --- a/VirtualRobot/CollisionDetection/CollisionModel.h +++ b/VirtualRobot/CollisionDetection/CollisionModel.h @@ -138,6 +138,7 @@ public: */ virtual bool saveModel(const std::string &modelPath, const std::string &filename); + virtual void scale(Eigen::Vector3f &scaleFactor); protected: @@ -146,6 +147,7 @@ protected: VisualizationNodePtr visualization; // this is the original visualization VisualizationNodePtr modelVisualization; // this is the visualization of the trimeshmodel bool updateVisualization; + TriMeshModelPtr model; BoundingBox bbox; diff --git a/VirtualRobot/CollisionDetection/CollisionModelImplementation.h b/VirtualRobot/CollisionDetection/CollisionModelImplementation.h index 1816aac9ae352037108ef09b557e253f58e469e3..3b2083f4a2de0aa428db012634492b6b179825a6 100644 --- a/VirtualRobot/CollisionDetection/CollisionModelImplementation.h +++ b/VirtualRobot/CollisionDetection/CollisionModelImplementation.h @@ -69,6 +69,7 @@ public: virtual void print() {cout << "Dummy Collision Model Implementation..." << endl;}; TriMeshModelPtr getTriMeshModel(){return modelData;} + protected: //! delete all data diff --git a/VirtualRobot/CollisionDetection/PQP/CollisionModelPQP.cpp b/VirtualRobot/CollisionDetection/PQP/CollisionModelPQP.cpp index 6da416fb4c7f243cc2a1fb6082b163189b69c93b..3af35178583e5b76be6e00b7817cd3cd226d6760 100644 --- a/VirtualRobot/CollisionDetection/PQP/CollisionModelPQP.cpp +++ b/VirtualRobot/CollisionDetection/PQP/CollisionModelPQP.cpp @@ -99,4 +99,5 @@ void CollisionModelPQP::print() cout << endl; } + } // namespace diff --git a/VirtualRobot/CollisionDetection/PQP/CollisionModelPQP.h b/VirtualRobot/CollisionDetection/PQP/CollisionModelPQP.h index bf8623f9ef0bee88d4efdd8f069bd3327359d806..318d0adc031495319bc836f1a96b12ce5c2a527f 100644 --- a/VirtualRobot/CollisionDetection/PQP/CollisionModelPQP.h +++ b/VirtualRobot/CollisionDetection/PQP/CollisionModelPQP.h @@ -42,7 +42,7 @@ class CollisionChecker; class CollisionCheckerPQP; /*! - A PQP related implementaion of a collision model. + A PQP related implementation of a collision model. */ class VIRTUAL_ROBOT_IMPORT_EXPORT CollisionModelPQP : public CollisionModelImplementation { diff --git a/VirtualRobot/Nodes/RobotNodePrismatic.cpp b/VirtualRobot/Nodes/RobotNodePrismatic.cpp index 82d94669cd31822ed34ef4df375e45d45782b0ce..1c9f5867af22c7fb2069bb4fb2d5944de3667d8b 100644 --- a/VirtualRobot/Nodes/RobotNodePrismatic.cpp +++ b/VirtualRobot/Nodes/RobotNodePrismatic.cpp @@ -24,6 +24,8 @@ RobotNodePrismatic::RobotNodePrismatic(RobotWeakPtr rob, ) : RobotNode(rob,name,jointLimitLo,jointLimitHi,visualization,collisionModel,jointValueOffset,p,colChecker,type) { initialized = false; + visuScaling = false; + visuScaleFactor << 1.0f,1.0f,1.0f; optionalDHParameter.isSet = false; this->localTransformation = preJointTransform; this->jointTranslationDirection = translationDirection; @@ -80,13 +82,32 @@ RobotNodePrismatic::~RobotNodePrismatic() bool RobotNodePrismatic::initialize(SceneObjectPtr parent, const std::vector<SceneObjectPtr> &children) { - return RobotNode::initialize(parent,children); + bool res = RobotNode::initialize(parent,children); + unscaledLocalCoM = physics.localCoM; + return res; } void RobotNodePrismatic::updateTransformationMatrices(const Eigen::Matrix4f &parentPose) { Eigen::Affine3f tmpT(Eigen::Translation3f((this->getJointValue()+jointValueOffset)*jointTranslationDirection)); globalPose = parentPose * getLocalTransformation() * tmpT.matrix(); + if (visuScaling) + { + float scValue = 0; + if (jointValueOffset==0) + scValue = jointValue; + else + scValue = (jointValue) / jointValueOffset; + Eigen::Vector3f scVec; + for (int i=0;i<3;i++) + scVec(i) = 1.0f + visuScaleFactor(i) * scValue; + if (visualizationModel) + visualizationModel->scale(scVec); + if (collisionModel) + collisionModel->scale(scVec); + for (int i=0;i<3;i++) + physics.localCoM(i) = unscaledLocalCoM(i) * scVec(i); + } } void RobotNodePrismatic::print( bool printChildren, bool printDecoration ) const @@ -98,7 +119,12 @@ void RobotNodePrismatic::print( bool printChildren, bool printDecoration ) const RobotNode::print(false,false); - cout << "* jointTranslationDirection: " << jointTranslationDirection[0] << ", " << jointTranslationDirection[1] << "," << jointTranslationDirection[2] << endl; + cout << "* jointTranslationDirection: " << jointTranslationDirection[0] << ", " << jointTranslationDirection[1] << "," << jointTranslationDirection[2] << endl; + cout << "* VisuScaling: "; + if (visuScaling) + cout << visuScaleFactor[0] << ", " << visuScaleFactor[1] << "," << visuScaleFactor[2] << endl; + else + cout << "disabled" << endl; if (printDecoration) cout << "******** End RobotNodePrismatic ********" << endl; @@ -111,7 +137,7 @@ void RobotNodePrismatic::print( bool printChildren, bool printDecoration ) const RobotNodePtr RobotNodePrismatic::_clone(const RobotPtr newRobot, const VisualizationNodePtr visualizationModel, const CollisionModelPtr collisionModel, CollisionCheckerPtr colChecker, float scaling) { - RobotNodePtr result; + boost::shared_ptr<RobotNodePrismatic> result; ReadLockPtr lock = getRobot()->getReadLock(); Physics p = physics.scale(scaling); if (optionalDHParameter.isSet) @@ -123,6 +149,10 @@ RobotNodePtr RobotNodePrismatic::_clone(const RobotPtr newRobot, const Visualiza lt.block(0,3,3,1) *= scaling; result.reset(new RobotNodePrismatic(newRobot,name,jointLimitLo,jointLimitHi,lt,jointTranslationDirection,visualizationModel,collisionModel,jointValueOffset,p,colChecker,nodeType)); } + if (result && visuScaling) + { + result->setVisuScaleFactor(visuScaleFactor); + } return result; } @@ -211,6 +241,17 @@ std::string RobotNodePrismatic::_toXML( const std::string &modelPath ) return ss.str(); } +void RobotNodePrismatic::setVisuScaleFactor( Eigen::Vector3f &scaleFactor ) +{ + if (scaleFactor.norm()==0.0f) + visuScaling = false; + else + { + visuScaling = true; + visuScaleFactor = scaleFactor; + } +} + } // namespace diff --git a/VirtualRobot/Nodes/RobotNodePrismatic.h b/VirtualRobot/Nodes/RobotNodePrismatic.h index 2bcddca7721e92d8cbe45e2563b10534790b9743..eabf9b034198a749934cea184637ccfe7f542eba 100644 --- a/VirtualRobot/Nodes/RobotNodePrismatic.h +++ b/VirtualRobot/Nodes/RobotNodePrismatic.h @@ -97,6 +97,15 @@ public: */ Eigen::Vector3f getJointTranslationDirectionJointCoordSystem() const; + /*! + Enables scaling of visualization and collision model according to joint value. + The jointOffset is used to determine the unscaled value. + Be careful, the scaling triggers a computation of the collision model, which may be time consuming. + \param scaleFactor If (0,0,0), the scaling is disabled, otherwise the value indicates the scale factors for each dimension. + + */ + void setVisuScaleFactor(Eigen::Vector3f &scaleFactor); + protected: /*! Can be called by a RobotNodeActuator in order to set the pose of this node. @@ -120,6 +129,10 @@ protected: */ virtual std::string _toXML(const std::string &modelPath); + bool visuScaling; + Eigen::Vector3f visuScaleFactor; + Eigen::Vector3f unscaledLocalCoM; + }; } // namespace VirtualRobot diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.cpp b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.cpp index e8e1f6c4c16ac84c81a22cedbb02fa134a2e076c..c6d9ba7236a0f692abd9bda912ab9d92c550e91d 100644 --- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.cpp +++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.cpp @@ -48,7 +48,13 @@ CoinVisualizationNode::CoinVisualizationNode(SoNode* visualizationNode) : visualization = new SoSeparator(); // create dummy node visualization->ref(); - visualizationAtGlobalPose->addChild(visualization); + scaledVisualization = new SoSeparator; + scaledVisualization->ref(); + scaling = new SoScale; + scaling->scaleFactor.setValue(1.0f,1.0f,1.0f); + scaledVisualization->addChild(scaling); + scaledVisualization->addChild(visualization); + visualizationAtGlobalPose->addChild(scaledVisualization); } @@ -65,6 +71,8 @@ CoinVisualizationNode::~CoinVisualizationNode() attachedVisualizationsSeparator->unref(); if (visualizationAtGlobalPose) visualizationAtGlobalPose->unref(); + if (scaledVisualization) + scaledVisualization->unref(); } /* @@ -116,7 +124,7 @@ TriMeshModelPtr CoinVisualizationNode::getTriMeshModel() * CoinVisualizationNode::triMeshModel. * If CoinVisualizationMode::visualization is invalid VirtualRobotException * is thrown. - * Otherwise CoinVisualizationNode::InentorTriangleCB() is called on the + * Otherwise CoinVisualizationNode::InventorTriangleCB() is called on the * Inventor graph stored in CoinVisualizationNode::visualization. */ void CoinVisualizationNode::createTriMeshModel() @@ -306,10 +314,10 @@ void CoinVisualizationNode::setupVisualization( bool showVisualization, bool sho visualizationAtGlobalPose->removeChild(attachedVisualizationsSeparator); - if (showVisualization && visualizationAtGlobalPose->findChild(visualization)<0) - visualizationAtGlobalPose->addChild(visualization); - if (!showVisualization && visualizationAtGlobalPose->findChild(visualization)>=0) - visualizationAtGlobalPose->removeChild(visualization); + if (showVisualization && visualizationAtGlobalPose->findChild(scaledVisualization)<0) + visualizationAtGlobalPose->addChild(scaledVisualization); + if (!showVisualization && visualizationAtGlobalPose->findChild(scaledVisualization)>=0) + visualizationAtGlobalPose->removeChild(scaledVisualization); } void CoinVisualizationNode::setVisualization( SoNode* newVisu ) @@ -375,4 +383,10 @@ bool CoinVisualizationNode::saveModel(const std::string &modelPath, const std::s return true; } +void CoinVisualizationNode::scale( Eigen::Vector3f &scaleFactor ) +{ + scaling->scaleFactor.setValue(scaleFactor(0),scaleFactor(1),scaleFactor(2)); + triMeshModel.reset(); +} + } // namespace VirtualRobot diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.h b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.h index f35d5b40b6ab8af3b4cca3dae9a40c0312a46d46..c23984fe0b7d6b0443fd2239d8d119ebcbc15b1e 100644 --- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.h +++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.h @@ -31,6 +31,7 @@ class SoNode; class SoSeparator; +class SoScale; class SoCallbackAction; class SoPrimitiveVertex; class SoMatrixTransform; @@ -53,6 +54,8 @@ public: virtual void print(); + virtual void scale(Eigen::Vector3f &scaleFactor); + /*! Attach an optional visualization to this VisualizationNode. The attached visualizations will not show up in the TriMeshModel. If there is already a visualization attached with the given name, it is quietly replaced. @@ -101,10 +104,12 @@ protected: SoNode* visualization; SoSeparator* visualizationAtGlobalPose; SoSeparator* attachedVisualizationsSeparator; + SoSeparator* scaledVisualization; std::map< std::string, SoNode* > attachedCoinVisualizations; //< These optional visualizations will not show up in the TriMeshModel SoMatrixTransform *globalPoseTransform; - TriMeshModelPtr triMeshModel; + TriMeshModelPtr triMeshModel; + SoScale* scaling; static void InventorTriangleCB(void* data, SoCallbackAction* action, const SoPrimitiveVertex* v1, diff --git a/VirtualRobot/Visualization/TriMeshModel.cpp b/VirtualRobot/Visualization/TriMeshModel.cpp index ec3498c56ae58e413d856e73ec9ec51c1206c68e..6afc7881f8883d538e8b50d248d403c99c2e5252 100644 --- a/VirtualRobot/Visualization/TriMeshModel.cpp +++ b/VirtualRobot/Visualization/TriMeshModel.cpp @@ -286,5 +286,36 @@ void TriMeshModel::print() cout.precision(pr); } +void TriMeshModel::scale( Eigen::Vector3f &scaleFactor ) +{ + if (scaleFactor(0) == 1.0f && scaleFactor(1) == 1.0f && scaleFactor(2) == 1.0f) + return; + for (size_t i=0; i < vertices.size(); i++) + { + for (int j=0;j<3;j++) + { + vertices[i][j] *= scaleFactor(j); + } + } + boundingBox.scale(scaleFactor); +} + +VirtualRobot::TriMeshModelPtr TriMeshModel::clone() +{ + Eigen::Vector3f scaleFactor; + scaleFactor << 1.0f,1.0f,1.0f; + return clone(scaleFactor); +} + +VirtualRobot::TriMeshModelPtr TriMeshModel::clone( Eigen::Vector3f &scaleFactor ) +{ + TriMeshModelPtr r(new TriMeshModel()); + r->vertices = vertices; + r->faces = faces; + r->boundingBox = boundingBox; + r->scale(scaleFactor); + return r; +} + } // namespace VirtualRobot diff --git a/VirtualRobot/Visualization/TriMeshModel.h b/VirtualRobot/Visualization/TriMeshModel.h index 00b4937fd4bc0c8a66f92763dc599cee5dc47026..e6cb80afe037cd89ce3aecd1f1c65757e1f7a53e 100644 --- a/VirtualRobot/Visualization/TriMeshModel.h +++ b/VirtualRobot/Visualization/TriMeshModel.h @@ -51,6 +51,10 @@ public: bool checkFacesHaveSameEdge(const MathTools::TriangleFace& face1, const MathTools::TriangleFace& face2, std::vector<std::pair<int, int> >& commonVertexIds) const; unsigned int checkAndCorrectNormals(bool inverted); + virtual void scale(Eigen::Vector3f &scaleFactor); + TriMeshModelPtr clone (); + TriMeshModelPtr clone (Eigen::Vector3f &scaleFactor); + std::vector<Eigen::Vector3f> vertices; std::vector<MathTools::TriangleFace> faces; BoundingBox boundingBox; diff --git a/VirtualRobot/Visualization/VisualizationNode.cpp b/VirtualRobot/Visualization/VisualizationNode.cpp index a8e0a16acb326de756fc99636ffea9c3632da8e7..dc9f441cdfe4d5b34f9bf80534054f2fd1c3e58e 100644 --- a/VirtualRobot/Visualization/VisualizationNode.cpp +++ b/VirtualRobot/Visualization/VisualizationNode.cpp @@ -205,5 +205,10 @@ bool VisualizationNode::saveModel(const std::string &modelPath, const std::strin return false; } +void VisualizationNode::scale( Eigen::Vector3f &scaleFactor ) +{ + VR_WARNING << "not implemented..." << endl; +} + } // namespace VirtualRobot diff --git a/VirtualRobot/Visualization/VisualizationNode.h b/VirtualRobot/Visualization/VisualizationNode.h index 7f9c0e43e988c08df168d39c02b590af2ea9c748..57608b8a8a58496ebc624d7836e7bda7f9eccb1b 100644 --- a/VirtualRobot/Visualization/VisualizationNode.h +++ b/VirtualRobot/Visualization/VisualizationNode.h @@ -143,6 +143,8 @@ public: */ virtual bool saveModel(const std::string &modelPath, const std::string &filename); + virtual void scale(Eigen::Vector3f &scaleFactor); + protected: bool boundingBox; //!< Indicates, if the bounding box model was used std::string filename; //!< if the visualization was build from a file, the filename is stored here diff --git a/VirtualRobot/XML/RobotIO.cpp b/VirtualRobot/XML/RobotIO.cpp index d663b93b75ce2c6c05a38a6feec87fc5cf937a89..0c7a69ce5b16f2e5b95b39b4962f5bb67dc60983 100644 --- a/VirtualRobot/XML/RobotIO.cpp +++ b/VirtualRobot/XML/RobotIO.cpp @@ -8,6 +8,7 @@ #include "../Nodes/RobotNodeFactory.h" #include "../Nodes/SensorFactory.h" #include "../Nodes/RobotNodeFixedFactory.h" +#include "../Nodes/RobotNodePrismatic.h" #include "../Transformation/DHParameter.h" #include "../Visualization/VisualizationFactory.h" #include "../Visualization/TriMeshModel.h" @@ -196,6 +197,7 @@ RobotNodePtr RobotIO::processJointNode(rapidxml::xml_node<char> *jointXMLNode, c rapidxml::xml_attribute<> *attr; float jointOffset = 0.0f; + float initialvalue = 0.0f; std::string jointType; RobotNodePtr robotNode; @@ -219,11 +221,17 @@ RobotNodePtr RobotIO::processJointNode(rapidxml::xml_node<char> *jointXMLNode, c jointType = RobotNodeFixedFactory::getName(); } - attr = jointXMLNode->first_attribute("offset", 0, false); - if (attr) - { - jointOffset = convertToFloat(attr->value()); - } + attr = jointXMLNode->first_attribute("offset", 0, false); + if (attr) + { + jointOffset = convertToFloat(attr->value()); + } + + attr = jointXMLNode->first_attribute("initialvalue", 0, false); + if (attr) + { + initialvalue = convertToFloat(attr->value()); + } rapidxml::xml_node<>* node = jointXMLNode->first_node(); rapidxml::xml_node<> *tmpXMLNodeAxis = NULL; @@ -233,6 +241,8 @@ RobotNodePtr RobotIO::processJointNode(rapidxml::xml_node<char> *jointXMLNode, c float maxVelocity = 1.0f; // m/s float maxAcceleration = 1.0f; // m/s^2 float maxTorque = 1.0f; // Nm + float scaleVisu = false; + Eigen::Vector3f scaleVisuFactor = Eigen::Vector3f::Zero(); while (node) { @@ -345,7 +355,13 @@ RobotNodePtr RobotIO::processJointNode(rapidxml::xml_node<char> *jointXMLNode, c if (attrPropa) f = convertToFloat(attrPropa->value()); propagateJVFactor.push_back(f); - } + }else if (nodeName == "scalevisualization") + { + scaleVisu = true; + scaleVisuFactor[0] = getFloatByAttributeName(node, "x"); + scaleVisuFactor[1] = getFloatByAttributeName(node, "y"); + scaleVisuFactor[2] = getFloatByAttributeName(node, "z"); + } else { THROW_VR_EXCEPTION("XML definition <" << nodeName << "> not supported in <Joint> tag of RobotNode <" << robotNodeName << ">." << endl); @@ -368,6 +384,11 @@ RobotNodePtr RobotIO::processJointNode(rapidxml::xml_node<char> *jointXMLNode, c */ if (jointType=="revolute") { + if (scaleVisu) + { + VR_WARNING << "Ignoring ScaleVisualization in Revolute joint." << endl; + scaleVisu = false; + } if (tmpXMLNodeAxis) { axis[0] = getFloatByAttributeName(tmpXMLNodeAxis, "x"); @@ -391,6 +412,11 @@ RobotNodePtr RobotIO::processJointNode(rapidxml::xml_node<char> *jointXMLNode, c { THROW_VR_EXCEPTION("Prismatic joint '" << robotNodeName << "' wrongly defined, expecting 'TranslationDirection' tag." << endl); } + if (scaleVisu) + { + THROW_VR_EXCEPTION_IF(scaleVisuFactor.norm() == 0.0f,"Zero scale factor"); + + } } //} @@ -413,6 +439,8 @@ RobotNodePtr RobotIO::processJointNode(rapidxml::xml_node<char> *jointXMLNode, c robotNode->setMaxAcceleration(maxAcceleration); robotNode->setMaxTorque(maxTorque); + robotNode->jointValue = initialvalue; + if (robotNode->isRotationalJoint() || robotNode->isTranslationalJoint()) { if (robotNode->jointValue < robotNode->jointLimitLo) @@ -420,6 +448,12 @@ RobotNodePtr RobotIO::processJointNode(rapidxml::xml_node<char> *jointXMLNode, c else if (robotNode->jointValue > robotNode->jointLimitHi) robotNode->jointValue =robotNode->jointLimitHi; } + if (scaleVisu) + { + boost::shared_ptr<RobotNodePrismatic> rnPM = boost::dynamic_pointer_cast<RobotNodePrismatic>(robotNode); + if (rnPM) + rnPM->setVisuScaleFactor(scaleVisuFactor); + } VR_ASSERT (propagateJVName.size() == propagateJVFactor.size()); for (size_t i=0;i<propagateJVName.size();i++) diff --git a/VirtualRobot/data/robots/examples/SimpleRobot/JointTranslation.xml b/VirtualRobot/data/robots/examples/SimpleRobot/JointTranslation.xml new file mode 100644 index 0000000000000000000000000000000000000000..67b34f62784b89610825fcd11b31bdd6bde1ec59 --- /dev/null +++ b/VirtualRobot/data/robots/examples/SimpleRobot/JointTranslation.xml @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<Robot Type="Simple3DoFRobot" RootNode="Joint1"> + + <RobotNode name="Joint1"> + <Visualization enable="true"> + <File type="inventor">box.iv</File> + <UseAsCollisionModel/> + </Visualization> + <Physics> + <CoM location="VisualizationBBoxCenter"/> + <Mass value="1" units="kg" /> + </Physics> + <Child name="Joint2"/> + </RobotNode> + + <!--RobotNode name="Joint2a"> + <Child name="Joint2b"/> + </RobotNode--> + + <RobotNode name="Joint2"> + <Transform> + <translation x="0" y="0" z="3000"/> + <rollpitchyaw roll="0" pitch="90" yaw="0" unitsAngle="degree"/> + </Transform> + <Joint type="revolute"> + <axis x="1" y="0" z="0"/> + <Limits unit="degree" lo="-90" hi="90"/> + </Joint> + <Child name="Joint3"/> + </RobotNode> + + + <RobotNode name="Joint3"> + <Joint type="prismatic" offset="3000"> + <TranslationDirection x="0" y="0" z="1"/> + <Limits unit="mm" lo="-1000" hi="4000"/> + <ScaleVisualization x="0.1" y="0.1" z="1"/> + </Joint> + <Visualization enable="true"> + <File type="inventor">box2.iv</File> + <UseAsCollisionModel/> + </Visualization> + <Physics> + <CoM location="VisualizationBBoxCenter"/> + <Mass value="1" units="kg" /> + </Physics> + <Child name="Joint4"/> + </RobotNode> + + + <RobotNode name="Joint4"> + <Visualization enable="true"> + <File type="inventor">sphere.iv</File> + <UseAsCollisionModel/> + </Visualization> + <Physics> + <CoM location="VisualizationBBoxCenter"/> + <Mass value="1" units="kg" /> + </Physics> + </RobotNode> + +</Robot> diff --git a/VirtualRobot/data/robots/examples/SimpleRobot/box2.iv b/VirtualRobot/data/robots/examples/SimpleRobot/box2.iv new file mode 100644 index 0000000000000000000000000000000000000000..b431e7f53fc00f4e148f3581b643db7e24400d14 --- /dev/null +++ b/VirtualRobot/data/robots/examples/SimpleRobot/box2.iv @@ -0,0 +1,19 @@ +#Inventor V2.0 ascii + +Separator { + + Units { + units MILLIMETERS + } + Material { + diffuseColor 1 1 1 + } + Translation { + translation 0 0 -1500 + } + Cube { + width 500 + height 500 + depth 3000 + } +} \ No newline at end of file