diff --git a/src/multibody/model.hpp b/src/multibody/model.hpp index d13ebf78bc9c8d7b8d5d093f182ebca6bce0b3ab..fd8eb8d482bcd803802358bbd523f3693d01b79b 100644 --- a/src/multibody/model.hpp +++ b/src/multibody/model.hpp @@ -138,7 +138,7 @@ namespace se3 ~Model() {} // std::cout << "Destroy model" << std::endl; } /// - /// \brief Add a joint to the kinematic tree. + /// \brief Add a joint to the kinematic tree with given bounds. /// /// \remark This method does not add a Frame of same name to the vector of frames. /// Use Model::addJointFrame. @@ -150,10 +150,10 @@ namespace se3 /// \param[in] joint_model The joint model. /// \param[in] joint_placement Placement of the joint inside its parent joint. /// \param[in] joint_name Name of the joint. If empty, the name is random. - /// \param[in] max_effort Maximal joint torque. (Default set to infinity). - /// \param[in] max_velocity Maximal joint velocity. (Default set to infinity). - /// \param[in] min_config Lower joint configuration. (Default set to infinity). - /// \param[in] max_config Upper joint configuration. (Default set to infinity). + /// \param[in] max_effort Maximal joint torque. + /// \param[in] max_velocity Maximal joint velocity. + /// \param[in] min_config Lower joint configuration. + /// \param[in] max_config Upper joint configuration. /// /// \return The index of the new joint. /// @@ -161,11 +161,33 @@ namespace se3 /// template<typename JointModelDerived> JointIndex addJoint(const JointIndex parent, const JointModelBase<JointModelDerived> & joint_model, const SE3 & joint_placement, - const std::string & joint_name = "", - const Eigen::VectorXd & max_effort = Eigen::VectorXd::Constant(JointModelDerived::NV,std::numeric_limits<double>::max()), - const Eigen::VectorXd & max_velocity = Eigen::VectorXd::Constant(JointModelDerived::NV,std::numeric_limits<double>::max()), - const Eigen::VectorXd & min_config = Eigen::VectorXd::Constant(JointModelDerived::NQ,std::numeric_limits<double>::min()), - const Eigen::VectorXd & max_config = Eigen::VectorXd::Constant(JointModelDerived::NQ,std::numeric_limits<double>::max()) + const Eigen::VectorXd & max_effort, + const Eigen::VectorXd & max_velocity, + const Eigen::VectorXd & min_config, + const Eigen::VectorXd & max_config, + const std::string & joint_name = "" + ); + + /// + /// \brief Add a joint to the kinematic tree with infinite bounds. + /// + /// \remark This method also adds a Frame of same name to the vector of frames. + /// \remark The inertia supported by the joint is set to Zero. + /// + /// \tparam JointModelDerived The type of the joint model. + /// + /// \param[in] parent Index of the parent joint. + /// \param[in] joint_model The joint model. + /// \param[in] joint_placement Placement of the joint inside its parent joint. + /// \param[in] joint_name Name of the joint. If empty, the name is random. + /// + /// \return The index of the new joint. + /// + /// \sa Model::appendBodyToJoint + /// + template<typename JointModelDerived> + JointIndex addJoint(const JointIndex parent, const JointModelBase<JointModelDerived> & joint_model, const SE3 & joint_placement, + const std::string & joint_name = "" ); /// diff --git a/src/multibody/model.hxx b/src/multibody/model.hxx index 1a3d3256c00d7805b8f0581f41cd5ae4452e82b8..5c1154f11a8da5e259a44bd11a030211e8e537f6 100644 --- a/src/multibody/model.hxx +++ b/src/multibody/model.hxx @@ -56,11 +56,11 @@ namespace se3 Model::JointIndex Model::addJoint(const Model::JointIndex parent, const JointModelBase<JointModelDerived> & joint_model, const SE3 & joint_placement, - const std::string & joint_name, const Eigen::VectorXd & max_effort, const Eigen::VectorXd & max_velocity, const Eigen::VectorXd & min_config, - const Eigen::VectorXd & max_config + const Eigen::VectorXd & max_config, + const std::string & joint_name ) { typedef JointModelDerived D; @@ -110,6 +110,33 @@ namespace se3 return idx; } + template<typename JointModelDerived> + Model::JointIndex Model::addJoint(const Model::JointIndex parent, + const JointModelBase<JointModelDerived> & joint_model, + const SE3 & joint_placement, + const std::string & joint_name + ) + { + typedef JointModelDerived D; + Eigen::VectorXd max_effort, max_velocity, min_config, max_config; + + if (D::NV == Eigen::Dynamic) + { + max_effort = Eigen::VectorXd::Constant(joint_model.nv(), std::numeric_limits<double>::max()); + max_velocity = Eigen::VectorXd::Constant(joint_model.nv(), std::numeric_limits<double>::max()); + min_config = Eigen::VectorXd::Constant(joint_model.nq(), std::numeric_limits<double>::max()); + max_config = Eigen::VectorXd::Constant(joint_model.nq(), std::numeric_limits<double>::max()); + } + else + { + max_effort = Eigen::VectorXd::Constant(D::NV, std::numeric_limits<double>::max()); + max_velocity = Eigen::VectorXd::Constant(D::NV, std::numeric_limits<double>::max()); + min_config = Eigen::VectorXd::Constant(D::NQ, std::numeric_limits<double>::max()); + max_config = Eigen::VectorXd::Constant(D::NQ, std::numeric_limits<double>::max()); + } + return addJoint(parent, joint_model, joint_placement, max_effort, max_velocity, min_config, max_config, joint_name); + } + inline int Model::addJointFrame (const JointIndex& jidx, int fidx) { @@ -123,6 +150,7 @@ namespace se3 return addFrame(Frame(names[jidx],jidx,fidx,SE3::Identity(),JOINT)); } + inline void Model::appendBodyToJoint(const Model::JointIndex joint_index, const Inertia & Y, const SE3 & body_placement) diff --git a/src/parsers/sample-models.cpp b/src/parsers/sample-models.cpp index 052cde20be33617bc74dcc4e9e500bf987ed6b92..aae94b3296785531471078dfcd47f645583cd94e 100644 --- a/src/parsers/sample-models.cpp +++ b/src/parsers/sample-models.cpp @@ -39,18 +39,22 @@ namespace se3 Model::JointIndex idx; if (setRandomLimits) + { idx = model.addJoint(model.getJointId(parent_name),joint, - placement, name + "_joint", - TV::Random() + TV::Constant(1), - TV::Random() + TV::Constant(1), - CV::Random() - CV::Constant(1), - CV::Random() + CV::Constant(1)); + SE3::Random(), + TV::Random() + TV::Constant(1), + TV::Random() + TV::Constant(1), + CV::Random() - CV::Constant(1), + CV::Random() + CV::Constant(1), + name + "_joint"); + model.addJointFrame(idx); + + model.appendBodyToJoint(idx,Inertia::Random(),SE3::Identity()); + model.addBodyFrame(name + "_body", idx); + } else idx = model.addJoint(model.getJointId(parent_name),joint, placement, name + "_joint"); - model.addJointFrame(idx); - model.appendBodyToJoint(idx,Inertia::Random(),SE3::Identity()); - model.addBodyFrame(name + "_body", idx); } void humanoid2d(Model & model) diff --git a/src/parsers/urdf/model.cpp b/src/parsers/urdf/model.cpp index 9b72c807d488027f3236adf64090bd85529c49df..23acf3e8b116a0cc9bfd817fd06f588bf03588ee 100644 --- a/src/parsers/urdf/model.cpp +++ b/src/parsers/urdf/model.cpp @@ -98,8 +98,8 @@ namespace se3 idx = model.addJoint(frame.parent,jmodel, frame.placement * joint_placement, - joint_name, - max_effort,max_velocity,min_config,max_config); + max_effort,max_velocity,min_config,max_config, + joint_name); FrameIndex jointFrameId = model.addJointFrame(idx, parentFrameId); appendBodyToJoint(model, jointFrameId, Y, SE3::Identity(), body_name); }