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 "