hpp-manipulation-urdf: hpp-manipulation-urdf

hpp-manipulation-urdf 9.0.2 Implementation of a parser for hpp-manipulation.

Loading...
Searching...
No Matches
hpp-manipulation-urdf

# Basic use

The library contains parser for SRDF describing robot grippers, object handles, object and environment contact surfaces.

In order to load HRP2 from a pair of URDF and SRDF files, one can do:

#include <hpp/manipulation/device.hh>
#include <hpp/manipulation/srdf/util.hh>
#include <hpp/pinocchio/urdf/util.hh>
int main (int argc, char** argv) {
using hpp::manipulation::DevicePtr_t;
using hpp::manipulation::Device;
using hpp::manipulation::srdf::loadRobotModel;
DevicePtr_t robot = Device::create ("hrp2");
pinocchio::urdf::loadUrdfModel (robot, "freeflyer", "hrp2",
"hrp2_14_description", "hrp2_14", "", "");
loadModelFromFile (robot, "hrp2",
"hrp2_14_description", "hrp2_14", "");
}
hpp::manipulation::Device
device.hh
hpp::manipulation::DevicePtr_t
shared_ptr< Device > DevicePtr_t
util.hh
util.hh

# SRDF syntax

## Handle

<handle name="name" clearance="value" approaching_direction="0 0 1">
<!-- name and clearance are required, approaching_direction is optional -->
<!-- One of the following position tag. Attributes are optional and read only if the tag has no text. -->
<position>0 0 0 1 0 0 0</position>
<position xyz="0 0 0" rpy="0 0 0"/>
<position xyz="0 0 0" wxyz="1 0 0 0"/>
<position xyz="0 0 0" xyzw="0 0 0 1"/>
<!-- the position represents the position of the handle relatively to the following link -->
<link name="link_name" />
<!-- Optionally, one may specify a mask.
It is a sequence of 6 booleans corresponding to the 3 translations
followed by the 3 rotations. True means the axis is constrained.
-->
<mask>1 1 1 0 0 0</mask>
</handle>

## Gripper

<gripper name="name" clearance="value">
<!-- Exactly 1 -->
<!-- A position tag. See handle tag for more details. -->
<position xyz="0 0 0" rpy="0 0 0"/>
<!-- the position represents the position of the gripper relatively to the following link -->
<link name="link_name" />
</gripper>

## Contact

<contact name="name">
<!-- Exactly 1 of -->
<!-- Set the link used to build the reference frame
In the first case, the position of the points below are expressed in the
link frame.
In the second case, the position of the points below are expressed in the
frame of the "index_collision_object"th collision body in the link. If
you have only one body, then set it to zero. This is a convenient way of
of defining surfaces on a particular body.
-->
<link name="link_name" />
<link name="link_name" index="index_collision_object" />
<!-- Exactly 1 -->
<!-- Sequence of 3D points expressed in the frame defined above -->
<point>-0.025 -0.025 -0.025 -0.025 0.025 -0.025 -0.025 -0.025 0.025 -0.025 0.025 0.025 </point>
<!-- Sequence of planar shape.
Shapes are defined by a sequence of points to be connected (consecutively).
For a shape defined by N points, N+1 values must be provided in this tag:
N iPoint_1 ... iPoint_N
WARNING: Shapes 3 0 1 2 and 3 0 2 1 are different because their respective orientations are opposites.
firstSegment ^ secondSegment must points outside the object -->
<shape> 3 0 2 1 3 2 1 3</shape>
<!-- DEPRECATED -->
<!-- Sequence of triangles, where a triangle is 3 point indexes in the above list of points
WARNING: Triangle 0 1 2 and 0 2 1 are different because their respective orientations are opposites
01 ^ 02 points outside the object -->
<triangle> 0 2 1 2 1 3</triangle>
</contact>

# Extend the parser

To extend the parser, you must write a class that inherits from parser::ObjectFactory. Some factories such as parser::SequenceFactory might be useful. You also have to declare the new factory to the parser:

#include <hpp/manipulation/parser/parser.hh>
// See ObjectFactory documentation for more details.
// This factory parses something like:
// <tagname>
// <position>0 0 0 1 0 0 0</position>
// <link name="linkname"/>
// </tagname>
class YourFactory : public hpp::manipulation::parser::ObjectFactory {
public:
YourFactory (ObjectFactory* parent, const XMLElement* element) :
ObjectFactory (parent, element)
{}
void YourFactory::finishTags ()
{
ObjectFactory* o (NULL);
if (!getChildOfType ("position", o)) {
// There is more than one tag <position>
// o is a pointer to the first one.
}
PositionFactory* pf = o->as <PositionFactory> ();
Transform3s position = pf->position ();
if (!getChildOfType ("link", o)) {
// There is more than one tag <link>
// o is a pointer to the first one.
}
std::string linkName = root ()->prependPrefix (o->name ());
if (!root ()->device ()) {
hppDout (error, "Device not found");
return;
}
root ()->device ()->yourfunction (linkName, position);
}
};
int main (int argc, char** argv) {
// Parameter false tells the constructor not to include default factories.
hpp::manipulation::parser::Parser p (false);
p.addObjectFactory ("tagname", hpp::manipulation::parser::create
<YourFactory>);
}
hpp::manipulation::parser::ObjectFactory
Class that catch XML Parser events for a specific tag and build the corresponding Object.
Definition parser.hh:85
hpp::manipulation::parser::ObjectFactory::root
RootFactory * root()
hpp::manipulation::parser::Parser
Parse an XML document.
Definition parser.hh:248
hpp::manipulation::parser::RootFactory::prependPrefix
std::string prependPrefix(const std::string &in) const
Definition parser.hh:212
hpp::manipulation::parser::RootFactory::device
DevicePtr_t device() const
hppDout
#define hppDout(channel, data)
hpp::manipulation::parser::create
ObjectFactory * create(ObjectFactory *parent=NULL, const XMLElement *element=NULL)
Definition parser.hh:238
hpp::manipulation::Transform3s
core::Transform3s Transform3s
parser.hh

See also
  parser::ObjectFactory