8 #include "pinocchio/parsers/urdf/model.hxx" 
   10 #include <urdf_model/model.h> 
   11 #include <urdf_parser/urdf_parser.h> 
   14 #include <boost/foreach.hpp> 
   32         const ::urdf::Vector3 & 
p = 
Y.origin.position;
 
   33         const ::urdf::Rotation & 
q = 
Y.origin.rotation;
 
   35         const Inertia::Vector3 
com(
p.x, 
p.y, 
p.z);
 
   36         const Inertia::Matrix3 & 
R =
 
   40         I << 
Y.ixx, 
Y.ixy, 
Y.ixz, 
Y.ixy, 
Y.iyy, 
Y.iyz, 
Y.ixz, 
Y.iyz, 
Y.izz;
 
   48         return Inertia::Zero();
 
   67       void parseTree(::urdf::LinkConstSharedPtr link, UrdfVisitorBase & 
model, 
const bool mimic)
 
   71         typedef UrdfVisitorBase::Vector Vector;
 
   72         typedef UrdfVisitorBase::Vector3 Vector3;
 
   76         const ::urdf::JointConstSharedPtr joint =
 
   77           ::urdf::const_pointer_cast<::urdf::Joint>(link->parent_joint);
 
   84           const std::string & link_name = link->name;
 
   85           const std::string & parent_link_name = link->getParent()->name;
 
   86           std::ostringstream joint_info;
 
   91           const SE3 jointPlacement =
 
   96           Vector max_effort(1), max_velocity(1), min_config(1), max_config(1);
 
   97           Vector friction(Vector::Constant(1, 0.)), damping(Vector::Constant(1, 0.));
 
   98           Vector3 
axis(joint->axis.x, joint->axis.y, joint->axis.z);
 
  100           const Scalar infty = std::numeric_limits<Scalar>::infinity();
 
  104           case ::urdf::Joint::FLOATING:
 
  105             joint_info << 
"joint FreeFlyer";
 
  107             max_effort = Vector::Constant(6, infty);
 
  108             max_velocity = Vector::Constant(6, infty);
 
  109             min_config = Vector::Constant(7, -infty);
 
  110             max_config = Vector::Constant(7, infty);
 
  111             min_config.tail<4>().setConstant(-1.01);
 
  112             max_config.tail<4>().setConstant(1.01);
 
  114             friction = Vector::Constant(6, 0.);
 
  115             damping = Vector::Constant(6, 0.);
 
  117             model.addJointAndBody(
 
  118               UrdfVisitorBase::FLOATING, 
axis, parentFrameId, jointPlacement, joint->name, 
Y,
 
  119               link->name, max_effort, max_velocity, min_config, max_config, friction, damping);
 
  122           case ::urdf::Joint::REVOLUTE:
 
  123             joint_info << 
"joint REVOLUTE with axis";
 
  126             assert(joint->limits);
 
  129               max_effort << joint->limits->effort;
 
  130               max_velocity << joint->limits->velocity;
 
  131               min_config << joint->limits->lower;
 
  132               max_config << joint->limits->upper;
 
  137               friction << joint->dynamics->friction;
 
  138               damping << joint->dynamics->damping;
 
  140             if (joint->mimic && mimic)
 
  142               max_effort = Vector::Constant(0, infty);
 
  143               max_velocity = Vector::Constant(0, infty);
 
  144               min_config = Vector::Constant(0, -infty);
 
  145               max_config = Vector::Constant(0, infty);
 
  147               friction = Vector::Constant(0, 0.);
 
  148               damping = Vector::Constant(0, 0.);
 
  150               MimicInfo_ mimic_info(
 
  151                 joint->mimic->joint_name, joint->mimic->multiplier, joint->mimic->offset, 
axis,
 
  152                 UrdfVisitorBase::REVOLUTE);
 
  154               model.addJointAndBody(
 
  155                 UrdfVisitorBase::MIMIC, 
axis, parentFrameId, jointPlacement, joint->name, 
Y,
 
  156                 link->name, max_effort, max_velocity, min_config, max_config, friction, damping,
 
  160               model.addJointAndBody(
 
  161                 UrdfVisitorBase::REVOLUTE, 
axis, parentFrameId, jointPlacement, joint->name, 
Y,
 
  162                 link->name, max_effort, max_velocity, min_config, max_config, friction, damping);
 
  165           case ::urdf::Joint::CONTINUOUS: 
 
  166             joint_info << 
"joint CONTINUOUS with axis";
 
  168             min_config.resize(2);
 
  169             max_config.resize(2);
 
  170             min_config << -1.01, -1.01;
 
  171             max_config << 1.01, 1.01;
 
  175               max_effort << joint->limits->effort;
 
  176               max_velocity << joint->limits->velocity;
 
  181               max_velocity << infty;
 
  186               friction << joint->dynamics->friction;
 
  187               damping << joint->dynamics->damping;
 
  190             model.addJointAndBody(
 
  191               UrdfVisitorBase::CONTINUOUS, 
axis, parentFrameId, jointPlacement, joint->name, 
Y,
 
  192               link->name, max_effort, max_velocity, min_config, max_config, friction, damping);
 
  195           case ::urdf::Joint::PRISMATIC:
 
  196             joint_info << 
"joint PRISMATIC with axis";
 
  199             assert(joint->limits);
 
  202               max_effort << joint->limits->effort;
 
  203               max_velocity << joint->limits->velocity;
 
  204               min_config << joint->limits->lower;
 
  205               max_config << joint->limits->upper;
 
  210               friction << joint->dynamics->friction;
 
  211               damping << joint->dynamics->damping;
 
  213             if (joint->mimic && mimic)
 
  215               max_effort = Vector::Constant(0, infty);
 
  216               max_velocity = Vector::Constant(0, infty);
 
  217               min_config = Vector::Constant(0, -infty);
 
  218               max_config = Vector::Constant(0, infty);
 
  220               friction = Vector::Constant(0, 0.);
 
  221               damping = Vector::Constant(0, 0.);
 
  223               MimicInfo_ mimic_info(
 
  224                 joint->mimic->joint_name, joint->mimic->multiplier, joint->mimic->offset, 
axis,
 
  225                 UrdfVisitorBase::PRISMATIC);
 
  227               model.addJointAndBody(
 
  228                 UrdfVisitorBase::MIMIC, 
axis, parentFrameId, jointPlacement, joint->name, 
Y,
 
  229                 link->name, max_effort, max_velocity, min_config, max_config, friction, damping,
 
  233               model.addJointAndBody(
 
  234                 UrdfVisitorBase::PRISMATIC, 
axis, parentFrameId, jointPlacement, joint->name, 
Y,
 
  235                 link->name, max_effort, max_velocity, min_config, max_config, friction, damping);
 
  238           case ::urdf::Joint::PLANAR:
 
  239             joint_info << 
"joint PLANAR with normal axis along Z";
 
  241             max_effort = Vector::Constant(3, infty);
 
  242             max_velocity = Vector::Constant(3, infty);
 
  243             min_config = Vector::Constant(4, -infty);
 
  244             max_config = Vector::Constant(4, infty);
 
  245             min_config.tail<2>().setConstant(-1.01);
 
  246             max_config.tail<2>().setConstant(1.01);
 
  248             friction = Vector::Constant(3, 0.);
 
  249             damping = Vector::Constant(3, 0.);
 
  251             model.addJointAndBody(
 
  252               UrdfVisitorBase::PLANAR, 
axis, parentFrameId, jointPlacement, joint->name, 
Y,
 
  253               link->name, max_effort, max_velocity, min_config, max_config, friction, damping);
 
  256           case ::urdf::Joint::FIXED:
 
  265             joint_info << 
"fixed joint";
 
  266             model.addFixedJointAndBody(parentFrameId, jointPlacement, 
joint_name, 
Y, link_name);
 
  270             throw std::invalid_argument(
"The type of joint " + 
joint_name + 
" is not supported.");
 
  274           model << 
"Adding Body" << 
'\n' 
  275                 << 
'\"' << link_name << 
"\" connected to \"" << parent_link_name
 
  276                 << 
"\" through joint \"" << 
joint_name << 
"\"\n" 
  277                 << 
"joint type: " << joint_info.str() << 
'\n' 
  278                 << 
"joint placement:\n" 
  279                 << jointPlacement << 
'\n' 
  280                 << 
"body info: " << 
'\n' 
  281                 << 
"  mass: " << 
Y.mass() << 
'\n' 
  282                 << 
"  lever: " << 
Y.lever().transpose() << 
'\n' 
  283                 << 
"  inertia elements (Ixx,Iyx,Iyy,Izx,Izy,Izz): " 
  284                 << 
Y.inertia().data().transpose() << 
'\n' 
  287         else if (link->getParent())
 
  288           throw std::invalid_argument(link->name + 
" - joint information missing.");
 
  290         BOOST_FOREACH (::urdf::LinkConstSharedPtr child, link->child_links)
 
  305         const ::urdf::ModelInterface * urdfTree, UrdfVisitorBase & 
model, 
const bool mimic)
 
  307         model.setName(urdfTree->getName());
 
  309         ::urdf::LinkConstSharedPtr root_link = urdfTree->getRoot();
 
  312         BOOST_FOREACH (::urdf::LinkConstSharedPtr child, root_link->child_links)
 
  320         ::urdf::ModelInterfaceSharedPtr urdfTree = ::urdf::parseURDFFile(
filename);
 
  324           throw std::invalid_argument(
 
  327               "contain a valid URDF model.");
 
  333         ::urdf::ModelInterfaceSharedPtr urdfTree = ::urdf::parseURDF(xmlString);
 
  337           throw std::invalid_argument(
"The XML stream does not contain a valid "