<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://openrave.programmingvision.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rdiankov</id>
		<title>OpenRAVE - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://openrave.programmingvision.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rdiankov"/>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php/Special:Contributions/Rdiankov"/>
		<updated>2026-09-10T04:33:36Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.24.4</generator>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=230</id>
		<title>Format:XML</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=230"/>
				<updated>2013-09-30T14:44:50Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
= OpenRAVE Custom XML Format =&lt;br /&gt;
&lt;br /&gt;
[[image:Openrave_robots.jpg|600px]] &lt;br /&gt;
&lt;br /&gt;
TODO: Decide on the versioning scheme&lt;br /&gt;
&lt;br /&gt;
OpenRAVE uses XML to store all robot and scene descriptions. The XML format is flexible enough to link one XML file from another like including already created objects/robots in an environment. It is also possible to specify vrml or iv formatted files within it to import models. &lt;br /&gt;
&lt;br /&gt;
All interface types can be created. Furthermore, an &amp;lt;environment&amp;gt; tag can optionally be specified to put all bodies/interfaces in.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Environment&amp;#039;&amp;#039;&amp;#039; - specify multiple objects and robots. Can also define some GUI properties like camera start location and background color. The environment allows the creation of &amp;#039;&amp;#039;&amp;#039;any&amp;#039;&amp;#039;&amp;#039; OpenRAVE interfaces. Each interface can take the &amp;#039;&amp;#039;&amp;#039;type&amp;#039;&amp;#039;&amp;#039; attribute specifying the interface type and can define custom XML readers.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039; - The basic object that all other objects derive from. A kinematic body consists of a collection of rigid bodies and joints that connect these bodies.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; - The basic robot that derives from &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039;. Usually every Robot has at least one KinBody declaration inside it. A robot can also hold a list of &amp;#039;&amp;#039;&amp;#039;Manipulator&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;AttachedSensor&amp;#039;&amp;#039;&amp;#039; objects describing the manipulation/sensing capabilities of the robot. Since plugin authors can create different robots, it is also possible to define custom fields in &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; to hold other information like balance control parameters for humanoids.&lt;br /&gt;
&lt;br /&gt;
== Transformations ==&lt;br /&gt;
&lt;br /&gt;
Most tags for links/bodies/robots hold a transformation. The following fields modify this transformation:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- xyz --&amp;gt;&lt;br /&gt;
&amp;lt;translation&amp;gt;0 1 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- w x y z --&amp;gt;&lt;br /&gt;
&amp;lt;quat&amp;gt;1 0 0 0&amp;lt;/quat&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- a 3x3 rotation matrix specified as rows first&lt;br /&gt;
r00, r01, r02,    r10, r11, r12,     r20, r21, r21 --&amp;gt;&lt;br /&gt;
&amp;lt;rotationmat&amp;gt;1 0 0 0 1 0 0 0 1&amp;lt;/rotationmat&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- axis_x axis_y axis_z angle(deg) --&amp;gt;&lt;br /&gt;
&amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multiple of the same tags can be specified, resulting in the transformations being compounded. During compounding, the translation and rotation are treated separately.&lt;br /&gt;
&lt;br /&gt;
== KinBody ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody name=&amp;quot;TestKinBody&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Create a rigid body named Body1 and declare it as &amp;#039;dynamic&amp;#039;.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;#039;dynamic&amp;#039; bodies are subject to physics laws, &amp;#039;static&amp;#039; bodies will never move--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- due to physical forces. It is recommended EVERYTHING is declared as &amp;#039;dynamic&amp;#039; --&amp;gt;&lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that the body transforms affects all geometry objects attached. --&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- translation of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;!--rotation of the body specified as a rotation axis. First three numbers are the axis.--&amp;gt;&lt;br /&gt;
    &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- defines mass properties for the entire kinbody. possible mass types are--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- mimicgeom - &amp;lt;density&amp;gt;. Adds a mass equivalent to all the geometry--&amp;gt;&lt;br /&gt;
    &amp;lt;!--    objects. trimesh and plane are not supported.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- box - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;extents&amp;gt; Adds a simple box--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- sphere - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;radius&amp;gt;--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;density&amp;gt;1000&amp;lt;/density&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Define a geometry object attached to the body. The functionality of --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- geometry objects is to define the collision and render geometries of the body. --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- All geometry types have Rotation(Mat/Quat), Translation, and Render components.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Possible geom types are box, sphere, trimesh, plane.--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *box - extents--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *sphere - radius--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *cylinder - radius, height (axis is along y)--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *trimesh - data--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- extents of the box - half width, height, length--&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;1 1 1&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;!-- set the translation and rotation of the box. Note that the transforamtions--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- are all relative to the parent body.--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;0 1 0 45&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Can create multiple geometries per body--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;2 1 2&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 1 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;!-- RotationMat is a 3x3 rotation matrix specified as rows first--&amp;gt;&lt;br /&gt;
      &amp;lt;RotationMat&amp;gt;1 0 0 0 1 0 0 0 1&amp;lt;/RotationMat&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Set the transparency of the geometry, 0 is opaque--&amp;gt;&lt;br /&gt;
      &amp;lt;transparency&amp;gt;0.4&amp;lt;/transparency&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- change the mass properties of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the total mass--&amp;gt;&lt;br /&gt;
      &amp;lt;total&amp;gt;0.40605&amp;lt;/total&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the 3x3 inertia matrix--&amp;gt;&lt;br /&gt;
      &amp;lt;inertia&amp;gt;2 0 0 0 3 0 0 0 5&amp;lt;/inertia&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the center of mass (if using ODE physics engine, should be 0)--&amp;gt;&lt;br /&gt;
      &amp;lt;com&amp;gt;0.008842 -0.000018 0.07367&amp;lt;/com&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a sphere--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;sphere&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- although the underlying collision geometry will be a sphere,--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- render it as a coffee pot--&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/coffeepot.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 -1.5 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Radius&amp;gt;1.5&amp;lt;/Radius&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a triangle mesh--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/cup.iv 0.01&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;!-- use the cup triangles for collision detection.--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The last number is the scale, in case the iv files are scaled improperly.--&amp;gt;&lt;br /&gt;
      &amp;lt;collision&amp;gt;models/objects/cup.iv 0.01&amp;lt;/collision&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1.5 -2 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Create a joint between the two bodies.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Possible joint types are: hinge, slider, universal, hinge2, and spherical.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Hinges are the most common joint type used in robots.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- For amotors, can specify mode, axis1, axis2, axis3. For each axis, first 3 values are the axis and the last value is the relative coord system (see ODE documentation).--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Every joint can have certain properties:--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxforce&amp;gt; are in number of degrees of freedom.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxvel&amp;gt;, &amp;lt;resolution&amp;gt; are scalar and apply to all DOFs.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;limits&amp;gt;, &amp;lt;limitsdeg&amp;gt;, &amp;lt;limitsrad&amp;gt; specify the joint limits --&amp;gt;&lt;br /&gt;
  &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Specify the names of the bodies, names are not case sensitive.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body1&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body2&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- anchor and axis of the hinge--&amp;gt;&lt;br /&gt;
    &amp;lt;Anchor&amp;gt;0 0 0&amp;lt;/Anchor&amp;gt;&lt;br /&gt;
    &amp;lt;Axis&amp;gt;0 1 0&amp;lt;/Axis&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Weight for configuration distance, mostly used in planners.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- for joints with &amp;gt; 1 DOF, specify 2+ values--&amp;gt;&lt;br /&gt;
    &amp;lt;Weight&amp;gt;1.0&amp;lt;/Weight&amp;gt;&lt;br /&gt;
    &amp;lt;!-- in Newton-meters (Nm)  --&amp;gt;&lt;br /&gt;
    &amp;lt;maxtorque&amp;gt;10&amp;lt;/maxtorque&amp;gt;&lt;br /&gt;
  &amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Models Directory ===&lt;br /&gt;
&lt;br /&gt;
By default, the root directory for all models files is the folder openrave is launched at. To change this, &amp;#039;&amp;#039;&amp;#039;&amp;lt;modelsdir&amp;gt;&amp;#039;&amp;#039;&amp;#039; can be used to specify model files relative to where the current xml file is. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;modelsdir&amp;gt;../mymodels&amp;lt;/modelsdir&amp;gt;&lt;br /&gt;
  &amp;lt;Body&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;render&amp;gt;kitchen/myfile.wrl&amp;lt;/render&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Circular Joints ===&lt;br /&gt;
&lt;br /&gt;
Sometimes joints will have the upper and lower limits identified, meaning that as soon as the joint gets past one limit it will wrap around to the other. Infinitely revolving hinge joints are the most common example of &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; joints where the &amp;lt;math&amp;gt;-\pi&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; limits are identified. In openrave, it is possible to set a joint as &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; like this:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint circular=&amp;quot;true&amp;quot; ...&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Adjacent Links ===&lt;br /&gt;
&lt;br /&gt;
Robot self-collision usually checks all pairs of non-adjacent links for collision; links are adjacent if they are connected to a joint. In order to reduce self-collision computation time and spurious collisions of small links, it is possible to force pairs of links to be treated as adjacent by specifying an &amp;#039;&amp;#039;&amp;#039;&amp;lt;adjacent&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag.&lt;br /&gt;
&lt;br /&gt;
=== Scale ===&lt;br /&gt;
&lt;br /&gt;
The first thing when importing a new model is to check that all the units are in meters (it is very common for robots to be in millimeters), otherwise the visualization model and the collision model will be in a different scale. to check this, open the robot and go to View-&amp;gt;Geometry-&amp;gt;Collision, this will show the collision model. If it is not the same scale, you need to go inside your model files and change the units. You can also enter a scale factor after model filenames like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;collision&amp;gt;mydata.iv 0.001&amp;lt;/collision&amp;gt;&lt;br /&gt;
&amp;lt;render&amp;gt;mydata.iv 0.001&amp;lt;/render&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this will scale the models by 0.001.&lt;br /&gt;
&lt;br /&gt;
=== Modifiable Geometry ===&lt;br /&gt;
&lt;br /&gt;
When avoiding collision obstacles, OpenRAVE can optionally use convex decompositions to speed up the environment collision checking and pad the geometry with safety regions. By default, all geometry is &amp;#039;&amp;#039;&amp;#039;modifiable&amp;#039;&amp;#039;&amp;#039;, but the user can turn it off so that the mesh is never changed by setting &amp;#039;&amp;#039;&amp;#039;modifiable=&amp;quot;false&amp;quot;&amp;#039;&amp;#039;&amp;#039; attribute in the &amp;#039;&amp;#039;&amp;#039;&amp;lt;geom&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag.&lt;br /&gt;
&lt;br /&gt;
Geometry that can make contact with the environment usually should not be modified. For example:&lt;br /&gt;
&lt;br /&gt;
- gripper links since contact points are important&lt;br /&gt;
&lt;br /&gt;
- markers and other place-holders used for tracking&lt;br /&gt;
&lt;br /&gt;
== Robot ==&lt;br /&gt;
&lt;br /&gt;
=== A simple 3DOF planar arm in XZ ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;3DOFRobot&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Create the base body, it should never move--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that all translations and rotations are with respect to this base--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- For example, the robot at the identity transformation is equivalent to the identity transformation of the first body.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Base&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.0  0.0  0.0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;radius&amp;gt;0.03&amp;lt;/radius&amp;gt;&lt;br /&gt;
        &amp;lt;height&amp;gt;0.02&amp;lt;/height&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;0.05 0.05 0.05&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the first movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm0&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Offset from is a fast way of specifying that the translation and rotation of this--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- body should be relative to another link--&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Base&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Translation relative to Base--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.01 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm0&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Base&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;4&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;3&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the second movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0.0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.0075 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the third movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.04 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.04 0.005 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;2&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;2&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Create the gripper joints:--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;RClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/RClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/RClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;RClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;RClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!--left gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;LClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0.005 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/LClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/LClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;LClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;LClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 -1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the transparency of every geometry in the KinBody--&amp;gt;&lt;br /&gt;
    &amp;lt;transparency&amp;gt;0.1&amp;lt;/transparency&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specifying the manipulator structure--&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;Arm2&amp;lt;/effector&amp;gt;   &amp;lt;!-- last link where end effector is attached--&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;Base&amp;lt;/base&amp;gt;           &amp;lt;!-- base link--&amp;gt;&lt;br /&gt;
    &amp;lt;joints&amp;gt;j1 j2&amp;lt;/joints&amp;gt;      &amp;lt;!-- the gripper joints used for contact--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- the id of the inverse kinematics solver, it is not necessary to--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify an ik solver for every robot. But if there is one,--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- use iksolver field to identity it.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;lt;iksolver&amp;gt;MyTriDOFSolver&amp;lt;/iksolver&amp;gt; --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- joint values of the closed and opened positions--&amp;gt;&lt;br /&gt;
    &amp;lt;closingdirection&amp;gt;1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
    &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
    &amp;lt;!-- grasp goal with respect to the effector--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0.125 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DOFRobot Robot:  [[image:tridof.jpg|200px]] &lt;br /&gt;
&lt;br /&gt;
=== Defining Manipulators ===&lt;br /&gt;
&lt;br /&gt;
A robot manipulator defines a kinematic chain of the robot joint hierarchy along with optional gripper joint values that are not used in the inverse kinematics computation but are needed for grasping purposes (chains for heads, legs do not need the joint values). A manipulator defines a new frame of reference with respect to the end effector link (&amp;#039;&amp;#039;&amp;#039;&amp;lt;effector&amp;gt;&amp;#039;&amp;#039;&amp;#039;); all inverse kinematics computations are computed using it. Furthermore, a manipulator can have a &amp;#039;&amp;#039;&amp;#039;&amp;lt;direction&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying an axis for approaching objects or line-of-sight. For example the &amp;#039;&amp;#039;&amp;#039;robots/barrettwam.robot.xml&amp;#039;&amp;#039;&amp;#039; gripper is defined by&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;base&amp;gt;wam0&amp;lt;/base&amp;gt; &amp;lt;!-- base link--&amp;gt;&lt;br /&gt;
  &amp;lt;effector&amp;gt;wam7&amp;lt;/effector&amp;gt; &amp;lt;!-- last link where end effector is attached--&amp;gt;&lt;br /&gt;
  &amp;lt;Translation&amp;gt;0 0 0.22&amp;lt;/Translation&amp;gt;     &amp;lt;!-- optional: offset with respect to the effector --&amp;gt;&lt;br /&gt;
  &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt; &amp;lt;!-- optional: rotational offset with respect to the effector --&amp;gt;&lt;br /&gt;
  &amp;lt;joints&amp;gt;JF1 JF2 JF3 JF4&amp;lt;/joints&amp;gt; &amp;lt;!-- optional: the gripper joints --&amp;gt;&lt;br /&gt;
  &amp;lt;closingdirection&amp;gt;1 1 1 0&amp;lt;/closingdirection&amp;gt;   &amp;lt;!-- optional: joint values of the closed and opened positions--&amp;gt;&lt;br /&gt;
  &amp;lt;direction&amp;gt;0 0 1&amp;lt;/direction&amp;gt; &amp;lt;!-- optional: specifying an axis for approaching objects or line-of-sight --&amp;gt;&lt;br /&gt;
  &amp;lt;iksolver&amp;gt;WAM7ikfast 0.05&amp;lt;/iksolver&amp;gt; &amp;lt;!-- optional: force an ik solver --&amp;gt;&lt;br /&gt;
&amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The manipulator can optionally define a &amp;#039;&amp;#039;&amp;#039;&amp;lt;iksolver&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying the iksolver interface that is used for getting IK solutions, or a shared object (DLL) to load an [[Component:Ikfast|ikfast]] solver from.&lt;br /&gt;
&lt;br /&gt;
=== Closed-chains and Mimic Joints ===&lt;br /&gt;
&lt;br /&gt;
OpenRAVE allows closed-chains and complex kinematics to be simulated using mimic joints. A mimic joint&amp;#039;s position, velocity, and acceleration values are computed from user-specified formulas using the values of other joints. OpenRAVE uses the Function Parser library to allow any formula to be specified. Refer to the documentation for more information [http://openrave.programmingvision.com/en/coreapihtml/classOpenRAVE_1_1KinBody_1_1Joint.html#a0e31c5be31c4145afa786e0c0d6a46ae here].&lt;br /&gt;
&lt;br /&gt;
A mimic joint requires at least the position equation and its partial derivatives (for velocity) to be manually entered. &lt;br /&gt;
&lt;br /&gt;
For example, the Barrett Hand mimic joints are defined as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;JF1&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;JF1mimic&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot; mimic_pos=&amp;quot;JF1/3+0.8727&amp;quot; mimic_vel=&amp;quot;|JF1 0.33333&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Of course, it is possible to have a mimic joint depend on more than one other joint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;b&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;c&amp;quot; type=&amp;quot;hinge&amp;quot; mimic_pos=&amp;quot;a+b+atan(a)&amp;quot; mimic_vel=&amp;quot;|a 1 + 1/(1+a*a) |b 1&amp;quot; mimic_accel=&amp;quot;|a -2*a/((1+a*a)*(1+a*a)) |b 0&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using mimic joints, it is important to still make all the correct joint connections so that loops are discovered and forces can be computed correctly.&lt;br /&gt;
&lt;br /&gt;
If a joint has more than one degree of freedom, attach the axis index at the end. For example: &amp;quot;mimic_pos0&amp;quot;, &amp;quot;mimic_pos1&amp;quot;, &amp;quot;mimic_vel0&amp;quot;, &amp;quot;mimic_vel1&amp;quot;, &amp;quot;mimic_accel0&amp;quot;, and &amp;quot;mimic_accel1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Attaching Robot Sensors ===&lt;br /&gt;
&lt;br /&gt;
Every robot can be attached a number of sensors onto it. The way to specify this in XML is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specify an attached sensor--&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyFirstLaser&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;link&amp;gt;wam1&amp;lt;/link&amp;gt; &amp;lt;!-- the robot link that the sensor is attached to. As the robot moves, the sensor will move with it--&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 0.2 0.4&amp;lt;/translation&amp;gt; &amp;lt;!-- the local translation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt; &amp;lt;!-- the local rotation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify the real sensor attached--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;#039;type&amp;#039; is the sensor interface identifier--&amp;gt;&lt;br /&gt;
    &amp;lt;sensor type=&amp;quot;BaseLaser2D&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The rest are specific fields to BaseLaser2D, these change as the type changes--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The best way to find out what fields are supported is to look for the documentation--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- for the type of sensor using--&amp;gt;&lt;br /&gt;
      &amp;lt;minangle&amp;gt;-135&amp;lt;/minangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;maxangle&amp;gt;135&amp;lt;/maxangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;0.35&amp;lt;/resolution&amp;gt; &amp;lt;!-- degrees between laser points--&amp;gt;&lt;br /&gt;
      &amp;lt;maxrange&amp;gt;5&amp;lt;/maxrange&amp;gt; &amp;lt;!-- max range of robot--&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting joint values for initial state ===&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot&amp;#039;s initial state is not when all the joints are at 0. Instead of transforming each of the geometry to the zero pose, it is possible to set the initial angle to use using the &amp;lt;initial&amp;gt; tag inside the &amp;lt;joint&amp;gt;. The definition for setting the initial angle to pi/2 radius is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link0&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link1&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;initial&amp;gt;1.570796326794&amp;lt;/initial&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Changing the Body Coordinate System ===&lt;br /&gt;
&lt;br /&gt;
[[image:Barrettwam_coordchange.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot origin and rotation should be defined in a different coordinate system. It is possible to create a new robot file that references the old one and changes its origin. This requires adding a new root link before the robot is defined. For example, consider the robots/barrettwam.robot.xml file whre the first link&amp;#039;s name is &amp;#039;wam0&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- add new first link --&amp;gt;&lt;br /&gt;
  &amp;lt;kinbody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;root&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;robot file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;!-- change the coordinate system of the original first link and attach a dummy joint --&amp;gt;&lt;br /&gt;
    &amp;lt;kinbody&amp;gt;&lt;br /&gt;
      &amp;lt;body name=&amp;quot;wam0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0.3 0.4 0.3&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;root&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;wam0&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;limitsdeg&amp;gt;0 0&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
== Environment Example ==&lt;br /&gt;
&lt;br /&gt;
This example is part of the &amp;#039;&amp;#039;&amp;#039;bin/data/intel/lab1.env.xml&amp;#039;&amp;#039;&amp;#039; file. The most important thing to note about this example is the use of the &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; attribute to import other XML files. The filename specified with &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; has to be &amp;#039;&amp;#039;&amp;#039;relative&amp;#039;&amp;#039;&amp;#039; to the current directory where the file calling it resides. Note the differences between segway.kinbody.xml and barrettwam.robot.xml.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the background color of the environment--&amp;gt;&lt;br /&gt;
  &amp;lt;bkgndcolor&amp;gt;0.3 0.7 0.8&amp;lt;/bkgndcolor&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera translation--&amp;gt;&lt;br /&gt;
  &amp;lt;camtrans&amp;gt;1.418 -1.234 2.963&amp;lt;/camtrans&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera rotation specified by rotation-axis--&amp;gt;&lt;br /&gt;
  &amp;lt;camrotaxis&amp;gt;0.724 0.302 0.619 68&amp;lt;/camrotaxis&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import the segway model and place it somewhere--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;data/segway.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;-0.0671   -0.0819    0.7550&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import a robot file and add an additional body for a cylindrical base--&amp;gt;&lt;br /&gt;
  &amp;lt;Robot file=&amp;quot;../../robots/barrettwam.robot.xml&amp;quot; name=&amp;quot;BarrettWAM&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;-.22 -.14 -.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Body type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
          &amp;lt;radius&amp;gt;0.08&amp;lt;/radius&amp;gt;&lt;br /&gt;
          &amp;lt;height&amp;gt;0.6&amp;lt;/height&amp;gt;&lt;br /&gt;
          &amp;lt;diffusecolor&amp;gt;0.3 0.3 0.3&amp;lt;/diffusecolor&amp;gt;&lt;br /&gt;
          &amp;lt;Translation&amp;gt; 0.2286 0.1397 -0.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;/Geom&amp;gt;&lt;br /&gt;
      &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;-0.754 0.3265 1.036&amp;lt;/translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Robot&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- add the floor as a box--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody name=&amp;quot;floor&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- floor should never move, so make it static--&amp;gt;&lt;br /&gt;
    &amp;lt;Body type=&amp;quot;static&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;2 2 0.005&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;.6 .6 .6&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      	&amp;lt;ambientColor&amp;gt;0.6 0.6 0.6&amp;lt;/ambientColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting Robot Joint Values ===&lt;br /&gt;
&lt;br /&gt;
It is possible to set the joint values of the kinbody in the scene using the &amp;#039;&amp;#039;&amp;#039;&amp;lt;jointvalues&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag. The order of the values should be the order of the DOF indices of each joint (passive/mimic joints are ignored).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;environment&amp;gt;&lt;br /&gt;
  &amp;lt;robot file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;jointvalues&amp;gt;1 1 0 0 0 0 0 0.5 0 0 0&amp;lt;/jointvalues&amp;gt;&lt;br /&gt;
  &amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot Composition ==&lt;br /&gt;
&lt;br /&gt;
The way we recommend managing robots composed of several sub-robots (like a humanoid composed of arms, legs, hands, etc) is to first create separate .kinbody files for just the kinematics and geometry of each separate&lt;br /&gt;
part (ie a hand.kinbody.xml and a arm.kinbody.xml). Then create a robot file that includes both the kinematics and defines the manipulators, sensors, and controllers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;attachedsensor&amp;gt;&lt;br /&gt;
     ....&lt;br /&gt;
 &amp;lt;/attachedsensor&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sometimes for grasp planning, the hand needs to be treated as a robot, so we create a hand.robot.xml file as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. A robot can reference other robots through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;a.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;b.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both a&amp;#039;s and b&amp;#039;s &amp;#039;&amp;#039;&amp;#039;&amp;lt;Manipulator&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;AttachedSensor&amp;gt;&amp;#039;&amp;#039;&amp;#039; tags will be used&lt;br /&gt;
in the parent robot, so you don&amp;#039; t have to copy their definitions.&lt;br /&gt;
&lt;br /&gt;
2. It is possible to prefix the links and joints of a child robot by using the&lt;br /&gt;
&amp;#039;prefix&amp;#039; attribute:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;left_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;right_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now all links and joints will either start with &amp;#039;&amp;#039;&amp;#039;left_&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;right_&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
3. When the xml parser sees a body with the same name as another body,&lt;br /&gt;
it &amp;#039;appends&amp;#039; the specified geometries to the original body. This allows the same link to be referenced/defined in multiple robot files (Note that it is not possible to change the original body coordinate system).&lt;br /&gt;
&lt;br /&gt;
=== Attaching Separate Links ===&lt;br /&gt;
&lt;br /&gt;
When a robot is composed of multiple parts defined in different files, it is necessary to attach links from the different files together so that the robot hierarchy can be complete. This is done by defining &amp;#039;&amp;#039;&amp;#039;disabled&amp;#039;&amp;#039;&amp;#039; dummy joints that attach two links together. These disabled joints do not show up in the robot&amp;#039;s description and are only present to maintain the relative transformation between two links. For example, the robot &amp;#039;&amp;#039;&amp;#039;robots/pa10schunk.robot.xml&amp;#039;&amp;#039;&amp;#039; is composed of &amp;#039;&amp;#039;&amp;#039;robots/pa10.kinbody.xml&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;robots/schunk_manip.kinbody.xml&amp;#039;&amp;#039;&amp;#039;, in order to join the two, the robot  is defined in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;pa10.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody file=&amp;quot;schunk_manip.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;False&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;link7&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;gripper_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;#039;&amp;#039;&amp;#039;link7&amp;#039;&amp;#039;&amp;#039; is a link of the pa10 arm and &amp;#039;&amp;#039;&amp;#039;gripper_base&amp;#039;&amp;#039;&amp;#039; is a link of the gripper. The lower and upper joint limits are all 0, which OpenRAVE recognizes as a dummy joint.&lt;br /&gt;
&lt;br /&gt;
=== Joining A Robot Arm and Hand ===&lt;br /&gt;
&lt;br /&gt;
It is possible to load robots and bodies from COLLADA files by specifying the collada filename through the &amp;#039;&amp;#039;&amp;#039;file&amp;#039;&amp;#039;&amp;#039; attribute. For example, the following robot is a combination of an arm defined in OpenRAVE XML and a hand defined in COLLADA (download schunkSDHHand from [http://opengrasp.sourceforge.net/Downloads.html OpenGrasp]). The dummy joint is used to join the arm end effector with the hand base.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot file=&amp;quot;robots/kuka-kr5-r650.robot.xml&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot prefix=&amp;quot;hand_&amp;quot; file=&amp;quot;schunkSDHhand.dae&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody&amp;gt;&lt;br /&gt;
   &amp;lt;body name=&amp;quot;hand_root&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;offsetfrom&amp;gt;link6&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
     &amp;lt;translation&amp;gt;0.03 0 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
     &amp;lt;rotationaxis&amp;gt;0 1 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;joint type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;link6&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;hand_root&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
   &amp;lt;/joint&amp;gt;&lt;br /&gt;
 &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;base&amp;gt;base&amp;lt;/base&amp;gt;&lt;br /&gt;
   &amp;lt;effector&amp;gt;link6&amp;lt;/effector&amp;gt;&lt;br /&gt;
   &amp;lt;joints&amp;gt;hand_Bone_B1_Joint hand_Bone_B2_Joint hand_Bone_B3_Joint hand_Bone_A1_Joint hand_Bone_A2_Joint hand_Bone_A3_Joint hand_Bone_C1_Joint hand_Bone_C2_Joint hand_Bone_C3_Joint&amp;lt;/joints&amp;gt;&lt;br /&gt;
   &amp;lt;closingdirection&amp;gt;0 1 1 0 1 1 0 1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
   &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Final robot: [[image:collada_sdh_kuka.jpg|150px]]&lt;br /&gt;
&lt;br /&gt;
=== Dual-arm example ===&lt;br /&gt;
&lt;br /&gt;
Here is an example file of having a robot composed of two arms attached to a common link named &amp;#039;&amp;#039;&amp;#039;chest&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;schunk-dualarm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;chest&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;0.1 0.1 0.4&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0 0 0.4&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/geom&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- left arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody prefix=&amp;quot;l_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 -0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody&amp;gt;prefix=&amp;quot;r_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- connect the two arms with dummy joints --&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;leftdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;l_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;rightdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;r_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;!-- define the manipulators --&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;leftarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;l_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;l_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;rightarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;r_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;r_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Single arm: [[image:schunk-lwa3.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
Dual arm: [[image:schunk-lwa3-dual.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
== Custom XML ==&lt;br /&gt;
&lt;br /&gt;
Openrave provides much more flexibility in creating and defining custom XML readers for interfaces. First the &amp;lt;environment&amp;gt; XML tag supports creating any interface type and supports loading plugins. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;plugin&amp;gt;libcustomreader&amp;lt;/plugin&amp;gt;&lt;br /&gt;
  &amp;lt;robot name=&amp;quot;wam&amp;quot; file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;controller type=&amp;quot;CustomController&amp;quot; robot=&amp;quot;wam&amp;quot; args=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    ..custom data....&lt;br /&gt;
  &amp;lt;/controller&amp;gt;&lt;br /&gt;
  &amp;lt;module type=&amp;quot;basemanipulation&amp;quot; args=&amp;quot;wam&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example, openrave will first load the plugin, then will create a robot, and then will create a controller that is attached to the robot, then will create the basemanipulation module giving it the robot name as the argument.&lt;br /&gt;
&lt;br /&gt;
Furthermore, using EnvironmentBase::RegisterXMLReader, it is possible to set a parser for custom XML tags for each interface type.  For those curious on how to take advantage of custom readers, please refer to examples/plugincpp/customreader.cpp on how to attach a custom XML reader to a controller.&lt;br /&gt;
&lt;br /&gt;
These changes will allow people to setup all their specific environment settings in the XML files without having to rely on external scripts or other programs to do it. Note that OpenRAVE processes tags in depth first order.&lt;br /&gt;
&lt;br /&gt;
== Sensor ==&lt;br /&gt;
&lt;br /&gt;
It is possible to have XML files that declare a sensor and its internal parameters. For example, &amp;#039;&amp;#039;&amp;#039;data/camera.sensor.xml&amp;#039;&amp;#039;&amp;#039; can look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;sensor type=&amp;quot;BaseCamera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KK&amp;gt;640 640 320 240&amp;lt;/KK&amp;gt;&lt;br /&gt;
  &amp;lt;width&amp;gt;640&amp;lt;/width&amp;gt;&lt;br /&gt;
  &amp;lt;height&amp;gt;480&amp;lt;/height&amp;gt;&lt;br /&gt;
  &amp;lt;framerate&amp;gt;5&amp;lt;/framerate&amp;gt;&lt;br /&gt;
  &amp;lt;color&amp;gt;0.5 0.5 1&amp;lt;/color&amp;gt;&lt;br /&gt;
&amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to attach a sensor defined by a file to a robot link do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyCamera&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is also possible to put a sensor directly in the environment without a robot. Such a sensor will not have any geometry associated with it, and will only act as a sensing source.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... environment definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;sensor name=&amp;quot;mysensor&amp;quot; file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the sensor transform --&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 1 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
  &amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== XML Reference ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; All XML handling is done in &amp;#039;&amp;#039;&amp;#039;src/libopenrave-core/xmlreaders.cpp&amp;#039;&amp;#039;&amp;#039;. If there&amp;#039;s any parameters that are not explained well, make sure to check out that source file for further reference.&lt;br /&gt;
&lt;br /&gt;
Here&amp;#039;s a list of all possible fields the XML supports in a hierarchical structure.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;environment&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;bkgndcolor&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camrotaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camtrans&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;planner&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensorsystem&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file, robot, args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;inversekinematicssolver&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;physicsengine&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;collisionchecker&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;trajectory&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;viewer&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;server&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type, makejoinedlinksadjacent&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;adjacent&amp;#039;&amp;#039;&amp;#039; - 2 body names&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (dynamic, static), file, skipgeometry, scalegeometry, enable&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;geom&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (box, sphere, trimesh, cylinder), render (true,false), modifiable (true,false)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;ambientcolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;collision&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;diffusecolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;extents&amp;#039;&amp;#039;&amp;#039; - 3 float [box]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;height&amp;#039;&amp;#039;&amp;#039; - float [cylinder]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float [cylinder, sphere]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;render&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;vertices&amp;#039;&amp;#039;&amp;#039; - 9*N floats where each 9 values defines 1 triangle with 3 vertices&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;com&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;inertia&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - body/link name&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;joint&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; enable (true, false), type (hinge, slider, universal, hinge2, spherical), circular(true, false), mimic_pos (math equation), mimic_vel (math equation), mimic_accel (math equation)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;anchor&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, hinge2, universal, spherical]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, slider]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis1&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis2&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limits&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsdeg&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in degrees if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsrad&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxvel&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxveldeg&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxaccel&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxacceldeg&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mode&amp;#039;&amp;#039;&amp;#039; - int [amotor]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - body/link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;resolution&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;weight&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxtorque&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;modelsdir&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - bodyname&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type (robot plugin type)&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;attachedsensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;link&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;...&amp;#039;&amp;#039;&amp;#039; - fields defined by SensorBase class instantiated by type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - type args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - name&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;manipulator&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;base&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closed&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;effector&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;iksolver&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;gripperjoints&amp;#039;&amp;#039;&amp;#039; - k joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closingdirection&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;direction&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - name, file, type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=ROS:Index&amp;diff=229</id>
		<title>ROS:Index</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=ROS:Index&amp;diff=229"/>
				<updated>2013-01-20T00:30:52Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
= Using OpenRAVE with ROS =&lt;br /&gt;
&lt;br /&gt;
Shows how to setup a full robot system with OpenRAVE and [http://ros.org Robot Operating System (ROS)]. Any robot system should deal with autonomous manipulation with vision feedback, sensor loops, and higher-level reasoning. &lt;br /&gt;
&lt;br /&gt;
OpenRAVE can be used in many different scenarios.&lt;br /&gt;
&lt;br /&gt;
* There is one openrave instance that does the planning and you would like all controllers/sensor feeding that to it. We&amp;#039;ll call this the &amp;#039;&amp;#039;&amp;#039;Master&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* There are openrave instances outside of the Master that wrap hardware/simulation controllers, generate simulated sensor data. These instances publish to the ROS network and usually feed into the Master openrave.&lt;br /&gt;
&lt;br /&gt;
== OpenRAVE plugins connecting to ROS ==&lt;br /&gt;
&lt;br /&gt;
There are several openrave/ros plugins that create nodes internally and advertise/subscribe to messages. These packages can be found in [http://sourceforge.net/projects/jsk-ros-pkg/?source=navbar jsk-ros-pkg]:&lt;br /&gt;
&lt;br /&gt;
* [http://www.ros.org/wiki/openraveros openraveros] - can send commands to OpenRAVE through the ROS network. There&amp;#039;s tutorials in [http://www.ros.org/wiki/openraveros_tutorials openraveros_tutorials].&lt;br /&gt;
* [http://www.ros.org/browse/details.php?name=openrave_sensors openrave_sensors] - subscribe to ROS messages for getting sensor data into openrave (loaded by Master)&lt;br /&gt;
* [http://www.ros.org/browse/details.php?name=openrave_robot_control openrave_robot_control] - simple session interface for controlling robots over the ROS network with openrave being the underlying client. You&amp;#039;ll notice in the lib folder is a librobot_control.so openrave plugin which the Master loads)&lt;br /&gt;
* [http://www.ros.org/browse/details.php?name=schunk_motion_controllers schunk_motion_controllers] - connects to the hardware Schunk interfaces and advertises services to control a robot.&lt;br /&gt;
* [http://www.ros.org/browse/details.php?name=orrosplanning orrosplanning] - misc plugins for reading sensing data and displaying it into openrave. For example, if there is a node plublishing checkerboard_detector/ObjectDetection messages, it is possible to use the &amp;#039;&amp;#039;&amp;#039;ObjectTransform&amp;#039;&amp;#039;&amp;#039; openrave SensorSystem interface to display the objects inside the environment.&lt;br /&gt;
&lt;br /&gt;
== Component Tutorials ==&lt;br /&gt;
&lt;br /&gt;
* [[ROS:ControllingRobots|Controlling Robots]] - Controlling robots through ROS using OpenRAVE&lt;br /&gt;
* [[ROS:sensors|Sensors]] - Publishing openrave sensor data through ROS.&lt;br /&gt;
* [[ROS:Object Detection]] - Simple object detection and inserting objects into the environment.&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=228</id>
		<title>Format:XML</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=228"/>
				<updated>2012-12-17T00:57:16Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
= OpenRAVE Custom XML Format =&lt;br /&gt;
&lt;br /&gt;
[[image:Openrave_robots.jpg|600px]] &lt;br /&gt;
&lt;br /&gt;
TODO: Decide on the versioning scheme&lt;br /&gt;
&lt;br /&gt;
OpenRAVE uses XML to store all robot and scene descriptions. The XML format is flexible enough to link one XML file from another like including already created objects/robots in an environment. It is also possible to specify vrml or iv formatted files within it to import models. &lt;br /&gt;
&lt;br /&gt;
All interface types can be created. Furthermore, an &amp;lt;environment&amp;gt; tag can optionally be specified to put all bodies/interfaces in.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Environment&amp;#039;&amp;#039;&amp;#039; - specify multiple objects and robots. Can also define some GUI properties like camera start location and background color. The environment allows the creation of &amp;#039;&amp;#039;&amp;#039;any&amp;#039;&amp;#039;&amp;#039; OpenRAVE interfaces. Each interface can take the &amp;#039;&amp;#039;&amp;#039;type&amp;#039;&amp;#039;&amp;#039; attribute specifying the interface type and can define custom XML readers.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039; - The basic object that all other objects derive from. A kinematic body consists of a collection of rigid bodies and joints that connect these bodies.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; - The basic robot that derives from &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039;. Usually every Robot has at least one KinBody declaration inside it. A robot can also hold a list of &amp;#039;&amp;#039;&amp;#039;Manipulator&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;AttachedSensor&amp;#039;&amp;#039;&amp;#039; objects describing the manipulation/sensing capabilities of the robot. Since plugin authors can create different robots, it is also possible to define custom fields in &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; to hold other information like balance control parameters for humanoids.&lt;br /&gt;
&lt;br /&gt;
== Transformations ==&lt;br /&gt;
&lt;br /&gt;
Most tags for links/bodies/robots hold a transformation. The following fields modify this transformation:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- xyz --&amp;gt;&lt;br /&gt;
&amp;lt;translation&amp;gt;0 1 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- w x y z --&amp;gt;&lt;br /&gt;
&amp;lt;quat&amp;gt;1 0 0 0&amp;lt;/quat&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- a 3x3 rotation matrix specified as rows first&lt;br /&gt;
r00, r01, r02,    r10, r11, r12,     r20, r21, r21 --&amp;gt;&lt;br /&gt;
&amp;lt;rotationmat&amp;gt;1 0 0 0 1 0 0 0 1&amp;lt;/rotationmat&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- axis_x axis_y axis_z angle(deg) --&amp;gt;&lt;br /&gt;
&amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multiple of the same tags can be specified, resulting in the transformations being compounded. During compounding, the translation and rotation are treated separately.&lt;br /&gt;
&lt;br /&gt;
== KinBody ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody name=&amp;quot;TestKinBody&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Create a rigid body named Body1 and declare it as &amp;#039;dynamic&amp;#039;.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;#039;dynamic&amp;#039; bodies are subject to physics laws, &amp;#039;static&amp;#039; bodies will never move--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- due to physical forces. It is recommended EVERYTHING is declared as &amp;#039;dynamic&amp;#039; --&amp;gt;&lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that the body transforms affects all geometry objects attached. --&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- translation of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;!--rotation of the body specified as a rotation axis. First three numbers are the axis.--&amp;gt;&lt;br /&gt;
    &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- defines mass properties for the entire kinbody. possible mass types are--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- mimicgeom - &amp;lt;density&amp;gt;. Adds a mass equivalent to all the geometry--&amp;gt;&lt;br /&gt;
    &amp;lt;!--    objects. trimesh and plane are not supported.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- box - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;extents&amp;gt; Adds a simple box--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- sphere - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;radius&amp;gt;--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;density&amp;gt;1000&amp;lt;/density&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Define a geometry object attached to the body. The functionality of --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- geometry objects is to define the collision and render geometries of the body. --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- All geometry types have Rotation(Mat/Quat), Translation, and Render components.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Possible geom types are box, sphere, trimesh, plane.--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *box - extents--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *sphere - radius--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *cylinder - radius, height (axis is along y)--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *trimesh - data--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- extents of the box - half width, height, length--&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;1 1 1&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;!-- set the translation and rotation of the box. Note that the transforamtions--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- are all relative to the parent body.--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;0 1 0 45&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Can create multiple geometries per body--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;2 1 2&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 1 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;!-- RotationMat is a 3x3 rotation matrix specified as rows first--&amp;gt;&lt;br /&gt;
      &amp;lt;RotationMat&amp;gt;1 0 0 0 1 0 0 0 1&amp;lt;/RotationMat&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Set the transparency of the geometry, 0 is opaque--&amp;gt;&lt;br /&gt;
      &amp;lt;transparency&amp;gt;0.4&amp;lt;/transparency&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- change the mass properties of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the total mass--&amp;gt;&lt;br /&gt;
      &amp;lt;total&amp;gt;0.40605&amp;lt;/total&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the 3x3 inertia matrix--&amp;gt;&lt;br /&gt;
      &amp;lt;inertia&amp;gt;2 0 0 0 3 0 0 0 5&amp;lt;/inertia&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the center of mass (if using ODE physics engine, should be 0)--&amp;gt;&lt;br /&gt;
      &amp;lt;com&amp;gt;0.008842 -0.000018 0.07367&amp;lt;/com&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a sphere--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;sphere&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- although the underlying collision geometry will be a sphere,--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- render it as a coffee pot--&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/coffeepot.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 -1.5 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Radius&amp;gt;1.5&amp;lt;/Radius&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a triangle mesh--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/cup.iv 0.01&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;!-- use the cup triangles for collision detection.--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The last number is the scale, in case the iv files are scaled improperly.--&amp;gt;&lt;br /&gt;
      &amp;lt;collision&amp;gt;models/objects/cup.iv 0.01&amp;lt;/collision&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1.5 -2 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Create a joint between the two bodies.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Possible joint types are: hinge, slider, universal, hinge2, and spherical.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Hinges are the most common joint type used in robots.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- For amotors, can specify mode, axis1, axis2, axis3. For each axis, first 3 values are the axis and the last value is the relative coord system (see ODE documentation).--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Every joint can have certain properties:--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxforce&amp;gt; are in number of degrees of freedom.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxvel&amp;gt;, &amp;lt;resolution&amp;gt; are scalar and apply to all DOFs.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;limits&amp;gt;, &amp;lt;limitsdeg&amp;gt;, &amp;lt;limitsrad&amp;gt; specify the joint limits --&amp;gt;&lt;br /&gt;
  &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Specify the names of the bodies, names are not case sensitive.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body1&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body2&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- anchor and axis of the hinge--&amp;gt;&lt;br /&gt;
    &amp;lt;Anchor&amp;gt;0 0 0&amp;lt;/Anchor&amp;gt;&lt;br /&gt;
    &amp;lt;Axis&amp;gt;0 1 0&amp;lt;/Axis&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Weight for configuration distance, mostly used in planners.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- for joints with &amp;gt; 1 DOF, specify 2+ values--&amp;gt;&lt;br /&gt;
    &amp;lt;Weight&amp;gt;1.0&amp;lt;/Weight&amp;gt;&lt;br /&gt;
    &amp;lt;!-- in Newton-meters (Nm)  --&amp;gt;&lt;br /&gt;
    &amp;lt;maxtorque&amp;gt;10&amp;lt;/maxtorque&amp;gt;&lt;br /&gt;
  &amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Models Directory ===&lt;br /&gt;
&lt;br /&gt;
By default, the root directory for all models files is the folder openrave is launched at. To change this, &amp;#039;&amp;#039;&amp;#039;&amp;lt;modelsdir&amp;gt;&amp;#039;&amp;#039;&amp;#039; can be used to specify model files relative to where the current xml file is. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;modelsdir&amp;gt;../mymodels&amp;lt;/modelsdir&amp;gt;&lt;br /&gt;
  &amp;lt;Body&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;render&amp;gt;kitchen/myfile.wrl&amp;lt;/render&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Circular Joints ===&lt;br /&gt;
&lt;br /&gt;
Sometimes joints will have the upper and lower limits identified, meaning that as soon as the joint gets past one limit it will wrap around to the other. Infinitely revolving hinge joints are the most common example of &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; joints where the &amp;lt;math&amp;gt;-\pi&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; limits are identified. In openrave, it is possible to set a joint as &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; like this:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint circular=&amp;quot;true&amp;quot; ...&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Adjacent Links ===&lt;br /&gt;
&lt;br /&gt;
Robot self-collision usually checks all pairs of non-adjacent links for collision; links are adjacent if they are connected to a joint. In order to reduce self-collision computation time and spurious collisions of small links, it is possible to force pairs of links to be treated as adjacent by specifying an &amp;#039;&amp;#039;&amp;#039;&amp;lt;adjacent&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag.&lt;br /&gt;
&lt;br /&gt;
=== Scale ===&lt;br /&gt;
&lt;br /&gt;
The first thing when importing a new model is to check that all the units are in meters (it is very common for robots to be in millimeters), otherwise the visualization model and the collision model will be in a different scale. to check this, open the robot and go to View-&amp;gt;Geometry-&amp;gt;Collision, this will show the collision model. If it is not the same scale, you need to go inside your model files and change the units. You can also enter a scale factor after model filenames like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;collision&amp;gt;mydata.iv 0.001&amp;lt;/collision&amp;gt;&lt;br /&gt;
&amp;lt;render&amp;gt;mydata.iv 0.001&amp;lt;/render&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this will scale the models by 0.001.&lt;br /&gt;
&lt;br /&gt;
=== Modifiable Geometry ===&lt;br /&gt;
&lt;br /&gt;
When avoiding collision obstacles, OpenRAVE can optionally use convex decompositions to speed up the environment collision checking and pad the geometry with safety regions. By default, all geometry is &amp;#039;&amp;#039;&amp;#039;modifiable&amp;#039;&amp;#039;&amp;#039;, but the user can turn it off so that the mesh is never changed by setting &amp;#039;&amp;#039;&amp;#039;modifiable=&amp;quot;false&amp;quot;&amp;#039;&amp;#039;&amp;#039; attribute in the &amp;#039;&amp;#039;&amp;#039;&amp;lt;geom&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag.&lt;br /&gt;
&lt;br /&gt;
Geometry that can make contact with the environment usually should not be modified. For example:&lt;br /&gt;
&lt;br /&gt;
- gripper links since contact points are important&lt;br /&gt;
&lt;br /&gt;
- markers and other place-holders used for tracking&lt;br /&gt;
&lt;br /&gt;
== Robot ==&lt;br /&gt;
&lt;br /&gt;
=== A simple 3DOF planar arm in XZ ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;3DOFRobot&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Create the base body, it should never move--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that all translations and rotations are with respect to this base--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- For example, the robot at the identity transformation is equivalent to the identity transformation of the first body.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Base&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.0  0.0  0.0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;radius&amp;gt;0.03&amp;lt;/radius&amp;gt;&lt;br /&gt;
        &amp;lt;height&amp;gt;0.02&amp;lt;/height&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;0.05 0.05 0.05&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the first movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm0&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Offset from is a fast way of specifying that the translation and rotation of this--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- body should be relative to another link--&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Base&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Translation relative to Base--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.01 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm0&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Base&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;4&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;3&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the second movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0.0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.0075 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the third movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.04 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.04 0.005 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;2&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;2&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Create the gripper joints:--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;RClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/RClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/RClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;RClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;RClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!--left gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;LClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0.005 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/LClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/LClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;LClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;LClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 -1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the transparency of every geometry in the KinBody--&amp;gt;&lt;br /&gt;
    &amp;lt;transparency&amp;gt;0.1&amp;lt;/transparency&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specifying the manipulator structure--&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;Arm2&amp;lt;/effector&amp;gt;   &amp;lt;!-- last link where end effector is attached--&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;Base&amp;lt;/base&amp;gt;           &amp;lt;!-- base link--&amp;gt;&lt;br /&gt;
    &amp;lt;joints&amp;gt;j1 j2&amp;lt;/joints&amp;gt;      &amp;lt;!-- the gripper joints used for contact--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- the id of the inverse kinematics solver, it is not necessary to--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify an ik solver for every robot. But if there is one,--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- use iksolver field to identity it.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;lt;iksolver&amp;gt;MyTriDOFSolver&amp;lt;/iksolver&amp;gt; --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- joint values of the closed and opened positions--&amp;gt;&lt;br /&gt;
    &amp;lt;closingdirection&amp;gt;1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
    &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
    &amp;lt;!-- grasp goal with respect to the effector--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0.125 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DOFRobot Robot:  [[image:tridof.jpg|200px]] &lt;br /&gt;
&lt;br /&gt;
=== Defining Manipulators ===&lt;br /&gt;
&lt;br /&gt;
A robot manipulator defines a kinematic chain of the robot joint hierarchy along with optional gripper joint values that are not used in the inverse kinematics computation but are needed for grasping purposes (chains for heads, legs do not need the joint values). A manipulator defines a new frame of reference with respect to the end effector link (&amp;#039;&amp;#039;&amp;#039;&amp;lt;effector&amp;gt;&amp;#039;&amp;#039;&amp;#039;); all inverse kinematics computations are computed using it. Furthermore, a manipulator can have a &amp;#039;&amp;#039;&amp;#039;&amp;lt;direction&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying an axis for approaching objects or line-of-sight. For example the &amp;#039;&amp;#039;&amp;#039;robots/barrettwam.robot.xml&amp;#039;&amp;#039;&amp;#039; gripper is defined by&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;base&amp;gt;wam0&amp;lt;/base&amp;gt; &amp;lt;!-- base link--&amp;gt;&lt;br /&gt;
  &amp;lt;effector&amp;gt;wam7&amp;lt;/effector&amp;gt; &amp;lt;!-- last link where end effector is attached--&amp;gt;&lt;br /&gt;
  &amp;lt;Translation&amp;gt;0 0 0.22&amp;lt;/Translation&amp;gt;     &amp;lt;!-- optional: offset with respect to the effector --&amp;gt;&lt;br /&gt;
  &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt; &amp;lt;!-- optional: rotational offset with respect to the effector --&amp;gt;&lt;br /&gt;
  &amp;lt;joints&amp;gt;JF1 JF2 JF3 JF4&amp;lt;/joints&amp;gt; &amp;lt;!-- optional: the gripper joints --&amp;gt;&lt;br /&gt;
  &amp;lt;closingdirection&amp;gt;1 1 1 0&amp;lt;/closingdirection&amp;gt;   &amp;lt;!-- optional: joint values of the closed and opened positions--&amp;gt;&lt;br /&gt;
  &amp;lt;direction&amp;gt;0 0 1&amp;lt;/direction&amp;gt; &amp;lt;!-- optional: specifying an axis for approaching objects or line-of-sight --&amp;gt;&lt;br /&gt;
  &amp;lt;iksolver&amp;gt;WAM7ikfast 0.05&amp;lt;/iksolver&amp;gt; &amp;lt;!-- optional: force an ik solver --&amp;gt;&lt;br /&gt;
&amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The manipulator can optionally define a &amp;#039;&amp;#039;&amp;#039;&amp;lt;iksolver&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying the iksolver interface that is used for getting IK solutions, or a shared object (DLL) to load an [[Component:Ikfast|ikfast]] solver from.&lt;br /&gt;
&lt;br /&gt;
=== Closed-chains and Mimic Joints ===&lt;br /&gt;
&lt;br /&gt;
OpenRAVE allows closed-chains and complex kinematics to be simulated using mimic joints. A mimic joint&amp;#039;s position, velocity, and acceleration values are computed from user-specified formulas using the values of other joints. OpenRAVE uses the Function Parser library to allow any formula to be specified. Refer to the documentation for more information [http://openrave.programmingvision.com/en/coreapihtml/classOpenRAVE_1_1KinBody_1_1Joint.html#a0e31c5be31c4145afa786e0c0d6a46ae here].&lt;br /&gt;
&lt;br /&gt;
A mimic joint requires at least the position equation and its partial derivatives (for velocity) to be manually entered. &lt;br /&gt;
&lt;br /&gt;
For example, the Barrett Hand mimic joints are defined as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;JF1&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;JF1mimic&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot; mimic_pos=&amp;quot;JF1/3+0.8727&amp;quot; mimic_vel=&amp;quot;|JF1 0.33333&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Of course, it is possible to have a mimic joint depend on more than one other joint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;b&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;c&amp;quot; type=&amp;quot;hinge&amp;quot; mimic_pos=&amp;quot;a+b+atan(a)&amp;quot; mimic_vel=&amp;quot;|a 1 + 1/(1+a*a) |b 1&amp;quot; mimic_accel=&amp;quot;|a -2*a/((1+a*a)*(1+a*a)) |b 0&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using mimic joints, it is important to still make all the correct joint connections so that loops are discovered and forces can be computed correctly.&lt;br /&gt;
&lt;br /&gt;
If a joint has more than one degree of freedom, attach the axis index at the end. For example: &amp;quot;mimic_pos0&amp;quot;, &amp;quot;mimic_pos1&amp;quot;, &amp;quot;mimic_vel0&amp;quot;, &amp;quot;mimic_vel1&amp;quot;, &amp;quot;mimic_accel0&amp;quot;, and &amp;quot;mimic_accel1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Attaching Robot Sensors ===&lt;br /&gt;
&lt;br /&gt;
Every robot can be attached a number of sensors onto it. The way to specify this in XML is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specify an attached sensor--&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyFirstLaser&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;link&amp;gt;wam1&amp;lt;/link&amp;gt; &amp;lt;!-- the robot link that the sensor is attached to. As the robot moves, the sensor will move with it--&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 0.2 0.4&amp;lt;/translation&amp;gt; &amp;lt;!-- the local translation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt; &amp;lt;!-- the local rotation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify the real sensor attached--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;#039;type&amp;#039; is the sensor interface identifier--&amp;gt;&lt;br /&gt;
    &amp;lt;sensor type=&amp;quot;BaseLaser2D&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The rest are specific fields to BaseLaser2D, these change as the type changes--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The best way to find out what fields are supported is to look for the documentation--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- for the type of sensor using--&amp;gt;&lt;br /&gt;
      &amp;lt;minangle&amp;gt;-135&amp;lt;/minangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;maxangle&amp;gt;135&amp;lt;/maxangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;0.35&amp;lt;/resolution&amp;gt; &amp;lt;!-- degrees between laser points--&amp;gt;&lt;br /&gt;
      &amp;lt;maxrange&amp;gt;5&amp;lt;/maxrange&amp;gt; &amp;lt;!-- max range of robot--&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting joint values for initial state ===&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot&amp;#039;s initial state is not when all the joints are at 0. Instead of transforming each of the geometry to the zero pose, it is possible to set the initial angle to use using the &amp;lt;initial&amp;gt; tag inside the &amp;lt;joint&amp;gt;. The definition for setting the initial angle to pi/2 radius is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link0&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link1&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;initial&amp;gt;1.570796326794&amp;lt;/initial&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Changing the Body Coordinate System ===&lt;br /&gt;
&lt;br /&gt;
[[image:Barrettwam_coordchange.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot origin and rotation should be defined in a different coordinate system. It is possible to create a new robot file that references the old one and changes its origin. This requires adding a new root link before the robot is defined. For example, consider the robots/barrettwam.robot.xml file whre the first link&amp;#039;s name is &amp;#039;wam0&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- add new first link --&amp;gt;&lt;br /&gt;
  &amp;lt;kinbody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;root&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;robot file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;!-- change the coordinate system of the original first link and attach a dummy joint --&amp;gt;&lt;br /&gt;
    &amp;lt;kinbody&amp;gt;&lt;br /&gt;
      &amp;lt;body name=&amp;quot;wam0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0.3 0.4 0.3&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;root&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;wam0&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;limitsdeg&amp;gt;0 0&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
== Environment Example ==&lt;br /&gt;
&lt;br /&gt;
This example is part of the &amp;#039;&amp;#039;&amp;#039;bin/data/intel/lab1.env.xml&amp;#039;&amp;#039;&amp;#039; file. The most important thing to note about this example is the use of the &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; attribute to import other XML files. The filename specified with &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; has to be &amp;#039;&amp;#039;&amp;#039;relative&amp;#039;&amp;#039;&amp;#039; to the current directory where the file calling it resides. Note the differences between segway.kinbody.xml and barrettwam.robot.xml.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the background color of the environment--&amp;gt;&lt;br /&gt;
  &amp;lt;bkgndcolor&amp;gt;0.3 0.7 0.8&amp;lt;/bkgndcolor&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera translation--&amp;gt;&lt;br /&gt;
  &amp;lt;camtrans&amp;gt;1.418 -1.234 2.963&amp;lt;/camtrans&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera rotation specified by rotation-axis--&amp;gt;&lt;br /&gt;
  &amp;lt;camrotaxis&amp;gt;0.724 0.302 0.619 68&amp;lt;/camrotaxis&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import the segway model and place it somewhere--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;data/segway.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;-0.0671   -0.0819    0.7550&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import a robot file and add an additional body for a cylindrical base--&amp;gt;&lt;br /&gt;
  &amp;lt;Robot file=&amp;quot;../../robots/barrettwam.robot.xml&amp;quot; name=&amp;quot;BarrettWAM&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;-.22 -.14 -.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Body type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
          &amp;lt;radius&amp;gt;0.08&amp;lt;/radius&amp;gt;&lt;br /&gt;
          &amp;lt;height&amp;gt;0.6&amp;lt;/height&amp;gt;&lt;br /&gt;
          &amp;lt;diffusecolor&amp;gt;0.3 0.3 0.3&amp;lt;/diffusecolor&amp;gt;&lt;br /&gt;
          &amp;lt;Translation&amp;gt; 0.2286 0.1397 -0.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;/Geom&amp;gt;&lt;br /&gt;
      &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;-0.754 0.3265 1.036&amp;lt;/translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Robot&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- add the floor as a box--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody name=&amp;quot;floor&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- floor should never move, so make it static--&amp;gt;&lt;br /&gt;
    &amp;lt;Body type=&amp;quot;static&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;2 2 0.005&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;.6 .6 .6&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      	&amp;lt;ambientColor&amp;gt;0.6 0.6 0.6&amp;lt;/ambientColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting Robot Joint Values ===&lt;br /&gt;
&lt;br /&gt;
It is possible to set the joint values of the kinbody in the scene using the &amp;#039;&amp;#039;&amp;#039;&amp;lt;jointvalues&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag. The order of the values should be the order of the DOF indices of each joint (passive/mimic joints are ignored).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;environment&amp;gt;&lt;br /&gt;
  &amp;lt;robot file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;jointvalues&amp;gt;1 1 0 0 0 0 0 0.5 0 0 0&amp;lt;/jointvalues&amp;gt;&lt;br /&gt;
  &amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot Composition ==&lt;br /&gt;
&lt;br /&gt;
The way we recommend managing robots composed of several sub-robots (like a humanoid composed of arms, legs, hands, etc) is to first create separate .kinbody files for just the kinematics and geometry of each separate&lt;br /&gt;
part (ie a hand.kinbody.xml and a arm.kinbody.xml). Then create a robot file that includes both the kinematics and defines the manipulators, sensors, and controllers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;attachedsensor&amp;gt;&lt;br /&gt;
     ....&lt;br /&gt;
 &amp;lt;/attachedsensor&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sometimes for grasp planning, the hand needs to be treated as a robot, so we create a hand.robot.xml file as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. A robot can reference other robots through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;a.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;b.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both a&amp;#039;s and b&amp;#039;s &amp;#039;&amp;#039;&amp;#039;&amp;lt;Manipulator&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;AttachedSensor&amp;gt;&amp;#039;&amp;#039;&amp;#039; tags will be used&lt;br /&gt;
in the parent robot, so you don&amp;#039; t have to copy their definitions.&lt;br /&gt;
&lt;br /&gt;
2. It is possible to prefix the links and joints of a child robot by using the&lt;br /&gt;
&amp;#039;prefix&amp;#039; attribute:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;left_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;right_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now all links and joints will either start with &amp;#039;&amp;#039;&amp;#039;left_&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;right_&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
3. When the xml parser sees a body with the same name as another body,&lt;br /&gt;
it &amp;#039;appends&amp;#039; the specified geometries to the original body. This allows the same link to be referenced/defined in multiple robot files (Note that it is not possible to change the original body coordinate system).&lt;br /&gt;
&lt;br /&gt;
=== Attaching Separate Links ===&lt;br /&gt;
&lt;br /&gt;
When a robot is composed of multiple parts defined in different files, it is necessary to attach links from the different files together so that the robot hierarchy can be complete. This is done by defining &amp;#039;&amp;#039;&amp;#039;disabled&amp;#039;&amp;#039;&amp;#039; dummy joints that attach two links together. These disabled joints do not show up in the robot&amp;#039;s description and are only present to maintain the relative transformation between two links. For example, the robot &amp;#039;&amp;#039;&amp;#039;robots/pa10schunk.robot.xml&amp;#039;&amp;#039;&amp;#039; is composed of &amp;#039;&amp;#039;&amp;#039;robots/pa10.kinbody.xml&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;robots/schunk_manip.kinbody.xml&amp;#039;&amp;#039;&amp;#039;, in order to join the two, the robot  is defined in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;pa10.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody file=&amp;quot;schunk_manip.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;False&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;link7&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;gripper_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;#039;&amp;#039;&amp;#039;link7&amp;#039;&amp;#039;&amp;#039; is a link of the pa10 arm and &amp;#039;&amp;#039;&amp;#039;gripper_base&amp;#039;&amp;#039;&amp;#039; is a link of the gripper. The lower and upper joint limits are all 0, which OpenRAVE recognizes as a dummy joint.&lt;br /&gt;
&lt;br /&gt;
=== Joining A Robot Arm and Hand ===&lt;br /&gt;
&lt;br /&gt;
It is possible to load robots and bodies from COLLADA files by specifying the collada filename through the &amp;#039;&amp;#039;&amp;#039;file&amp;#039;&amp;#039;&amp;#039; attribute. For example, the following robot is a combination of an arm defined in OpenRAVE XML and a hand defined in COLLADA (download schunkSDHHand from [http://opengrasp.sourceforge.net/Downloads.html OpenGrasp]). The dummy joint is used to join the arm end effector with the hand base.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot file=&amp;quot;robots/kuka-kr5-r650.robot.xml&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot prefix=&amp;quot;hand_&amp;quot; file=&amp;quot;schunkSDHhand.dae&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody&amp;gt;&lt;br /&gt;
   &amp;lt;body name=&amp;quot;hand_root&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;offsetfrom&amp;gt;link6&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
     &amp;lt;translation&amp;gt;0.03 0 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
     &amp;lt;rotationaxis&amp;gt;0 1 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;joint type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;link6&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;hand_root&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
   &amp;lt;/joint&amp;gt;&lt;br /&gt;
 &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;base&amp;gt;base&amp;lt;/base&amp;gt;&lt;br /&gt;
   &amp;lt;effector&amp;gt;link6&amp;lt;/effector&amp;gt;&lt;br /&gt;
   &amp;lt;joints&amp;gt;hand_Bone_B1_Joint hand_Bone_B2_Joint hand_Bone_B3_Joint hand_Bone_A1_Joint hand_Bone_A2_Joint hand_Bone_A3_Joint hand_Bone_C1_Joint hand_Bone_C2_Joint hand_Bone_C3_Joint&amp;lt;/joints&amp;gt;&lt;br /&gt;
   &amp;lt;closingdirection&amp;gt;0 1 1 0 1 1 0 1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
   &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Final robot: [[image:collada_sdh_kuka.jpg|150px]]&lt;br /&gt;
&lt;br /&gt;
=== Dual-arm example ===&lt;br /&gt;
&lt;br /&gt;
Here is an example file of having a robot composed of two arms attached to a common link named &amp;#039;&amp;#039;&amp;#039;chest&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;schunk-dualarm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;chest&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;0.1 0.1 0.4&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0 0 0.4&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/geom&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- left arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody prefix=&amp;quot;l_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 -0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody&amp;gt;prefix=&amp;quot;r_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- connect the two arms with dummy joints --&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;leftdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;l_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;rightdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;r_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;!-- define the manipulators --&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;leftarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;l_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;l_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;rightarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;r_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;r_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Single arm: [[image:schunk-lwa3.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
Dual arm: [[image:schunk-lwa3-dual.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
== Custom XML ==&lt;br /&gt;
&lt;br /&gt;
Openrave provides much more flexibility in creating and defining custom XML readers for interfaces. First the &amp;lt;environment&amp;gt; XML tag supports creating any interface type and supports loading plugins. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;plugin&amp;gt;libcustomreader&amp;lt;/plugin&amp;gt;&lt;br /&gt;
  &amp;lt;robot name=&amp;quot;wam&amp;quot; file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;controller type=&amp;quot;CustomController&amp;quot; robot=&amp;quot;wam&amp;quot; args=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    ..custom data....&lt;br /&gt;
  &amp;lt;/controller&amp;gt;&lt;br /&gt;
  &amp;lt;module type=&amp;quot;basemanipulation&amp;quot; args=&amp;quot;wam&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example, openrave will first load the plugin, then will create a robot, and then will create a controller that is attached to the robot, then will create the basemanipulation module giving it the robot name as the argument.&lt;br /&gt;
&lt;br /&gt;
Furthermore, using EnvironmentBase::RegisterXMLReader, it is possible to set a parser for custom XML tags for each interface type.  For those curious on how to take advantage of custom readers, please refer to examples/plugincpp/customreader.cpp on how to attach a custom XML reader to a controller.&lt;br /&gt;
&lt;br /&gt;
These changes will allow people to setup all their specific environment settings in the XML files without having to rely on external scripts or other programs to do it. Note that OpenRAVE processes tags in depth first order.&lt;br /&gt;
&lt;br /&gt;
== Sensor ==&lt;br /&gt;
&lt;br /&gt;
It is possible to have XML files that declare a sensor and its internal parameters. For example, &amp;#039;&amp;#039;&amp;#039;data/camera.sensor.xml&amp;#039;&amp;#039;&amp;#039; can look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;sensor type=&amp;quot;BaseCamera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KK&amp;gt;640 640 320 240&amp;lt;/KK&amp;gt;&lt;br /&gt;
  &amp;lt;width&amp;gt;640&amp;lt;/width&amp;gt;&lt;br /&gt;
  &amp;lt;height&amp;gt;480&amp;lt;/height&amp;gt;&lt;br /&gt;
  &amp;lt;framerate&amp;gt;5&amp;lt;/framerate&amp;gt;&lt;br /&gt;
  &amp;lt;color&amp;gt;0.5 0.5 1&amp;lt;/color&amp;gt;&lt;br /&gt;
&amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to attach a sensor defined by a file to a robot link do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyCamera&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is also possible to put a sensor directly in the environment without a robot. Such a sensor will not have any geometry associated with it, and will only act as a sensing source.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... environment definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;sensor name=&amp;quot;mysensor&amp;quot; file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the sensor transform --&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 1 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
  &amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== XML Reference ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; All XML handling is done in &amp;#039;&amp;#039;&amp;#039;src/libopenrave-core/xmlreaders.cpp&amp;#039;&amp;#039;&amp;#039;. If there&amp;#039;s any parameters that are not explained well, make sure to check out that source file for further reference.&lt;br /&gt;
&lt;br /&gt;
Here&amp;#039;s a list of all possible fields the XML supports in a hierarchical structure.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;environment&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;bkgndcolor&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camrotaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camtrans&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;planner&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensorsystem&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file, robot, args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;inversekinematicssolver&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;physicsengine&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;collisionchecker&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;trajectory&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;viewer&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;server&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type, makejoinedlinksadjacent&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;adjacent&amp;#039;&amp;#039;&amp;#039; - 2 body names&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (dynamic, static)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;geom&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (box, sphere, trimesh, cylinder), render (true,false), modifiable (true,false)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;ambientcolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;collision&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;diffusecolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;extents&amp;#039;&amp;#039;&amp;#039; - 3 float [box]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;height&amp;#039;&amp;#039;&amp;#039; - float [cylinder]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float [cylinder, sphere]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;render&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;vertices&amp;#039;&amp;#039;&amp;#039; - 9*N floats where each 9 values defines 1 triangle with 3 vertices&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;com&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;inertia&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - body/link name&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;joint&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; enable (true, false), type (hinge, slider, universal, hinge2, spherical), circular(true, false), mimic_pos (math equation), mimic_vel (math equation), mimic_accel (math equation)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;anchor&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, hinge2, universal, spherical]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, slider]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis1&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis2&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limits&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsdeg&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in degrees if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsrad&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxvel&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxveldeg&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxaccel&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxacceldeg&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mode&amp;#039;&amp;#039;&amp;#039; - int [amotor]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - body/link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;resolution&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;weight&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxtorque&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;modelsdir&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - bodyname&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type (robot plugin type)&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;attachedsensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;link&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;...&amp;#039;&amp;#039;&amp;#039; - fields defined by SensorBase class instantiated by type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - type args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - name&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;manipulator&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;base&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closed&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;effector&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;iksolver&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;gripperjoints&amp;#039;&amp;#039;&amp;#039; - k joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closingdirection&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;direction&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - name, file, type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=227</id>
		<title>Format:XML</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=227"/>
				<updated>2012-10-23T03:09:10Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
= OpenRAVE Custom XML Format =&lt;br /&gt;
&lt;br /&gt;
[[image:Openrave_robots.jpg|600px]] &lt;br /&gt;
&lt;br /&gt;
TODO: Decide on the versioning scheme&lt;br /&gt;
&lt;br /&gt;
OpenRAVE uses XML to store all robot and scene descriptions. The XML format is flexible enough to link one XML file from another like including already created objects/robots in an environment. It is also possible to specify vrml or iv formatted files within it to import models. &lt;br /&gt;
&lt;br /&gt;
All interface types can be created. Furthermore, an &amp;lt;environment&amp;gt; tag can optionally be specified to put all bodies/interfaces in.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Environment&amp;#039;&amp;#039;&amp;#039; - specify multiple objects and robots. Can also define some GUI properties like camera start location and background color. The environment allows the creation of &amp;#039;&amp;#039;&amp;#039;any&amp;#039;&amp;#039;&amp;#039; OpenRAVE interfaces. Each interface can take the &amp;#039;&amp;#039;&amp;#039;type&amp;#039;&amp;#039;&amp;#039; attribute specifying the interface type and can define custom XML readers.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039; - The basic object that all other objects derive from. A kinematic body consists of a collection of rigid bodies and joints that connect these bodies.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; - The basic robot that derives from &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039;. Usually every Robot has at least one KinBody declaration inside it. A robot can also hold a list of &amp;#039;&amp;#039;&amp;#039;Manipulator&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;AttachedSensor&amp;#039;&amp;#039;&amp;#039; objects describing the manipulation/sensing capabilities of the robot. Since plugin authors can create different robots, it is also possible to define custom fields in &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; to hold other information like balance control parameters for humanoids.&lt;br /&gt;
&lt;br /&gt;
== Transformations ==&lt;br /&gt;
&lt;br /&gt;
Most tags for links/bodies/robots hold a transformation. The following fields modify this transformation:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- xyz --&amp;gt;&lt;br /&gt;
&amp;lt;translation&amp;gt;0 1 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- w x y z --&amp;gt;&lt;br /&gt;
&amp;lt;quat&amp;gt;1 0 0 0&amp;lt;/quat&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- a 3x3 rotation matrix specified as rows first&lt;br /&gt;
r00, r01, r02,    r10, r11, r12,     r20, r21, r21 --&amp;gt;&lt;br /&gt;
&amp;lt;rotationmat&amp;gt;1 0 0 0 1 0 0 0 1&amp;lt;/rotationmat&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- axis_x axis_y axis_z angle(deg) --&amp;gt;&lt;br /&gt;
&amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multiple of the same tags can be specified, resulting in the transformations being compounded. During compounding, the translation and rotation are treated separately.&lt;br /&gt;
&lt;br /&gt;
== KinBody ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody name=&amp;quot;TestKinBody&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Create a rigid body named Body1 and declare it as &amp;#039;dynamic&amp;#039;.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;#039;dynamic&amp;#039; bodies are subject to physics laws, &amp;#039;static&amp;#039; bodies will never move--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- due to physical forces. It is recommended EVERYTHING is declared as &amp;#039;dynamic&amp;#039; --&amp;gt;&lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that the body transforms affects all geometry objects attached. --&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- translation of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;!--rotation of the body specified as a rotation axis. First three numbers are the axis.--&amp;gt;&lt;br /&gt;
    &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- defines mass properties for the entire kinbody. possible mass types are--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- mimicgeom - &amp;lt;density&amp;gt;. Adds a mass equivalent to all the geometry--&amp;gt;&lt;br /&gt;
    &amp;lt;!--    objects. trimesh and plane are not supported.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- box - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;extents&amp;gt; Adds a simple box--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- sphere - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;radius&amp;gt;--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;density&amp;gt;1000&amp;lt;/density&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Define a geometry object attached to the body. The functionality of --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- geometry objects is to define the collision and render geometries of the body. --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- All geometry types have Rotation(Mat/Quat), Translation, and Render components.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Possible geom types are box, sphere, trimesh, plane.--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *box - extents--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *sphere - radius--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *cylinder - radius, height (axis is along y)--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *trimesh - data--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- extents of the box - half width, height, length--&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;1 1 1&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;!-- set the translation and rotation of the box. Note that the transforamtions--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- are all relative to the parent body.--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;0 1 0 45&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Can create multiple geometries per body--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;2 1 2&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 1 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;!-- RotationMat is a 3x3 rotation matrix specified as rows first--&amp;gt;&lt;br /&gt;
      &amp;lt;RotationMat&amp;gt;1 0 0 0 1 0 0 0 1&amp;lt;/RotationMat&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Set the transparency of the geometry, 0 is opaque--&amp;gt;&lt;br /&gt;
      &amp;lt;transparency&amp;gt;0.4&amp;lt;/transparency&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- change the mass properties of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the total mass--&amp;gt;&lt;br /&gt;
      &amp;lt;total&amp;gt;0.40605&amp;lt;/total&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the 3x3 inertia matrix--&amp;gt;&lt;br /&gt;
      &amp;lt;inertia&amp;gt;2 0 0 0 3 0 0 0 5&amp;lt;/inertia&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the center of mass (if using ODE physics engine, should be 0)--&amp;gt;&lt;br /&gt;
      &amp;lt;com&amp;gt;0.008842 -0.000018 0.07367&amp;lt;/com&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a sphere--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;sphere&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- although the underlying collision geometry will be a sphere,--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- render it as a coffee pot--&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/coffeepot.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 -1.5 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Radius&amp;gt;1.5&amp;lt;/Radius&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a triangle mesh--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/cup.iv 0.01&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;!-- use the cup triangles for collision detection.--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The last number is the scale, in case the iv files are scaled improperly.--&amp;gt;&lt;br /&gt;
      &amp;lt;collision&amp;gt;models/objects/cup.iv 0.01&amp;lt;/collision&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1.5 -2 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Create a joint between the two bodies.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Possible joint types are: hinge, slider, universal, hinge2, and spherical.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Hinges are the most common joint type used in robots.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- For amotors, can specify mode, axis1, axis2, axis3. For each axis, first 3 values are the axis and the last value is the relative coord system (see ODE documentation).--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Every joint can have certain properties:--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxforce&amp;gt; are in number of degrees of freedom.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxvel&amp;gt;, &amp;lt;resolution&amp;gt; are scalar and apply to all DOFs.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;limits&amp;gt;, &amp;lt;limitsdeg&amp;gt;, &amp;lt;limitsrad&amp;gt; specify the joint limits --&amp;gt;&lt;br /&gt;
  &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Specify the names of the bodies, names are not case sensitive.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body1&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body2&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- anchor and axis of the hinge--&amp;gt;&lt;br /&gt;
    &amp;lt;Anchor&amp;gt;0 0 0&amp;lt;/Anchor&amp;gt;&lt;br /&gt;
    &amp;lt;Axis&amp;gt;0 1 0&amp;lt;/Axis&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Weight for configuration distance, mostly used in planners.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- for joints with &amp;gt; 1 DOF, specify 2+ values--&amp;gt;&lt;br /&gt;
    &amp;lt;Weight&amp;gt;1.0&amp;lt;/Weight&amp;gt;&lt;br /&gt;
    &amp;lt;!-- in Newton-meters (Nm)  --&amp;gt;&lt;br /&gt;
    &amp;lt;maxtorque&amp;gt;10&amp;lt;/maxtorque&amp;gt;&lt;br /&gt;
  &amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Models Directory ===&lt;br /&gt;
&lt;br /&gt;
By default, the root directory for all models files is the folder openrave is launched at. To change this, &amp;#039;&amp;#039;&amp;#039;&amp;lt;modelsdir&amp;gt;&amp;#039;&amp;#039;&amp;#039; can be used to specify model files relative to where the current xml file is. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;modelsdir&amp;gt;../mymodels&amp;lt;/modelsdir&amp;gt;&lt;br /&gt;
  &amp;lt;Body&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;render&amp;gt;kitchen/myfile.wrl&amp;lt;/render&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Circular Joints ===&lt;br /&gt;
&lt;br /&gt;
Sometimes joints will have the upper and lower limits identified, meaning that as soon as the joint gets past one limit it will wrap around to the other. Infinitely revolving hinge joints are the most common example of &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; joints where the &amp;lt;math&amp;gt;-\pi&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; limits are identified. In openrave, it is possible to set a joint as &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; like this:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint circular=&amp;quot;true&amp;quot; ...&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Adjacent Links ===&lt;br /&gt;
&lt;br /&gt;
Robot self-collision usually checks all pairs of non-adjacent links for collision; links are adjacent if they are connected to a joint. In order to reduce self-collision computation time and spurious collisions of small links, it is possible to force pairs of links to be treated as adjacent by specifying an &amp;#039;&amp;#039;&amp;#039;&amp;lt;adjacent&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag.&lt;br /&gt;
&lt;br /&gt;
=== Scale ===&lt;br /&gt;
&lt;br /&gt;
The first thing when importing a new model is to check that all the units are in meters (it is very common for robots to be in millimeters), otherwise the visualization model and the collision model will be in a different scale. to check this, open the robot and go to View-&amp;gt;Geometry-&amp;gt;Collision, this will show the collision model. If it is not the same scale, you need to go inside your model files and change the units. You can also enter a scale factor after model filenames like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;collision&amp;gt;mydata.iv 0.001&amp;lt;/collision&amp;gt;&lt;br /&gt;
&amp;lt;render&amp;gt;mydata.iv 0.001&amp;lt;/render&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this will scale the models by 0.001.&lt;br /&gt;
&lt;br /&gt;
=== Modifiable Geometry ===&lt;br /&gt;
&lt;br /&gt;
When avoiding collision obstacles, OpenRAVE can optionally use convex decompositions to speed up the environment collision checking and pad the geometry with safety regions. By default, all geometry is &amp;#039;&amp;#039;&amp;#039;modifiable&amp;#039;&amp;#039;&amp;#039;, but the user can turn it off so that the mesh is never changed by setting &amp;#039;&amp;#039;&amp;#039;modifiable=&amp;quot;false&amp;quot;&amp;#039;&amp;#039;&amp;#039; attribute in the &amp;#039;&amp;#039;&amp;#039;&amp;lt;geom&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag.&lt;br /&gt;
&lt;br /&gt;
Geometry that can make contact with the environment usually should not be modified. For example:&lt;br /&gt;
&lt;br /&gt;
- gripper links since contact points are important&lt;br /&gt;
&lt;br /&gt;
- markers and other place-holders used for tracking&lt;br /&gt;
&lt;br /&gt;
== Robot ==&lt;br /&gt;
&lt;br /&gt;
=== A simple 3DOF planar arm in XZ ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;3DOFRobot&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Create the base body, it should never move--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that all translations and rotations are with respect to this base--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- For example, the robot at the identity transformation is equivalent to the identity transformation of the first body.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Base&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.0  0.0  0.0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;radius&amp;gt;0.03&amp;lt;/radius&amp;gt;&lt;br /&gt;
        &amp;lt;height&amp;gt;0.02&amp;lt;/height&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;0.05 0.05 0.05&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the first movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm0&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Offset from is a fast way of specifying that the translation and rotation of this--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- body should be relative to another link--&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Base&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Translation relative to Base--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.01 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm0&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Base&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;4&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;3&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the second movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0.0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.0075 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the third movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.04 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.04 0.005 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;2&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;2&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Create the gripper joints:--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;RClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/RClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/RClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;RClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;RClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!--left gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;LClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0.005 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/LClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/LClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;LClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;LClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 -1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the transparency of every geometry in the KinBody--&amp;gt;&lt;br /&gt;
    &amp;lt;transparency&amp;gt;0.1&amp;lt;/transparency&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specifying the manipulator structure--&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;Arm2&amp;lt;/effector&amp;gt;   &amp;lt;!-- last link where end effector is attached--&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;Base&amp;lt;/base&amp;gt;           &amp;lt;!-- base link--&amp;gt;&lt;br /&gt;
    &amp;lt;joints&amp;gt;j1 j2&amp;lt;/joints&amp;gt;      &amp;lt;!-- the gripper joints used for contact--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- the id of the inverse kinematics solver, it is not necessary to--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify an ik solver for every robot. But if there is one,--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- use iksolver field to identity it.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;lt;iksolver&amp;gt;MyTriDOFSolver&amp;lt;/iksolver&amp;gt; --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- joint values of the closed and opened positions--&amp;gt;&lt;br /&gt;
    &amp;lt;closingdirection&amp;gt;1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
    &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
    &amp;lt;!-- grasp goal with respect to the effector--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0.125 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DOFRobot Robot:  [[image:tridof.jpg|200px]] &lt;br /&gt;
&lt;br /&gt;
=== Defining Manipulators ===&lt;br /&gt;
&lt;br /&gt;
A robot manipulator defines a kinematic chain of the robot joint hierarchy along with optional gripper joint values that are not used in the inverse kinematics computation but are needed for grasping purposes (chains for heads, legs do not need the joint values). A manipulator defines a new frame of reference with respect to the end effector link (&amp;#039;&amp;#039;&amp;#039;&amp;lt;effector&amp;gt;&amp;#039;&amp;#039;&amp;#039;); all inverse kinematics computations are computed using it. Furthermore, a manipulator can have a &amp;#039;&amp;#039;&amp;#039;&amp;lt;direction&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying an axis for approaching objects or line-of-sight. For example the &amp;#039;&amp;#039;&amp;#039;robots/barrettwam.robot.xml&amp;#039;&amp;#039;&amp;#039; gripper is defined by&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;base&amp;gt;wam0&amp;lt;/base&amp;gt; &amp;lt;!-- base link--&amp;gt;&lt;br /&gt;
  &amp;lt;effector&amp;gt;wam7&amp;lt;/effector&amp;gt; &amp;lt;!-- last link where end effector is attached--&amp;gt;&lt;br /&gt;
  &amp;lt;Translation&amp;gt;0 0 0.22&amp;lt;/Translation&amp;gt;     &amp;lt;!-- optional: offset with respect to the effector --&amp;gt;&lt;br /&gt;
  &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt; &amp;lt;!-- optional: rotational offset with respect to the effector --&amp;gt;&lt;br /&gt;
  &amp;lt;joints&amp;gt;JF1 JF2 JF3 JF4&amp;lt;/joints&amp;gt; &amp;lt;!-- optional: the gripper joints --&amp;gt;&lt;br /&gt;
  &amp;lt;closingdirection&amp;gt;1 1 1 0&amp;lt;/closingdirection&amp;gt;   &amp;lt;!-- optional: joint values of the closed and opened positions--&amp;gt;&lt;br /&gt;
  &amp;lt;direction&amp;gt;0 0 1&amp;lt;/direction&amp;gt; &amp;lt;!-- optional: specifying an axis for approaching objects or line-of-sight --&amp;gt;&lt;br /&gt;
  &amp;lt;iksolver&amp;gt;WAM7ikfast 0.05&amp;lt;/iksolver&amp;gt; &amp;lt;!-- optional: force an ik solver --&amp;gt;&lt;br /&gt;
&amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The manipulator can optionally define a &amp;#039;&amp;#039;&amp;#039;&amp;lt;iksolver&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying the iksolver interface that is used for getting IK solutions, or a shared object (DLL) to load an [[Component:Ikfast|ikfast]] solver from.&lt;br /&gt;
&lt;br /&gt;
=== Closed-chains and Mimic Joints ===&lt;br /&gt;
&lt;br /&gt;
OpenRAVE allows closed-chains and complex kinematics to be simulated using mimic joints. A mimic joint&amp;#039;s position, velocity, and acceleration values are computed from user-specified formulas using the values of other joints. OpenRAVE uses the Function Parser library to allow any formula to be specified. Refer to the documentation for more information [http://openrave.programmingvision.com/en/coreapihtml/classOpenRAVE_1_1KinBody_1_1Joint.html#a0e31c5be31c4145afa786e0c0d6a46ae here].&lt;br /&gt;
&lt;br /&gt;
A mimic joint requires at least the position equation and its partial derivatives (for velocity) to be manually entered. &lt;br /&gt;
&lt;br /&gt;
For example, the Barrett Hand mimic joints are defined as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;JF1&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;JF1mimic&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot; mimic_pos=&amp;quot;JF1/3+0.8727&amp;quot; mimic_vel=&amp;quot;|JF1 0.33333&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Of course, it is possible to have a mimic joint depend on more than one other joint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;b&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;c&amp;quot; type=&amp;quot;hinge&amp;quot; mimic_pos=&amp;quot;a+b+atan(a)&amp;quot; mimic_vel=&amp;quot;|a 1 + 1/(1+a*a) |b 1&amp;quot; mimic_accel=&amp;quot;|a -2*a/((1+a*a)*(1+a*a)) |b 0&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using mimic joints, it is important to still make all the correct joint connections so that loops are discovered and forces can be computed correctly.&lt;br /&gt;
&lt;br /&gt;
If a joint has more than one degree of freedom, attach the axis index at the end. For example: &amp;quot;mimic_pos0&amp;quot;, &amp;quot;mimic_pos1&amp;quot;, &amp;quot;mimic_vel0&amp;quot;, &amp;quot;mimic_vel1&amp;quot;, &amp;quot;mimic_accel0&amp;quot;, and &amp;quot;mimic_accel1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Attaching Robot Sensors ===&lt;br /&gt;
&lt;br /&gt;
Every robot can be attached a number of sensors onto it. The way to specify this in XML is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specify an attached sensor--&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyFirstLaser&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;link&amp;gt;wam1&amp;lt;/link&amp;gt; &amp;lt;!-- the robot link that the sensor is attached to. As the robot moves, the sensor will move with it--&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 0.2 0.4&amp;lt;/translation&amp;gt; &amp;lt;!-- the local translation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt; &amp;lt;!-- the local rotation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify the real sensor attached--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;#039;type&amp;#039; is the sensor interface identifier--&amp;gt;&lt;br /&gt;
    &amp;lt;sensor type=&amp;quot;BaseLaser2D&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The rest are specific fields to BaseLaser2D, these change as the type changes--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The best way to find out what fields are supported is to look for the documentation--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- for the type of sensor using--&amp;gt;&lt;br /&gt;
      &amp;lt;minangle&amp;gt;-135&amp;lt;/minangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;maxangle&amp;gt;135&amp;lt;/maxangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;0.35&amp;lt;/resolution&amp;gt; &amp;lt;!-- degrees between laser points--&amp;gt;&lt;br /&gt;
      &amp;lt;maxrange&amp;gt;5&amp;lt;/maxrange&amp;gt; &amp;lt;!-- max range of robot--&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting joint values for initial state ===&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot&amp;#039;s initial state is not when all the joints are at 0. Instead of transforming each of the geometry to the zero pose, it is possible to set the initial angle to use using the &amp;lt;initial&amp;gt; tag inside the &amp;lt;joint&amp;gt;. The definition for setting the initial angle to pi/2 radius is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link0&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link1&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;initial&amp;gt;1.570796326794&amp;lt;/initial&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Changing the Body Coordinate System ===&lt;br /&gt;
&lt;br /&gt;
[[image:Barrettwam_coordchange.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot origin and rotation should be defined in a different coordinate system. It is possible to create a new robot file that references the old one and changes its origin. This requires adding a new root link before the robot is defined. For example, consider the robots/barrettwam.robot.xml file whre the first link&amp;#039;s name is &amp;#039;wam0&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- add new first link --&amp;gt;&lt;br /&gt;
  &amp;lt;kinbody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;root&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;robot file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;!-- change the coordinate system of the original first link and attach a dummy joint --&amp;gt;&lt;br /&gt;
    &amp;lt;kinbody&amp;gt;&lt;br /&gt;
      &amp;lt;body name=&amp;quot;wam0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0.3 0.4 0.3&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;root&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;wam0&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;limitsdeg&amp;gt;0 0&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
== Environment Example ==&lt;br /&gt;
&lt;br /&gt;
This example is part of the &amp;#039;&amp;#039;&amp;#039;bin/data/intel/lab1.env.xml&amp;#039;&amp;#039;&amp;#039; file. The most important thing to note about this example is the use of the &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; attribute to import other XML files. The filename specified with &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; has to be &amp;#039;&amp;#039;&amp;#039;relative&amp;#039;&amp;#039;&amp;#039; to the current directory where the file calling it resides. Note the differences between segway.kinbody.xml and barrettwam.robot.xml.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the background color of the environment--&amp;gt;&lt;br /&gt;
  &amp;lt;bkgndcolor&amp;gt;0.3 0.7 0.8&amp;lt;/bkgndcolor&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera translation--&amp;gt;&lt;br /&gt;
  &amp;lt;camtrans&amp;gt;1.418 -1.234 2.963&amp;lt;/camtrans&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera rotation specified by rotation-axis--&amp;gt;&lt;br /&gt;
  &amp;lt;camrotaxis&amp;gt;0.724 0.302 0.619 68&amp;lt;/camrotaxis&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import the segway model and place it somewhere--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;data/segway.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;-0.0671   -0.0819    0.7550&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import a robot file and add an additional body for a cylindrical base--&amp;gt;&lt;br /&gt;
  &amp;lt;Robot file=&amp;quot;../../robots/barrettwam.robot.xml&amp;quot; name=&amp;quot;BarrettWAM&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;-.22 -.14 -.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Body type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
          &amp;lt;radius&amp;gt;0.08&amp;lt;/radius&amp;gt;&lt;br /&gt;
          &amp;lt;height&amp;gt;0.6&amp;lt;/height&amp;gt;&lt;br /&gt;
          &amp;lt;diffusecolor&amp;gt;0.3 0.3 0.3&amp;lt;/diffusecolor&amp;gt;&lt;br /&gt;
          &amp;lt;Translation&amp;gt; 0.2286 0.1397 -0.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;/Geom&amp;gt;&lt;br /&gt;
      &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;-0.754 0.3265 1.036&amp;lt;/translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Robot&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- add the floor as a box--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody name=&amp;quot;floor&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- floor should never move, so make it static--&amp;gt;&lt;br /&gt;
    &amp;lt;Body type=&amp;quot;static&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;2 2 0.005&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;.6 .6 .6&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      	&amp;lt;ambientColor&amp;gt;0.6 0.6 0.6&amp;lt;/ambientColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting Robot Joint Values ===&lt;br /&gt;
&lt;br /&gt;
It is possible to set the joint values of the kinbody in the scene using the &amp;#039;&amp;#039;&amp;#039;&amp;lt;jointvalues&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag. The order of the values should be the order of the DOF indices of each joint (passive/mimic joints are ignored).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;environment&amp;gt;&lt;br /&gt;
  &amp;lt;robot file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;jointvalues&amp;gt;1 1 0 0 0 0 0 0.5 0 0 0&amp;lt;/jointvalues&amp;gt;&lt;br /&gt;
  &amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot Composition ==&lt;br /&gt;
&lt;br /&gt;
The way we recommend managing robots composed of several sub-robots (like a humanoid composed of arms, legs, hands, etc) is to first create separate .kinbody files for just the kinematics and geometry of each separate&lt;br /&gt;
part (ie a hand.kinbody.xml and a arm.kinbody.xml). Then create a robot file that includes both the kinematics and defines the manipulators, sensors, and controllers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;attachedsensor&amp;gt;&lt;br /&gt;
     ....&lt;br /&gt;
 &amp;lt;/attachedsensor&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sometimes for grasp planning, the hand needs to be treated as a robot, so we create a hand.robot.xml file as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. A robot can reference other robots through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;a.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;b.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both a&amp;#039;s and b&amp;#039;s &amp;#039;&amp;#039;&amp;#039;&amp;lt;Manipulator&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;AttachedSensor&amp;gt;&amp;#039;&amp;#039;&amp;#039; tags will be used&lt;br /&gt;
in the parent robot, so you don&amp;#039; t have to copy their definitions.&lt;br /&gt;
&lt;br /&gt;
2. It is possible to prefix the links and joints of a child robot by using the&lt;br /&gt;
&amp;#039;prefix&amp;#039; attribute:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;left_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;right_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now all links and joints will either start with &amp;#039;&amp;#039;&amp;#039;left_&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;right_&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
3. When the xml parser sees a body with the same name as another body,&lt;br /&gt;
it &amp;#039;appends&amp;#039; the specified geometries to the original body. This allows the same link to be referenced/defined in multiple robot files (Note that it is not possible to change the original body coordinate system).&lt;br /&gt;
&lt;br /&gt;
=== Attaching Separate Links ===&lt;br /&gt;
&lt;br /&gt;
When a robot is composed of multiple parts defined in different files, it is necessary to attach links from the different files together so that the robot hierarchy can be complete. This is done by defining &amp;#039;&amp;#039;&amp;#039;disabled&amp;#039;&amp;#039;&amp;#039; dummy joints that attach two links together. These disabled joints do not show up in the robot&amp;#039;s description and are only present to maintain the relative transformation between two links. For example, the robot &amp;#039;&amp;#039;&amp;#039;robots/pa10schunk.robot.xml&amp;#039;&amp;#039;&amp;#039; is composed of &amp;#039;&amp;#039;&amp;#039;robots/pa10.kinbody.xml&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;robots/schunk_manip.kinbody.xml&amp;#039;&amp;#039;&amp;#039;, in order to join the two, the robot  is defined in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;pa10.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody file=&amp;quot;schunk_manip.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;False&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;link7&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;gripper_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;#039;&amp;#039;&amp;#039;link7&amp;#039;&amp;#039;&amp;#039; is a link of the pa10 arm and &amp;#039;&amp;#039;&amp;#039;gripper_base&amp;#039;&amp;#039;&amp;#039; is a link of the gripper. The lower and upper joint limits are all 0, which OpenRAVE recognizes as a dummy joint.&lt;br /&gt;
&lt;br /&gt;
=== Joining A Robot Arm and Hand ===&lt;br /&gt;
&lt;br /&gt;
It is possible to load robots and bodies from COLLADA files by specifying the collada filename through the &amp;#039;&amp;#039;&amp;#039;file&amp;#039;&amp;#039;&amp;#039; attribute. For example, the following robot is a combination of an arm defined in OpenRAVE XML and a hand defined in COLLADA (download schunkSDHHand from [http://opengrasp.sourceforge.net/Downloads.html OpenGrasp]). The dummy joint is used to join the arm end effector with the hand base.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot file=&amp;quot;robots/kuka-kr5-r650.robot.xml&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot prefix=&amp;quot;hand_&amp;quot; file=&amp;quot;schunkSDHhand.dae&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody&amp;gt;&lt;br /&gt;
   &amp;lt;body name=&amp;quot;hand_root&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;offsetfrom&amp;gt;link6&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
     &amp;lt;translation&amp;gt;0.03 0 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
     &amp;lt;rotationaxis&amp;gt;0 1 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;joint type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;link6&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;hand_root&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
   &amp;lt;/joint&amp;gt;&lt;br /&gt;
 &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;base&amp;gt;base&amp;lt;/base&amp;gt;&lt;br /&gt;
   &amp;lt;effector&amp;gt;link6&amp;lt;/effector&amp;gt;&lt;br /&gt;
   &amp;lt;joints&amp;gt;hand_Bone_B1_Joint hand_Bone_B2_Joint hand_Bone_B3_Joint hand_Bone_A1_Joint hand_Bone_A2_Joint hand_Bone_A3_Joint hand_Bone_C1_Joint hand_Bone_C2_Joint hand_Bone_C3_Joint&amp;lt;/joints&amp;gt;&lt;br /&gt;
   &amp;lt;closingdirection&amp;gt;0 1 1 0 1 1 0 1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
   &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Final robot: [[image:collada_sdh_kuka.jpg|150px]]&lt;br /&gt;
&lt;br /&gt;
=== Dual-arm example ===&lt;br /&gt;
&lt;br /&gt;
Here is an example file of having a robot composed of two arms attached to a common link named &amp;#039;&amp;#039;&amp;#039;chest&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;schunk-dualarm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;chest&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;0.1 0.1 0.4&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0 0 0.4&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/geom&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- left arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody prefix=&amp;quot;l_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 -0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody&amp;gt;prefix=&amp;quot;r_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- connect the two arms with dummy joints --&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;leftdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;l_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;rightdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;r_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;!-- define the manipulators --&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;leftarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;l_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;l_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
    &amp;lt;armjoints&amp;gt;l_j0 l_j1 l_j2 l_j3 l_j4 l_j5 l_j6&amp;lt;/armjoints&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;rightarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;r_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;r_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
    &amp;lt;armjoints&amp;gt;r_j0 r_j1 r_j2 r_j3 r_j4 r_j5 r_j6&amp;lt;/armjoints&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Single arm: [[image:schunk-lwa3.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
Dual arm: [[image:schunk-lwa3-dual.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
== Custom XML ==&lt;br /&gt;
&lt;br /&gt;
Openrave provides much more flexibility in creating and defining custom XML readers for interfaces. First the &amp;lt;environment&amp;gt; XML tag supports creating any interface type and supports loading plugins. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;plugin&amp;gt;libcustomreader&amp;lt;/plugin&amp;gt;&lt;br /&gt;
  &amp;lt;robot name=&amp;quot;wam&amp;quot; file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;controller type=&amp;quot;CustomController&amp;quot; robot=&amp;quot;wam&amp;quot; args=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    ..custom data....&lt;br /&gt;
  &amp;lt;/controller&amp;gt;&lt;br /&gt;
  &amp;lt;module type=&amp;quot;basemanipulation&amp;quot; args=&amp;quot;wam&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example, openrave will first load the plugin, then will create a robot, and then will create a controller that is attached to the robot, then will create the basemanipulation module giving it the robot name as the argument.&lt;br /&gt;
&lt;br /&gt;
Furthermore, using EnvironmentBase::RegisterXMLReader, it is possible to set a parser for custom XML tags for each interface type.  For those curious on how to take advantage of custom readers, please refer to examples/plugincpp/customreader.cpp on how to attach a custom XML reader to a controller.&lt;br /&gt;
&lt;br /&gt;
These changes will allow people to setup all their specific environment settings in the XML files without having to rely on external scripts or other programs to do it. Note that OpenRAVE processes tags in depth first order.&lt;br /&gt;
&lt;br /&gt;
== Sensor ==&lt;br /&gt;
&lt;br /&gt;
It is possible to have XML files that declare a sensor and its internal parameters. For example, &amp;#039;&amp;#039;&amp;#039;data/camera.sensor.xml&amp;#039;&amp;#039;&amp;#039; can look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;sensor type=&amp;quot;BaseCamera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KK&amp;gt;640 640 320 240&amp;lt;/KK&amp;gt;&lt;br /&gt;
  &amp;lt;width&amp;gt;640&amp;lt;/width&amp;gt;&lt;br /&gt;
  &amp;lt;height&amp;gt;480&amp;lt;/height&amp;gt;&lt;br /&gt;
  &amp;lt;framerate&amp;gt;5&amp;lt;/framerate&amp;gt;&lt;br /&gt;
  &amp;lt;color&amp;gt;0.5 0.5 1&amp;lt;/color&amp;gt;&lt;br /&gt;
&amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to attach a sensor defined by a file to a robot link do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyCamera&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is also possible to put a sensor directly in the environment without a robot. Such a sensor will not have any geometry associated with it, and will only act as a sensing source.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... environment definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;sensor name=&amp;quot;mysensor&amp;quot; file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the sensor transform --&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 1 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
  &amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== XML Reference ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; All XML handling is done in &amp;#039;&amp;#039;&amp;#039;src/libopenrave-core/xmlreaders.cpp&amp;#039;&amp;#039;&amp;#039;. If there&amp;#039;s any parameters that are not explained well, make sure to check out that source file for further reference.&lt;br /&gt;
&lt;br /&gt;
Here&amp;#039;s a list of all possible fields the XML supports in a hierarchical structure.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;environment&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;bkgndcolor&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camrotaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camtrans&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;planner&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensorsystem&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file, robot, args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;inversekinematicssolver&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;physicsengine&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;collisionchecker&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;trajectory&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;viewer&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;server&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type, makejoinedlinksadjacent&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;adjacent&amp;#039;&amp;#039;&amp;#039; - 2 body names&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (dynamic, static)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;geom&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (box, sphere, trimesh, cylinder), render (true,false), modifiable (true,false)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;ambientcolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;collision&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;diffusecolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;extents&amp;#039;&amp;#039;&amp;#039; - 3 float [box]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;height&amp;#039;&amp;#039;&amp;#039; - float [cylinder]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float [cylinder, sphere]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;render&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;vertices&amp;#039;&amp;#039;&amp;#039; - 9*N floats where each 9 values defines 1 triangle with 3 vertices&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;com&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;inertia&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - body/link name&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;joint&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; enable (true, false), type (hinge, slider, universal, hinge2, spherical), circular(true, false), mimic_pos (math equation), mimic_vel (math equation), mimic_accel (math equation)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;anchor&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, hinge2, universal, spherical]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, slider]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis1&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis2&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limits&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsdeg&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in degrees if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsrad&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxvel&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxveldeg&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxaccel&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxacceldeg&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mode&amp;#039;&amp;#039;&amp;#039; - int [amotor]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - body/link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;resolution&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;weight&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxtorque&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;modelsdir&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - bodyname&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type (robot plugin type)&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;attachedsensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;link&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;...&amp;#039;&amp;#039;&amp;#039; - fields defined by SensorBase class instantiated by type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - type args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - name&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;manipulator&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;armjoints&amp;#039;&amp;#039;&amp;#039; - n joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;base&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closed&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;effector&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;iksolver&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;gripperjoints&amp;#039;&amp;#039;&amp;#039; - k joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closingdirection&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;direction&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - name, file, type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=ROS:ControllingRobots&amp;diff=226</id>
		<title>ROS:ControllingRobots</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=ROS:ControllingRobots&amp;diff=226"/>
				<updated>2012-09-12T13:41:18Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Controlling Robots with ROS/OpenRAVE =&lt;br /&gt;
&lt;br /&gt;
This tutorial explains how to control robots via the [http://www.ros.org/browse/details.php?name=openrave_robot_control openrave_robot_control] package.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
By using this framework, a controller gains:&lt;br /&gt;
&lt;br /&gt;
* All robot-specific settings (like masses, max velocities, limits) come from openrave xml files to allow for consistent integration with planners.&lt;br /&gt;
* Forward/Inverse kinematics, jacobian computation, and dynamics computation.&lt;br /&gt;
* Automatically published TF Frames of all the links of the robot.&lt;br /&gt;
* Integration for openrave to send trajectory, velocity, and torque commands.&lt;br /&gt;
* Controller-level self-collision checking.&lt;br /&gt;
* Advertisement of services through ROS along with concept of &amp;#039;&amp;#039;&amp;#039;sessions&amp;#039;&amp;#039;&amp;#039; managing exclusive access to robot control.&lt;br /&gt;
* Trajectory re-timing and smoothing by OpenRAVE.&lt;br /&gt;
&lt;br /&gt;
= Setting up a Robot Example =&lt;br /&gt;
&lt;br /&gt;
==Starting a ROS robot controller==&lt;br /&gt;
&lt;br /&gt;
The first thing you need to do is startup up a robot controller, that advertises services that OpenRAVE can talk to.  There are several options available:&lt;br /&gt;
&lt;br /&gt;
#&amp;#039;&amp;#039;&amp;#039;Simulated Controller&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
#*The simplest thing is to start a simulated controller, that will let you see if your messages are getting through. Such a simulation exists in the openrave_robot_control package&lt;br /&gt;
#*It can be started by running: &amp;lt;br /&amp;gt; &amp;lt;pre&amp;gt;rosrun openrave_robot_control simulationserver --robotfile robots/schunk-lwa3.robot.xml --jointname j0 --jointname j1 --jointname j2 --jointname j3 --jointname j4 --jointname j5 --jointname j6&amp;lt;/pre&amp;gt;&lt;br /&gt;
#*Or the same command through a launchfile:&amp;lt;br /&amp;gt;&amp;lt;pre&amp;gt;  roslaunch openrave_robot_control schunkarm_sim.launch.xml&amp;lt;/pre&amp;gt;&lt;br /&gt;
#**The robot file, just like in normal OpenRAVE, found by searching the paths defined by the environmental variable OPENRAVE_DATA&lt;br /&gt;
#**the joints you wish to control must all be stated explicitly with the joint name given in the kinbody XML file&lt;br /&gt;
#*If the physics engine on openrave is set, the robot could be torque controlled and exhibit similar behaviors as the real robot. It is also possible to load in an environment in which the robot resides for getting environment contact forces.&lt;br /&gt;
#&amp;#039;&amp;#039;&amp;#039;Actual Controller&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
#*Obviously, this is going to depend on your particular robot. Here are some available controllers:&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;10&amp;quot;&lt;br /&gt;
!Hardware !! Package !! Executable !! Repository !! Interface !! Usage&lt;br /&gt;
|-&lt;br /&gt;
|Schunk LWA3 &lt;br /&gt;
| [http://www.ros.org/browse/details.php?name=schunk_motion_controllers schunk_motion_controllers] &lt;br /&gt;
| shunk_server &lt;br /&gt;
| [http://sourceforge.net/projects/cmu-ros-pkg/ cmu-ros-pkg] &lt;br /&gt;
| Serial and CAN(ntcan lib needed) || schunk_server [--device &amp;#039;&amp;#039;can or serial&amp;#039;&amp;#039;] [--moduleid id] [--robotfile openravefile] [--maxvelmult multiplier] [--serial serialport] [--can canport]&lt;br /&gt;
|-&lt;br /&gt;
|Mitsubishi PA10        &lt;br /&gt;
| [http://www.ros.org/browse/details.php?name=pa10controller pa10controller]            &lt;br /&gt;
| pa10server   &lt;br /&gt;
| [http://sourceforge.net/projects/cmu-ros-pkg/ cmu-ros-pkg] &lt;br /&gt;
| ??             &lt;br /&gt;
| pa10server [--robotfile openravefile] [--manipname manipulator name] [--maxvelmult multiplier]&lt;br /&gt;
|-&lt;br /&gt;
|maxon motors&lt;br /&gt;
| [http://www.ros.org/browse/details.php?name=maxondrivers maxondrivers]&lt;br /&gt;
| eposserver&lt;br /&gt;
| [http://sourceforge.net/projects/cmu-ros-pkg/ cmu-ros-pkg] &lt;br /&gt;
| CAN (ntcan library)&lt;br /&gt;
| eposserver [--can port] [--robotfile openravefile] [--manipname name] [--maxvelmult multiplier]&lt;br /&gt;
|-&lt;br /&gt;
|maxon motors + pid&lt;br /&gt;
| [http://www.ros.org/browse/details.php?name=armrobot armrobot]&lt;br /&gt;
| armrobot&lt;br /&gt;
| [http://sourceforge.net/projects/cmu-ros-pkg/ cmu-ros-pkg] &lt;br /&gt;
| openrave_robot_control&lt;br /&gt;
| armrobot [--can port] [--robotfile openravefile] [--manipname name] [--maxvelmult multiplier]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Verify the controller is running ===&lt;br /&gt;
You will notice the above ROS nodes advertise ROS services (They are actually sessions, which are collections of services)&lt;br /&gt;
You can check that they are advertising by running:&lt;br /&gt;
  rosservice list&lt;br /&gt;
  rostopic list &lt;br /&gt;
For the simulated controller, you will see the additional services:&lt;br /&gt;
  /Brake&lt;br /&gt;
  /Cancel&lt;br /&gt;
  /Query&lt;br /&gt;
  /StartTorque&lt;br /&gt;
  /StartTrajectory&lt;br /&gt;
  /StartVelocity&lt;br /&gt;
  /Wait&lt;br /&gt;
  /controller_session&lt;br /&gt;
  /schunk_simulation/get_loggers&lt;br /&gt;
  /schunk_simulation/set_logger_level&lt;br /&gt;
and the additional topics:&lt;br /&gt;
  /mechanism_state&lt;br /&gt;
  /tf&lt;br /&gt;
Especially important is the &amp;#039;/controller_session&amp;#039; service.  This is how OpenRAVE will talk with the ROS node.&lt;br /&gt;
&lt;br /&gt;
=== OpenRAVE Simulated Controller Example ===&lt;br /&gt;
&lt;br /&gt;
Here is an example of openrave connecting to a robot simulated using &amp;#039;&amp;#039;&amp;#039;simulationserver&amp;#039;&amp;#039;&amp;#039; and setting random values. To start the example do:&lt;br /&gt;
&lt;br /&gt;
 roslaunch openrave_robot_control wam_sim.launch.xml&lt;br /&gt;
&lt;br /&gt;
The ROS launch file is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- shows how to start a simple simulation controller on the WAM--&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;machine name=&amp;quot;wam&amp;quot; address=&amp;quot;localhost&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;node machine=&amp;quot;wam&amp;quot; name=&amp;quot;wam&amp;quot; pkg=&amp;quot;openrave_robot_control&amp;quot; type=&amp;quot;simulationserver&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; args=&amp;quot;--robotfile robots/barrettsegway.robot.xml --manipname arm --maxvelmult 1.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node machine=&amp;quot;wam&amp;quot; name=&amp;quot;openrave&amp;quot; pkg=&amp;quot;openrave_robot_control&amp;quot; type=&amp;quot;testopenravecontrol.py&amp;quot; respawn=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;env name=&amp;quot;OPENRAVE_PLUGINS&amp;quot; value=&amp;quot;$(optenv OPENRAVE_PLUGINS):$(find openrave_robot_control)/lib&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The simple openravepy file to set the commands is:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
from openravepy import *&lt;br /&gt;
from numpy import *&lt;br /&gt;
import time&lt;br /&gt;
env = Environment() # create openrave environment&lt;br /&gt;
env.SetViewer(&amp;#039;qtcoin&amp;#039;)&lt;br /&gt;
env.Load(&amp;#039;robots/barrettwam.robot.xml&amp;#039;)&lt;br /&gt;
robot = env.GetRobots()[0] # get the first robot&lt;br /&gt;
manip = robot.GetManipulators()[0]&lt;br /&gt;
jointnames = &amp;#039; &amp;#039;.join(robot.GetJoints()[j].GetName() for j in manip.GetArmJoints())&lt;br /&gt;
robot.SetController(env.CreateController(&amp;#039;ROSOpenRAVE + trajectoryservice /controller_session &amp;#039;+jointnames))&lt;br /&gt;
&lt;br /&gt;
lower,upper = robot.GetJointLimits()&lt;br /&gt;
&lt;br /&gt;
# sending velocity command?&lt;br /&gt;
#robot.GetController().SendCommand(&amp;quot;setvelocity 4 .01&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
    with robot: # save the robot state and get random joint values that are collision free&lt;br /&gt;
        while True:&lt;br /&gt;
            values = lower + random.rand(len(lower))*(upper-lower)&lt;br /&gt;
            robot.SetJointValues(values)&lt;br /&gt;
            if not robot.CheckSelfCollision() and not env.CheckCollision(robot):&lt;br /&gt;
                break&lt;br /&gt;
    print &amp;#039;setting: &amp;#039;,values&lt;br /&gt;
    robot.GetController().SetDesired(values)&lt;br /&gt;
    robot.WaitForController(0)&lt;br /&gt;
    time.sleep(1.0)&lt;br /&gt;
&lt;br /&gt;
env.Destroy()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Loading the Robot into the OpenRAVE Master ==&lt;br /&gt;
==== Add ROSOpenRAVE Controller to the Path ====&lt;br /&gt;
You need to add the directory holding the &amp;#039;&amp;#039;&amp;#039;librobot_control.so&amp;#039;&amp;#039;&amp;#039; openrave plugin to the OPENRAVE_PLUGINS environment variables. This is possible by putting the following path inside the bashrc file:&lt;br /&gt;
&lt;br /&gt;
 export OPENRAVE_PLUGINS=$OPENRAVE_PLUGINS:`rospack find openrave`/share/openrave/plugins:`rospack find openrave_robot_control`/lib &lt;br /&gt;
&lt;br /&gt;
Executing &amp;#039;openrave --listplugins&amp;#039; should show the &amp;#039;&amp;#039;&amp;#039;ROSOpenRAVE&amp;#039;&amp;#039;&amp;#039; controller interface.&lt;br /&gt;
&lt;br /&gt;
==== Load the ROSOpenRAVE controller interface into OpenRAVE ====&lt;br /&gt;
&lt;br /&gt;
Load the ROSOpenRAVE controller interface into openrave coming from the librobot_control.so and tell it to read the correct schunk service. The shared object contains a &amp;#039;&amp;#039;&amp;#039;Controller&amp;#039;&amp;#039;&amp;#039; interface, which has to be set on the robot in order to take effect. See [[Started:SettingControllers|Setting Controllers]] for how to do this.&lt;br /&gt;
&lt;br /&gt;
Another cool thing with the ROSOpenRAVE interface is that any number of separate pieces of hardware can be trated as the same robot (for example two schunk arms + gripper). All you have to do is specify multiple &amp;#039;&amp;#039;&amp;#039;trajectoryservice&amp;#039;&amp;#039;&amp;#039; tags for each root service your controllers publish. For example, these are the luanch scripts for setting up a PA10 arm and a Schunk serial manipulator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;machine name=&amp;quot;pa10&amp;quot; address=&amp;quot;localhost&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;machine name=&amp;quot;schunk&amp;quot; address=&amp;quot;localhost&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;group ns=&amp;quot;pa10&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;node machine=&amp;quot;pa10&amp;quot; name=&amp;quot;pa10&amp;quot; pkg=&amp;quot;pa10controller&amp;quot; type=&amp;quot;pa10server&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; args=&amp;quot;--robotfile robots/pa10schunk.robot.xml --maxvelmult 0.1&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;env name=&amp;quot;OPENRAVE_DATA&amp;quot; value=&amp;quot;$(optenv OPENRAVE_DATA):$(find openrave)/share/openrave&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/node&amp;gt;&lt;br /&gt;
 &amp;lt;/group&amp;gt;&lt;br /&gt;
 &amp;lt;group ns=&amp;quot;schunk&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;node machine=&amp;quot;schunk&amp;quot; name=&amp;quot;schunk&amp;quot; pkg=&amp;quot;schunk_motion_controllers&amp;quot; type=&amp;quot;schunk_serial_server&amp;quot; respawn=&amp;quot;true&amp;quot; output=&amp;quot;screen&amp;quot; args=&amp;quot; --robotfile robots/pa10schunk.robot.xml --serial /dev/ttyUSB1&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;env name=&amp;quot;OPENRAVE_DATA&amp;quot; value=&amp;quot;$(optenv OPENRAVE_DATA):$(find openrave)/share/openrave&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/node&amp;gt;&lt;br /&gt;
 &amp;lt;/group&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(OPENRAVE_DATA tells the system where to look for the openrave robot files. )&lt;br /&gt;
&lt;br /&gt;
This will setup two namespaces with these root services&lt;br /&gt;
 /pa10/controller_session&lt;br /&gt;
 /schunk/controller_session&lt;br /&gt;
&lt;br /&gt;
Then in openrave, load the ROSOpenRAVE controller interface with the following arguments&lt;br /&gt;
&lt;br /&gt;
 trajectoryservice /pa10/controller_session trajectoryservice /schunk/controller_session joints S1 S2 S3 E1 E2 W1 W2 jfinger_L&lt;br /&gt;
&lt;br /&gt;
This tells the controller that the joints it should control are &amp;quot;S1 S2 S3 E1 E2 W1 W2 jfinger_L&amp;quot;, which come from the ROS services.&lt;br /&gt;
&lt;br /&gt;
==== Using Python for Testing Controller Communication ====&lt;br /&gt;
When running a ROS robot controller, the &amp;#039;&amp;#039;&amp;#039;openrave_robot_control/scripts/controlclient.py&amp;#039;&amp;#039;&amp;#039; script allows users to  send commands to the robot controller without starting a master openrave instance.&lt;br /&gt;
&lt;br /&gt;
= Creating a Controller Driver =&lt;br /&gt;
&lt;br /&gt;
New robot controllers taking advantage of this framework need to depend on the &amp;#039;&amp;#039;&amp;#039;openrave_robot_control&amp;#039;&amp;#039;&amp;#039; package and derive from the &amp;#039;&amp;#039;&amp;#039;openrave_robot_control::OpenRAVEController&amp;#039;&amp;#039;&amp;#039; class. New implementations need a thread that constantly calls OpenRAVEController::_publishTF, fills and publishes OpenRAVEController::_mstate, and processes OpenRAVEController::_listCommands.&lt;br /&gt;
&lt;br /&gt;
The controller offers several modes of operation, each mode has a &amp;#039;&amp;#039;&amp;#039;start&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;run&amp;#039;&amp;#039;&amp;#039;, and &amp;#039;&amp;#039;&amp;#039;finish&amp;#039;&amp;#039;&amp;#039; functions. To hook into trajectory control, implementations of these member functions are needed:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
virtual void _startTrajectoryCommand(TrajectoryBasePtr ptraj);&lt;br /&gt;
virtual CommandStatus _runTrajectoryCommand(TrajectoryBasePtr ptraj, float fCommandTime);&lt;br /&gt;
virtual void _finishTrajectoryCommand(TrajectoryBasePtr ptraj);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Simulating a Controller over ROS ==&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;openrave_robot_control&amp;#039;&amp;#039;&amp;#039; package has a simulation controller which will run the server inside openrave. Basically it is a replacement for the hardware equivalents, which can be used to test planning and programs without running the robot. For example, to simulate joints j0 through j6 on a schunk LWA3 robot do:&lt;br /&gt;
&lt;br /&gt;
 rosrun openrave_robot_control simulationserver --robotfile robots/schunk-lwa3.robot.xml --jointname j0 --jointname j1 --jointname j2 --jointname j3 --jointname j4 --jointname j5 --jointname j6&lt;br /&gt;
&lt;br /&gt;
If this physics engine on openrave is set, the robot could be torque controlled and exhibit similar behaviors as the real robot. It is also possible to load in an environment in which the robot resides for getting environment contact forces.&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Format:COLLADA&amp;diff=225</id>
		<title>Format:COLLADA</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Format:COLLADA&amp;diff=225"/>
				<updated>2012-07-12T02:36:17Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;html&amp;gt;&amp;lt;a id=&amp;quot;redirectme&amp;quot; href=&amp;quot;http://openrave.org/docs/latest_stable/collada_robot_extensions&amp;quot;&amp;gt;COLLADA Extensions Page&amp;lt;/a&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.location.href=document.getElementById(&amp;#039;redirectme&amp;#039;).href&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Format:COLLADA&amp;diff=224</id>
		<title>Format:COLLADA</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Format:COLLADA&amp;diff=224"/>
				<updated>2012-07-12T02:33:39Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: Redirected page to Http://openrave.org/docs/latest stable/collada robot extensions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[http://openrave.org/docs/latest_stable/collada_robot_extensions]] [[Category:Other Resources]]&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Format:COLLADA&amp;diff=223</id>
		<title>Format:COLLADA</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Format:COLLADA&amp;diff=223"/>
				<updated>2012-07-12T02:31:37Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[&amp;lt;html&amp;gt;http://openrave.org/docs/latest_stable/collada_robot_extensions&amp;lt;/html&amp;gt;]]&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Format:COLLADA&amp;diff=222</id>
		<title>Format:COLLADA</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Format:COLLADA&amp;diff=222"/>
				<updated>2012-07-12T02:28:35Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [http://openrave.org/docs/latest_stable/collada_robot_extensions]&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Format:COLLADA&amp;diff=221</id>
		<title>Format:COLLADA</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Format:COLLADA&amp;diff=221"/>
				<updated>2012-07-12T02:27:50Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: Redirected page to Http://openrave.org/docs/latest stable/collada robot extensions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[http://openrave.org/docs/latest_stable/collada_robot_extensions]]&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Format:COLLADA&amp;diff=220</id>
		<title>Format:COLLADA</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Format:COLLADA&amp;diff=220"/>
				<updated>2012-07-12T02:23:52Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [http://openrave.org/docs/latest_stable/collada_robot_extensions]&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Format:COLLADA&amp;diff=219</id>
		<title>Format:COLLADA</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Format:COLLADA&amp;diff=219"/>
				<updated>2012-07-12T02:21:34Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: Replaced content with &amp;quot;moved to

http://openrave.org/docs/latest_stable/collada_robot_extensions&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;moved to&lt;br /&gt;
&lt;br /&gt;
http://openrave.org/docs/latest_stable/collada_robot_extensions&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=FAQ&amp;diff=218</id>
		<title>FAQ</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=FAQ&amp;diff=218"/>
				<updated>2012-07-06T11:12:47Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installation Questions ==&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;How do I use OpenRAVE with ROS?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
#* Install the &amp;#039;&amp;#039;&amp;#039;rospackages&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;openrave&amp;#039;&amp;#039;, &amp;#039;&amp;#039;collada_robots&amp;#039;&amp;#039;, and &amp;#039;&amp;#039;soqt&amp;#039;&amp;#039; found on the ROS website.  Also make sure you have &amp;#039;&amp;#039;python-sympy&amp;#039;&amp;#039; from your OS repo.  Now, whenever you want to use openrave, just update your manifest.xml with a&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;depend package=&amp;quot;openrave&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
#* You also have another option, download openrave from source.  Compile and install it.  To add it to your ROS_PATH, you need a manifest.xml in an &amp;quot;openrave&amp;quot; folder inside your &amp;#039;&amp;#039;&amp;#039;ROS_PACKAGE_PATH&amp;#039;&amp;#039;&amp;#039;.  I need to update this and add a manifest.xml you can use. (just the same one from the ros repo install)&lt;br /&gt;
&lt;br /&gt;
== Physics and OpenRAVE ==&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;When I turned physics on, my robot fell apart.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
#: This is because the time step of your simulation is too large.  Try setting a smaller timestep (&amp;lt;= 0.001).&lt;br /&gt;
#: In python:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
env.StopSimulation()&lt;br /&gt;
env.StartSimularion(0.001)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
#: In C++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
EnvironmentBasePtr env = RaveCreateEnvironment;&lt;br /&gt;
env-&amp;gt;StopSimulation();&lt;br /&gt;
env-&amp;gt;StartSimularion(0.001);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Is there a parallel/modified ODE plugin?  What about setting contact joints?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
#* The ode engine from ROS (&amp;#039;&amp;#039;opende&amp;#039;&amp;#039;) employs a few patches, as well as a parallelization patch.  You can rosmake the opende package.  HOWEVER, then you must recompile the odeplugin (OpenRAVE plugin) and force OpenRAVE to use the sources and shared libraries from the modified ODE engine.  Lucky for you, the opende package has an odeconfig tool which spits out the correct flags for you.&lt;br /&gt;
#* There is also a plugin developed by CSIRO ASL.  Among the things they changed is allowing the individual parameter setting of contact joints in the xml. [https://code.launchpad.net/csiro-asl-ros-pkg Here] is the repo.  You need openrave in your &amp;#039;&amp;#039;&amp;#039;ROS_PACKAGE_PATH&amp;#039;&amp;#039;&amp;#039; to use its CMake.  It may be possible to modify the CMake file using openrave-config to get all the flags.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;My physics is unstable what can I do?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
#* The first most important thing you should do, is lower the timestep as stated above.&lt;br /&gt;
#* The second most important thing to do, is set your erp and cfm.  The OpenRAVE ODE plugin by default sets them extremely low.  An explanation can be found [http://opende.sourceforge.net/wiki/index.php/Manual_(Concepts)#Soft_constraint_and_constraint_force_mixing_.28CFM.29 here].&lt;br /&gt;
#** Just setting the &amp;lt;erp&amp;gt;0.4&amp;lt;/erp&amp;gt; drastically stabilized my simulations.&lt;br /&gt;
&lt;br /&gt;
== OpenRAVE Planners ==&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=OctaveMATLAB&amp;diff=217</id>
		<title>OctaveMATLAB</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=OctaveMATLAB&amp;diff=217"/>
				<updated>2012-05-16T03:06:18Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Unfortunately, MATLAB mex file binaries cannot be re-distributed with OpenRAVE since there are many versions of the tool and the compilers are non-free. Therefore, starting with OpenRAVE 0.4, the mex source files are distributed in the &amp;#039;&amp;#039;&amp;#039;share/openrave-*/matlab&amp;#039;&amp;#039;&amp;#039; directory. In order to use MATLAB, will need to compile each of the &amp;#039;&amp;#039;&amp;#039;cpp&amp;#039;&amp;#039;&amp;#039; files into &amp;#039;&amp;#039;&amp;#039;mex&amp;#039;&amp;#039;&amp;#039; files and add that directory to your MATLAB path. The files are:&lt;br /&gt;
&lt;br /&gt;
- orcreate.cpp&lt;br /&gt;
- orread.cpp&lt;br /&gt;
- orwrite.cpp&lt;br /&gt;
&lt;br /&gt;
Windows users have a special &amp;#039;&amp;#039;&amp;#039;runmex.bat&amp;#039;&amp;#039;&amp;#039; file to help them with this.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Scripting ==&lt;br /&gt;
&lt;br /&gt;
One of the biggest features that separates OpenRAVE from other simulation/planning environments is that it supports scripting over the network. This makes it possible to free OpenRAVE of complex GUIs. At initialization, OpenRAVE starts listening on specific ports for the commands. This allows any computer to open a socket connection with OpenRAVE, which can be running on a different computer, and communicate with it. The official release supports Matlab and Octave as the scripting engines. Note that all script commands are sent as text across the network; therefore, it is possible to do everything in Python or Perl.&lt;br /&gt;
&lt;br /&gt;
The rest of this document is written using the Matlab/Octave functions found in the &amp;#039;&amp;#039;&amp;#039;matlab/&amp;#039;&amp;#039;&amp;#039; directory. For any function, type &amp;#039;help functionname&amp;#039; to get a help message describing its parameters and usage. Some formatting rules:&lt;br /&gt;
&lt;br /&gt;
* All OpenRAVE functions start with &amp;#039;&amp;#039;&amp;#039;or&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* All KinBody specific functions start with &amp;#039;&amp;#039;&amp;#039;orBody&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* All Robot specific functions start with &amp;#039;&amp;#039;&amp;#039;orRobot&amp;#039;&amp;#039;&amp;#039;. Every robot can use all &amp;#039;&amp;#039;&amp;#039;orBody&amp;#039;&amp;#039;&amp;#039; functions.&lt;br /&gt;
* All general environment functions start with &amp;#039;&amp;#039;&amp;#039;orEnv&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* All problem instance specific functions start with &amp;#039;&amp;#039;&amp;#039;orProblem&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Check out the RaveServer constructor in &amp;#039;&amp;#039;&amp;#039;src/server.cpp&amp;#039;&amp;#039;&amp;#039; for a complete list of commands supported.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
All examples can be found in &amp;#039;&amp;#039;&amp;#039;$INSTALL/share/openrave/octave&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
To run &amp;#039;&amp;#039;&amp;#039;MATLAB/Octave&amp;#039;&amp;#039;&amp;#039; examples, first start openrave and then in a separate terminal execute the &amp;#039;&amp;#039;&amp;#039;*.m&amp;#039;&amp;#039;&amp;#039; files.&lt;br /&gt;
&lt;br /&gt;
== Communicating with OpenRAVE ==&lt;br /&gt;
&lt;br /&gt;
Usually communicating with an OpenRAVE instance running on the same computer as the scripting environment is simple. Just call the methods in the &amp;lt;b&amp;gt;matlab&amp;lt;/b&amp;gt; folder directly without having to worry about setting ip address. If OpenRAVE is running on a different computer, the IP address will have to be set manually through a global variable &amp;#039;&amp;#039;&amp;#039;orConnectionParams&amp;#039;&amp;#039;&amp;#039;. To set the address of the remote OpenRAVE in Octave/Matlab instance type&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;global orConnectionParams&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;orConnectionParams.ip = &amp;#039;myopenrave_ip&amp;#039;; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;orConnectionParams.port = 4765; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The scripting environment can communicate with multiple OpenRAVE instances at once, just set orConnectionParams to the appropriate instance. Also, OpenRAVE can handle multiple scripting environments talking to the same instance simultaneously.&lt;br /&gt;
&lt;br /&gt;
[[image:Openrave_network.png|600px]]&lt;br /&gt;
&lt;br /&gt;
The default port openrave starts is 4765, use the &amp;#039;&amp;#039;&amp;#039;-server&amp;#039;&amp;#039;&amp;#039; option to change the port. For example,&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;./openrave -server 3000&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
starts openrave to listen for connections on port 3000.&lt;br /&gt;
&lt;br /&gt;
== Tutorial ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;NOTE:&amp;#039;&amp;#039;&amp;#039; Remember that warnings and responses can appear both in the Matlab/Octave window and the console window where openrave is started from.&lt;br /&gt;
&lt;br /&gt;
=== Basic commands ===&lt;br /&gt;
&lt;br /&gt;
First start &amp;#039;&amp;#039;&amp;#039;openrave&amp;#039;&amp;#039;&amp;#039; and leave it in the background. Then start an Octave or Matlab instance and make sure the paths to the Octave/Matlab scripts are added to the path.&lt;br /&gt;
&lt;br /&gt;
To load a simple scene with the Barrett WAM and Hand:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orEnvLoadScene(&amp;#039;data/lab1.env.xml&amp;#039;, 1)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The 1 is a flag to reset the whole OpenRAVE scene before loading &amp;#039;&amp;#039;&amp;#039;lab1.env.xml&amp;#039;&amp;#039;&amp;#039;. If it wasn&amp;#039;t there, lab1.env.xml would get appended to the current OpenRAVE scene. Now let&amp;#039;s query and display all the objects in the scene&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
bodies = orEnvGetBodies()&lt;br /&gt;
celldisp(bodies)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Every object has a unique id. Use this id for any function that performs an operation on the object. We can move the first joint of the robot 0.5 radians by&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetDOFValues(1,0.5,0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or the first 10 joints:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetDOFValues(1,0.5*ones(1,10),0:9)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here &amp;#039;1&amp;#039; is the unique id of the robot.&lt;br /&gt;
&lt;br /&gt;
If the third argument is not specified, then the default degrees of fredom (joints) used will be the &amp;#039;&amp;#039;&amp;#039;active DOFs&amp;#039;&amp;#039;&amp;#039;. The default &amp;#039;&amp;#039;&amp;#039;active DOFs&amp;#039;&amp;#039;&amp;#039; are all the joints of the robot. To make only the first 7 joints active type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetActiveDOFs(1,0:6,0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get the number of active dofs type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotGetActiveDOF(1)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The concept of &amp;#039;&amp;#039;&amp;#039;active DOFs&amp;#039;&amp;#039;&amp;#039; is very powerful. All planners search only in the &amp;#039;&amp;#039;&amp;#039;active DOFs&amp;#039;&amp;#039;&amp;#039; when planning. In this example, the robot is a combination of an arm and a hand. Most of the time, we would only want to plan and move the arm while ignoring the hand. To do this, set the &amp;#039;&amp;#039;&amp;#039;active DOFs&amp;#039;&amp;#039;&amp;#039; to the joint indices of the arm only before calling the planner. &amp;#039;&amp;#039;&amp;#039;Active DOFs&amp;#039;&amp;#039;&amp;#039; are not limited to just joints, they can also be the translation or rotation components of the robot itself. For example, to plan for the robot arm while it is moving on the &amp;#039;&amp;#039;&amp;#039;xy&amp;#039;&amp;#039;&amp;#039; plane type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetActiveDOFs(1,0:6,3)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To have it rotate around the &amp;#039;&amp;#039;&amp;#039;z&amp;#039;&amp;#039;&amp;#039;-axis at the same time, type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetActiveDOFs(1,0:6,11,[0 0 1])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now,&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotGetActiveDOF(1)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
returns 10: 7 for the arm, 2 for &amp;#039;&amp;#039;&amp;#039;xy&amp;#039;&amp;#039;&amp;#039; planar translation, and 1 for the rotation around &amp;#039;&amp;#039;&amp;#039;z&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
To query the transformations of all the links of the robot type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
L = orBodyGetLinks(1)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will return a 12xN matrix for N links, where each column is a 3x4 transformation matrix (left 3x3 is a rotation, and last column is the translation component). For example, to extract the tranformation matrix of the second link, type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
T = reshape(L(:,2),[3 4])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To set the transformation of the base robot do&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orBodySetTransform(1,[0 0 1],[0.707 0.707 0 0])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will set the translation to (0,0,1). The third parameter is a rotation around the X axis by 90 degrees in quaternion form. It is also possible to directly input a 3x4 transformation matrix T by:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orBodySetTransform(1,reshape(T,[1 12]))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To add a cup on top of the table named &amp;#039;table&amp;#039; type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
destTransform = orBodyGetTransform(orEnvGetBody(&amp;#039;table&amp;#039;));&lt;br /&gt;
destPosition  = destTransform(10:12);&lt;br /&gt;
cupPosition   = destPosition + [0;0;0.1];&lt;br /&gt;
cupid         = orEnvCreateKinBody(&amp;#039;MyCup&amp;#039;,&amp;#039;data/mug1.kinbody.xml&amp;#039;);&lt;br /&gt;
orBodySetTransform(cupid, cupPosition,[0.707 0.707 0 0]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Executing planners - A Grasping Example ===&lt;br /&gt;
&lt;br /&gt;
[[image:Openrave_dishwasher.jpg|350px]] &lt;br /&gt;
&lt;br /&gt;
In this part, we&amp;#039;ll be loading the manipulation plugin and using its various features to plan in the lab1.env.xml workspace with the BarrettWAM. The manipulation plugin exposes a Manipulation ProblemInstance and the Inverse Kinematics functions for the Barrett WAM arm.&lt;br /&gt;
&lt;br /&gt;
First load&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orEnvLoadScene(&amp;#039;data/lab1.env.xml&amp;#039;, 1)&lt;br /&gt;
robotid = orEnvGetBody(&amp;#039;BarrettWAM&amp;#039;)&lt;br /&gt;
manipid = orEnvCreateProblem(&amp;#039;BaseManipulation&amp;#039;, &amp;#039;BarrettWAM&amp;#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each ProblemInstance supports a &amp;#039;SendCommand&amp;#039; function that is used to receive commands from the script server and send back responses. Matlab can communicate with this function by the &amp;#039;orProblemSendCommand&amp;#039; function.&lt;br /&gt;
&lt;br /&gt;
To move the hand safely to a particular preshape do:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
manips = orRobotGetManipulators(robotid);&lt;br /&gt;
orBodySetJointValues(robotid,[0 0 0 pi/2],manips{1}.handjoints);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Alternative: &amp;#039;&amp;#039;&amp;#039; Can move the robot safely to a preshape using planners by:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetActiveDOFs(robotid,manips{1}.armjoints);&lt;br /&gt;
handjoints = sprintf(&amp;#039;%d &amp;#039;,manips{1}.handjoints);&lt;br /&gt;
orProblemSendCommand([&amp;#039;MoveUnsyncJoints handjoints 4 0 0 0 1.57 &amp;#039; handjoints],manipid);&lt;br /&gt;
orBodySetJointValues(robotid,[0 0 0 pi/2],manips{1}.handjoints);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To plan for a configuration space goal for the arm joints of the robot, type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orProblemSendCommand(&amp;#039;MoveManipulator goal -0.005617 1.07 0.233 2.096 -4.194 -0.235 1.302520&amp;#039;,manipid)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Can squeeze the fingers of the hand by:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orProblemSendCommand(&amp;#039;CloseFingers&amp;#039;,manipid)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Grab the body by:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orProblemSendCommand(&amp;#039;GrabBody name mug6&amp;#039;,manipid)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Move to the table:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
tableTrans = [  -0.035588  -0.995502  -0.087805  -0.466866&lt;br /&gt;
                -0.994116   0.026269   0.105090   0.869644&lt;br /&gt;
                -0.102311   0.091028  -0.990579   1.000000 ];&lt;br /&gt;
orProblemSendCommand([&amp;#039;MoveToHandPosition matrix &amp;#039; sprintf(&amp;#039;%f &amp;#039;,tableTrans(1:3,1:4))],manipid)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Move the hand down a little:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orProblemSendCommand([&amp;#039;MoveHandStraight direction 0 0 -1 maxdist 0.3 matrix &amp;#039; sprintf(&amp;#039;%f &amp;#039;,tableTrans(1:3,1:4))],manipid)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally, to release the fingers use the ReleaseFingers command. ReleaseFingers is a little more general than CloseFingers because the fingers to move and the direction of movement can be specified.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetActiveDOFs(1,[7 8 9]); % want to move 3 joints&lt;br /&gt;
orProblemSendCommand(&amp;#039;releasefingers target mug6&amp;#039;,manipid);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Can now plan to original position:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orProblemSendCommand(&amp;#039;MoveManipulator goal 0 0 0 0 0 0 0&amp;#039;,manipid);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Can also test if an IK solution exists by giving the transformation matrix T of the wrist:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
s = orProblemSendCommand([&amp;#039;IKtest trans &amp;#039;, num2str(T(:,4)&amp;#039;), &amp;#039; rot &amp;#039;, num2str(T(1:9))],manipid)&lt;br /&gt;
if( ~isempty(s) )&lt;br /&gt;
    orRobotSetDOFValues(1, sscanf(s, &amp;#039;%f&amp;#039;),0:6)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Logging ===&lt;br /&gt;
&lt;br /&gt;
A scene can be easily saved by using the &amp;#039;&amp;#039;&amp;#039;logging&amp;#039;&amp;#039;&amp;#039; plugin. Once a scene is loaded and all the objects are in place, do the following commands:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
logid = orEnvCreateProblem(&amp;#039;logging&amp;#039;)&lt;br /&gt;
orProblemSendCommand(&amp;#039;savescene filename myscene.env.xml&amp;#039;,logid)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Loading IKFast Solvers ===&lt;br /&gt;
&lt;br /&gt;
Most robots when loaded at first, do not have any IK solvers set. Use the following code to load a Transform6D IK solver to the currently set active manipulator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
probid = orEnvCreateProblem(&amp;#039;ikfast&amp;#039;);&lt;br /&gt;
s = orProblemSendCommand([&amp;#039;LoadIKFastSolver &amp;#039; robotname &amp;#039; Transform6D&amp;#039;],probid)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Set the active manipulator with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
manips = orRobotGetManipulators(robotid);&lt;br /&gt;
manipname = manips{1}.name;&lt;br /&gt;
orRobotSetActiveManipulator(robotid,manipname);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Matlab/Octave Partial Reference ==&lt;br /&gt;
&lt;br /&gt;
This is &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; a complete list and use this only to introduce yourself to the functions, the real reference and usages can be found in the help files of each function by typing &amp;#039;&amp;#039;&amp;#039;help function_name&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orBodyDestroy(bodyid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Destroys a body of id bodyid. bodyid can also be a robot.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;success = orBodyEnable(bodyid, enable)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Enables or disables the body. If a body is disabled, &lt;br /&gt;
 collision detection and physics will will be turned off for it.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;aabb = orBodyGetAABB(bodyid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Returns an axis-aligned boudning box of the body in world coordinates&lt;br /&gt;
 aabb is a 3x2  vector where the first column is the position of the&lt;br /&gt;
 box and the second is the extents.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;aabbs = orBodyGetAABBs(bodyid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 returns the axis-aligned boudning boxes of all the links of the body in world coordinates&lt;br /&gt;
 aabbs is a 6xn vector where each column describes the box for all n links.&lt;br /&gt;
 The first 3 values in each column describe the position of the aabb, and the next&lt;br /&gt;
 3 values describe the extents (half width/length/height) on each of the axes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;dof = orBodyGetDOF(robotid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Returns the number of active joints of the body.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;values = orBodyGetDOFValues(robotid, indices)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Gets the body&amp;#039;s dof values in a Nx1 vector where N is the DOF&lt;br /&gt;
 bodyid - unique id of the robot&lt;br /&gt;
 indices [optional]- The indices of the joints whose values should be returned.&lt;br /&gt;
                     If not specified, all joints are returned&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;values = orBodyGetLinks(bodyid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Returns the transformations of all the body&amp;#039;s links in a 12 x L matrix. Where L&lt;br /&gt;
 is the number of links and each column is a 3x4 transformation&lt;br /&gt;
 (use T=reshape(., [3 4]) to recover).&lt;br /&gt;
 T * [X;1] = Xnew&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orBodySetJointValues(bodyid, values, indices)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Set the raw joint values of a body. If bodyid is a robot, sets the robot&amp;#039;s&lt;br /&gt;
 joints ignoring its current active degrees of freedom. If a controller on&lt;br /&gt;
 the robot is running, this function might not have any effect. Instead&lt;br /&gt;
 use orRobotSetDOFValues&lt;br /&gt;
 indices [optional] - array specifying the indices to control&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orBodySetTransform&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 orBodySetTransform(bodyid, translation, quaternion)&lt;br /&gt;
 orBodySetTransform(bodyid, [quaternion translation])&lt;br /&gt;
 orBodySetTransform(bodyid, transform matrix) (12x1, 1x12, or 3x4)&lt;br /&gt;
 Set the affine transformation of the body. The transformation actually&lt;br /&gt;
 describes the first link of the body. The rest of the links are derived by&lt;br /&gt;
 the joint angles. A quaternion is related to axis and angle via: [cos(theta/2);sin(theta/2)*axis]&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[collision, colbody] = orEnvCheckCollision(bodyid,excludeid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Check collision of the robot with the environment. collision is 1 if the robot&lt;br /&gt;
 is colliding, colbodyid is the id of the object that body collided with&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orEnvClose(figureids)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
closes the figures and plots&lt;br /&gt;
figureids - array of ids returned from orEnvPlot or other plotting functions&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;bodyid = orEnvCreateKinBody(name, xmlfile)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;plannerid = orEnvCreatePlanner(plannertype)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orEnvCreateProblem&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 problemid = orEnvCreateProblem(problemname, args)&lt;br /&gt;
 problemid = orEnvCreateProblem([problemname, args])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;problemid = orEnvCreateProblem(problemname, args, destroyduplicates)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Creates an instance of a problem and returns its id for future communicate with it&lt;br /&gt;
 problemname - the problem name&lt;br /&gt;
 args - a string of arguments to send to the problem&amp;#039;s main function&lt;br /&gt;
 destroyduplicates [optional] - if 1, will destroy any previous problems with the same problem name.&lt;br /&gt;
                               If 0, will not destroy anything.&lt;br /&gt;
                               The default value is 1. &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;robotid = orEnvCreateRobot(robotname, xmlfile, type)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Creates a robot of the given type. If type is not specified, creates a generic robot&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orEnvDestroyProblem(problemid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Destroys problem instance whose id is problemid.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;bodies = orEnvGetBodies()&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 bodies is a cell array of all body objects in the scene&lt;br /&gt;
 every cell contains a struct with the following parameters&lt;br /&gt;
 id - bodyid&lt;br /&gt;
 filename - filename used to initialize the body with&lt;br /&gt;
 name - human robot name&lt;br /&gt;
 type - xml type of body&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;id = orEnvGetBody(bodyname)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 returns the id of the body that corresponds to bodyname&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;robots = orEnvGetRobots()&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 robots is a cell array of robots&lt;br /&gt;
 every cell contains a struct with the following parameters&lt;br /&gt;
 id - robotid&lt;br /&gt;
 filename - filename used to initialize the robot with&lt;br /&gt;
 name - human robot name&lt;br /&gt;
 type - type of robot&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;success = orEnvLoadPlugin(filename)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Loads a plugin.&lt;br /&gt;
 filename - the relative path of the plugin to load. (*.so for linux, *.dll for windows)&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orEnvLoadScene(filename, [ClearScene])&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Loads a new environment.&lt;br /&gt;
 filename - The filename of the scene to load. If a relative file&lt;br /&gt;
            is specified, note that it is relative to the current direction&lt;br /&gt;
            of the OpenRAVE executable.&lt;br /&gt;
 ClearScene - If 1, then clears the scene before loading. Else leaves the &lt;br /&gt;
              scene alone and loads in addition to it.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;figureid = orEnvPlot(points,...)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 plots points or lines in the openrave viewer&lt;br /&gt;
 points - Nx3 vector of xyz positions&lt;br /&gt;
 optional arguments include &amp;#039;size&amp;#039;, &amp;#039;color&amp;#039;, and &amp;#039;line&amp;#039;&lt;br /&gt;
   color - Nx3 vector of RGB values between 0 and 1&lt;br /&gt;
   size - Nx1 vector of the sizes in pixels of each point/line&lt;br /&gt;
   line (or linestrip) - if specified, then openrave renders a line strip&lt;br /&gt;
   linelist - if specified, openrave renders a line for every two points&lt;br /&gt;
   trilist - if specified, openrave renders a triangle for every three&lt;br /&gt;
             vertices should be specified in counter-clockwise order&lt;br /&gt;
   sphere - if specified, openrave renders each point as a sphere&lt;br /&gt;
   transparency - [0,1], set transparency of plotted objects (0 is opaque)&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[collision, colinfo] = orEnvRayCollision(rays)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 performs ray collision checks and returns the position and normals&lt;br /&gt;
 where all the rays collide&lt;br /&gt;
 rays - a 6xN matrix where the first 3&lt;br /&gt;
 rows are the ray position and last 3 are the ray direction&lt;br /&gt;
 collision - N dim vector that is 1 for colliding rays and 0&lt;br /&gt;
 for non-colliding rays colinfo is a 6xN vector that describes &lt;br /&gt;
 where the ray hit and the normal to the surface of the hit point&lt;br /&gt;
 where the first 3 columns are position and last 3 are normals&lt;br /&gt;
 if bodyid is specified, only checks collisions with that body&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orEnvSetOptions(&amp;#039;publishanytime 1&amp;#039;)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Current options:&lt;br /&gt;
 - simulation [start/stop] [time_step] - toggles the internal simulation loop, ie all the calls to SimulationStep. &lt;br /&gt;
 If time_step is specified, will set the simulation time step for all objects.&lt;br /&gt;
 Note that this is not tied to real time at all, how fast the  simulation goes in reality depends on complexity&lt;br /&gt;
 of the scene and the physics engine being used.&lt;br /&gt;
 - physics engine_name - switches the physics engine to another one with id &amp;#039;engine_name&amp;#039;&lt;br /&gt;
 - gravity [x y z] - changes to gravity vector&lt;br /&gt;
 - publishanytime [1/0] - switch between publishing the body transformations&lt;br /&gt;
          to the GUI anytime or only between stepsimulation and server  messsages.&lt;br /&gt;
          When publishing anytime, the GUI will reflect the body movements after every&lt;br /&gt;
          move. This is useful when visualizing internal C++ states. When off, the GUI&lt;br /&gt;
          will only reflect the state of robots after all calls to stepsimulation and&lt;br /&gt;
          server send messages have been done. The default is off.&lt;br /&gt;
 - debug [debug level] - toggles debugging messages by RAVELOG.&lt;br /&gt;
                        0  - only RAVEPRINT statements show&lt;br /&gt;
                        1+ - RAVELOG statements with various debug levels show&lt;br /&gt;
 - quit - closes the openrave instance&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[tripoints, triindices] = orEnvTriangulate(inclusive, ids)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Returns the triangulation of various objects in the scenes controlled by name and options&lt;br /&gt;
 Arguments:&lt;br /&gt;
   inclusive - if 1, will only triangulate the bodies pointed to by ids&lt;br /&gt;
               if 0, will triangulate all objects except the bodies pointed to by ids&lt;br /&gt;
               default value is 0.&lt;br /&gt;
   ids (optional) - the ids to include or exclude in the triangulation&lt;br /&gt;
 To triangulate everything, just do orEnvTriangulate(0,[]), or orEnvTriangulate()&lt;br /&gt;
&lt;br /&gt;
 Output:&lt;br /&gt;
   tripoints - 3xN matrix of 3D points&lt;br /&gt;
   tripoints - 3xK matrix of indices into tripoints for every triangle.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;success = orEnvWait(robotid, robot_timeout)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 wait until all previously sent commands to matlab are finished.&lt;br /&gt;
 Since problems are meant to last for a long time orEnvWait waits&lt;br /&gt;
 until the problem&amp;#039;s main function finishes.&lt;br /&gt;
 &lt;br /&gt;
 robotid - optional argument. If a robot id is specified, will wait until&lt;br /&gt;
 the robot finishes with its trajectory.&lt;br /&gt;
 &lt;br /&gt;
 robot_timeout (s) - function will return with success set to 0 if robot&lt;br /&gt;
 did not finish its commands by robot_timeout ms. If not specified, orEnvWait&lt;br /&gt;
 will not return until robot completes.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;success = orPlannerInit(planner, robot, parameters)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Initialize a planner to plan for a robot and give some parameters&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;trajectory = orPlannerPlan(planner)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Start planning. The planner returns a trajectory when successful (otherwise returns an empty matrix)&lt;br /&gt;
 trajectory - (DOF+1)xN matrix where N is the number of points in the trajectory.&lt;br /&gt;
              The first row are the time values of each trajectory point.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;output = orProblemSendCommand(cmd, problemid, dosync)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Sends a command to the problem. The function doesn&amp;#039;t return until&lt;br /&gt;
 ProblemInstance::SendCommand returns.&lt;br /&gt;
 cmd - the string command to send the problem&lt;br /&gt;
 problemid [optional] - returned id of the problem, if not specified, then&lt;br /&gt;
                       command is sent to all problems&lt;br /&gt;
 dosync [optional] - If 1, the SendCommand is called in the main thread, in sync&lt;br /&gt;
                       with the rest of the primitives. If 0, called in a different thread.&lt;br /&gt;
 output - the concatenated output of all the problems that the command is sent to&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orRender(cmd)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Controls rendering properties. Cmd can be&lt;br /&gt;
 start - starts the GUI to update the internal openrave state&lt;br /&gt;
 stop - stops the GUI from updating the internal openrave state (can be used to speed up loading)&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;success = orRobotControllerSend(robotid, controllercmd)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 &lt;br /&gt;
 sends a command to the current controller the robot is connected to.&lt;br /&gt;
 OpenRAVE sends directly to ControllerBase::SendCmd,&lt;br /&gt;
 ControllerBase::SupportsCmd is also used to check for support.&lt;br /&gt;
 &lt;br /&gt;
 success - 1 if command was accepted, 0 if not&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;success = orRobotControllerSet(robotid, controllername, controllerargs)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Sets a new robot controller and destroys the old.&lt;br /&gt;
 controllername - name used to query a controller&lt;br /&gt;
 controllerargs [optional] - the arguments to ControllerBase::Init&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;dof = orRobotGetActiveDOF(robotid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 returns the robot&amp;#039;s active degrees of freedom used for planning (not necessary corresponding to joints).&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;sensors = orRobotGetAttachedSensors(robotid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sensors is a cell array describing the attached sensors of the robot&lt;br /&gt;
 Each cell is a struct with fields:&lt;br /&gt;
   name - name of the attached sensor&lt;br /&gt;
   link - zero-based index of link sensor is attached to&lt;br /&gt;
   Trelative - 3x4 matrix of the relative transform of the camera with respect to the robot&lt;br /&gt;
   Tglobal - 3x4 matrix of the global transform of the sensor of the current robot&lt;br /&gt;
             Tglobal = Tlink * Trelative&lt;br /&gt;
   type - the xml id of the sensor that is attached&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;values = orRobotGetDOFLimits(robotid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Gets the robot&amp;#039;s dof limits in a Nx2 vector where N is the DOF, the first column&lt;br /&gt;
 is the low limit and the second column is the upper limit.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;values = orRobotGetDOFValues(robotid, indices)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Gets the robot&amp;#039;s dof values in a Nx1 vector where N is the DOF&lt;br /&gt;
 robotid - unique id of the robot&lt;br /&gt;
 indices [optional]- The indices of the joints whose values should be returned.&lt;br /&gt;
                     If not specified, the active degreees of freedeom set by&lt;br /&gt;
                     orRobotSetActiveDOFs will be used.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;manipulators = orRobotGetManipulators(robotid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 manipulators is a cell array describes the manipulators of the robot&lt;br /&gt;
 Each cell is a struct with fields&lt;br /&gt;
   baselink - zero-based index of base link manipulator is attached to&lt;br /&gt;
   eelink - zero-based index of link defining the end-effector&lt;br /&gt;
   Tgrasp - 3x4 matrix of the grasp frame relative to the end effector link,&lt;br /&gt;
            Tglobalgrasp = Tendeffector*Tgrasp&lt;br /&gt;
   joints - 1xK zero-based joint indices of the hand attached to the end effector&lt;br /&gt;
   armjoints - 1xN zero-based manipulator joint indices that have an&lt;br /&gt;
               effect on the end effector&lt;br /&gt;
   iksolvername - name of ik solver to use&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;data = orRobotSensorGetData(robotid, sensorindex)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Gets the sensor data. The format returned is dependent on the type&lt;br /&gt;
 of sensor. Look at the different data SensorData implementations in rave.h.&lt;br /&gt;
 Although the data returned is not necessarily one of them.&lt;br /&gt;
 options [optional] - options that specify what type of data to request (0 is default)&lt;br /&gt;
 data.type - contains the id of the data type (see SensorBase::SensorType)&lt;br /&gt;
 For laser data&lt;br /&gt;
  data.laserrange - 3xN array where each column is the direction * distance&lt;br /&gt;
  data.laserpos - 3xN array where each column is the corresponding origin of each range measurement&lt;br /&gt;
  data.laserint - 1xN optional laser intensity array&lt;br /&gt;
 For image data&lt;br /&gt;
  data.KK - 3x3 intrinsic matrix&lt;br /&gt;
  data.T - 3x4 camera matrix (to project a point multiply by KK*inv(T))&lt;br /&gt;
  data.I - the rgb image size(I) = [height width 3]&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;out = orRobotSensorSend(robotid, sensorindex, controllercmd)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sends a command to a sensor attached to the robot &lt;br /&gt;
 OpenRAVE sends directly to SensorBase::SendCmd,&lt;br /&gt;
 SensorBase::SupportsCmd is used to check for command support.&lt;br /&gt;
&lt;br /&gt;
 robotid - unique id of the robot&lt;br /&gt;
 sensorindex - zero-based index of sensor into robot&amp;#039;s attached sensor array&lt;br /&gt;
 out - the output of the command&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orRobotSetActiveDOfs(robotid, indices, affinedofs, rotationaxis)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 robotid - unique id of the robot&lt;br /&gt;
 indices - zero based indices of the robot joints to activate&lt;br /&gt;
 affinedofs [optional] - is a mask of affine transformation for planning&lt;br /&gt;
       1 - X, 2 - Y, 4 - Z, 8 - RotationAxis (rotationaxis has to be avlid, 16 - full 3D rotation&lt;br /&gt;
 rotationaxis [optional] - the rotation axis (if the RotationAxis bit is set in affinedofs)&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orRobotSetDofValues(robotid, values, indices)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Sets the DOF values of the robot&lt;br /&gt;
 robotid - unique id of the robot&lt;br /&gt;
 values - the joint values of the robot&lt;br /&gt;
 indices [optional] - the indices of the dofs to set of the robot. &lt;br /&gt;
                      If indices is not specified the active degrees of freedom&lt;br /&gt;
                      set by previous calls to orRobotSetActiveDOFs will be used.&lt;br /&gt;
                      Note that specifying indices will not change the active dofs of the robot.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orRobotStartActiveTrajectory(robotid, jointvalues, timestamps, transformations)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Starts/Queues a robot trajectory of the robot where the size of&lt;br /&gt;
 each trajectory point is the current active degrees of freedom&lt;br /&gt;
 of the robot (others are held constants)&lt;br /&gt;
 D is the number of active degrees of freedom.&lt;br /&gt;
 N is the number of points of the trajectory&lt;br /&gt;
 robotid - unique id of the robot&lt;br /&gt;
 jointvalues - DxN matrix of the joint values of each point in the trajrectory.&lt;br /&gt;
 timestamps [optional] - the time stamps in seconds of each trajectory point.&lt;br /&gt;
 transformations [optional] - 12xN or 7xN matrix. The base link transformations of&lt;br /&gt;
                              each trajectory point.&lt;br /&gt;
                              If the column size is 12, then it is a 3x4 matrix&lt;br /&gt;
                              in column first order&lt;br /&gt;
                              If the column size is 7, then it is a quaterion and a translation.&lt;br /&gt;
                              If active degrees of freedom contains a affine transformation component&lt;br /&gt;
                              it is overwritten with the transformations matrices&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Format:COLLADA&amp;diff=216</id>
		<title>Format:COLLADA</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Format:COLLADA&amp;diff=216"/>
				<updated>2012-05-09T05:29:08Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
= COLLADA Robot Specification Version 0.2.1 =&lt;br /&gt;
&lt;br /&gt;
The [https://collada.org/mediawiki/index.php/COLLADA_-_Digital_Asset_and_FX_Exchange_Schema COLLADA] format is used to specify all robot and scene related information. By default, COLLADA 1.5 handles geometry, visual effects, physical properties, and kinematics. This document describes how to extend the format to handle robot-specific information. An official example of a COLLADA extension can be found [http://www.collada.org/mediawiki/index.php/Morph_weights_EXT_extension here].&lt;br /&gt;
&lt;br /&gt;
COLLADA allows extensions of any of its tags using the &amp;#039;&amp;#039;&amp;#039;&amp;lt;extra&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag. Each &amp;#039;&amp;#039;&amp;#039;&amp;lt;extra&amp;gt;&amp;#039;&amp;#039;&amp;#039; defines what type of information to provide (ie manipulator, sensor, collision), and a format for that information, also called &amp;#039;&amp;#039;&amp;#039;technique&amp;#039;&amp;#039;&amp;#039;. All custom data defined here uses the &amp;#039;&amp;#039;&amp;#039;OpenRAVE&amp;#039;&amp;#039;&amp;#039; technique. &lt;br /&gt;
&lt;br /&gt;
There are one-to-one correspondences between the OpenRAVE interface types and COLLADA tags:&lt;br /&gt;
&lt;br /&gt;
* Robot &amp;lt;-&amp;gt; articulated_system&lt;br /&gt;
* KinBody &amp;lt;-&amp;gt; kinematics_model&lt;br /&gt;
* Sensor &amp;lt;-&amp;gt; sensor (new)&lt;br /&gt;
&lt;br /&gt;
= interface_type =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Specifies the type of kinematics body/robot type to instantiate inside the code.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
All of the kinematics body methods can be overridden with new implementations. Because this requires loading user code, a user-provided instantiation has to be used. The interface type specifies what this type is and where to load it from.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;articulated_system&amp;gt;, &amp;lt;kinematics_model&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Child elements || See the following subsection.&lt;br /&gt;
|-&lt;br /&gt;
| Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;interface&amp;gt; || Contains the string id of the interface || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;plugin&amp;gt; || Optional. Contains the string of the location of the shared object object to load. Because plugin prefixes and suffixes depends on the OS, a prefix and suffix independent name can be specified. || 0 or 1&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;interface_type&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interface&amp;gt;MyGenericRobot&amp;lt;/interface&amp;gt;&lt;br /&gt;
    &amp;lt;plugin&amp;gt;myplugin&amp;lt;/plugin&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= manipulator =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Defines a subset of the robot that acts as an &amp;#039;&amp;#039;&amp;#039;arm&amp;#039;&amp;#039;&amp;#039; and a &amp;#039;&amp;#039;&amp;#039;gripper&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
The arm is a chain of joints whose &amp;#039;&amp;#039;&amp;#039;end effector&amp;#039;&amp;#039;&amp;#039; is treated as a gripper. The arm is extracted from the &amp;#039;&amp;#039;&amp;#039;origin&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;tip&amp;#039;&amp;#039;&amp;#039; links. The &amp;#039;&amp;#039;&amp;#039;tip&amp;#039;&amp;#039;&amp;#039; contains the manipulator frame of reference. The gripper axes have to be specified manually. The direction is used as a hint for grasping and inverse kinematics.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;articulated_system&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;frame_origin&amp;gt; || The base frame that the arm starts at || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;frame_tip&amp;gt; || The end effector frame the arm ends at || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;gripper_joint&amp;gt; || Defines one joint of the gripper || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;iksolver&amp;gt; || Defines properties of inverse kinematics functions when used with the arm || 0 or more&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;frame_origin&amp;gt;/&amp;lt;frame_tip&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| link || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. References the SID of a &amp;lt;link&amp;gt; defined in &amp;lt;kinematics_model&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements for &amp;lt;frame_tip&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;translate&amp;gt; || Translation. See main entry in Core. || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;rotate&amp;gt; || Rotation axis. See main entry in Core. || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;direction&amp;gt; || Direction meta information. Sometimes IK and other modules require the manipulator to have a direction to measure angles from. This is defined inside the frame tip coordinate system. || 0 or 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;gripper_joint&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| joint || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The reference of the joint in the instantiated kinematics model that is part of the gripper.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements for &amp;lt;gripper_joint&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;closing_direction&amp;gt; || &amp;#039;&amp;#039;&amp;#039;common_float_or_param_type&amp;#039;&amp;#039;&amp;#039; that contains the default closing direction of an axis on the joint. If a closing direction is not specified for an axis in the joint, it defaults to 0. || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;gripper_joint&amp;gt;/&amp;lt;closing_direction&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| axis || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The SID of the axis inside the referenced joint.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;iksolver&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| type || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The type of the inverse kinematics to set a property for. Possible types are: &amp;#039;&amp;#039;&amp;#039;Transform6D, Rotation3D, Translation3D, Direction3D, Ray4D, Lookat3D, TranslationDirection5D&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements for &amp;lt;iksolver&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;free_joint&amp;gt; || Specifies one free joint to use for ik. || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;interface_type&amp;gt; || Optional. Specifies the interface of the inverse kinematics solver. || 0 or 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;iksolver&amp;gt;/&amp;lt;free_joint&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| joint || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The reference of the joint in the instantiated kinematics model that is part of the manipulator chain.&lt;br /&gt;
|-&lt;br /&gt;
| stepsize || &amp;#039;&amp;#039;&amp;#039;xs:float&amp;#039;&amp;#039;&amp;#039; || The discretization value of this joint when searching for solutions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
The current IK types are:&lt;br /&gt;
&lt;br /&gt;
* Transform6D - end effector reaches desired 6D transformation&lt;br /&gt;
* Rotation3D - end effector reaches desired 3D rotation&lt;br /&gt;
* Translation3D - end effector origin reaches desired 3D translation&lt;br /&gt;
* Direction3D - direction on end effector coordinate system reaches desired direction&lt;br /&gt;
* Ray4D - ray on end effector coordinate system reaches desired global ray&lt;br /&gt;
* Lookat3D - direction on end effector coordinate system points to desired 3D position&lt;br /&gt;
* TranslationDirection5D - end effector origin and direction reaches desired 3D translation and direction. Can be thought of as Ray IK where the origin of the ray must coincide.&lt;br /&gt;
&lt;br /&gt;
The IK types are meant to be hints as to how a manipulator can be used. Multiple IK types can be set for one manipulator and differing free joint values. It is possible for a post-processing stage to determine what IK types are best suited for a particular manipulator structure, and then add those into the COLLADA file.&lt;br /&gt;
&lt;br /&gt;
* Why is a manipulator frame necessary?&lt;br /&gt;
** Answer: Manipulator frames allow the user to define a coordinate system where it makes target tasks easier to complete. In this regard, the manipulator frame can be freely chosen by the user without worrying about destroying the link coordinate systems. For example, link frames are usually aligned with joint axes and center of masses and robot state is defined by their 6D transform in space. Having them also represent task-specific information could destroy consistency when the task changes. Also, the z-axis of the manipulator frame can define the &amp;quot;direction&amp;quot; of the manipulator. Direction can be used in many places like sensor line of sight and grasping approach, which makes it possible to quickly use the robot for planning.&lt;br /&gt;
&lt;br /&gt;
* Question: For dual arm manipulation, would a leftright manipulator ever be used including all joints? In this case, will it might be necessary to define two frame tips (one for left arm and one for right arm)?&lt;br /&gt;
** Answer: Having a leftright manipulator destroys the one-to-one correspondence between gripper joints and ik solver, and not much is gained. So better to have only have one frame tip and origin and treat two arms as separate. The constraint between the end effectors of the two arms is not always rigid, it very task dependent. Therefore, the user should take care of the dual relation.&lt;br /&gt;
&lt;br /&gt;
* Question: What about closing gripper direction for complex hands? Fingers with many DOF might need special grasping strategies.&lt;br /&gt;
** Answer: The closing direction just provide a hint as to the usage. The real gripper movement depends on the grasp strategy, which is beyond the definition of this scope. &lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
The example defines an arm with an end effector at link wam7 with a local coordinate system. It also defines two gripper axes. For the &amp;#039;transform6d&amp;#039; inverse kinematics type, it specifies that the free joint should be &amp;#039;joint4&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;manipulator&amp;quot; name=&amp;quot;leftarm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;frame_origin link=&amp;quot;wam0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;frame_tip link=&amp;quot;wam7&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;translate&amp;gt;0.0 0.0 0.22&amp;lt;/translate&amp;gt;&lt;br /&gt;
      &amp;lt;rotate&amp;gt;0.0 1.0 0.0 90.0&amp;lt;/rotate&amp;gt;&lt;br /&gt;
      &amp;lt;direction&amp;gt;0.0 0.0 1.0&amp;lt;/direction&amp;gt;&lt;br /&gt;
    &amp;lt;/frame_tip&amp;gt;&lt;br /&gt;
    &amp;lt;gripper_joint joint=&amp;quot;jointname&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;closing_direction axis=&amp;quot;axis0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;float&amp;gt;1&amp;lt;/float&amp;gt;&lt;br /&gt;
      &amp;lt;/closing_direction&amp;gt;&lt;br /&gt;
    &amp;lt;/gripper_joint&amp;gt;&lt;br /&gt;
    &amp;lt;gripper_joint joint=&amp;quot;jointname2&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;closing_direction axis=&amp;quot;axis0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;float&amp;gt;-1&amp;lt;/float&amp;gt;&lt;br /&gt;
      &amp;lt;/closing_direction&amp;gt;&lt;br /&gt;
    &amp;lt;/gripper_joint&amp;gt;&lt;br /&gt;
    &amp;lt;iksolver type=&amp;quot;Transform6D&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;free_joint joint=&amp;quot;jointname3&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;interface_type&amp;gt;&lt;br /&gt;
        &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;interface&amp;gt;WAM7ikfast&amp;lt;/interface&amp;gt;&lt;br /&gt;
          &amp;lt;plugin&amp;gt;WAM7ikfast&amp;lt;/plugin&amp;gt;&lt;br /&gt;
        &amp;lt;/technique&amp;gt;&lt;br /&gt;
      &amp;lt;/interface_type&amp;gt;&lt;br /&gt;
    &amp;lt;/iksolver&amp;gt;&lt;br /&gt;
    &amp;lt;iksolver type=&amp;quot;Translation3D&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;free_joint joint=&amp;quot;jointname4&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/iksolver&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= collision =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Links all possible collision meshes and properties for one kinematics body. The meshes depends on the usage.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
A link can have three different collision meshes:&lt;br /&gt;
* for visual rendering&lt;br /&gt;
* for self-collisions&lt;br /&gt;
* for environment collisions&lt;br /&gt;
&lt;br /&gt;
For each link, COLLADA will store three geometries in the &amp;#039;&amp;#039;&amp;#039;&amp;lt;library_geometries&amp;gt;&amp;#039;&amp;#039;&amp;#039;. The geometries will have an &amp;lt;extra&amp;gt; tag that specifies which usage they are meant to. The &amp;#039;&amp;#039;&amp;#039;self&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;env&amp;#039;&amp;#039;&amp;#039; will be referenced inside the visual geometry.&lt;br /&gt;
&lt;br /&gt;
The tag also stores information about what pairs of links can be completely ignored from self-collision detection. These links are either adjacent to each other, or so far from each other that no configuration of the robot can get them into possible collision.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;kinematics_model&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;bind_instance_geometry&amp;gt; || The geometry used for a particular link || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ignore_link_pair&amp;gt; || Specifies two links pairs whose self-collision should not be checked || 0 or more&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;bind_instance_geometry&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| type || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The usage type: &amp;#039;&amp;#039;&amp;#039;environment&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;self&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| link || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. References the SID of a &amp;lt;link&amp;gt; defined in &amp;lt;kinematics_model&amp;gt;. This link is where the geometries will be added.&lt;br /&gt;
|-&lt;br /&gt;
| url || &amp;#039;&amp;#039;&amp;#039;xs:anyURI&amp;#039;&amp;#039;&amp;#039; || Required. The URL of the location of the &amp;lt;geometry&amp;gt; element to instantiate. Can refer to a local instance or external reference.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;ignore_link_pair&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| link0 || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. References the SID of a &amp;lt;link&amp;gt; defined in &amp;lt;kinematics_model&amp;gt;. One of the links defining the pair to be ignored.&lt;br /&gt;
|-&lt;br /&gt;
| link1 || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. References the SID of a &amp;lt;link&amp;gt; defined in &amp;lt;kinematics_model&amp;gt;. One of the links defining the pair to be ignored.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
Convex decompositions can be defined by using one geometry per convex hull and attaching multiple geometries to the same link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ignore_link_pair&amp;gt; tags help self-collision detection to help prune possibilities. The adjacency information is not just the neighboring links. It is also meant to prune any collisions between two links that *cannot* possibly happen if the robot maintains its joint limits. This information depends not only on the kinematics of the robot, but also on the geometry of every link. Also for triplets of joints j1, j2, j3 that intersect at a common axis, you would want to add (j1,j2),(j2,j3),(j1,j3).&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;library_visual_scenes&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;mynode&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;instance_geometry url=&amp;quot;#linka_vis0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;instance_geometry url=&amp;quot;#linka_vis1&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&amp;lt;/library_visual_scenes&amp;gt;&lt;br /&gt;
&amp;lt;library_geometries&amp;gt;&lt;br /&gt;
  &amp;lt;geometry id=&amp;quot;linka_vis0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;geometry id=&amp;quot;linka_vis1&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;geometry id=&amp;quot;linka_env0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;geometry id=&amp;quot;linka_env1&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;geometry id=&amp;quot;linka_self&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;geometry id=&amp;quot;linkb_env0&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/library_geometries&amp;gt;&lt;br /&gt;
&amp;lt;library_kinematics_models&amp;gt;&lt;br /&gt;
  &amp;lt;kinematics_model&amp;gt;&lt;br /&gt;
    &amp;lt;extra type=&amp;quot;collision&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;bind_instance_geometry type=&amp;quot;environment&amp;quot; link=&amp;quot;linka&amp;quot; url=&amp;quot;#linka_env0&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;bind_instance_geometry type=&amp;quot;environment&amp;quot; link=&amp;quot;linka&amp;quot; url=&amp;quot;#linka_env1&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;bind_instance_geometry type=&amp;quot;self&amp;quot; link=&amp;quot;linka&amp;quot; url=&amp;quot;#linka_self&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;bind_instance_geometry type=&amp;quot;environment&amp;quot; link=&amp;quot;linkb&amp;quot; url=&amp;quot;#linkb_env0&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;ignore_link_pair link0=&amp;quot;linka&amp;quot; link1=&amp;quot;linkb&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/technique&amp;gt;&lt;br /&gt;
    &amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/library_kinematics_models&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= library_sensors =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Provides a library in which to place &amp;lt;sensor&amp;gt; elements.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
Allows sensors to be stored as modular resources in libraries. Can be easily referenced through files.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;COLLADA&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= sensor =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Defines a sensor&amp;#039;s type and the geometric and intrinsic parameters.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
Each sensor will be associated with a particular sensor type; depending on the sensor type, the parameters that need to be set will change. The parameters should contain everything necessary to simulate the sensor accurately. They *should not* contain parameters that define the format and transfer of the data.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;articulated_system&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| type || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The type of the sensor. Possible types are: &amp;#039;&amp;#039;&amp;#039;base_pinhole_camera, base_stereo_camera, base_laser2d, base_laser3d, base_flash_laser, base_encoder, base_force6d, base_imu, base_odometry&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;#039;&amp;#039;&amp;#039;xs:ID&amp;#039;&amp;#039;&amp;#039; || Required. A text string containing the unique identifier of the &amp;lt;sensor&amp;gt; element. This value must be unique within the instance document.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;common&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;interface_type&amp;gt; || Optional. Contains the interface type to load the sensor with. || 0 or 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_pinhole_camera&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
Simple pin hole camera defined by an intrinsic matrix. The camera can support multiple image dimensions with multiple channel formats. It is not clear whether all supported formats for one camera should be enumerated in one &amp;lt;sensor&amp;gt; tag, or there should be multiple sensor tags for each different type where the sensors are exclusively mutual.&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;image_dimensions&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;int3_type&amp;#039;&amp;#039;&amp;#039; that specifies the image width, height, and channels. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;format&amp;gt; || Contains a string that specifies the format of every value in the image. Possible types are &amp;#039;&amp;#039;&amp;#039;uint8, uint16, uint32, int8, int16, int32, float32, float64&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;measurement_time&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies time between images (ie exposure time). || 0 or 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;intrinsic&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float2x3_type&amp;#039;&amp;#039;&amp;#039; that specifies the intrinsic parameters defining the principal point, field of view, and skew. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;focal_length&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the physical focal length of the camera. || 0 or 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;distortion_model&amp;gt; || The distortion model to use. It has a &amp;#039;&amp;#039;&amp;#039;type&amp;#039;&amp;#039;&amp;#039; attribute specifying the actual model type, and contains a &amp;#039;&amp;#039;&amp;#039;list_of_floats_type&amp;#039;&amp;#039;&amp;#039; that specifies the distortion coefficients of the model. || 0 or 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_stereo_camera:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Uses two cameras together to extract a depth map. The stereo camera&amp;#039;s coordinate system is in the first instanced camera.&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;instance_sensor&amp;gt; || The camera sensors, the scan time should be equal || 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;instance_sensor&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| url || &amp;#039;&amp;#039;&amp;#039;xs:anyURI&amp;#039;&amp;#039;&amp;#039; || Required. The URL of the location of the &amp;lt;sensor&amp;gt; element to instantiate.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements for &amp;lt;instance_sensor&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;rectification&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float3x3_type&amp;#039;&amp;#039;&amp;#039; that specifies a homography which takes an image to the ideal stereo image plane so that epipolar lines in both stereo images are parallel. The homography transforms from the second image to the first image. || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_laser2d&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
Single scan from a planar laser range-finder along the xy plane.&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;angle_range&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float2_type&amp;#039;&amp;#039;&amp;#039; that specifies the minimum and maximum angles (degrees) of the laser range. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;distance_range&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float2_type&amp;#039;&amp;#039;&amp;#039; that specifies the minimum and maximum distance of the laser. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;angle_increment&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the angular distance between measurements (degrees). || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;time_increment&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the time between measurements (seconds). If your scanner is moving, this will be used in interpolating position of 3d points. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;measurement_time&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the time between scans (seconds) || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_laser3d:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_flash_laser:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_encoder:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_force6d:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;load_range_force&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float3_type&amp;#039;&amp;#039;&amp;#039; that specifies the maximum force around the XYZ axes the sensor can accurately measure before saturating. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance² * Time-²&amp;#039;&amp;#039;&amp;#039;. || 0 or 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;load_range_torque&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float3_type&amp;#039;&amp;#039;&amp;#039; that specifies the maximum torque around the XYZ axes the sensor can accurately measure before saturating. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance * Time-²&amp;#039;&amp;#039;&amp;#039;. || 0 or 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;load_resolution_force&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float3_type&amp;#039;&amp;#039;&amp;#039; that specifies the sensing resolution of the forces being measured around the XYZ axes. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance² * Time-²&amp;#039;&amp;#039;&amp;#039;. || 0 or 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;load_resolution_torque&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float3_type&amp;#039;&amp;#039;&amp;#039; that specifies the sensing resolution of the torques being measured around the XYZ axes. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance² * Time-²&amp;#039;&amp;#039;&amp;#039;. || 0 or 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;load_capacity_range_force&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float3_type&amp;#039;&amp;#039;&amp;#039; that specifies the maximum force around the XYZ axes the sensor can withstand before breaking. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance² * Time-²&amp;#039;&amp;#039;&amp;#039;. || 0 or 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;load_capacity_range_torque&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float3_type&amp;#039;&amp;#039;&amp;#039; that specifies the maximum torque around the XYZ axes the sensor can withstand before breaking. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance² * Time-²&amp;#039;&amp;#039;&amp;#039;. || 0 or 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_imu:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;measurement_time&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the time between scans (seconds). || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;rotation_covariance&amp;gt; || The uncertainty covariance matrix (3x3 row-major matrix) in x, y, and z axes. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;angular_velocity_covariance&amp;gt; || The uncertainty covariance matrix (3x3 row-major matrix) in x, y, and z axes. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;linear_acceleration_covariance&amp;gt; || The uncertainty covariance matrix (3x3 row-major matrix) in x, y, and z axes. || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_odometry:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;measurement_time&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the time between scans (seconds). || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;target&amp;gt; || The name of the target whose odometry is being measured || 0 or 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
Example using a default sensor with a custom interface&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;library_sensors&amp;quot; id=&amp;quot;libsensors&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor type=&amp;quot;base_laser2d&amp;quot; id=&amp;quot;ExampleLaser1&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;angle_min&amp;gt;-90&amp;lt;/angle_min&amp;gt;&lt;br /&gt;
      &amp;lt;angle_max&amp;gt;90&amp;lt;/angle_max&amp;gt;&lt;br /&gt;
      &amp;lt;range_min&amp;gt;0.01&amp;lt;/range_min&amp;gt;&lt;br /&gt;
      &amp;lt;range_max&amp;gt;4.0&amp;lt;/range_max&amp;gt;&lt;br /&gt;
      &amp;lt;angle_increment&amp;gt;1&amp;lt;/angle_increment&amp;gt;&lt;br /&gt;
      &amp;lt;time_increment&amp;gt;0.0005&amp;lt;/time_increment&amp;gt;&lt;br /&gt;
      &amp;lt;measurement_time&amp;gt;0.025&amp;lt;/measurement_time&amp;gt;&lt;br /&gt;
      &amp;lt;interface_type&amp;gt;&lt;br /&gt;
        &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;interface&amp;gt;BaseLaser2D&amp;lt;/interface&amp;gt;&lt;br /&gt;
        &amp;lt;/technique&amp;gt;&lt;br /&gt;
      &amp;lt;/interface_type&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using a non-default, custom sensor&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;library_sensors&amp;quot; id=&amp;quot;libsensors&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor type=&amp;quot;BaseLaser2D&amp;quot; id=&amp;quot;ExampleLaser1&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;minangle&amp;gt;-135&amp;lt;/minangle&amp;gt;&lt;br /&gt;
      &amp;lt;maxangle&amp;gt;135&amp;lt;/maxangle&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;0.35&amp;lt;/resolution&amp;gt;&lt;br /&gt;
      &amp;lt;maxrange&amp;gt;5&amp;lt;/maxrange&amp;gt;&lt;br /&gt;
      &amp;lt;scantime&amp;gt;0.1&amp;lt;/scantime&amp;gt;&lt;br /&gt;
      &amp;lt;color&amp;gt;0.5 0.5 1&amp;lt;/color&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Develop a formal sensor XML file format for different sensor types.&lt;br /&gt;
&lt;br /&gt;
= attach_sensor =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Attaches a sensor to a link of the robot.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
The sensor comes from the sensor library. It can be attached anywhere onto a link defined from the kinematics section. The sensor will maintain a constant transformation between the link.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;articulated_system&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;instance_sensor&amp;gt; || Instantiate a sensor. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;frame_origin&amp;gt; || The base link that the sensor is attached to. || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;frame_origin&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| link || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. References the SID of a &amp;lt;link&amp;gt; defined in &amp;lt;kinematics_model&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements for &amp;lt;frame_origin&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;translate&amp;gt; || Translation. See main entry in Core. || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;rotate&amp;gt; || Rotation axis. See main entry in Core. || 0 or more&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;attach_sensor&amp;quot; name=&amp;quot;left_head_camera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;instance_sensor url=&amp;quot;#pgr_camera&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;frame_origin link=&amp;quot;head&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;translate&amp;gt;0 1 0&amp;lt;/translate&amp;gt;&lt;br /&gt;
      &amp;lt;rotate&amp;gt;0 1 0 90&amp;lt;/rotate&amp;gt;&lt;br /&gt;
    &amp;lt;/frame_origin&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= formula/technique =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Full specifies a formula for a joint and annotates it with extra information necessary for robotics.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
The original &amp;lt;formula&amp;gt;/&amp;lt;technique_common&amp;gt; supports only one equation for the value of the joint. More complex kinematics systems have more than one degree of freedom per joint and use the partial derivatives of the equation to compute Jacobians and simulate physics. &lt;br /&gt;
&lt;br /&gt;
This &amp;quot;OpenRAVE&amp;quot; technique for &amp;lt;formula&amp;gt; can specify partial derivatives of the position &lt;br /&gt;
equation for computing velocity and accelerations.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;formula&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;equation&amp;gt; || Equation in MathML format. Used to specify the position and partial derivatives. || 0 or more&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;equation&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| type || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. can be one of &amp;quot;position&amp;quot;, &amp;quot;first_partial&amp;quot;, or &amp;quot;second_partial&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| target || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || If &amp;#039;type&amp;#039; is &amp;quot;first_partial&amp;quot; or &amp;quot;second_partial&amp;quot;, then fill this with the variable taking the partial derivative with respect to. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;equation type=&amp;quot;position&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;&lt;br /&gt;
      &amp;lt;apply&amp;gt;&lt;br /&gt;
        &amp;lt;plus/&amp;gt;&lt;br /&gt;
        &amp;lt;apply&amp;gt;&lt;br /&gt;
          &amp;lt;times/&amp;gt;&lt;br /&gt;
          &amp;lt;cn&amp;gt;0.333330&amp;lt;/cn&amp;gt;&lt;br /&gt;
          &amp;lt;csymbol encoding=&amp;quot;COLLADA&amp;quot;&amp;gt;kmodel1/joint0&amp;lt;/csymbol&amp;gt;&lt;br /&gt;
        &amp;lt;/apply&amp;gt;&lt;br /&gt;
        &amp;lt;cn&amp;gt;0.872700&amp;lt;/cn&amp;gt;&lt;br /&gt;
      &amp;lt;/apply&amp;gt;&lt;br /&gt;
    &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;/equation&amp;gt;&lt;br /&gt;
  &amp;lt;equation type=&amp;quot;first_partial&amp;quot; target=&amp;quot;kmodel1/joint0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;&lt;br /&gt;
      &amp;lt;cn&amp;gt;0.333330&amp;lt;/cn&amp;gt;&lt;br /&gt;
    &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= library_actuators =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Provides a library in which to place &amp;lt;actuator&amp;gt; elements.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
Allows actuators to be stored as modular resources in libraries. Can be easily referenced through files.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;COLLADA&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= actuator =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
An actuator provides force/momentum/action to kinematics joints.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
Defines a actuator&amp;#039;s physical properties necessary to simulate dynamics and control algorithms of a robot. They &amp;#039;&amp;#039;&amp;#039;should not&amp;#039;&amp;#039;&amp;#039; contain parameters that define the format and transfer of the data to and from actuators. &lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;articulated_system&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| type || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The type of the actuator. Possible types are: &amp;#039;&amp;#039;&amp;#039;motor&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;#039;&amp;#039;&amp;#039;xs:ID&amp;#039;&amp;#039;&amp;#039; || Required. A text string containing the unique identifier of the &amp;lt;actuator&amp;gt; element. This value must be unique within the instance document.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;common&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;interface_type&amp;gt; || Optional. Contains the interface type to load the actuator with. || 0 or 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type electric_motor&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
Converts electrical energy into mechanical energy usually using magnetic fields and conductors. The &amp;#039;&amp;#039;&amp;#039;speed&amp;#039;&amp;#039;&amp;#039; of a motor is measured in revolutions/Time (Time is defined by the &amp;lt;asset&amp;gt; tag and usually measured in seconds). DC Motor Theory References:&lt;br /&gt;
&lt;br /&gt;
* http://hades.mech.northwestern.edu/index.php/Brushed_DC_Motor_Theory&lt;br /&gt;
&lt;br /&gt;
* http://en.wikipedia.org/wiki/Brushed_DC_electric_motor&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;assigned_power_rating&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the nominal power the electric motor can safely produce. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance² * Time-³&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;max_speed&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the maximum speed of the motor. Units are &amp;#039;&amp;#039;&amp;#039;Time-¹&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;no_load_speed&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the speed of the motor powered by the nominal voltage when the motor provides zero torque. Units are &amp;#039;&amp;#039;&amp;#039;Time-¹&amp;#039;&amp;#039;&amp;#039;. || 0 or 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nominal_torque&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the maximum torque the motor can provide continuously without overheating. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance * Time-²&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nominal_voltage&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the nominal voltage the electric motor can safely produce. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance² * Time-² * Charge&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;rotor_inertia&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the inertia of the rotating element about the axis of rotation. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance²&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;speed_constant&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the constant of proportionality relating speed to voltage. Units are &amp;#039;&amp;#039;&amp;#039;Mass-¹ * Distance-² * Time * Charge-¹&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;speed_torque_gradient&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the slope of the speed-torque curve, approximately equal to the no load speed divided by the stall torque. Units are &amp;#039;&amp;#039;&amp;#039; Mass-¹ * Distance-¹ * Time-¹&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;starting_current&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the current through the motor at zero velocity, equal to the nominal voltage divided by the terminal resistance. Also called the stall current.  Units are &amp;#039;&amp;#039;&amp;#039;Time-¹ * Charge&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;terminal_resistance&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the resistance of the motor windings. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance² * Time-¹ * Charge-²&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;torque_constant&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the proportion relating current to torque. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance * Time-¹ * Charge-¹&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;gear_ratio&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float type&amp;#039;&amp;#039;&amp;#039; that specifies the ratio between the input speed of the transmission (the speed of the motor shaft) and the output speed of the transmission.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Related variables, but not inserted in the electric_motor specification:&lt;br /&gt;
&lt;br /&gt;
* Stall torque - The time it takes the unloaded motor to reach 63% of its no load speed under a constant voltage, starting from rest. Proportional to the inertia of the rotor and inversely proportional to the square of the the torque constant. &lt;br /&gt;
* Max. efficiency - The maximum efficiency of the motor in converting electrical power to mechanical power. This maximum efficiency typically occurs at high speed and low torque; the efficiency is zero at zero speed and zero torque, since the mechanical power is τω. &lt;br /&gt;
* No load current - The current required to spin the motor at the no load condition (i.e., the current needed to provide the torque necessary to overcome friction).&lt;br /&gt;
* Nominal current (max. continuous current) - The current that yields the maximum continuous torque. This maximum is determined by thermal characteristics of the motor. The power dissipated by the motor as heat is i2R. Larger currents are acceptable intermittently, but large continuous currents may cause the motor to overheat. &lt;br /&gt;
* Mechanical time constant - The time it takes the unloaded motor to reach 63% of its no load speed under a constant voltage, starting from rest. Proportional to the inertia of the rotor and inversely proportional to the square of the the torque constant.&lt;br /&gt;
* Terminal inductance - The inductance of the motor windings. &lt;br /&gt;
* Thermal resistance housing-ambient &lt;br /&gt;
* Thermal resistance winding-housing&lt;br /&gt;
* Thermal time constant winding.&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;library_actuators&amp;quot; id=&amp;quot;libactuators&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;actuator type=&amp;quot;electric_motor&amp;quot; id=&amp;quot;ExampleMotor1&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;assigned_power_rating&amp;gt;1.0&amp;lt;/assigned_power_rating&amp;gt;&lt;br /&gt;
      &amp;lt;max_speed&amp;gt;3000&amp;lt;/max_speed&amp;gt;&lt;br /&gt;
      &amp;lt;no_load_speed&amp;gt;3990&amp;lt;/no_load_speed&amp;gt;&lt;br /&gt;
      &amp;lt;nominal_torque&amp;gt;0.012&amp;lt;/nominal_torque&amp;gt;&lt;br /&gt;
      &amp;lt;nominal_voltage&amp;gt;24.0&amp;lt;/nominal_voltage&amp;gt;&lt;br /&gt;
      &amp;lt;rotor_inertia&amp;gt;0.0000023&amp;lt;/rotor_inertia&amp;gt;&lt;br /&gt;
      &amp;lt;speed_constant&amp;gt;173.0&amp;lt;/speed_constant&amp;gt;&lt;br /&gt;
      &amp;lt;speed_torque_gradient&amp;gt;130000.0&amp;lt;/speed_torque_gradient&amp;gt;&lt;br /&gt;
      &amp;lt;starting_current&amp;gt;0.578&amp;lt;/starting_current&amp;gt;&lt;br /&gt;
      &amp;lt;terminal_resistance&amp;gt;41.5&amp;lt;/terminal_resistance&amp;gt;&lt;br /&gt;
      &amp;lt;torque_constant&amp;gt;0.0552&amp;lt;/torque_constant&amp;gt;&lt;br /&gt;
    &amp;lt;/actuator&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= attach_actuator =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Attaches an actuator to a joint.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
The actuator comes from the actuator library.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;articulated_system&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;instance_actuator&amp;gt; || Instantiate an actuator. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;bind_actuator&amp;gt; || Binds the actuator to a joint. || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;bind_actuator&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| joint || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The reference of the joint in the instantiated kinematics model that is part of the manipulator chain.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;attach_actuator&amp;quot; name=&amp;quot;motor0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;instance_actuator url=&amp;quot;#ExampleMotor1&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;bind_actuator joint=&amp;quot;kmodel0/myjoint&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= COLLADA Usage =&lt;br /&gt;
&lt;br /&gt;
== COLLADA Format Notes ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;articulated_system&amp;#039;&amp;#039;&amp;#039; tag is equivalent to OpenRAVE robot&lt;br /&gt;
** if child is a &amp;#039;&amp;#039;&amp;#039;motion&amp;#039;&amp;#039;&amp;#039; tag, get accelerations and velocity limits from it&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;kinematics_model&amp;#039;&amp;#039;&amp;#039; tag is equivalent to KinBody&lt;br /&gt;
* If visual_scene tag present, but no kinematics, then add each node tree as a rigid link.&lt;br /&gt;
* In order to set a static link in physics, use the &amp;lt;instance_rigid_body&amp;gt;/&amp;lt;dynamic&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
== Hard and Soft Joint Limits ==&lt;br /&gt;
&lt;br /&gt;
In many scenarios, the controllers on the robots use joints limits which are smaller than the maximum limits. The controller limits are called &amp;#039;&amp;#039;&amp;#039;soft limits&amp;#039;&amp;#039;&amp;#039;, while the hardware limits are called &amp;#039;&amp;#039;&amp;#039;hard limits&amp;#039;&amp;#039;&amp;#039;. In COLLADA, the specification is:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;hard limits&amp;#039;&amp;#039;&amp;#039; - specified inside the &amp;lt;joint&amp;gt; tag using the &amp;lt;limits&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;soft limits&amp;#039;&amp;#039;&amp;#039; - specified inside the &amp;lt;articulated_system&amp;gt;/&amp;lt;kinematics&amp;gt;/&amp;lt;technique_common&amp;gt;/&amp;lt;axis_info&amp;gt; tag using the &amp;lt;limits&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Planning Weights ==&lt;br /&gt;
&lt;br /&gt;
For each joint, a measure of how much a joint&amp;#039;s movement impacts the robot (base joints have more impact than end effector joints). this information should be used by all planners to evaluate importance of joints. Calculating this accurately might require an offline process.&lt;br /&gt;
&lt;br /&gt;
== Composition ==&lt;br /&gt;
&lt;br /&gt;
Robots usually have grippers, robot arms, and robot bases in separate files, then we have one file that references all of them and specifies the links to merge together (ie, we do not complicate things by creating dummy joints). This can be done with articulated systems (&amp;lt;kinematics&amp;gt; tag supports multiple &amp;lt;instance_kinematics_model&amp;gt; tags).&lt;br /&gt;
&lt;br /&gt;
== Geometric Primitives ==&lt;br /&gt;
&lt;br /&gt;
Use COLLADA &amp;lt;brep&amp;gt; for spheres, cylinders, boxes, etc. &lt;br /&gt;
&lt;br /&gt;
== Storing Convex Decompositions ==&lt;br /&gt;
&lt;br /&gt;
Each link is composed of a set of convex hulls. Need to create one geometry per convex hull (&amp;lt;convex_mesh&amp;gt;?) and specify multiple geometries per &amp;lt;node&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Calibration vs Static Data ==&lt;br /&gt;
&lt;br /&gt;
One thing that separates a base description of the robot from the real&lt;br /&gt;
robot that will be used in labs is calibration:&lt;br /&gt;
* where each sensor is with respect to the robot (6D pose)&lt;br /&gt;
* intrinsic parameters for each sensor&lt;br /&gt;
* joint offsets for encoder calibration&lt;br /&gt;
* controller parameters like PID gains for dynamic properties of motors&lt;br /&gt;
* possibly even link lengths depending on how much you trust the manufacturer&lt;br /&gt;
&lt;br /&gt;
All these parameters will change per robot, and it won&amp;#039;t be a good&lt;br /&gt;
idea asking every person to go and modify their one robot file.&lt;br /&gt;
Instead we should have a different calibration file that the main&lt;br /&gt;
collada file always references. It should be setup in such a way that the calibration file becomes optional.&lt;br /&gt;
&lt;br /&gt;
== Controllers ==&lt;br /&gt;
&lt;br /&gt;
Specifying controller parameters in the collada file falls somewhere&lt;br /&gt;
in between calibration parameters and parameters that will never&lt;br /&gt;
change and should be in the main robot file. In my opinion it is very&lt;br /&gt;
hard to find static parameters especially when considering controllers&lt;br /&gt;
in simulation along with real world controllers. Also, there&amp;#039;s as many&lt;br /&gt;
control algorithms out there as planners, and I wouldn&amp;#039;t feel&lt;br /&gt;
comfortable specifying planning algorithms and parameters inside a&lt;br /&gt;
robot file.&lt;br /&gt;
&lt;br /&gt;
= COLLADA Samples Using OpenRAVE Extensions =&lt;br /&gt;
&lt;br /&gt;
[https://openrave.svn.sourceforge.net/svnroot/openrave/data/robots/ Robot Database]&lt;br /&gt;
&lt;br /&gt;
== Contributors ==&lt;br /&gt;
&lt;br /&gt;
* University of Tokyo - Rosen Diankov and Ryohei Ueda&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Format:COLLADA&amp;diff=215</id>
		<title>Format:COLLADA</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Format:COLLADA&amp;diff=215"/>
				<updated>2012-05-05T05:22:00Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
= COLLADA Robot Specification Version 0.2.1 =&lt;br /&gt;
&lt;br /&gt;
The [https://collada.org/mediawiki/index.php/COLLADA_-_Digital_Asset_and_FX_Exchange_Schema COLLADA] format is used to specify all robot and scene related information. By default, COLLADA 1.5 handles geometry, visual effects, physical properties, and kinematics. This document describes how to extend the format to handle robot-specific information. An official example of a COLLADA extension can be found [http://www.collada.org/mediawiki/index.php/Morph_weights_EXT_extension here].&lt;br /&gt;
&lt;br /&gt;
COLLADA allows extensions of any of its tags using the &amp;#039;&amp;#039;&amp;#039;&amp;lt;extra&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag. Each &amp;#039;&amp;#039;&amp;#039;&amp;lt;extra&amp;gt;&amp;#039;&amp;#039;&amp;#039; defines what type of information to provide (ie manipulator, sensor, collision), and a format for that information, also called &amp;#039;&amp;#039;&amp;#039;technique&amp;#039;&amp;#039;&amp;#039;. All custom data defined here uses the &amp;#039;&amp;#039;&amp;#039;OpenRAVE&amp;#039;&amp;#039;&amp;#039; technique. &lt;br /&gt;
&lt;br /&gt;
There are one-to-one correspondences between the OpenRAVE interface types and COLLADA tags:&lt;br /&gt;
&lt;br /&gt;
* Robot &amp;lt;-&amp;gt; articulated_system&lt;br /&gt;
* KinBody &amp;lt;-&amp;gt; kinematics_model&lt;br /&gt;
* Sensor &amp;lt;-&amp;gt; sensor (new)&lt;br /&gt;
&lt;br /&gt;
= interface_type =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Specifies the type of kinematics body/robot type to instantiate inside the code.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
All of the kinematics body methods can be overridden with new implementations. Because this requires loading user code, a user-provided instantiation has to be used. The interface type specifies what this type is and where to load it from.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;articulated_system&amp;gt;, &amp;lt;kinematics_model&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Child elements || See the following subsection.&lt;br /&gt;
|-&lt;br /&gt;
| Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;interface&amp;gt; || Contains the string id of the interface || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;plugin&amp;gt; || Optional. Contains the string of the location of the shared object object to load. Because plugin prefixes and suffixes depends on the OS, a prefix and suffix independent name can be specified. || 0 or 1&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;interface_type&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interface&amp;gt;MyGenericRobot&amp;lt;/interface&amp;gt;&lt;br /&gt;
    &amp;lt;plugin&amp;gt;myplugin&amp;lt;/plugin&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= manipulator =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Defines a subset of the robot that acts as an &amp;#039;&amp;#039;&amp;#039;arm&amp;#039;&amp;#039;&amp;#039; and a &amp;#039;&amp;#039;&amp;#039;gripper&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
The arm is a chain of joints whose &amp;#039;&amp;#039;&amp;#039;end effector&amp;#039;&amp;#039;&amp;#039; is treated as a gripper. The arm is extracted from the &amp;#039;&amp;#039;&amp;#039;origin&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;tip&amp;#039;&amp;#039;&amp;#039; links. The &amp;#039;&amp;#039;&amp;#039;tip&amp;#039;&amp;#039;&amp;#039; contains the manipulator frame of reference. The gripper axes have to be specified manually. The direction is used as a hint for grasping and inverse kinematics.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;articulated_system&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;frame_origin&amp;gt; || The base frame that the arm starts at || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;frame_tip&amp;gt; || The end effector frame the arm ends at || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;gripper_joint&amp;gt; || Defines one joint of the gripper || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;iksolver&amp;gt; || Defines properties of inverse kinematics functions when used with the arm || 0 or more&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;frame_origin&amp;gt;/&amp;lt;frame_tip&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| link || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. References the SID of a &amp;lt;link&amp;gt; defined in &amp;lt;kinematics_model&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements for &amp;lt;frame_tip&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;translate&amp;gt; || Translation. See main entry in Core. || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;rotate&amp;gt; || Rotation axis. See main entry in Core. || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;direction&amp;gt; || Direction meta information. Sometimes IK and other modules require the manipulator to have a direction to measure angles from. This is defined inside the frame tip coordinate system. || 0 or 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;gripper_joint&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| joint || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The reference of the joint in the instantiated kinematics model that is part of the gripper.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements for &amp;lt;gripper_joint&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;closing_direction&amp;gt; || &amp;#039;&amp;#039;&amp;#039;common_float_or_param_type&amp;#039;&amp;#039;&amp;#039; that contains the default closing direction of an axis on the joint. If a closing direction is not specified for an axis in the joint, it defaults to 0. || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;gripper_joint&amp;gt;/&amp;lt;closing_direction&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| axis || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The SID of the axis inside the referenced joint.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;iksolver&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| type || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The type of the inverse kinematics to set a property for. Possible types are: &amp;#039;&amp;#039;&amp;#039;Transform6D, Rotation3D, Translation3D, Direction3D, Ray4D, Lookat3D, TranslationDirection5D&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements for &amp;lt;iksolver&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;free_joint&amp;gt; || Specifies one free joint to use for ik. || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;interface_type&amp;gt; || Optional. Specifies the interface of the inverse kinematics solver. || 0 or 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;iksolver&amp;gt;/&amp;lt;free_joint&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| joint || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The reference of the joint in the instantiated kinematics model that is part of the manipulator chain.&lt;br /&gt;
|-&lt;br /&gt;
| stepsize || &amp;#039;&amp;#039;&amp;#039;xs:float&amp;#039;&amp;#039;&amp;#039; || The discretization value of this joint when searching for solutions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
The current IK types are:&lt;br /&gt;
&lt;br /&gt;
* Transform6D - end effector reaches desired 6D transformation&lt;br /&gt;
* Rotation3D - end effector reaches desired 3D rotation&lt;br /&gt;
* Translation3D - end effector origin reaches desired 3D translation&lt;br /&gt;
* Direction3D - direction on end effector coordinate system reaches desired direction&lt;br /&gt;
* Ray4D - ray on end effector coordinate system reaches desired global ray&lt;br /&gt;
* Lookat3D - direction on end effector coordinate system points to desired 3D position&lt;br /&gt;
* TranslationDirection5D - end effector origin and direction reaches desired 3D translation and direction. Can be thought of as Ray IK where the origin of the ray must coincide.&lt;br /&gt;
&lt;br /&gt;
The IK types are meant to be hints as to how a manipulator can be used. Multiple IK types can be set for one manipulator and differing free joint values. It is possible for a post-processing stage to determine what IK types are best suited for a particular manipulator structure, and then add those into the COLLADA file.&lt;br /&gt;
&lt;br /&gt;
* Why is a manipulator frame necessary?&lt;br /&gt;
** Answer: Manipulator frames allow the user to define a coordinate system where it makes target tasks easier to complete. In this regard, the manipulator frame can be freely chosen by the user without worrying about destroying the link coordinate systems. For example, link frames are usually aligned with joint axes and center of masses and robot state is defined by their 6D transform in space. Having them also represent task-specific information could destroy consistency when the task changes. Also, the z-axis of the manipulator frame can define the &amp;quot;direction&amp;quot; of the manipulator. Direction can be used in many places like sensor line of sight and grasping approach, which makes it possible to quickly use the robot for planning.&lt;br /&gt;
&lt;br /&gt;
* Question: For dual arm manipulation, would a leftright manipulator ever be used including all joints? In this case, will it might be necessary to define two frame tips (one for left arm and one for right arm)?&lt;br /&gt;
** Answer: Having a leftright manipulator destroys the one-to-one correspondence between gripper joints and ik solver, and not much is gained. So better to have only have one frame tip and origin and treat two arms as separate. The constraint between the end effectors of the two arms is not always rigid, it very task dependent. Therefore, the user should take care of the dual relation.&lt;br /&gt;
&lt;br /&gt;
* Question: What about closing gripper direction for complex hands? Fingers with many DOF might need special grasping strategies.&lt;br /&gt;
** Answer: The closing direction just provide a hint as to the usage. The real gripper movement depends on the grasp strategy, which is beyond the definition of this scope. &lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
The example defines an arm with an end effector at link wam7 with a local coordinate system. It also defines two gripper axes. For the &amp;#039;transform6d&amp;#039; inverse kinematics type, it specifies that the free joint should be &amp;#039;joint4&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;manipulator&amp;quot; name=&amp;quot;leftarm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;frame_origin link=&amp;quot;wam0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;frame_tip link=&amp;quot;wam7&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;translate&amp;gt;0.0 0.0 0.22&amp;lt;/translate&amp;gt;&lt;br /&gt;
      &amp;lt;rotate&amp;gt;0.0 1.0 0.0 90.0&amp;lt;/rotate&amp;gt;&lt;br /&gt;
      &amp;lt;direction&amp;gt;0.0 0.0 1.0&amp;lt;/direction&amp;gt;&lt;br /&gt;
    &amp;lt;/frame_tip&amp;gt;&lt;br /&gt;
    &amp;lt;gripper_joint joint=&amp;quot;jointname&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;closing_direction axis=&amp;quot;axis0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;float&amp;gt;1&amp;lt;/float&amp;gt;&lt;br /&gt;
      &amp;lt;/closing_direction&amp;gt;&lt;br /&gt;
    &amp;lt;/gripper_joint&amp;gt;&lt;br /&gt;
    &amp;lt;gripper_joint joint=&amp;quot;jointname2&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;closing_direction axis=&amp;quot;axis0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;float&amp;gt;-1&amp;lt;/float&amp;gt;&lt;br /&gt;
      &amp;lt;/closing_direction&amp;gt;&lt;br /&gt;
    &amp;lt;/gripper_joint&amp;gt;&lt;br /&gt;
    &amp;lt;iksolver type=&amp;quot;Transform6D&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;free_joint joint=&amp;quot;jointname3&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;interface_type&amp;gt;&lt;br /&gt;
        &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;interface&amp;gt;WAM7ikfast&amp;lt;/interface&amp;gt;&lt;br /&gt;
          &amp;lt;plugin&amp;gt;WAM7ikfast&amp;lt;/plugin&amp;gt;&lt;br /&gt;
        &amp;lt;/technique&amp;gt;&lt;br /&gt;
      &amp;lt;/interface_type&amp;gt;&lt;br /&gt;
    &amp;lt;/iksolver&amp;gt;&lt;br /&gt;
    &amp;lt;iksolver type=&amp;quot;Translation3D&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;free_joint joint=&amp;quot;jointname4&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/iksolver&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= collision =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Links all possible collision meshes and properties for one kinematics body. The meshes depends on the usage.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
A link can have three different collision meshes:&lt;br /&gt;
* for visual rendering&lt;br /&gt;
* for self-collisions&lt;br /&gt;
* for environment collisions&lt;br /&gt;
&lt;br /&gt;
For each link, COLLADA will store three geometries in the &amp;#039;&amp;#039;&amp;#039;&amp;lt;library_geometries&amp;gt;&amp;#039;&amp;#039;&amp;#039;. The geometries will have an &amp;lt;extra&amp;gt; tag that specifies which usage they are meant to. The &amp;#039;&amp;#039;&amp;#039;self&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;env&amp;#039;&amp;#039;&amp;#039; will be referenced inside the visual geometry.&lt;br /&gt;
&lt;br /&gt;
The tag also stores information about what pairs of links can be completely ignored from self-collision detection. These links are either adjacent to each other, or so far from each other that no configuration of the robot can get them into possible collision.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;kinematics_model&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;bind_instance_geometry&amp;gt; || The geometry used for a particular link || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ignore_link_pair&amp;gt; || Specifies two links pairs whose self-collision should not be checked || 0 or more&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;bind_instance_geometry&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| type || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The usage type: &amp;#039;&amp;#039;&amp;#039;environment&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;self&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| link || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. References the SID of a &amp;lt;link&amp;gt; defined in &amp;lt;kinematics_model&amp;gt;. This link is where the geometries will be added.&lt;br /&gt;
|-&lt;br /&gt;
| url || &amp;#039;&amp;#039;&amp;#039;xs:anyURI&amp;#039;&amp;#039;&amp;#039; || Required. The URL of the location of the &amp;lt;geometry&amp;gt; element to instantiate. Can refer to a local instance or external reference.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;ignore_link_pair&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| link0 || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. References the SID of a &amp;lt;link&amp;gt; defined in &amp;lt;kinematics_model&amp;gt;. One of the links defining the pair to be ignored.&lt;br /&gt;
|-&lt;br /&gt;
| link1 || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. References the SID of a &amp;lt;link&amp;gt; defined in &amp;lt;kinematics_model&amp;gt;. One of the links defining the pair to be ignored.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
Convex decompositions can be defined by using one geometry per convex hull and attaching multiple geometries to the same link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ignore_link_pair&amp;gt; tags help self-collision detection to help prune possibilities. The adjacency information is not just the neighboring links. It is also meant to prune any collisions between two links that *cannot* possibly happen if the robot maintains its joint limits. This information depends not only on the kinematics of the robot, but also on the geometry of every link. Also for triplets of joints j1, j2, j3 that intersect at a common axis, you would want to add (j1,j2),(j2,j3),(j1,j3).&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;library_visual_scenes&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;mynode&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;instance_geometry url=&amp;quot;#linka_vis0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;instance_geometry url=&amp;quot;#linka_vis1&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&amp;lt;/library_visual_scenes&amp;gt;&lt;br /&gt;
&amp;lt;library_geometries&amp;gt;&lt;br /&gt;
  &amp;lt;geometry id=&amp;quot;linka_vis0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;geometry id=&amp;quot;linka_vis1&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;geometry id=&amp;quot;linka_env0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;geometry id=&amp;quot;linka_env1&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;geometry id=&amp;quot;linka_self&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;geometry id=&amp;quot;linkb_env0&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/library_geometries&amp;gt;&lt;br /&gt;
&amp;lt;library_kinematics_models&amp;gt;&lt;br /&gt;
  &amp;lt;kinematics_model&amp;gt;&lt;br /&gt;
    &amp;lt;extra type=&amp;quot;collision&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;bind_instance_geometry type=&amp;quot;environment&amp;quot; link=&amp;quot;linka&amp;quot; url=&amp;quot;#linka_env0&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;bind_instance_geometry type=&amp;quot;environment&amp;quot; link=&amp;quot;linka&amp;quot; url=&amp;quot;#linka_env1&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;bind_instance_geometry type=&amp;quot;self&amp;quot; link=&amp;quot;linka&amp;quot; url=&amp;quot;#linka_self&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;bind_instance_geometry type=&amp;quot;environment&amp;quot; link=&amp;quot;linkb&amp;quot; url=&amp;quot;#linkb_env0&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;ignore_link_pair link0=&amp;quot;linka&amp;quot; link1=&amp;quot;linkb&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/technique&amp;gt;&lt;br /&gt;
    &amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/library_kinematics_models&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= library_sensors =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Provides a library in which to place &amp;lt;sensor&amp;gt; elements.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
Allows sensors to be stored as modular resources in libraries. Can be easily referenced through files.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;COLLADA&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= sensor =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Defines a sensor&amp;#039;s type and the geometric and intrinsic parameters.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
Each sensor will be associated with a particular sensor type; depending on the sensor type, the parameters that need to be set will change. The parameters should contain everything necessary to simulate the sensor accurately. They *should not* contain parameters that define the format and transfer of the data.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;articulated_system&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| type || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The type of the sensor. Possible types are: &amp;#039;&amp;#039;&amp;#039;base_pinhole_camera, base_stereo_camera, base_laser2d, base_laser3d, base_flash_laser, base_encoder, base_force6d, base_imu, base_odometry&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;#039;&amp;#039;&amp;#039;xs:ID&amp;#039;&amp;#039;&amp;#039; || Required. A text string containing the unique identifier of the &amp;lt;sensor&amp;gt; element. This value must be unique within the instance document.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;common&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;interface_type&amp;gt; || Optional. Contains the interface type to load the sensor with. || 0 or 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_pinhole_camera&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
Simple pin hole camera defined by an intrinsic matrix. The camera can support multiple image dimensions with multiple channel formats. It is not clear whether all supported formats for one camera should be enumerated in one &amp;lt;sensor&amp;gt; tag, or there should be multiple sensor tags for each different type where the sensors are exclusively mutual.&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;image_dimensions&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;int3_type&amp;#039;&amp;#039;&amp;#039; that specifies the image width, height, and channels. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;format&amp;gt; || Contains a string that specifies the format of every value in the image. Possible types are &amp;#039;&amp;#039;&amp;#039;uint8, uint16, uint32, int8, int16, int32, float32, float64&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;measurement_time&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies time between images (ie exposure time). || 0 or 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;intrinsic&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float2x3_type&amp;#039;&amp;#039;&amp;#039; that specifies the intrinsic parameters defining the principal point, field of view, and skew. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;focal_length&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the physical focal length of the camera. || 0 or 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;distortion_model&amp;gt; || The distortion model to use. It has a &amp;#039;&amp;#039;&amp;#039;type&amp;#039;&amp;#039;&amp;#039; attribute specifying the actual model type, and contains a &amp;#039;&amp;#039;&amp;#039;list_of_floats_type&amp;#039;&amp;#039;&amp;#039; that specifies the distortion coefficients of the model. || 0 or 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_stereo_camera:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Uses two cameras together to extract a depth map. The stereo camera&amp;#039;s coordinate system is in the first instanced camera.&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;instance_sensor&amp;gt; || The camera sensors, the scan time should be equal || 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;instance_sensor&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| url || &amp;#039;&amp;#039;&amp;#039;xs:anyURI&amp;#039;&amp;#039;&amp;#039; || Required. The URL of the location of the &amp;lt;sensor&amp;gt; element to instantiate.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements for &amp;lt;instance_sensor&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;rectification&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float3x3_type&amp;#039;&amp;#039;&amp;#039; that specifies a homography which takes an image to the ideal stereo image plane so that epipolar lines in both stereo images are parallel. The homography transforms from the second image to the first image. || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_laser2d&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
Single scan from a planar laser range-finder along the xy plane.&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;angle_range&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float2_type&amp;#039;&amp;#039;&amp;#039; that specifies the minimum and maximum angles (degrees) of the laser range. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;distance_range&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float2_type&amp;#039;&amp;#039;&amp;#039; that specifies the minimum and maximum distance of the laser. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;angle_increment&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the angular distance between measurements (degrees). || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;time_increment&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the time between measurements (seconds). If your scanner is moving, this will be used in interpolating position of 3d points. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;measurement_time&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the time between scans (seconds) || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_laser3d:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_flash_laser:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_encoder:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_force6d:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_imu:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;measurement_time&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the time between scans (seconds). || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;rotation_covariance&amp;gt; || The uncertainty covariance matrix (3x3 row-major matrix) in x, y, and z axes. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;angular_velocity_covariance&amp;gt; || The uncertainty covariance matrix (3x3 row-major matrix) in x, y, and z axes. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;linear_acceleration_covariance&amp;gt; || The uncertainty covariance matrix (3x3 row-major matrix) in x, y, and z axes. || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_odometry:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;measurement_time&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the time between scans (seconds). || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;target&amp;gt; || The name of the target whose odometry is being measured || 0 or 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
Example using a default sensor with a custom interface&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;library_sensors&amp;quot; id=&amp;quot;libsensors&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor type=&amp;quot;base_laser2d&amp;quot; id=&amp;quot;ExampleLaser1&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;angle_min&amp;gt;-90&amp;lt;/angle_min&amp;gt;&lt;br /&gt;
      &amp;lt;angle_max&amp;gt;90&amp;lt;/angle_max&amp;gt;&lt;br /&gt;
      &amp;lt;range_min&amp;gt;0.01&amp;lt;/range_min&amp;gt;&lt;br /&gt;
      &amp;lt;range_max&amp;gt;4.0&amp;lt;/range_max&amp;gt;&lt;br /&gt;
      &amp;lt;angle_increment&amp;gt;1&amp;lt;/angle_increment&amp;gt;&lt;br /&gt;
      &amp;lt;time_increment&amp;gt;0.0005&amp;lt;/time_increment&amp;gt;&lt;br /&gt;
      &amp;lt;measurement_time&amp;gt;0.025&amp;lt;/measurement_time&amp;gt;&lt;br /&gt;
      &amp;lt;interface_type&amp;gt;&lt;br /&gt;
        &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;interface&amp;gt;BaseLaser2D&amp;lt;/interface&amp;gt;&lt;br /&gt;
        &amp;lt;/technique&amp;gt;&lt;br /&gt;
      &amp;lt;/interface_type&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using a non-default, custom sensor&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;library_sensors&amp;quot; id=&amp;quot;libsensors&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor type=&amp;quot;BaseLaser2D&amp;quot; id=&amp;quot;ExampleLaser1&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;minangle&amp;gt;-135&amp;lt;/minangle&amp;gt;&lt;br /&gt;
      &amp;lt;maxangle&amp;gt;135&amp;lt;/maxangle&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;0.35&amp;lt;/resolution&amp;gt;&lt;br /&gt;
      &amp;lt;maxrange&amp;gt;5&amp;lt;/maxrange&amp;gt;&lt;br /&gt;
      &amp;lt;scantime&amp;gt;0.1&amp;lt;/scantime&amp;gt;&lt;br /&gt;
      &amp;lt;color&amp;gt;0.5 0.5 1&amp;lt;/color&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Develop a formal sensor XML file format for different sensor types.&lt;br /&gt;
&lt;br /&gt;
= attach_sensor =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Attaches a sensor to a link of the robot.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
The sensor comes from the sensor library. It can be attached anywhere onto a link defined from the kinematics section. The sensor will maintain a constant transformation between the link.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;articulated_system&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;instance_sensor&amp;gt; || Instantiate a sensor. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;frame_origin&amp;gt; || The base link that the sensor is attached to. || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;frame_origin&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| link || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. References the SID of a &amp;lt;link&amp;gt; defined in &amp;lt;kinematics_model&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements for &amp;lt;frame_origin&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;translate&amp;gt; || Translation. See main entry in Core. || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;rotate&amp;gt; || Rotation axis. See main entry in Core. || 0 or more&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;attach_sensor&amp;quot; name=&amp;quot;left_head_camera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;instance_sensor url=&amp;quot;#pgr_camera&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;frame_origin link=&amp;quot;head&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;translate&amp;gt;0 1 0&amp;lt;/translate&amp;gt;&lt;br /&gt;
      &amp;lt;rotate&amp;gt;0 1 0 90&amp;lt;/rotate&amp;gt;&lt;br /&gt;
    &amp;lt;/frame_origin&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= formula/technique =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Full specifies a formula for a joint and annotates it with extra information necessary for robotics.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
The original &amp;lt;formula&amp;gt;/&amp;lt;technique_common&amp;gt; supports only one equation for the value of the joint. More complex kinematics systems have more than one degree of freedom per joint and use the partial derivatives of the equation to compute Jacobians and simulate physics. &lt;br /&gt;
&lt;br /&gt;
This &amp;quot;OpenRAVE&amp;quot; technique for &amp;lt;formula&amp;gt; can specify partial derivatives of the position &lt;br /&gt;
equation for computing velocity and accelerations.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;formula&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;equation&amp;gt; || Equation in MathML format. Used to specify the position and partial derivatives. || 0 or more&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;equation&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| type || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. can be one of &amp;quot;position&amp;quot;, &amp;quot;first_partial&amp;quot;, or &amp;quot;second_partial&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| target || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || If &amp;#039;type&amp;#039; is &amp;quot;first_partial&amp;quot; or &amp;quot;second_partial&amp;quot;, then fill this with the variable taking the partial derivative with respect to. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;equation type=&amp;quot;position&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;&lt;br /&gt;
      &amp;lt;apply&amp;gt;&lt;br /&gt;
        &amp;lt;plus/&amp;gt;&lt;br /&gt;
        &amp;lt;apply&amp;gt;&lt;br /&gt;
          &amp;lt;times/&amp;gt;&lt;br /&gt;
          &amp;lt;cn&amp;gt;0.333330&amp;lt;/cn&amp;gt;&lt;br /&gt;
          &amp;lt;csymbol encoding=&amp;quot;COLLADA&amp;quot;&amp;gt;kmodel1/joint0&amp;lt;/csymbol&amp;gt;&lt;br /&gt;
        &amp;lt;/apply&amp;gt;&lt;br /&gt;
        &amp;lt;cn&amp;gt;0.872700&amp;lt;/cn&amp;gt;&lt;br /&gt;
      &amp;lt;/apply&amp;gt;&lt;br /&gt;
    &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;/equation&amp;gt;&lt;br /&gt;
  &amp;lt;equation type=&amp;quot;first_partial&amp;quot; target=&amp;quot;kmodel1/joint0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;&lt;br /&gt;
      &amp;lt;cn&amp;gt;0.333330&amp;lt;/cn&amp;gt;&lt;br /&gt;
    &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= library_actuators =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Provides a library in which to place &amp;lt;actuator&amp;gt; elements.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
Allows actuators to be stored as modular resources in libraries. Can be easily referenced through files.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;COLLADA&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= actuator =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
An actuator provides force/momentum/action to kinematics joints.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
Defines a actuator&amp;#039;s physical properties necessary to simulate dynamics and control algorithms of a robot. They &amp;#039;&amp;#039;&amp;#039;should not&amp;#039;&amp;#039;&amp;#039; contain parameters that define the format and transfer of the data to and from actuators. &lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;articulated_system&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| type || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The type of the actuator. Possible types are: &amp;#039;&amp;#039;&amp;#039;motor&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;#039;&amp;#039;&amp;#039;xs:ID&amp;#039;&amp;#039;&amp;#039; || Required. A text string containing the unique identifier of the &amp;lt;actuator&amp;gt; element. This value must be unique within the instance document.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;common&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;interface_type&amp;gt; || Optional. Contains the interface type to load the actuator with. || 0 or 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type electric_motor&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
Converts electrical energy into mechanical energy usually using magnetic fields and conductors. The &amp;#039;&amp;#039;&amp;#039;speed&amp;#039;&amp;#039;&amp;#039; of a motor is measured in revolutions/Time (Time is defined by the &amp;lt;asset&amp;gt; tag and usually measured in seconds). DC Motor Theory References:&lt;br /&gt;
&lt;br /&gt;
* http://hades.mech.northwestern.edu/index.php/Brushed_DC_Motor_Theory&lt;br /&gt;
&lt;br /&gt;
* http://en.wikipedia.org/wiki/Brushed_DC_electric_motor&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;assigned_power_rating&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the nominal power the electric motor can safely produce. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance² * Time-³&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;max_speed&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the maximum speed of the motor. Units are &amp;#039;&amp;#039;&amp;#039;Time-¹&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;no_load_speed&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the speed of the motor powered by the nominal voltage when the motor provides zero torque. Units are &amp;#039;&amp;#039;&amp;#039;Time-¹&amp;#039;&amp;#039;&amp;#039;. || 0 or 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nominal_torque&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the maximum torque the motor can provide continuously without overheating. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance * Time-²&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nominal_voltage&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the nominal voltage the electric motor can safely produce. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance² * Time-² * Charge&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;rotor_inertia&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the inertia of the rotating element about the axis of rotation. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance²&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;speed_constant&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the constant of proportionality relating speed to voltage. Units are &amp;#039;&amp;#039;&amp;#039;Mass-¹ * Distance-² * Time * Charge-¹&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;speed_torque_gradient&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the slope of the speed-torque curve, approximately equal to the no load speed divided by the stall torque. Units are &amp;#039;&amp;#039;&amp;#039; Mass-¹ * Distance-¹ * Time-¹&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;starting_current&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the current through the motor at zero velocity, equal to the nominal voltage divided by the terminal resistance. Also called the stall current.  Units are &amp;#039;&amp;#039;&amp;#039;Time-¹ * Charge&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;terminal_resistance&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the resistance of the motor windings. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance² * Time-¹ * Charge-²&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;torque_constant&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the proportion relating current to torque. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance * Time-¹ * Charge-¹&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;gear_ratio&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float type&amp;#039;&amp;#039;&amp;#039; that specifies the ratio between the input speed of the transmission (the speed of the motor shaft) and the output speed of the transmission.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Related variables, but not inserted in the electric_motor specification:&lt;br /&gt;
&lt;br /&gt;
* Stall torque - The time it takes the unloaded motor to reach 63% of its no load speed under a constant voltage, starting from rest. Proportional to the inertia of the rotor and inversely proportional to the square of the the torque constant. &lt;br /&gt;
* Max. efficiency - The maximum efficiency of the motor in converting electrical power to mechanical power. This maximum efficiency typically occurs at high speed and low torque; the efficiency is zero at zero speed and zero torque, since the mechanical power is τω. &lt;br /&gt;
* No load current - The current required to spin the motor at the no load condition (i.e., the current needed to provide the torque necessary to overcome friction).&lt;br /&gt;
* Nominal current (max. continuous current) - The current that yields the maximum continuous torque. This maximum is determined by thermal characteristics of the motor. The power dissipated by the motor as heat is i2R. Larger currents are acceptable intermittently, but large continuous currents may cause the motor to overheat. &lt;br /&gt;
* Mechanical time constant - The time it takes the unloaded motor to reach 63% of its no load speed under a constant voltage, starting from rest. Proportional to the inertia of the rotor and inversely proportional to the square of the the torque constant.&lt;br /&gt;
* Terminal inductance - The inductance of the motor windings. &lt;br /&gt;
* Thermal resistance housing-ambient &lt;br /&gt;
* Thermal resistance winding-housing&lt;br /&gt;
* Thermal time constant winding.&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;library_actuators&amp;quot; id=&amp;quot;libactuators&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;actuator type=&amp;quot;electric_motor&amp;quot; id=&amp;quot;ExampleMotor1&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;assigned_power_rating&amp;gt;1.0&amp;lt;/assigned_power_rating&amp;gt;&lt;br /&gt;
      &amp;lt;max_speed&amp;gt;3000&amp;lt;/max_speed&amp;gt;&lt;br /&gt;
      &amp;lt;no_load_speed&amp;gt;3990&amp;lt;/no_load_speed&amp;gt;&lt;br /&gt;
      &amp;lt;nominal_torque&amp;gt;0.012&amp;lt;/nominal_torque&amp;gt;&lt;br /&gt;
      &amp;lt;nominal_voltage&amp;gt;24.0&amp;lt;/nominal_voltage&amp;gt;&lt;br /&gt;
      &amp;lt;rotor_inertia&amp;gt;0.0000023&amp;lt;/rotor_inertia&amp;gt;&lt;br /&gt;
      &amp;lt;speed_constant&amp;gt;173.0&amp;lt;/speed_constant&amp;gt;&lt;br /&gt;
      &amp;lt;speed_torque_gradient&amp;gt;130000.0&amp;lt;/speed_torque_gradient&amp;gt;&lt;br /&gt;
      &amp;lt;starting_current&amp;gt;0.578&amp;lt;/starting_current&amp;gt;&lt;br /&gt;
      &amp;lt;terminal_resistance&amp;gt;41.5&amp;lt;/terminal_resistance&amp;gt;&lt;br /&gt;
      &amp;lt;torque_constant&amp;gt;0.0552&amp;lt;/torque_constant&amp;gt;&lt;br /&gt;
    &amp;lt;/actuator&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= attach_actuator =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Attaches an actuator to a joint.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
The actuator comes from the actuator library.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;articulated_system&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;instance_actuator&amp;gt; || Instantiate an actuator. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;bind_actuator&amp;gt; || Binds the actuator to a joint. || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;bind_actuator&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| joint || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The reference of the joint in the instantiated kinematics model that is part of the manipulator chain.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;attach_actuator&amp;quot; name=&amp;quot;motor0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;instance_actuator url=&amp;quot;#ExampleMotor1&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;bind_actuator joint=&amp;quot;kmodel0/myjoint&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= COLLADA Usage =&lt;br /&gt;
&lt;br /&gt;
== COLLADA Format Notes ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;articulated_system&amp;#039;&amp;#039;&amp;#039; tag is equivalent to OpenRAVE robot&lt;br /&gt;
** if child is a &amp;#039;&amp;#039;&amp;#039;motion&amp;#039;&amp;#039;&amp;#039; tag, get accelerations and velocity limits from it&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;kinematics_model&amp;#039;&amp;#039;&amp;#039; tag is equivalent to KinBody&lt;br /&gt;
* If visual_scene tag present, but no kinematics, then add each node tree as a rigid link.&lt;br /&gt;
* In order to set a static link in physics, use the &amp;lt;instance_rigid_body&amp;gt;/&amp;lt;dynamic&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
== Hard and Soft Joint Limits ==&lt;br /&gt;
&lt;br /&gt;
In many scenarios, the controllers on the robots use joints limits which are smaller than the maximum limits. The controller limits are called &amp;#039;&amp;#039;&amp;#039;soft limits&amp;#039;&amp;#039;&amp;#039;, while the hardware limits are called &amp;#039;&amp;#039;&amp;#039;hard limits&amp;#039;&amp;#039;&amp;#039;. In COLLADA, the specification is:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;hard limits&amp;#039;&amp;#039;&amp;#039; - specified inside the &amp;lt;joint&amp;gt; tag using the &amp;lt;limits&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;soft limits&amp;#039;&amp;#039;&amp;#039; - specified inside the &amp;lt;articulated_system&amp;gt;/&amp;lt;kinematics&amp;gt;/&amp;lt;technique_common&amp;gt;/&amp;lt;axis_info&amp;gt; tag using the &amp;lt;limits&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Planning Weights ==&lt;br /&gt;
&lt;br /&gt;
For each joint, a measure of how much a joint&amp;#039;s movement impacts the robot (base joints have more impact than end effector joints). this information should be used by all planners to evaluate importance of joints. Calculating this accurately might require an offline process.&lt;br /&gt;
&lt;br /&gt;
== Composition ==&lt;br /&gt;
&lt;br /&gt;
Robots usually have grippers, robot arms, and robot bases in separate files, then we have one file that references all of them and specifies the links to merge together (ie, we do not complicate things by creating dummy joints). This can be done with articulated systems (&amp;lt;kinematics&amp;gt; tag supports multiple &amp;lt;instance_kinematics_model&amp;gt; tags).&lt;br /&gt;
&lt;br /&gt;
== Geometric Primitives ==&lt;br /&gt;
&lt;br /&gt;
Use COLLADA &amp;lt;brep&amp;gt; for spheres, cylinders, boxes, etc. &lt;br /&gt;
&lt;br /&gt;
== Storing Convex Decompositions ==&lt;br /&gt;
&lt;br /&gt;
Each link is composed of a set of convex hulls. Need to create one geometry per convex hull (&amp;lt;convex_mesh&amp;gt;?) and specify multiple geometries per &amp;lt;node&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Calibration vs Static Data ==&lt;br /&gt;
&lt;br /&gt;
One thing that separates a base description of the robot from the real&lt;br /&gt;
robot that will be used in labs is calibration:&lt;br /&gt;
* where each sensor is with respect to the robot (6D pose)&lt;br /&gt;
* intrinsic parameters for each sensor&lt;br /&gt;
* joint offsets for encoder calibration&lt;br /&gt;
* controller parameters like PID gains for dynamic properties of motors&lt;br /&gt;
* possibly even link lengths depending on how much you trust the manufacturer&lt;br /&gt;
&lt;br /&gt;
All these parameters will change per robot, and it won&amp;#039;t be a good&lt;br /&gt;
idea asking every person to go and modify their one robot file.&lt;br /&gt;
Instead we should have a different calibration file that the main&lt;br /&gt;
collada file always references. It should be setup in such a way that the calibration file becomes optional.&lt;br /&gt;
&lt;br /&gt;
== Controllers ==&lt;br /&gt;
&lt;br /&gt;
Specifying controller parameters in the collada file falls somewhere&lt;br /&gt;
in between calibration parameters and parameters that will never&lt;br /&gt;
change and should be in the main robot file. In my opinion it is very&lt;br /&gt;
hard to find static parameters especially when considering controllers&lt;br /&gt;
in simulation along with real world controllers. Also, there&amp;#039;s as many&lt;br /&gt;
control algorithms out there as planners, and I wouldn&amp;#039;t feel&lt;br /&gt;
comfortable specifying planning algorithms and parameters inside a&lt;br /&gt;
robot file.&lt;br /&gt;
&lt;br /&gt;
= COLLADA Samples Using OpenRAVE Extensions =&lt;br /&gt;
&lt;br /&gt;
[https://openrave.svn.sourceforge.net/svnroot/openrave/data/robots/ Robot Database]&lt;br /&gt;
&lt;br /&gt;
== Contributors ==&lt;br /&gt;
&lt;br /&gt;
* University of Tokyo - Rosen Diankov and Ryohei Ueda&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=214</id>
		<title>Format:XML</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=214"/>
				<updated>2012-04-30T07:13:16Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
= OpenRAVE Custom XML Format =&lt;br /&gt;
&lt;br /&gt;
[[image:Openrave_robots.jpg|600px]] &lt;br /&gt;
&lt;br /&gt;
TODO: Decide on the versioning scheme&lt;br /&gt;
&lt;br /&gt;
OpenRAVE uses XML to store all robot and scene descriptions. The XML format is flexible enough to link one XML file from another like including already created objects/robots in an environment. It is also possible to specify vrml or iv formatted files within it to import models. &lt;br /&gt;
&lt;br /&gt;
All interface types can be created. Furthermore, an &amp;lt;environment&amp;gt; tag can optionally be specified to put all bodies/interfaces in.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Environment&amp;#039;&amp;#039;&amp;#039; - specify multiple objects and robots. Can also define some GUI properties like camera start location and background color. The environment allows the creation of &amp;#039;&amp;#039;&amp;#039;any&amp;#039;&amp;#039;&amp;#039; OpenRAVE interfaces. Each interface can take the &amp;#039;&amp;#039;&amp;#039;type&amp;#039;&amp;#039;&amp;#039; attribute specifying the interface type and can define custom XML readers.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039; - The basic object that all other objects derive from. A kinematic body consists of a collection of rigid bodies and joints that connect these bodies.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; - The basic robot that derives from &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039;. Usually every Robot has at least one KinBody declaration inside it. A robot can also hold a list of &amp;#039;&amp;#039;&amp;#039;Manipulator&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;AttachedSensor&amp;#039;&amp;#039;&amp;#039; objects describing the manipulation/sensing capabilities of the robot. Since plugin authors can create different robots, it is also possible to define custom fields in &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; to hold other information like balance control parameters for humanoids.&lt;br /&gt;
&lt;br /&gt;
== Transformations ==&lt;br /&gt;
&lt;br /&gt;
Most tags for links/bodies/robots hold a transformation. The following fields modify this transformation:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- xyz --&amp;gt;&lt;br /&gt;
&amp;lt;translation&amp;gt;0 1 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- w x y z --&amp;gt;&lt;br /&gt;
&amp;lt;quat&amp;gt;1 0 0 0&amp;lt;/quat&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- a 3x3 rotation matrix specified as rows first&lt;br /&gt;
r00, r01, r02,    r10, r11, r12,     r20, r21, r21 --&amp;gt;&lt;br /&gt;
&amp;lt;rotationmat&amp;gt;1 0 0 0 1 0 0 0 1&amp;lt;/rotationmat&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- axis_x axis_y axis_z angle(deg) --&amp;gt;&lt;br /&gt;
&amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multiple of the same tags can be specified, resulting in the transformations being compounded. During compounding, the translation and rotation are treated separately.&lt;br /&gt;
&lt;br /&gt;
== KinBody ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody name=&amp;quot;TestKinBody&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Create a rigid body named Body1 and declare it as &amp;#039;dynamic&amp;#039;.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;#039;dynamic&amp;#039; bodies are subject to physics laws, &amp;#039;static&amp;#039; bodies will never move--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- due to physical forces. It is recommended EVERYTHING is declared as &amp;#039;dynamic&amp;#039; --&amp;gt;&lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that the body transforms affects all geometry objects attached. --&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- translation of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;!--rotation of the body specified as a rotation axis. First three numbers are the axis.--&amp;gt;&lt;br /&gt;
    &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- defines mass properties for the entire kinbody. possible mass types are--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- mimicgeom - &amp;lt;density&amp;gt;. Adds a mass equivalent to all the geometry--&amp;gt;&lt;br /&gt;
    &amp;lt;!--    objects. trimesh and plane are not supported.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- box - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;extents&amp;gt; Adds a simple box--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- sphere - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;radius&amp;gt;--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;density&amp;gt;1000&amp;lt;/density&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Define a geometry object attached to the body. The functionality of --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- geometry objects is to define the collision and render geometries of the body. --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- All geometry types have Rotation(Mat/Quat), Translation, and Render components.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Possible geom types are box, sphere, trimesh, plane.--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *box - extents--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *sphere - radius--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *cylinder - radius, height (axis is along y)--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *trimesh - data--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- extents of the box - half width, height, length--&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;1 1 1&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;!-- set the translation and rotation of the box. Note that the transforamtions--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- are all relative to the parent body.--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;0 1 0 45&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Can create multiple geometries per body--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;2 1 2&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 1 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;!-- RotationMat is a 3x3 rotation matrix specified as rows first--&amp;gt;&lt;br /&gt;
      &amp;lt;RotationMat&amp;gt;1 0 0 0 1 0 0 0 1&amp;lt;/RotationMat&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Set the transparency of the geometry, 0 is opaque--&amp;gt;&lt;br /&gt;
      &amp;lt;transparency&amp;gt;0.4&amp;lt;/transparency&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- change the mass properties of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the total mass--&amp;gt;&lt;br /&gt;
      &amp;lt;total&amp;gt;0.40605&amp;lt;/total&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the 3x3 inertia matrix--&amp;gt;&lt;br /&gt;
      &amp;lt;inertia&amp;gt;2 0 0 0 3 0 0 0 5&amp;lt;/inertia&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the center of mass (if using ODE physics engine, should be 0)--&amp;gt;&lt;br /&gt;
      &amp;lt;com&amp;gt;0.008842 -0.000018 0.07367&amp;lt;/com&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a sphere--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;sphere&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- although the underlying collision geometry will be a sphere,--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- render it as a coffee pot--&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/coffeepot.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 -1.5 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Radius&amp;gt;1.5&amp;lt;/Radius&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a triangle mesh--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/cup.iv 0.01&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;!-- use the cup triangles for collision detection.--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The last number is the scale, in case the iv files are scaled improperly.--&amp;gt;&lt;br /&gt;
      &amp;lt;collision&amp;gt;models/objects/cup.iv 0.01&amp;lt;/collision&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1.5 -2 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Create a joint between the two bodies.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Possible joint types are: hinge, slider, universal, hinge2, and spherical.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Hinges are the most common joint type used in robots.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- For amotors, can specify mode, axis1, axis2, axis3. For each axis, first 3 values are the axis and the last value is the relative coord system (see ODE documentation).--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Every joint can have certain properties:--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxforce&amp;gt; are in number of degrees of freedom.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxvel&amp;gt;, &amp;lt;resolution&amp;gt; are scalar and apply to all DOFs.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;limits&amp;gt;, &amp;lt;limitsdeg&amp;gt;, &amp;lt;limitsrad&amp;gt; specify the joint limits --&amp;gt;&lt;br /&gt;
  &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Specify the names of the bodies, names are not case sensitive.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body1&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body2&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- anchor and axis of the hinge--&amp;gt;&lt;br /&gt;
    &amp;lt;Anchor&amp;gt;0 0 0&amp;lt;/Anchor&amp;gt;&lt;br /&gt;
    &amp;lt;Axis&amp;gt;0 1 0&amp;lt;/Axis&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Weight for configuration distance, mostly used in planners.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- for joints with &amp;gt; 1 DOF, specify 2+ values--&amp;gt;&lt;br /&gt;
    &amp;lt;Weight&amp;gt;1.0&amp;lt;/Weight&amp;gt;&lt;br /&gt;
    &amp;lt;!-- in Newton-meters (Nm)  --&amp;gt;&lt;br /&gt;
    &amp;lt;maxtorque&amp;gt;10&amp;lt;/maxtorque&amp;gt;&lt;br /&gt;
  &amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Models Directory ===&lt;br /&gt;
&lt;br /&gt;
By default, the root directory for all models files is the folder openrave is launched at. To change this, &amp;#039;&amp;#039;&amp;#039;&amp;lt;modelsdir&amp;gt;&amp;#039;&amp;#039;&amp;#039; can be used to specify model files relative to where the current xml file is. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;modelsdir&amp;gt;../mymodels&amp;lt;/modelsdir&amp;gt;&lt;br /&gt;
  &amp;lt;Body&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;render&amp;gt;kitchen/myfile.wrl&amp;lt;/render&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Circular Joints ===&lt;br /&gt;
&lt;br /&gt;
Sometimes joints will have the upper and lower limits identified, meaning that as soon as the joint gets past one limit it will wrap around to the other. Infinitely revolving hinge joints are the most common example of &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; joints where the &amp;lt;math&amp;gt;-\pi&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; limits are identified. In openrave, it is possible to set a joint as &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; like this:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint circular=&amp;quot;true&amp;quot; ...&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Adjacent Links ===&lt;br /&gt;
&lt;br /&gt;
Robot self-collision usually checks all pairs of non-adjacent links for collision; links are adjacent if they are connected to a joint. In order to reduce self-collision computation time and spurious collisions of small links, it is possible to force pairs of links to be treated as adjacent by specifying an &amp;#039;&amp;#039;&amp;#039;&amp;lt;adjacent&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag.&lt;br /&gt;
&lt;br /&gt;
=== Scale ===&lt;br /&gt;
&lt;br /&gt;
The first thing when importing a new model is to check that all the units are in meters (it is very common for robots to be in millimeters), otherwise the visualization model and the collision model will be in a different scale. to check this, open the robot and go to View-&amp;gt;Geometry-&amp;gt;Collision, this will show the collision model. If it is not the same scale, you need to go inside your model files and change the units. You can also enter a scale factor after model filenames like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;collision&amp;gt;mydata.iv 0.001&amp;lt;/collision&amp;gt;&lt;br /&gt;
&amp;lt;render&amp;gt;mydata.iv 0.001&amp;lt;/render&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this will scale the models by 0.001.&lt;br /&gt;
&lt;br /&gt;
=== Modifiable Geometry ===&lt;br /&gt;
&lt;br /&gt;
When avoiding collision obstacles, OpenRAVE can optionally use convex decompositions to speed up the environment collision checking and pad the geometry with safety regions. By default, all geometry is &amp;#039;&amp;#039;&amp;#039;modifiable&amp;#039;&amp;#039;&amp;#039;, but the user can turn it off so that the mesh is never changed by setting &amp;#039;&amp;#039;&amp;#039;modifiable=&amp;quot;false&amp;quot;&amp;#039;&amp;#039;&amp;#039; attribute in the &amp;#039;&amp;#039;&amp;#039;&amp;lt;geom&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag.&lt;br /&gt;
&lt;br /&gt;
Geometry that can make contact with the environment usually should not be modified. For example:&lt;br /&gt;
&lt;br /&gt;
- gripper links since contact points are important&lt;br /&gt;
&lt;br /&gt;
- markers and other place-holders used for tracking&lt;br /&gt;
&lt;br /&gt;
== Robot ==&lt;br /&gt;
&lt;br /&gt;
=== A simple 3DOF planar arm in XZ ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;3DOFRobot&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Create the base body, it should never move--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that all translations and rotations are with respect to this base--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- For example, the robot at the identity transformation is equivalent to the identity transformation of the first body.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Base&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.0  0.0  0.0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;radius&amp;gt;0.03&amp;lt;/radius&amp;gt;&lt;br /&gt;
        &amp;lt;height&amp;gt;0.02&amp;lt;/height&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;0.05 0.05 0.05&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the first movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm0&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Offset from is a fast way of specifying that the translation and rotation of this--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- body should be relative to another link--&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Base&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Translation relative to Base--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.01 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm0&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Base&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;4&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;3&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the second movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0.0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.0075 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the third movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.04 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.04 0.005 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;2&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;2&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Create the gripper joints:--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;RClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/RClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/RClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;RClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;RClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!--left gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;LClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0.005 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/LClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/LClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;LClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;LClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 -1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the transparency of every geometry in the KinBody--&amp;gt;&lt;br /&gt;
    &amp;lt;transparency&amp;gt;0.1&amp;lt;/transparency&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specifying the manipulator structure--&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;Arm2&amp;lt;/effector&amp;gt;   &amp;lt;!-- last link where end effector is attached--&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;Base&amp;lt;/base&amp;gt;           &amp;lt;!-- base link--&amp;gt;&lt;br /&gt;
    &amp;lt;joints&amp;gt;j1 j2&amp;lt;/joints&amp;gt;      &amp;lt;!-- the gripper joints used for contact--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- the id of the inverse kinematics solver, it is not necessary to--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify an ik solver for every robot. But if there is one,--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- use iksolver field to identity it.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;lt;iksolver&amp;gt;MyTriDOFSolver&amp;lt;/iksolver&amp;gt; --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- joint values of the closed and opened positions--&amp;gt;&lt;br /&gt;
    &amp;lt;closingdirection&amp;gt;1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
    &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
    &amp;lt;!-- grasp goal with respect to the effector--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0.125 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DOFRobot Robot:  [[image:tridof.jpg|200px]] &lt;br /&gt;
&lt;br /&gt;
=== Defining Manipulators ===&lt;br /&gt;
&lt;br /&gt;
A robot manipulator defines a kinematic chain of the robot joint hierarchy along with optional gripper joint values that are not used in the inverse kinematics computation but are needed for grasping purposes (chains for heads, legs do not need the joint values). A manipulator defines a new frame of reference with respect to the end effector link; all inverse kinematics computations are computed using it. Furthermore, a manipulator can have a &amp;#039;&amp;#039;&amp;#039;&amp;lt;direction&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying an axis for approaching objects or line-of-sight. For example the &amp;#039;&amp;#039;&amp;#039;robots/barrettwam.robot.xml&amp;#039;&amp;#039;&amp;#039; gripper is defined by&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;base&amp;gt;wam0&amp;lt;/base&amp;gt;&lt;br /&gt;
  &amp;lt;effector&amp;gt;wam7&amp;lt;/effector&amp;gt;&lt;br /&gt;
  &amp;lt;Translation&amp;gt;0 0 0.22&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;joints&amp;gt;JF1 JF2 JF3 JF4&amp;lt;/joints&amp;gt;&lt;br /&gt;
  &amp;lt;closingdirection&amp;gt;1 1 1 0&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
  &amp;lt;direction&amp;gt;0 0 1&amp;lt;/direction&amp;gt;&lt;br /&gt;
  &amp;lt;iksolver&amp;gt;WAM7ikfast 0.05&amp;lt;/iksolver&amp;gt;&lt;br /&gt;
&amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The manipulator can optionally define a &amp;#039;&amp;#039;&amp;#039;&amp;lt;iksolver&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying the iksolver interface that is used for getting IK solutions, or a shared object (DLL) to load an [[Component:Ikfast|ikfast]] solver from.&lt;br /&gt;
&lt;br /&gt;
=== Closed-chains and Mimic Joints ===&lt;br /&gt;
&lt;br /&gt;
OpenRAVE allows closed-chains and complex kinematics to be simulated using mimic joints. A mimic joint&amp;#039;s position, velocity, and acceleration values are computed from user-specified formulas using the values of other joints. OpenRAVE uses the Function Parser library to allow any formula to be specified. Refer to the documentation for more information [http://openrave.programmingvision.com/en/coreapihtml/classOpenRAVE_1_1KinBody_1_1Joint.html#a0e31c5be31c4145afa786e0c0d6a46ae here].&lt;br /&gt;
&lt;br /&gt;
A mimic joint requires at least the position equation and its partial derivatives (for velocity) to be manually entered. &lt;br /&gt;
&lt;br /&gt;
For example, the Barrett Hand mimic joints are defined as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;JF1&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;JF1mimic&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot; mimic_pos=&amp;quot;JF1/3+0.8727&amp;quot; mimic_vel=&amp;quot;|JF1 0.33333&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Of course, it is possible to have a mimic joint depend on more than one other joint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;b&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;c&amp;quot; type=&amp;quot;hinge&amp;quot; mimic_pos=&amp;quot;a+b+atan(a)&amp;quot; mimic_vel=&amp;quot;|a 1 + 1/(1+a*a) |b 1&amp;quot; mimic_accel=&amp;quot;|a -2*a/((1+a*a)*(1+a*a)) |b 0&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using mimic joints, it is important to still make all the correct joint connections so that loops are discovered and forces can be computed correctly.&lt;br /&gt;
&lt;br /&gt;
If a joint has more than one degree of freedom, attach the axis index at the end. For example: &amp;quot;mimic_pos0&amp;quot;, &amp;quot;mimic_pos1&amp;quot;, &amp;quot;mimic_vel0&amp;quot;, &amp;quot;mimic_vel1&amp;quot;, &amp;quot;mimic_accel0&amp;quot;, and &amp;quot;mimic_accel1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Attaching Robot Sensors ===&lt;br /&gt;
&lt;br /&gt;
Every robot can be attached a number of sensors onto it. The way to specify this in XML is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specify an attached sensor--&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyFirstLaser&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;link&amp;gt;wam1&amp;lt;/link&amp;gt; &amp;lt;!-- the robot link that the sensor is attached to. As the robot moves, the sensor will move with it--&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 0.2 0.4&amp;lt;/translation&amp;gt; &amp;lt;!-- the local translation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt; &amp;lt;!-- the local rotation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify the real sensor attached--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;#039;type&amp;#039; is the sensor interface identifier--&amp;gt;&lt;br /&gt;
    &amp;lt;sensor type=&amp;quot;BaseLaser2D&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The rest are specific fields to BaseLaser2D, these change as the type changes--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The best way to find out what fields are supported is to look for the documentation--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- for the type of sensor using--&amp;gt;&lt;br /&gt;
      &amp;lt;minangle&amp;gt;-135&amp;lt;/minangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;maxangle&amp;gt;135&amp;lt;/maxangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;0.35&amp;lt;/resolution&amp;gt; &amp;lt;!-- degrees between laser points--&amp;gt;&lt;br /&gt;
      &amp;lt;maxrange&amp;gt;5&amp;lt;/maxrange&amp;gt; &amp;lt;!-- max range of robot--&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting joint values for initial state ===&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot&amp;#039;s initial state is not when all the joints are at 0. Instead of transforming each of the geometry to the zero pose, it is possible to set the initial angle to use using the &amp;lt;initial&amp;gt; tag inside the &amp;lt;joint&amp;gt;. The definition for setting the initial angle to pi/2 radius is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link0&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link1&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;initial&amp;gt;1.570796326794&amp;lt;/initial&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Changing the Body Coordinate System ===&lt;br /&gt;
&lt;br /&gt;
[[image:Barrettwam_coordchange.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot origin and rotation should be defined in a different coordinate system. It is possible to create a new robot file that references the old one and changes its origin. This requires adding a new root link before the robot is defined. For example, consider the robots/barrettwam.robot.xml file whre the first link&amp;#039;s name is &amp;#039;wam0&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- add new first link --&amp;gt;&lt;br /&gt;
  &amp;lt;kinbody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;root&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;robot file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;!-- change the coordinate system of the original first link and attach a dummy joint --&amp;gt;&lt;br /&gt;
    &amp;lt;kinbody&amp;gt;&lt;br /&gt;
      &amp;lt;body name=&amp;quot;wam0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0.3 0.4 0.3&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;root&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;wam0&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;limitsdeg&amp;gt;0 0&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
== Environment Example ==&lt;br /&gt;
&lt;br /&gt;
This example is part of the &amp;#039;&amp;#039;&amp;#039;bin/data/intel/lab1.env.xml&amp;#039;&amp;#039;&amp;#039; file. The most important thing to note about this example is the use of the &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; attribute to import other XML files. The filename specified with &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; has to be &amp;#039;&amp;#039;&amp;#039;relative&amp;#039;&amp;#039;&amp;#039; to the current directory where the file calling it resides. Note the differences between segway.kinbody.xml and barrettwam.robot.xml.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the background color of the environment--&amp;gt;&lt;br /&gt;
  &amp;lt;bkgndcolor&amp;gt;0.3 0.7 0.8&amp;lt;/bkgndcolor&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera translation--&amp;gt;&lt;br /&gt;
  &amp;lt;camtrans&amp;gt;1.418 -1.234 2.963&amp;lt;/camtrans&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera rotation specified by rotation-axis--&amp;gt;&lt;br /&gt;
  &amp;lt;camrotaxis&amp;gt;0.724 0.302 0.619 68&amp;lt;/camrotaxis&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import the segway model and place it somewhere--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;data/segway.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;-0.0671   -0.0819    0.7550&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import a robot file and add an additional body for a cylindrical base--&amp;gt;&lt;br /&gt;
  &amp;lt;Robot file=&amp;quot;../../robots/barrettwam.robot.xml&amp;quot; name=&amp;quot;BarrettWAM&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;-.22 -.14 -.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Body type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
          &amp;lt;radius&amp;gt;0.08&amp;lt;/radius&amp;gt;&lt;br /&gt;
          &amp;lt;height&amp;gt;0.6&amp;lt;/height&amp;gt;&lt;br /&gt;
          &amp;lt;diffusecolor&amp;gt;0.3 0.3 0.3&amp;lt;/diffusecolor&amp;gt;&lt;br /&gt;
          &amp;lt;Translation&amp;gt; 0.2286 0.1397 -0.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;/Geom&amp;gt;&lt;br /&gt;
      &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;-0.754 0.3265 1.036&amp;lt;/translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Robot&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- add the floor as a box--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody name=&amp;quot;floor&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- floor should never move, so make it static--&amp;gt;&lt;br /&gt;
    &amp;lt;Body type=&amp;quot;static&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;2 2 0.005&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;.6 .6 .6&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      	&amp;lt;ambientColor&amp;gt;0.6 0.6 0.6&amp;lt;/ambientColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting Robot Joint Values ===&lt;br /&gt;
&lt;br /&gt;
It is possible to set the joint values of the kinbody in the scene using the &amp;#039;&amp;#039;&amp;#039;&amp;lt;jointvalues&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag. The order of the values should be the order of the DOF indices of each joint (passive/mimic joints are ignored).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;environment&amp;gt;&lt;br /&gt;
  &amp;lt;robot file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;jointvalues&amp;gt;1 1 0 0 0 0 0 0.5 0 0 0&amp;lt;/jointvalues&amp;gt;&lt;br /&gt;
  &amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot Composition ==&lt;br /&gt;
&lt;br /&gt;
The way we recommend managing robots composed of several sub-robots (like a humanoid composed of arms, legs, hands, etc) is to first create separate .kinbody files for just the kinematics and geometry of each separate&lt;br /&gt;
part (ie a hand.kinbody.xml and a arm.kinbody.xml). Then create a robot file that includes both the kinematics and defines the manipulators, sensors, and controllers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;attachedsensor&amp;gt;&lt;br /&gt;
     ....&lt;br /&gt;
 &amp;lt;/attachedsensor&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sometimes for grasp planning, the hand needs to be treated as a robot, so we create a hand.robot.xml file as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. A robot can reference other robots through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;a.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;b.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both a&amp;#039;s and b&amp;#039;s &amp;#039;&amp;#039;&amp;#039;&amp;lt;Manipulator&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;AttachedSensor&amp;gt;&amp;#039;&amp;#039;&amp;#039; tags will be used&lt;br /&gt;
in the parent robot, so you don&amp;#039; t have to copy their definitions.&lt;br /&gt;
&lt;br /&gt;
2. It is possible to prefix the links and joints of a child robot by using the&lt;br /&gt;
&amp;#039;prefix&amp;#039; attribute:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;left_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;right_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now all links and joints will either start with &amp;#039;&amp;#039;&amp;#039;left_&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;right_&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
3. When the xml parser sees a body with the same name as another body,&lt;br /&gt;
it &amp;#039;appends&amp;#039; the specified geometries to the original body. This allows the same link to be referenced/defined in multiple robot files (Note that it is not possible to change the original body coordinate system).&lt;br /&gt;
&lt;br /&gt;
=== Attaching Separate Links ===&lt;br /&gt;
&lt;br /&gt;
When a robot is composed of multiple parts defined in different files, it is necessary to attach links from the different files together so that the robot hierarchy can be complete. This is done by defining &amp;#039;&amp;#039;&amp;#039;disabled&amp;#039;&amp;#039;&amp;#039; dummy joints that attach two links together. These disabled joints do not show up in the robot&amp;#039;s description and are only present to maintain the relative transformation between two links. For example, the robot &amp;#039;&amp;#039;&amp;#039;robots/pa10schunk.robot.xml&amp;#039;&amp;#039;&amp;#039; is composed of &amp;#039;&amp;#039;&amp;#039;robots/pa10.kinbody.xml&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;robots/schunk_manip.kinbody.xml&amp;#039;&amp;#039;&amp;#039;, in order to join the two, the robot  is defined in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;pa10.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody file=&amp;quot;schunk_manip.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;False&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;link7&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;gripper_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;#039;&amp;#039;&amp;#039;link7&amp;#039;&amp;#039;&amp;#039; is a link of the pa10 arm and &amp;#039;&amp;#039;&amp;#039;gripper_base&amp;#039;&amp;#039;&amp;#039; is a link of the gripper. The lower and upper joint limits are all 0, which OpenRAVE recognizes as a dummy joint.&lt;br /&gt;
&lt;br /&gt;
=== Joining A Robot Arm and Hand ===&lt;br /&gt;
&lt;br /&gt;
It is possible to load robots and bodies from COLLADA files by specifying the collada filename through the &amp;#039;&amp;#039;&amp;#039;file&amp;#039;&amp;#039;&amp;#039; attribute. For example, the following robot is a combination of an arm defined in OpenRAVE XML and a hand defined in COLLADA (download schunkSDHHand from [http://opengrasp.sourceforge.net/Downloads.html OpenGrasp]). The dummy joint is used to join the arm end effector with the hand base.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot file=&amp;quot;robots/kuka-kr5-r650.robot.xml&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot prefix=&amp;quot;hand_&amp;quot; file=&amp;quot;schunkSDHhand.dae&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody&amp;gt;&lt;br /&gt;
   &amp;lt;body name=&amp;quot;hand_root&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;offsetfrom&amp;gt;link6&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
     &amp;lt;translation&amp;gt;0.03 0 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
     &amp;lt;rotationaxis&amp;gt;0 1 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;joint type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;link6&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;hand_root&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
   &amp;lt;/joint&amp;gt;&lt;br /&gt;
 &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;base&amp;gt;base&amp;lt;/base&amp;gt;&lt;br /&gt;
   &amp;lt;effector&amp;gt;link6&amp;lt;/effector&amp;gt;&lt;br /&gt;
   &amp;lt;joints&amp;gt;hand_Bone_B1_Joint hand_Bone_B2_Joint hand_Bone_B3_Joint hand_Bone_A1_Joint hand_Bone_A2_Joint hand_Bone_A3_Joint hand_Bone_C1_Joint hand_Bone_C2_Joint hand_Bone_C3_Joint&amp;lt;/joints&amp;gt;&lt;br /&gt;
   &amp;lt;closingdirection&amp;gt;0 1 1 0 1 1 0 1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
   &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Final robot: [[image:collada_sdh_kuka.jpg|150px]]&lt;br /&gt;
&lt;br /&gt;
=== Dual-arm example ===&lt;br /&gt;
&lt;br /&gt;
Here is an example file of having a robot composed of two arms attached to a common link named &amp;#039;&amp;#039;&amp;#039;chest&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;schunk-dualarm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;chest&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;0.1 0.1 0.4&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0 0 0.4&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/geom&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- left arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody prefix=&amp;quot;l_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 -0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody&amp;gt;prefix=&amp;quot;r_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- connect the two arms with dummy joints --&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;leftdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;l_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;rightdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;r_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;!-- define the manipulators --&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;leftarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;l_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;l_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
    &amp;lt;armjoints&amp;gt;l_j0 l_j1 l_j2 l_j3 l_j4 l_j5 l_j6&amp;lt;/armjoints&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;rightarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;r_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;r_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
    &amp;lt;armjoints&amp;gt;r_j0 r_j1 r_j2 r_j3 r_j4 r_j5 r_j6&amp;lt;/armjoints&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Single arm: [[image:schunk-lwa3.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
Dual arm: [[image:schunk-lwa3-dual.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
== Custom XML ==&lt;br /&gt;
&lt;br /&gt;
Openrave provides much more flexibility in creating and defining custom XML readers for interfaces. First the &amp;lt;environment&amp;gt; XML tag supports creating any interface type and supports loading plugins. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;plugin&amp;gt;libcustomreader&amp;lt;/plugin&amp;gt;&lt;br /&gt;
  &amp;lt;robot name=&amp;quot;wam&amp;quot; file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;controller type=&amp;quot;CustomController&amp;quot; robot=&amp;quot;wam&amp;quot; args=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    ..custom data....&lt;br /&gt;
  &amp;lt;/controller&amp;gt;&lt;br /&gt;
  &amp;lt;module type=&amp;quot;basemanipulation&amp;quot; args=&amp;quot;wam&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example, openrave will first load the plugin, then will create a robot, and then will create a controller that is attached to the robot, then will create the basemanipulation module giving it the robot name as the argument.&lt;br /&gt;
&lt;br /&gt;
Furthermore, using EnvironmentBase::RegisterXMLReader, it is possible to set a parser for custom XML tags for each interface type.  For those curious on how to take advantage of custom readers, please refer to examples/plugincpp/customreader.cpp on how to attach a custom XML reader to a controller.&lt;br /&gt;
&lt;br /&gt;
These changes will allow people to setup all their specific environment settings in the XML files without having to rely on external scripts or other programs to do it. Note that OpenRAVE processes tags in depth first order.&lt;br /&gt;
&lt;br /&gt;
== Sensor ==&lt;br /&gt;
&lt;br /&gt;
It is possible to have XML files that declare a sensor and its internal parameters. For example, &amp;#039;&amp;#039;&amp;#039;data/camera.sensor.xml&amp;#039;&amp;#039;&amp;#039; can look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;sensor type=&amp;quot;BaseCamera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KK&amp;gt;640 640 320 240&amp;lt;/KK&amp;gt;&lt;br /&gt;
  &amp;lt;width&amp;gt;640&amp;lt;/width&amp;gt;&lt;br /&gt;
  &amp;lt;height&amp;gt;480&amp;lt;/height&amp;gt;&lt;br /&gt;
  &amp;lt;framerate&amp;gt;5&amp;lt;/framerate&amp;gt;&lt;br /&gt;
  &amp;lt;color&amp;gt;0.5 0.5 1&amp;lt;/color&amp;gt;&lt;br /&gt;
&amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to attach a sensor defined by a file to a robot link do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyCamera&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is also possible to put a sensor directly in the environment without a robot. Such a sensor will not have any geometry associated with it, and will only act as a sensing source.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... environment definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;sensor name=&amp;quot;mysensor&amp;quot; file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the sensor transform --&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 1 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
  &amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== XML Reference ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; All XML handling is done in &amp;#039;&amp;#039;&amp;#039;src/libopenrave-core/xmlreaders.cpp&amp;#039;&amp;#039;&amp;#039;. If there&amp;#039;s any parameters that are not explained well, make sure to check out that source file for further reference.&lt;br /&gt;
&lt;br /&gt;
Here&amp;#039;s a list of all possible fields the XML supports in a hierarchical structure.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;environment&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;bkgndcolor&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camrotaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camtrans&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;planner&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensorsystem&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file, robot, args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;inversekinematicssolver&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;physicsengine&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;collisionchecker&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;trajectory&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;viewer&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;server&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type, makejoinedlinksadjacent&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;adjacent&amp;#039;&amp;#039;&amp;#039; - 2 body names&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (dynamic, static)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;geom&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (box, sphere, trimesh, cylinder), render (true,false), modifiable (true,false)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;ambientcolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;collision&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;diffusecolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;extents&amp;#039;&amp;#039;&amp;#039; - 3 float [box]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;height&amp;#039;&amp;#039;&amp;#039; - float [cylinder]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float [cylinder, sphere]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;render&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;vertices&amp;#039;&amp;#039;&amp;#039; - 9*N floats where each 9 values defines 1 triangle with 3 vertices&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;com&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;inertia&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - body/link name&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;joint&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; enable (true, false), type (hinge, slider, universal, hinge2, spherical), circular(true, false), mimic_pos (math equation), mimic_vel (math equation), mimic_accel (math equation)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;anchor&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, hinge2, universal, spherical]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, slider]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis1&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis2&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limits&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsdeg&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in degrees if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsrad&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxvel&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxveldeg&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxaccel&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxacceldeg&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mode&amp;#039;&amp;#039;&amp;#039; - int [amotor]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - body/link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;resolution&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;weight&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxtorque&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;modelsdir&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - bodyname&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type (robot plugin type)&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;attachedsensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;link&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;...&amp;#039;&amp;#039;&amp;#039; - fields defined by SensorBase class instantiated by type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - type args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - name&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;manipulator&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;armjoints&amp;#039;&amp;#039;&amp;#039; - n joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;base&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closed&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;effector&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;iksolver&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;gripperjoints&amp;#039;&amp;#039;&amp;#039; - k joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closingdirection&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;direction&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - name, file, type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=213</id>
		<title>Format:XML</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=213"/>
				<updated>2012-04-08T01:28:36Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
= OpenRAVE Custom XML Format =&lt;br /&gt;
&lt;br /&gt;
[[image:Openrave_robots.jpg|600px]] &lt;br /&gt;
&lt;br /&gt;
TODO: Decide on the versioning scheme&lt;br /&gt;
&lt;br /&gt;
OpenRAVE uses XML to store all robot and scene descriptions. The XML format is flexible enough to link one XML file from another like including already created objects/robots in an environment. It is also possible to specify vrml or iv formatted files within it to import models. &lt;br /&gt;
&lt;br /&gt;
All interface types can be created. Furthermore, an &amp;lt;environment&amp;gt; tag can optionally be specified to put all bodies/interfaces in.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Environment&amp;#039;&amp;#039;&amp;#039; - specify multiple objects and robots. Can also define some GUI properties like camera start location and background color. The environment allows the creation of &amp;#039;&amp;#039;&amp;#039;any&amp;#039;&amp;#039;&amp;#039; OpenRAVE interfaces. Each interface can take the &amp;#039;&amp;#039;&amp;#039;type&amp;#039;&amp;#039;&amp;#039; attribute specifying the interface type and can define custom XML readers.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039; - The basic object that all other objects derive from. A kinematic body consists of a collection of rigid bodies and joints that connect these bodies.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; - The basic robot that derives from &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039;. Usually every Robot has at least one KinBody declaration inside it. A robot can also hold a list of &amp;#039;&amp;#039;&amp;#039;Manipulator&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;AttachedSensor&amp;#039;&amp;#039;&amp;#039; objects describing the manipulation/sensing capabilities of the robot. Since plugin authors can create different robots, it is also possible to define custom fields in &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; to hold other information like balance control parameters for humanoids.&lt;br /&gt;
&lt;br /&gt;
== Transformations ==&lt;br /&gt;
&lt;br /&gt;
Most tags for links/bodies/robots hold a transformation. The following fields modify this transformation:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- xyz --&amp;gt;&lt;br /&gt;
&amp;lt;translation&amp;gt;0 1 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- w x y z --&amp;gt;&lt;br /&gt;
&amp;lt;quat&amp;gt;1 0 0 0&amp;lt;/quat&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- a 3x3 rotation matrix specified as rows first&lt;br /&gt;
r00, r01, r02,    r10, r11, r12,     r20, r21, r21 --&amp;gt;&lt;br /&gt;
&amp;lt;rotationmat&amp;gt;1 0 0 0 1 0 0 0 1&amp;lt;/rotationmat&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- axis_x axis_y axis_z angle(deg) --&amp;gt;&lt;br /&gt;
&amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multiple of the same tags can be specified, resulting in the transformations being compounded. During compounding, the translation and rotation are treated separately.&lt;br /&gt;
&lt;br /&gt;
== KinBody ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody name=&amp;quot;TestKinBody&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Create a rigid body named Body1 and declare it as &amp;#039;dynamic&amp;#039;.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;#039;dynamic&amp;#039; bodies are subject to physics laws, &amp;#039;static&amp;#039; bodies will never move--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- due to physical forces. It is recommended EVERYTHING is declared as &amp;#039;dynamic&amp;#039; --&amp;gt;&lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that the body transforms affects all geometry objects attached. --&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- translation of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;!--rotation of the body specified as a rotation axis. First three numbers are the axis.--&amp;gt;&lt;br /&gt;
    &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- defines mass properties for the entire kinbody. possible mass types are--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- mimicgeom - &amp;lt;density&amp;gt;. Adds a mass equivalent to all the geometry--&amp;gt;&lt;br /&gt;
    &amp;lt;!--    objects. trimesh and plane are not supported.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- box - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;extents&amp;gt; Adds a simple box--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- sphere - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;radius&amp;gt;--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;density&amp;gt;1000&amp;lt;/density&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Define a geometry object attached to the body. The functionality of --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- geometry objects is to define the collision and render geometries of the body. --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- All geometry types have Rotation(Mat/Quat), Translation, and Render components.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Possible geom types are box, sphere, trimesh, plane.--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *box - extents--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *sphere - radius--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *cylinder - radius, height (axis is along y)--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *trimesh - data--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- extents of the box - half width, height, length--&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;1 1 1&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;!-- set the translation and rotation of the box. Note that the transforamtions--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- are all relative to the parent body.--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;0 1 0 45&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Can create multiple geometries per body--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;2 1 2&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 1 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;!-- RotationMat is a 3x3 rotation matrix specified as rows first--&amp;gt;&lt;br /&gt;
      &amp;lt;RotationMat&amp;gt;1 0 0 0 1 0 0 0 1&amp;lt;/RotationMat&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Set the transparency of the geometry, 0 is opaque--&amp;gt;&lt;br /&gt;
      &amp;lt;transparency&amp;gt;0.4&amp;lt;/transparency&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- change the mass properties of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the total mass--&amp;gt;&lt;br /&gt;
      &amp;lt;total&amp;gt;0.40605&amp;lt;/total&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the 3x3 inertia matrix--&amp;gt;&lt;br /&gt;
      &amp;lt;inertia&amp;gt;2 0 0 0 3 0 0 0 5&amp;lt;/inertia&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the center of mass (if using ODE physics engine, should be 0)--&amp;gt;&lt;br /&gt;
      &amp;lt;com&amp;gt;0.008842 -0.000018 0.07367&amp;lt;/com&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a sphere--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;sphere&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- although the underlying collision geometry will be a sphere,--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- render it as a coffee pot--&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/coffeepot.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 -1.5 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Radius&amp;gt;1.5&amp;lt;/Radius&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a triangle mesh--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/cup.iv 0.01&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;!-- use the cup triangles for collision detection.--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The last number is the scale, in case the iv files are scaled improperly.--&amp;gt;&lt;br /&gt;
      &amp;lt;collision&amp;gt;models/objects/cup.iv 0.01&amp;lt;/collision&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1.5 -2 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Create a joint between the two bodies.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Possible joint types are: hinge, slider, universal, hinge2, and spherical.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Hinges are the most common joint type used in robots.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- For amotors, can specify mode, axis1, axis2, axis3. For each axis, first 3 values are the axis and the last value is the relative coord system (see ODE documentation).--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Every joint can have certain properties:--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxforce&amp;gt; are in number of degrees of freedom.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxvel&amp;gt;, &amp;lt;resolution&amp;gt; are scalar and apply to all DOFs.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;limits&amp;gt;, &amp;lt;limitsdeg&amp;gt;, &amp;lt;limitsrad&amp;gt; specify the joint limits --&amp;gt;&lt;br /&gt;
  &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Specify the names of the bodies, names are not case sensitive.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body1&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body2&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- anchor and axis of the hinge--&amp;gt;&lt;br /&gt;
    &amp;lt;Anchor&amp;gt;0 0 0&amp;lt;/Anchor&amp;gt;&lt;br /&gt;
    &amp;lt;Axis&amp;gt;0 1 0&amp;lt;/Axis&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Weight for configuration distance, mostly used in planners.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- for joints with &amp;gt; 1 DOF, specify 2+ values--&amp;gt;&lt;br /&gt;
    &amp;lt;Weight&amp;gt;1.0&amp;lt;/Weight&amp;gt;&lt;br /&gt;
  &amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Models Directory ===&lt;br /&gt;
&lt;br /&gt;
By default, the root directory for all models files is the folder openrave is launched at. To change this, &amp;#039;&amp;#039;&amp;#039;&amp;lt;modelsdir&amp;gt;&amp;#039;&amp;#039;&amp;#039; can be used to specify model files relative to where the current xml file is. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;modelsdir&amp;gt;../mymodels&amp;lt;/modelsdir&amp;gt;&lt;br /&gt;
  &amp;lt;Body&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;render&amp;gt;kitchen/myfile.wrl&amp;lt;/render&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Circular Joints ===&lt;br /&gt;
&lt;br /&gt;
Sometimes joints will have the upper and lower limits identified, meaning that as soon as the joint gets past one limit it will wrap around to the other. Infinitely revolving hinge joints are the most common example of &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; joints where the &amp;lt;math&amp;gt;-\pi&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; limits are identified. In openrave, it is possible to set a joint as &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; like this:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint circular=&amp;quot;true&amp;quot; ...&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Adjacent Links ===&lt;br /&gt;
&lt;br /&gt;
Robot self-collision usually checks all pairs of non-adjacent links for collision; links are adjacent if they are connected to a joint. In order to reduce self-collision computation time and spurious collisions of small links, it is possible to force pairs of links to be treated as adjacent by specifying an &amp;#039;&amp;#039;&amp;#039;&amp;lt;adjacent&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag.&lt;br /&gt;
&lt;br /&gt;
=== Scale ===&lt;br /&gt;
&lt;br /&gt;
The first thing when importing a new model is to check that all the units are in meters (it is very common for robots to be in millimeters), otherwise the visualization model and the collision model will be in a different scale. to check this, open the robot and go to View-&amp;gt;Geometry-&amp;gt;Collision, this will show the collision model. If it is not the same scale, you need to go inside your model files and change the units. You can also enter a scale factor after model filenames like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;collision&amp;gt;mydata.iv 0.001&amp;lt;/collision&amp;gt;&lt;br /&gt;
&amp;lt;render&amp;gt;mydata.iv 0.001&amp;lt;/render&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this will scale the models by 0.001.&lt;br /&gt;
&lt;br /&gt;
=== Modifiable Geometry ===&lt;br /&gt;
&lt;br /&gt;
When avoiding collision obstacles, OpenRAVE can optionally use convex decompositions to speed up the environment collision checking and pad the geometry with safety regions. By default, all geometry is &amp;#039;&amp;#039;&amp;#039;modifiable&amp;#039;&amp;#039;&amp;#039;, but the user can turn it off so that the mesh is never changed by setting &amp;#039;&amp;#039;&amp;#039;modifiable=&amp;quot;false&amp;quot;&amp;#039;&amp;#039;&amp;#039; attribute in the &amp;#039;&amp;#039;&amp;#039;&amp;lt;geom&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag.&lt;br /&gt;
&lt;br /&gt;
Geometry that can make contact with the environment usually should not be modified. For example:&lt;br /&gt;
&lt;br /&gt;
- gripper links since contact points are important&lt;br /&gt;
&lt;br /&gt;
- markers and other place-holders used for tracking&lt;br /&gt;
&lt;br /&gt;
== Robot ==&lt;br /&gt;
&lt;br /&gt;
=== A simple 3DOF planar arm in XZ ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;3DOFRobot&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Create the base body, it should never move--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that all translations and rotations are with respect to this base--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- For example, the robot at the identity transformation is equivalent to the identity transformation of the first body.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Base&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.0  0.0  0.0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;radius&amp;gt;0.03&amp;lt;/radius&amp;gt;&lt;br /&gt;
        &amp;lt;height&amp;gt;0.02&amp;lt;/height&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;0.05 0.05 0.05&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the first movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm0&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Offset from is a fast way of specifying that the translation and rotation of this--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- body should be relative to another link--&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Base&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Translation relative to Base--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.01 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm0&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Base&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;4&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;3&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the second movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0.0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.0075 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the third movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.04 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.04 0.005 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;2&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;2&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Create the gripper joints:--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;RClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/RClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/RClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;RClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;RClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!--left gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;LClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0.005 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/LClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/LClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;LClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;LClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 -1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the transparency of every geometry in the KinBody--&amp;gt;&lt;br /&gt;
    &amp;lt;transparency&amp;gt;0.1&amp;lt;/transparency&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specifying the manipulator structure--&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;Arm2&amp;lt;/effector&amp;gt;   &amp;lt;!-- last link where end effector is attached--&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;Base&amp;lt;/base&amp;gt;           &amp;lt;!-- base link--&amp;gt;&lt;br /&gt;
    &amp;lt;joints&amp;gt;j1 j2&amp;lt;/joints&amp;gt;      &amp;lt;!-- the gripper joints used for contact--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- the id of the inverse kinematics solver, it is not necessary to--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify an ik solver for every robot. But if there is one,--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- use iksolver field to identity it.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;lt;iksolver&amp;gt;MyTriDOFSolver&amp;lt;/iksolver&amp;gt; --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- joint values of the closed and opened positions--&amp;gt;&lt;br /&gt;
    &amp;lt;closingdirection&amp;gt;1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
    &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
    &amp;lt;!-- grasp goal with respect to the effector--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0.125 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DOFRobot Robot:  [[image:tridof.jpg|200px]] &lt;br /&gt;
&lt;br /&gt;
=== Defining Manipulators ===&lt;br /&gt;
&lt;br /&gt;
A robot manipulator defines a kinematic chain of the robot joint hierarchy along with optional gripper joint values that are not used in the inverse kinematics computation but are needed for grasping purposes (chains for heads, legs do not need the joint values). A manipulator defines a new frame of reference with respect to the end effector link; all inverse kinematics computations are computed using it. Furthermore, a manipulator can have a &amp;#039;&amp;#039;&amp;#039;&amp;lt;direction&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying an axis for approaching objects or line-of-sight. For example the &amp;#039;&amp;#039;&amp;#039;robots/barrettwam.robot.xml&amp;#039;&amp;#039;&amp;#039; gripper is defined by&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;base&amp;gt;wam0&amp;lt;/base&amp;gt;&lt;br /&gt;
  &amp;lt;effector&amp;gt;wam7&amp;lt;/effector&amp;gt;&lt;br /&gt;
  &amp;lt;Translation&amp;gt;0 0 0.22&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;joints&amp;gt;JF1 JF2 JF3 JF4&amp;lt;/joints&amp;gt;&lt;br /&gt;
  &amp;lt;closingdirection&amp;gt;1 1 1 0&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
  &amp;lt;direction&amp;gt;0 0 1&amp;lt;/direction&amp;gt;&lt;br /&gt;
  &amp;lt;iksolver&amp;gt;WAM7ikfast 0.05&amp;lt;/iksolver&amp;gt;&lt;br /&gt;
&amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The manipulator can optionally define a &amp;#039;&amp;#039;&amp;#039;&amp;lt;iksolver&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying the iksolver interface that is used for getting IK solutions, or a shared object (DLL) to load an [[Component:Ikfast|ikfast]] solver from.&lt;br /&gt;
&lt;br /&gt;
=== Closed-chains and Mimic Joints ===&lt;br /&gt;
&lt;br /&gt;
OpenRAVE allows closed-chains and complex kinematics to be simulated using mimic joints. A mimic joint&amp;#039;s position, velocity, and acceleration values are computed from user-specified formulas using the values of other joints. OpenRAVE uses the Function Parser library to allow any formula to be specified. Refer to the documentation for more information [http://openrave.programmingvision.com/en/coreapihtml/classOpenRAVE_1_1KinBody_1_1Joint.html#a0e31c5be31c4145afa786e0c0d6a46ae here].&lt;br /&gt;
&lt;br /&gt;
A mimic joint requires at least the position equation and its partial derivatives (for velocity) to be manually entered. &lt;br /&gt;
&lt;br /&gt;
For example, the Barrett Hand mimic joints are defined as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;JF1&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;JF1mimic&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot; mimic_pos=&amp;quot;JF1/3+0.8727&amp;quot; mimic_vel=&amp;quot;|JF1 0.33333&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Of course, it is possible to have a mimic joint depend on more than one other joint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;b&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;c&amp;quot; type=&amp;quot;hinge&amp;quot; mimic_pos=&amp;quot;a+b+atan(a)&amp;quot; mimic_vel=&amp;quot;|a 1 + 1/(1+a*a) |b 1&amp;quot; mimic_accel=&amp;quot;|a -2*a/((1+a*a)*(1+a*a)) |b 0&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using mimic joints, it is important to still make all the correct joint connections so that loops are discovered and forces can be computed correctly.&lt;br /&gt;
&lt;br /&gt;
If a joint has more than one degree of freedom, attach the axis index at the end. For example: &amp;quot;mimic_pos0&amp;quot;, &amp;quot;mimic_pos1&amp;quot;, &amp;quot;mimic_vel0&amp;quot;, &amp;quot;mimic_vel1&amp;quot;, &amp;quot;mimic_accel0&amp;quot;, and &amp;quot;mimic_accel1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Attaching Robot Sensors ===&lt;br /&gt;
&lt;br /&gt;
Every robot can be attached a number of sensors onto it. The way to specify this in XML is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specify an attached sensor--&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyFirstLaser&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;link&amp;gt;wam1&amp;lt;/link&amp;gt; &amp;lt;!-- the robot link that the sensor is attached to. As the robot moves, the sensor will move with it--&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 0.2 0.4&amp;lt;/translation&amp;gt; &amp;lt;!-- the local translation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt; &amp;lt;!-- the local rotation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify the real sensor attached--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;#039;type&amp;#039; is the sensor interface identifier--&amp;gt;&lt;br /&gt;
    &amp;lt;sensor type=&amp;quot;BaseLaser2D&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The rest are specific fields to BaseLaser2D, these change as the type changes--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The best way to find out what fields are supported is to look for the documentation--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- for the type of sensor using--&amp;gt;&lt;br /&gt;
      &amp;lt;minangle&amp;gt;-135&amp;lt;/minangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;maxangle&amp;gt;135&amp;lt;/maxangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;0.35&amp;lt;/resolution&amp;gt; &amp;lt;!-- degrees between laser points--&amp;gt;&lt;br /&gt;
      &amp;lt;maxrange&amp;gt;5&amp;lt;/maxrange&amp;gt; &amp;lt;!-- max range of robot--&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting joint values for initial state ===&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot&amp;#039;s initial state is not when all the joints are at 0. Instead of transforming each of the geometry to the zero pose, it is possible to set the initial angle to use using the &amp;lt;initial&amp;gt; tag inside the &amp;lt;joint&amp;gt;. The definition for setting the initial angle to pi/2 radius is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link0&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link1&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;initial&amp;gt;1.570796326794&amp;lt;/initial&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Changing the Body Coordinate System ===&lt;br /&gt;
&lt;br /&gt;
[[image:Barrettwam_coordchange.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot origin and rotation should be defined in a different coordinate system. It is possible to create a new robot file that references the old one and changes its origin. This requires adding a new root link before the robot is defined. For example, consider the robots/barrettwam.robot.xml file whre the first link&amp;#039;s name is &amp;#039;wam0&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- add new first link --&amp;gt;&lt;br /&gt;
  &amp;lt;kinbody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;root&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;robot file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;!-- change the coordinate system of the original first link and attach a dummy joint --&amp;gt;&lt;br /&gt;
    &amp;lt;kinbody&amp;gt;&lt;br /&gt;
      &amp;lt;body name=&amp;quot;wam0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0.3 0.4 0.3&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;root&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;wam0&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;limitsdeg&amp;gt;0 0&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
== Environment Example ==&lt;br /&gt;
&lt;br /&gt;
This example is part of the &amp;#039;&amp;#039;&amp;#039;bin/data/intel/lab1.env.xml&amp;#039;&amp;#039;&amp;#039; file. The most important thing to note about this example is the use of the &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; attribute to import other XML files. The filename specified with &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; has to be &amp;#039;&amp;#039;&amp;#039;relative&amp;#039;&amp;#039;&amp;#039; to the current directory where the file calling it resides. Note the differences between segway.kinbody.xml and barrettwam.robot.xml.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the background color of the environment--&amp;gt;&lt;br /&gt;
  &amp;lt;bkgndcolor&amp;gt;0.3 0.7 0.8&amp;lt;/bkgndcolor&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera translation--&amp;gt;&lt;br /&gt;
  &amp;lt;camtrans&amp;gt;1.418 -1.234 2.963&amp;lt;/camtrans&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera rotation specified by rotation-axis--&amp;gt;&lt;br /&gt;
  &amp;lt;camrotaxis&amp;gt;0.724 0.302 0.619 68&amp;lt;/camrotaxis&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import the segway model and place it somewhere--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;data/segway.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;-0.0671   -0.0819    0.7550&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import a robot file and add an additional body for a cylindrical base--&amp;gt;&lt;br /&gt;
  &amp;lt;Robot file=&amp;quot;../../robots/barrettwam.robot.xml&amp;quot; name=&amp;quot;BarrettWAM&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;-.22 -.14 -.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Body type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
          &amp;lt;radius&amp;gt;0.08&amp;lt;/radius&amp;gt;&lt;br /&gt;
          &amp;lt;height&amp;gt;0.6&amp;lt;/height&amp;gt;&lt;br /&gt;
          &amp;lt;diffusecolor&amp;gt;0.3 0.3 0.3&amp;lt;/diffusecolor&amp;gt;&lt;br /&gt;
          &amp;lt;Translation&amp;gt; 0.2286 0.1397 -0.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;/Geom&amp;gt;&lt;br /&gt;
      &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;-0.754 0.3265 1.036&amp;lt;/translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Robot&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- add the floor as a box--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody name=&amp;quot;floor&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- floor should never move, so make it static--&amp;gt;&lt;br /&gt;
    &amp;lt;Body type=&amp;quot;static&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;2 2 0.005&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;.6 .6 .6&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      	&amp;lt;ambientColor&amp;gt;0.6 0.6 0.6&amp;lt;/ambientColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting Robot Joint Values ===&lt;br /&gt;
&lt;br /&gt;
It is possible to set the joint values of the kinbody in the scene using the &amp;#039;&amp;#039;&amp;#039;&amp;lt;jointvalues&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag. The order of the values should be the order of the DOF indices of each joint (passive/mimic joints are ignored).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;environment&amp;gt;&lt;br /&gt;
  &amp;lt;robot file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;jointvalues&amp;gt;1 1 0 0 0 0 0 0.5 0 0 0&amp;lt;/jointvalues&amp;gt;&lt;br /&gt;
  &amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot Composition ==&lt;br /&gt;
&lt;br /&gt;
The way we recommend managing robots composed of several sub-robots (like a humanoid composed of arms, legs, hands, etc) is to first create separate .kinbody files for just the kinematics and geometry of each separate&lt;br /&gt;
part (ie a hand.kinbody.xml and a arm.kinbody.xml). Then create a robot file that includes both the kinematics and defines the manipulators, sensors, and controllers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;attachedsensor&amp;gt;&lt;br /&gt;
     ....&lt;br /&gt;
 &amp;lt;/attachedsensor&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sometimes for grasp planning, the hand needs to be treated as a robot, so we create a hand.robot.xml file as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. A robot can reference other robots through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;a.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;b.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both a&amp;#039;s and b&amp;#039;s &amp;#039;&amp;#039;&amp;#039;&amp;lt;Manipulator&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;AttachedSensor&amp;gt;&amp;#039;&amp;#039;&amp;#039; tags will be used&lt;br /&gt;
in the parent robot, so you don&amp;#039; t have to copy their definitions.&lt;br /&gt;
&lt;br /&gt;
2. It is possible to prefix the links and joints of a child robot by using the&lt;br /&gt;
&amp;#039;prefix&amp;#039; attribute:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;left_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;right_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now all links and joints will either start with &amp;#039;&amp;#039;&amp;#039;left_&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;right_&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
3. When the xml parser sees a body with the same name as another body,&lt;br /&gt;
it &amp;#039;appends&amp;#039; the specified geometries to the original body. This allows the same link to be referenced/defined in multiple robot files (Note that it is not possible to change the original body coordinate system).&lt;br /&gt;
&lt;br /&gt;
=== Attaching Separate Links ===&lt;br /&gt;
&lt;br /&gt;
When a robot is composed of multiple parts defined in different files, it is necessary to attach links from the different files together so that the robot hierarchy can be complete. This is done by defining &amp;#039;&amp;#039;&amp;#039;disabled&amp;#039;&amp;#039;&amp;#039; dummy joints that attach two links together. These disabled joints do not show up in the robot&amp;#039;s description and are only present to maintain the relative transformation between two links. For example, the robot &amp;#039;&amp;#039;&amp;#039;robots/pa10schunk.robot.xml&amp;#039;&amp;#039;&amp;#039; is composed of &amp;#039;&amp;#039;&amp;#039;robots/pa10.kinbody.xml&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;robots/schunk_manip.kinbody.xml&amp;#039;&amp;#039;&amp;#039;, in order to join the two, the robot  is defined in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;pa10.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody file=&amp;quot;schunk_manip.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;False&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;link7&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;gripper_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;#039;&amp;#039;&amp;#039;link7&amp;#039;&amp;#039;&amp;#039; is a link of the pa10 arm and &amp;#039;&amp;#039;&amp;#039;gripper_base&amp;#039;&amp;#039;&amp;#039; is a link of the gripper. The lower and upper joint limits are all 0, which OpenRAVE recognizes as a dummy joint.&lt;br /&gt;
&lt;br /&gt;
=== Joining A Robot Arm and Hand ===&lt;br /&gt;
&lt;br /&gt;
It is possible to load robots and bodies from COLLADA files by specifying the collada filename through the &amp;#039;&amp;#039;&amp;#039;file&amp;#039;&amp;#039;&amp;#039; attribute. For example, the following robot is a combination of an arm defined in OpenRAVE XML and a hand defined in COLLADA (download schunkSDHHand from [http://opengrasp.sourceforge.net/Downloads.html OpenGrasp]). The dummy joint is used to join the arm end effector with the hand base.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot file=&amp;quot;robots/kuka-kr5-r650.robot.xml&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot prefix=&amp;quot;hand_&amp;quot; file=&amp;quot;schunkSDHhand.dae&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody&amp;gt;&lt;br /&gt;
   &amp;lt;body name=&amp;quot;hand_root&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;offsetfrom&amp;gt;link6&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
     &amp;lt;translation&amp;gt;0.03 0 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
     &amp;lt;rotationaxis&amp;gt;0 1 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;joint type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;link6&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;hand_root&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
   &amp;lt;/joint&amp;gt;&lt;br /&gt;
 &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;base&amp;gt;base&amp;lt;/base&amp;gt;&lt;br /&gt;
   &amp;lt;effector&amp;gt;link6&amp;lt;/effector&amp;gt;&lt;br /&gt;
   &amp;lt;joints&amp;gt;hand_Bone_B1_Joint hand_Bone_B2_Joint hand_Bone_B3_Joint hand_Bone_A1_Joint hand_Bone_A2_Joint hand_Bone_A3_Joint hand_Bone_C1_Joint hand_Bone_C2_Joint hand_Bone_C3_Joint&amp;lt;/joints&amp;gt;&lt;br /&gt;
   &amp;lt;closingdirection&amp;gt;0 1 1 0 1 1 0 1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
   &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Final robot: [[image:collada_sdh_kuka.jpg|150px]]&lt;br /&gt;
&lt;br /&gt;
=== Dual-arm example ===&lt;br /&gt;
&lt;br /&gt;
Here is an example file of having a robot composed of two arms attached to a common link named &amp;#039;&amp;#039;&amp;#039;chest&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;schunk-dualarm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;chest&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;0.1 0.1 0.4&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0 0 0.4&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/geom&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- left arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody prefix=&amp;quot;l_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 -0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody&amp;gt;prefix=&amp;quot;r_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- connect the two arms with dummy joints --&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;leftdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;l_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;rightdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;r_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;!-- define the manipulators --&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;leftarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;l_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;l_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
    &amp;lt;armjoints&amp;gt;l_j0 l_j1 l_j2 l_j3 l_j4 l_j5 l_j6&amp;lt;/armjoints&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;rightarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;r_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;r_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
    &amp;lt;armjoints&amp;gt;r_j0 r_j1 r_j2 r_j3 r_j4 r_j5 r_j6&amp;lt;/armjoints&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Single arm: [[image:schunk-lwa3.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
Dual arm: [[image:schunk-lwa3-dual.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
== Custom XML ==&lt;br /&gt;
&lt;br /&gt;
Openrave provides much more flexibility in creating and defining custom XML readers for interfaces. First the &amp;lt;environment&amp;gt; XML tag supports creating any interface type and supports loading plugins. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;plugin&amp;gt;libcustomreader&amp;lt;/plugin&amp;gt;&lt;br /&gt;
  &amp;lt;robot name=&amp;quot;wam&amp;quot; file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;controller type=&amp;quot;CustomController&amp;quot; robot=&amp;quot;wam&amp;quot; args=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    ..custom data....&lt;br /&gt;
  &amp;lt;/controller&amp;gt;&lt;br /&gt;
  &amp;lt;module type=&amp;quot;basemanipulation&amp;quot; args=&amp;quot;wam&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example, openrave will first load the plugin, then will create a robot, and then will create a controller that is attached to the robot, then will create the basemanipulation module giving it the robot name as the argument.&lt;br /&gt;
&lt;br /&gt;
Furthermore, using EnvironmentBase::RegisterXMLReader, it is possible to set a parser for custom XML tags for each interface type.  For those curious on how to take advantage of custom readers, please refer to examples/plugincpp/customreader.cpp on how to attach a custom XML reader to a controller.&lt;br /&gt;
&lt;br /&gt;
These changes will allow people to setup all their specific environment settings in the XML files without having to rely on external scripts or other programs to do it. Note that OpenRAVE processes tags in depth first order.&lt;br /&gt;
&lt;br /&gt;
== Sensor ==&lt;br /&gt;
&lt;br /&gt;
It is possible to have XML files that declare a sensor and its internal parameters. For example, &amp;#039;&amp;#039;&amp;#039;data/camera.sensor.xml&amp;#039;&amp;#039;&amp;#039; can look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;sensor type=&amp;quot;BaseCamera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KK&amp;gt;640 640 320 240&amp;lt;/KK&amp;gt;&lt;br /&gt;
  &amp;lt;width&amp;gt;640&amp;lt;/width&amp;gt;&lt;br /&gt;
  &amp;lt;height&amp;gt;480&amp;lt;/height&amp;gt;&lt;br /&gt;
  &amp;lt;framerate&amp;gt;5&amp;lt;/framerate&amp;gt;&lt;br /&gt;
  &amp;lt;color&amp;gt;0.5 0.5 1&amp;lt;/color&amp;gt;&lt;br /&gt;
&amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to attach a sensor defined by a file to a robot link do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyCamera&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is also possible to put a sensor directly in the environment without a robot. Such a sensor will not have any geometry associated with it, and will only act as a sensing source.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... environment definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;sensor name=&amp;quot;mysensor&amp;quot; file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the sensor transform --&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 1 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
  &amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== XML Reference ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; All XML handling is done in &amp;#039;&amp;#039;&amp;#039;src/libopenrave-core/xmlreaders.cpp&amp;#039;&amp;#039;&amp;#039;. If there&amp;#039;s any parameters that are not explained well, make sure to check out that source file for further reference.&lt;br /&gt;
&lt;br /&gt;
Here&amp;#039;s a list of all possible fields the XML supports in a hierarchical structure.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;environment&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;bkgndcolor&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camrotaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camtrans&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;planner&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensorsystem&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file, robot, args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;inversekinematicssolver&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;physicsengine&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;collisionchecker&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;trajectory&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;viewer&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;server&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type, makejoinedlinksadjacent&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;adjacent&amp;#039;&amp;#039;&amp;#039; - 2 body names&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (dynamic, static)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;geom&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (box, sphere, trimesh, cylinder), render (true,false), modifiable (true,false)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;ambientcolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;collision&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;diffusecolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;extents&amp;#039;&amp;#039;&amp;#039; - 3 float [box]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;height&amp;#039;&amp;#039;&amp;#039; - float [cylinder]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float [cylinder, sphere]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;render&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;vertices&amp;#039;&amp;#039;&amp;#039; - 9*N floats where each 9 values defines 1 triangle with 3 vertices&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;com&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;inertia&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - body/link name&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;joint&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; enable (true, false), type (hinge, slider, universal, hinge2, spherical), circular(true, false), mimic_pos (math equation), mimic_vel (math equation), mimic_accel (math equation)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;anchor&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, hinge2, universal, spherical]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, slider]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis1&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis2&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limits&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsdeg&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in degrees if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsrad&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxvel&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxveldeg&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxaccel&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxacceldeg&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mode&amp;#039;&amp;#039;&amp;#039; - int [amotor]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - body/link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;resolution&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;weight&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;modelsdir&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - bodyname&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type (robot plugin type)&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;attachedsensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;link&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;...&amp;#039;&amp;#039;&amp;#039; - fields defined by SensorBase class instantiated by type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - type args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - name&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;manipulator&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;armjoints&amp;#039;&amp;#039;&amp;#039; - n joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;base&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closed&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;effector&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;iksolver&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;gripperjoints&amp;#039;&amp;#039;&amp;#039; - k joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closingdirection&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;direction&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - name, file, type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
&amp;lt;math&amp;gt;Insert formula here&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=ROS:ControllingRobots&amp;diff=212</id>
		<title>ROS:ControllingRobots</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=ROS:ControllingRobots&amp;diff=212"/>
				<updated>2012-02-12T14:45:56Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Controlling Robots with ROS/OpenRAVE =&lt;br /&gt;
&lt;br /&gt;
This tutorial explains how to control robots via the [http://www.ros.org/browse/details.php?name=openrave_robot_control openrave_robot_control] package.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
By using this framework, a controller gains:&lt;br /&gt;
&lt;br /&gt;
* All robot-specific settings (like masses, max velocities, limits) come from openrave xml files to allow for consistent integration with planners.&lt;br /&gt;
* Forward/Inverse kinematics, jacobian computation, and dynamics computation.&lt;br /&gt;
* Automatically published TF Frames of all the links of the robot.&lt;br /&gt;
* Integration for openrave to send trajectory, velocity, and torque commands.&lt;br /&gt;
* Controller-level self-collision checking.&lt;br /&gt;
* Advertisement of services through ROS along with concept of &amp;#039;&amp;#039;&amp;#039;sessions&amp;#039;&amp;#039;&amp;#039; managing exclusive access to robot control.&lt;br /&gt;
* Trajectory re-timing and smoothing by OpenRAVE.&lt;br /&gt;
&lt;br /&gt;
= Setting up a Robot Example =&lt;br /&gt;
&lt;br /&gt;
==Starting a ROS robot controller==&lt;br /&gt;
&lt;br /&gt;
The first thing you need to do is startup up a robot controller, that advertises services that OpenRAVE can talk to.  There are several options available:&lt;br /&gt;
&lt;br /&gt;
#&amp;#039;&amp;#039;&amp;#039;Simulated Controller&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
#*The simplest thing is to start a simulated controller, that will let you see if your messages are getting through. Such a simulation exists in the openrave_robot_control package&lt;br /&gt;
#*It can be started by running: &amp;lt;br /&amp;gt; &amp;lt;pre&amp;gt;rosrun openrave_robot_control simulationserver --robotfile robots/schunk-lwa3.robot.xml --jointname j0 --jointname j1 --jointname j2 --jointname j3 --jointname j4 --jointname j5 --jointname j6&amp;lt;/pre&amp;gt;&lt;br /&gt;
#*Or the same command through a launchfile:&amp;lt;br /&amp;gt;&amp;lt;pre&amp;gt;  roslaunch openrave_robot_control schunkarm_sim.launch.xml&amp;lt;/pre&amp;gt;&lt;br /&gt;
#**The robot file, just like in normal OpenRAVE, found by searching the paths defined by the environmental variable OPENRAVE_DATA&lt;br /&gt;
#**the joints you wish to control must all be stated explicitly with the joint name given in the kinbody XML file&lt;br /&gt;
#*If the physics engine on openrave is set, the robot could be torque controlled and exhibit similar behaviors as the real robot. It is also possible to load in an environment in which the robot resides for getting environment contact forces.&lt;br /&gt;
#&amp;#039;&amp;#039;&amp;#039;Actual Controller&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
#*Obviously, this is going to depend on your particular robot. Here are some available controllers:&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;10&amp;quot;&lt;br /&gt;
!Hardware !! Package !! Executable !! Repository !! Interface !! Usage&lt;br /&gt;
|-&lt;br /&gt;
|Schunk LWA3 &lt;br /&gt;
| [http://www.ros.org/browse/details.php?name=schunk_motion_controllers schunk_motion_controllers] &lt;br /&gt;
| shunk_server &lt;br /&gt;
| [http://sourceforge.net/projects/cmu-ros-pkg/ cmu-ros-pkg] &lt;br /&gt;
| Serial and CAN(ntcan lib needed) || schunk_server [--device &amp;#039;&amp;#039;can or serial&amp;#039;&amp;#039;] [--moduleid id] [--robotfile openravefile] [--maxvelmult multiplier] [--serial serialport] [--can canport]&lt;br /&gt;
|-&lt;br /&gt;
|Mitsubishi PA10        &lt;br /&gt;
| [http://www.ros.org/browse/details.php?name=pa10controller pa10controller]            &lt;br /&gt;
| pa10server   &lt;br /&gt;
| [http://sourceforge.net/projects/cmu-ros-pkg/ cmu-ros-pkg] &lt;br /&gt;
| ??             &lt;br /&gt;
| pa10server [--robotfile openravefile] [--manipname manipulator name] [--maxvelmult multiplier]&lt;br /&gt;
|-&lt;br /&gt;
|maxon motors&lt;br /&gt;
| [http://www.ros.org/browse/details.php?name=maxondrivers maxondrivers]&lt;br /&gt;
| eposserver&lt;br /&gt;
| [http://sourceforge.net/projects/cmu-ros-pkg/ cmu-ros-pkg] &lt;br /&gt;
| CAN (ntcan library)&lt;br /&gt;
| eposserver [--can port] [--robotfile openravefile] [--manipname name] [--maxvelmult multiplier]&lt;br /&gt;
|-&lt;br /&gt;
|maxon motors + pid&lt;br /&gt;
| [http://www.ros.org/browse/details.php?name=doorarmcontroller doorarmcontroller]&lt;br /&gt;
| doorarmcontroller&lt;br /&gt;
| [http://sourceforge.net/projects/cmu-ros-pkg/ cmu-ros-pkg] &lt;br /&gt;
| openrave_robot_control&lt;br /&gt;
| doorarmcontroller [--can port] [--robotfile openravefile] [--manipname name] [--maxvelmult multiplier]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Verify the controller is running ===&lt;br /&gt;
You will notice the above ROS nodes advertise ROS services (They are actually sessions, which are collections of services)&lt;br /&gt;
You can check that they are advertising by running:&lt;br /&gt;
  rosservice list&lt;br /&gt;
  rostopic list &lt;br /&gt;
For the simulated controller, you will see the additional services:&lt;br /&gt;
  /Brake&lt;br /&gt;
  /Cancel&lt;br /&gt;
  /Query&lt;br /&gt;
  /StartTorque&lt;br /&gt;
  /StartTrajectory&lt;br /&gt;
  /StartVelocity&lt;br /&gt;
  /Wait&lt;br /&gt;
  /controller_session&lt;br /&gt;
  /schunk_simulation/get_loggers&lt;br /&gt;
  /schunk_simulation/set_logger_level&lt;br /&gt;
and the additional topics:&lt;br /&gt;
  /mechanism_state&lt;br /&gt;
  /tf&lt;br /&gt;
Especially important is the &amp;#039;/controller_session&amp;#039; service.  This is how OpenRAVE will talk with the ROS node.&lt;br /&gt;
&lt;br /&gt;
=== OpenRAVE Simulated Controller Example ===&lt;br /&gt;
&lt;br /&gt;
Here is an example of openrave connecting to a robot simulated using &amp;#039;&amp;#039;&amp;#039;simulationserver&amp;#039;&amp;#039;&amp;#039; and setting random values. To start the example do:&lt;br /&gt;
&lt;br /&gt;
 roslaunch openrave_robot_control wam_sim.launch.xml&lt;br /&gt;
&lt;br /&gt;
The ROS launch file is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- shows how to start a simple simulation controller on the WAM--&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;machine name=&amp;quot;wam&amp;quot; address=&amp;quot;localhost&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;node machine=&amp;quot;wam&amp;quot; name=&amp;quot;wam&amp;quot; pkg=&amp;quot;openrave_robot_control&amp;quot; type=&amp;quot;simulationserver&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; args=&amp;quot;--robotfile robots/barrettsegway.robot.xml --manipname arm --maxvelmult 1.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node machine=&amp;quot;wam&amp;quot; name=&amp;quot;openrave&amp;quot; pkg=&amp;quot;openrave_robot_control&amp;quot; type=&amp;quot;testopenravecontrol.py&amp;quot; respawn=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;env name=&amp;quot;OPENRAVE_PLUGINS&amp;quot; value=&amp;quot;$(optenv OPENRAVE_PLUGINS):$(find openrave_robot_control)/lib&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The simple openravepy file to set the commands is:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
from openravepy import *&lt;br /&gt;
from numpy import *&lt;br /&gt;
import time&lt;br /&gt;
env = Environment() # create openrave environment&lt;br /&gt;
env.SetViewer(&amp;#039;qtcoin&amp;#039;)&lt;br /&gt;
env.Load(&amp;#039;robots/barrettwam.robot.xml&amp;#039;)&lt;br /&gt;
robot = env.GetRobots()[0] # get the first robot&lt;br /&gt;
manip = robot.GetManipulators()[0]&lt;br /&gt;
jointnames = &amp;#039; &amp;#039;.join(robot.GetJoints()[j].GetName() for j in manip.GetArmJoints())&lt;br /&gt;
robot.SetController(env.CreateController(&amp;#039;ROSOpenRAVE + trajectoryservice /controller_session &amp;#039;+jointnames))&lt;br /&gt;
&lt;br /&gt;
lower,upper = robot.GetJointLimits()&lt;br /&gt;
&lt;br /&gt;
# sending velocity command?&lt;br /&gt;
#robot.GetController().SendCommand(&amp;quot;setvelocity 4 .01&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
    with robot: # save the robot state and get random joint values that are collision free&lt;br /&gt;
        while True:&lt;br /&gt;
            values = lower + random.rand(len(lower))*(upper-lower)&lt;br /&gt;
            robot.SetJointValues(values)&lt;br /&gt;
            if not robot.CheckSelfCollision() and not env.CheckCollision(robot):&lt;br /&gt;
                break&lt;br /&gt;
    print &amp;#039;setting: &amp;#039;,values&lt;br /&gt;
    robot.GetController().SetDesired(values)&lt;br /&gt;
    robot.WaitForController(0)&lt;br /&gt;
    time.sleep(1.0)&lt;br /&gt;
&lt;br /&gt;
env.Destroy()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Loading the Robot into the OpenRAVE Master ==&lt;br /&gt;
==== Add ROSOpenRAVE Controller to the Path ====&lt;br /&gt;
You need to add the directory holding the &amp;#039;&amp;#039;&amp;#039;librobot_control.so&amp;#039;&amp;#039;&amp;#039; openrave plugin to the OPENRAVE_PLUGINS environment variables. This is possible by putting the following path inside the bashrc file:&lt;br /&gt;
&lt;br /&gt;
 export OPENRAVE_PLUGINS=$OPENRAVE_PLUGINS:`rospack find openrave`/share/openrave/plugins:`rospack find openrave_robot_control`/lib &lt;br /&gt;
&lt;br /&gt;
Executing &amp;#039;openrave --listplugins&amp;#039; should show the &amp;#039;&amp;#039;&amp;#039;ROSOpenRAVE&amp;#039;&amp;#039;&amp;#039; controller interface.&lt;br /&gt;
&lt;br /&gt;
==== Load the ROSOpenRAVE controller interface into OpenRAVE ====&lt;br /&gt;
&lt;br /&gt;
Load the ROSOpenRAVE controller interface into openrave coming from the librobot_control.so and tell it to read the correct schunk service. The shared object contains a &amp;#039;&amp;#039;&amp;#039;Controller&amp;#039;&amp;#039;&amp;#039; interface, which has to be set on the robot in order to take effect. See [[Started:SettingControllers|Setting Controllers]] for how to do this.&lt;br /&gt;
&lt;br /&gt;
Another cool thing with the ROSOpenRAVE interface is that any number of separate pieces of hardware can be trated as the same robot (for example two schunk arms + gripper). All you have to do is specify multiple &amp;#039;&amp;#039;&amp;#039;trajectoryservice&amp;#039;&amp;#039;&amp;#039; tags for each root service your controllers publish. For example, these are the luanch scripts for setting up a PA10 arm and a Schunk serial manipulator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;machine name=&amp;quot;pa10&amp;quot; address=&amp;quot;localhost&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;machine name=&amp;quot;schunk&amp;quot; address=&amp;quot;localhost&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;group ns=&amp;quot;pa10&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;node machine=&amp;quot;pa10&amp;quot; name=&amp;quot;pa10&amp;quot; pkg=&amp;quot;pa10controller&amp;quot; type=&amp;quot;pa10server&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; args=&amp;quot;--robotfile robots/pa10schunk.robot.xml --maxvelmult 0.1&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;env name=&amp;quot;OPENRAVE_DATA&amp;quot; value=&amp;quot;$(optenv OPENRAVE_DATA):$(find openrave)/share/openrave&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/node&amp;gt;&lt;br /&gt;
 &amp;lt;/group&amp;gt;&lt;br /&gt;
 &amp;lt;group ns=&amp;quot;schunk&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;node machine=&amp;quot;schunk&amp;quot; name=&amp;quot;schunk&amp;quot; pkg=&amp;quot;schunk_motion_controllers&amp;quot; type=&amp;quot;schunk_serial_server&amp;quot; respawn=&amp;quot;true&amp;quot; output=&amp;quot;screen&amp;quot; args=&amp;quot; --robotfile robots/pa10schunk.robot.xml --serial /dev/ttyUSB1&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;env name=&amp;quot;OPENRAVE_DATA&amp;quot; value=&amp;quot;$(optenv OPENRAVE_DATA):$(find openrave)/share/openrave&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/node&amp;gt;&lt;br /&gt;
 &amp;lt;/group&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(OPENRAVE_DATA tells the system where to look for the openrave robot files. )&lt;br /&gt;
&lt;br /&gt;
This will setup two namespaces with these root services&lt;br /&gt;
 /pa10/controller_session&lt;br /&gt;
 /schunk/controller_session&lt;br /&gt;
&lt;br /&gt;
Then in openrave, load the ROSOpenRAVE controller interface with the following arguments&lt;br /&gt;
&lt;br /&gt;
 trajectoryservice /pa10/controller_session trajectoryservice /schunk/controller_session joints S1 S2 S3 E1 E2 W1 W2 jfinger_L&lt;br /&gt;
&lt;br /&gt;
This tells the controller that the joints it should control are &amp;quot;S1 S2 S3 E1 E2 W1 W2 jfinger_L&amp;quot;, which come from the ROS services.&lt;br /&gt;
&lt;br /&gt;
==== Using Python for Testing Controller Communication ====&lt;br /&gt;
When running a ROS robot controller, the &amp;#039;&amp;#039;&amp;#039;openrave_robot_control/scripts/controlclient.py&amp;#039;&amp;#039;&amp;#039; script allows users to  send commands to the robot controller without starting a master openrave instance.&lt;br /&gt;
&lt;br /&gt;
= Creating a Controller Driver =&lt;br /&gt;
&lt;br /&gt;
New robot controllers taking advantage of this framework need to depend on the &amp;#039;&amp;#039;&amp;#039;openrave_robot_control&amp;#039;&amp;#039;&amp;#039; package and derive from the &amp;#039;&amp;#039;&amp;#039;openrave_robot_control::OpenRAVEController&amp;#039;&amp;#039;&amp;#039; class. New implementations need a thread that constantly calls OpenRAVEController::_publishTF, fills and publishes OpenRAVEController::_mstate, and processes OpenRAVEController::_listCommands.&lt;br /&gt;
&lt;br /&gt;
The controller offers several modes of operation, each mode has a &amp;#039;&amp;#039;&amp;#039;start&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;run&amp;#039;&amp;#039;&amp;#039;, and &amp;#039;&amp;#039;&amp;#039;finish&amp;#039;&amp;#039;&amp;#039; functions. To hook into trajectory control, implementations of these member functions are needed:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
virtual void _startTrajectoryCommand(TrajectoryBasePtr ptraj);&lt;br /&gt;
virtual CommandStatus _runTrajectoryCommand(TrajectoryBasePtr ptraj, float fCommandTime);&lt;br /&gt;
virtual void _finishTrajectoryCommand(TrajectoryBasePtr ptraj);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Simulating a Controller over ROS ==&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;openrave_robot_control&amp;#039;&amp;#039;&amp;#039; package has a simulation controller which will run the server inside openrave. Basically it is a replacement for the hardware equivalents, which can be used to test planning and programs without running the robot. For example, to simulate joints j0 through j6 on a schunk LWA3 robot do:&lt;br /&gt;
&lt;br /&gt;
 rosrun openrave_robot_control simulationserver --robotfile robots/schunk-lwa3.robot.xml --jointname j0 --jointname j1 --jointname j2 --jointname j3 --jointname j4 --jointname j5 --jointname j6&lt;br /&gt;
&lt;br /&gt;
If this physics engine on openrave is set, the robot could be torque controlled and exhibit similar behaviors as the real robot. It is also possible to load in an environment in which the robot resides for getting environment contact forces.&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=ROS:Index&amp;diff=211</id>
		<title>ROS:Index</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=ROS:Index&amp;diff=211"/>
				<updated>2012-02-07T08:32:31Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
= Using OpenRAVE with ROS =&lt;br /&gt;
&lt;br /&gt;
Shows how to setup a full robot system with OpenRAVE and [http://ros.org Robot Operating System (ROS)]. Any robot system should deal with autonomous manipulation with vision feedback, sensor loops, and higher-level reasoning. &lt;br /&gt;
&lt;br /&gt;
OpenRAVE can be used in many different scenarios.&lt;br /&gt;
&lt;br /&gt;
* There is one openrave instance that does the planning and you would like all controllers/sensor feeding that to it. We&amp;#039;ll call this the &amp;#039;&amp;#039;&amp;#039;Master&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* There are openrave instances outside of the Master that wrap hardware/simulation controllers, generate simulated sensor data. These instances publish to the ROS network and usually feed into the Master openrave.&lt;br /&gt;
&lt;br /&gt;
== OpenRAVE plugins connecting to ROS ==&lt;br /&gt;
&lt;br /&gt;
There are several openrave/ros plugins that create nodes internally and advertise/subscribe to messages. These plugins can be found in these ROS packages:&lt;br /&gt;
&lt;br /&gt;
* [http://www.ros.org/wiki/openraveros openraveros] - can send commands to OpenRAVE through the ROS network. There&amp;#039;s tutorials in [http://www.ros.org/wiki/openraveros_tutorials openraveros_tutorials].&lt;br /&gt;
* [http://www.ros.org/browse/details.php?name=openrave_sensors openrave_sensors] - subscribe to ROS messages for getting sensor data into openrave (loaded by Master)&lt;br /&gt;
* [http://www.ros.org/browse/details.php?name=openrave_robot_control openrave_robot_control] - simple session interface for controlling robots over the ROS network with openrave being the underlying client. You&amp;#039;ll notice in the lib folder is a librobot_control.so openrave plugin which the Master loads)&lt;br /&gt;
* [http://www.ros.org/browse/details.php?name=schunk_motion_controllers schunk_motion_controllers] - connects to the hardware Schunk interfaces and advertises services to control a robot.&lt;br /&gt;
* [http://www.ros.org/browse/details.php?name=orrosplanning orrosplanning] - misc plugins for reading sensing data and displaying it into openrave. For example, if there is a node plublishing checkerboard_detector/ObjectDetection messages, it is possible to use the &amp;#039;&amp;#039;&amp;#039;ObjectTransform&amp;#039;&amp;#039;&amp;#039; openrave SensorSystem interface to display the objects inside the environment.&lt;br /&gt;
&lt;br /&gt;
== Component Tutorials ==&lt;br /&gt;
&lt;br /&gt;
* [[ROS:ControllingRobots|Controlling Robots]] - Controlling robots through ROS using OpenRAVE&lt;br /&gt;
* [[ROS:sensors|Sensors]] - Publishing openrave sensor data through ROS.&lt;br /&gt;
* [[ROS:Object Detection]] - Simple object detection and inserting objects into the environment.&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=ROS:Index&amp;diff=210</id>
		<title>ROS:Index</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=ROS:Index&amp;diff=210"/>
				<updated>2012-02-07T06:36:31Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
= Using OpenRAVE with ROS =&lt;br /&gt;
&lt;br /&gt;
Shows how to setup a full robot system with OpenRAVE and [http://ros.org Robot Operating System (ROS)]. Any robot system should deal with autonomous manipulation with vision feedback, sensor loops, and higher-level reasoning. &lt;br /&gt;
&lt;br /&gt;
OpenRAVE can be used in many different scenarios.&lt;br /&gt;
&lt;br /&gt;
* There is one openrave instance that does the planning and you would like all controllers/sensor feeding that to it. We&amp;#039;ll call this the &amp;#039;&amp;#039;&amp;#039;Master&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* There are openrave instances outside of the Master that wrap hardware/simulation controllers, generate simulated sensor data. These instances publish to the ROS network and usually feed into the Master openrave.&lt;br /&gt;
&lt;br /&gt;
== OpenRAVE plugins connecting to ROS ==&lt;br /&gt;
&lt;br /&gt;
There are several openrave/ros plugins that create nodes internally and advertise/subscribe to messages. These plugins can be found in these ROS packages:&lt;br /&gt;
&lt;br /&gt;
* [http://www.ros.org/browse/details.php?name=openrave_sensors openrave_sensors] - subscribe to ROS messages for getting sensor data into openrave (loaded by Master)&lt;br /&gt;
* [http://www.ros.org/browse/details.php?name=openrave_robot_control openrave_robot_control] - simple session interface for controlling robots over the ROS network with openrave being the underlying client. You&amp;#039;ll notice in the lib folder is a librobot_control.so openrave plugin which the Master loads)&lt;br /&gt;
* [http://www.ros.org/browse/details.php?name=schunk_motion_controllers schunk_motion_controllers] - connects to the hardware Schunk interfaces and advertises services to control a robot.&lt;br /&gt;
* [http://www.ros.org/browse/details.php?name=orrosplanning orrosplanning] - misc plugins for reading sensing data and displaying it into openrave. For example, if there is a node plublishing checkerboard_detector/ObjectDetection messages, it is possible to use the &amp;#039;&amp;#039;&amp;#039;ObjectTransform&amp;#039;&amp;#039;&amp;#039; openrave SensorSystem interface to display the objects inside the environment.&lt;br /&gt;
&lt;br /&gt;
== Component Tutorials ==&lt;br /&gt;
&lt;br /&gt;
* [[ROS:ControllingRobots|Controlling Robots]] - Controlling robots through ROS using OpenRAVE&lt;br /&gt;
* [[ROS:sensors|Sensors]] - Publishing openrave sensor data through ROS.&lt;br /&gt;
* [[ROS:Object Detection]] - Simple object detection and inserting objects into the environment.&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=ROS:openraveros&amp;diff=209</id>
		<title>ROS:openraveros</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=ROS:openraveros&amp;diff=209"/>
				<updated>2012-02-07T06:35:58Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=OctaveMATLAB&amp;diff=208</id>
		<title>OctaveMATLAB</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=OctaveMATLAB&amp;diff=208"/>
				<updated>2012-02-06T11:46:42Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Unfortunately, MATLAB mex file binaries cannot be re-distributed with OpenRAVE since there are many versions of the tool and the compilers are non-free. Therefore, starting with OpenRAVE 0.4, the mex source files are distributed in the &amp;#039;&amp;#039;&amp;#039;share/openrave-*/matlab&amp;#039;&amp;#039;&amp;#039; directory. In order to use MATLAB, will need to compile each of the &amp;#039;&amp;#039;&amp;#039;cpp&amp;#039;&amp;#039;&amp;#039; files into &amp;#039;&amp;#039;&amp;#039;mex&amp;#039;&amp;#039;&amp;#039; files and add that directory to your MATLAB path. The files are:&lt;br /&gt;
&lt;br /&gt;
- orcreate.cpp&lt;br /&gt;
- orread.cpp&lt;br /&gt;
- orwrite.cpp&lt;br /&gt;
&lt;br /&gt;
Windows users have a special &amp;#039;&amp;#039;&amp;#039;runmex.bat&amp;#039;&amp;#039;&amp;#039; file to help them with this.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Scripting ==&lt;br /&gt;
&lt;br /&gt;
One of the biggest features that separates OpenRAVE from other simulation/planning environments is that it supports scripting over the network. This makes it possible to free OpenRAVE of complex GUIs. At initialization, OpenRAVE starts listening on specific ports for the commands. This allows any computer to open a socket connection with OpenRAVE, which can be running on a different computer, and communicate with it. The official release supports Matlab and Octave as the scripting engines. Note that all script commands are sent as text across the network; therefore, it is possible to do everything in Python or Perl.&lt;br /&gt;
&lt;br /&gt;
The rest of this document is written using the Matlab/Octave functions found in the &amp;#039;&amp;#039;&amp;#039;matlab/&amp;#039;&amp;#039;&amp;#039; directory. For any function, type &amp;#039;help functionname&amp;#039; to get a help message describing its parameters and usage. Some formatting rules:&lt;br /&gt;
&lt;br /&gt;
* All OpenRAVE functions start with &amp;#039;&amp;#039;&amp;#039;or&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* All KinBody specific functions start with &amp;#039;&amp;#039;&amp;#039;orBody&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* All Robot specific functions start with &amp;#039;&amp;#039;&amp;#039;orRobot&amp;#039;&amp;#039;&amp;#039;. Every robot can use all &amp;#039;&amp;#039;&amp;#039;orBody&amp;#039;&amp;#039;&amp;#039; functions.&lt;br /&gt;
* All general environment functions start with &amp;#039;&amp;#039;&amp;#039;orEnv&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* All problem instance specific functions start with &amp;#039;&amp;#039;&amp;#039;orProblem&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Check out the RaveServer constructor in &amp;#039;&amp;#039;&amp;#039;src/server.cpp&amp;#039;&amp;#039;&amp;#039; for a complete list of commands supported.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
All examples can be found in &amp;#039;&amp;#039;&amp;#039;$INSTALL/share/openrave/octave&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
To run &amp;#039;&amp;#039;&amp;#039;MATLAB/Octave&amp;#039;&amp;#039;&amp;#039; examples, first start openrave and then in a separate terminal execute the &amp;#039;&amp;#039;&amp;#039;*.m&amp;#039;&amp;#039;&amp;#039; files.&lt;br /&gt;
&lt;br /&gt;
== Communicating with OpenRAVE ==&lt;br /&gt;
&lt;br /&gt;
Usually communicating with an OpenRAVE instance running on the same computer as the scripting environment is simple. Just call the methods in the &amp;lt;b&amp;gt;matlab&amp;lt;/b&amp;gt; folder directly without having to worry about setting ip address. If OpenRAVE is running on a different computer, the IP address will have to be set manually through a global variable &amp;#039;&amp;#039;&amp;#039;orConnectionParams&amp;#039;&amp;#039;&amp;#039;. To set the address of the remote OpenRAVE in Octave/Matlab instance type&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;global orConnectionParams&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;orConnectionParams.ip = &amp;#039;myopenrave_ip&amp;#039;; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;orConnectionParams.port = 4765; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The scripting environment can communicate with multiple OpenRAVE instances at once, just set orConnectionParams to the appropriate instance. Also, OpenRAVE can handle multiple scripting environments talking to the same instance simultaneously.&lt;br /&gt;
&lt;br /&gt;
[[image:Openrave_network.png|600px]]&lt;br /&gt;
&lt;br /&gt;
The default port openrave starts is 4765, use the &amp;#039;&amp;#039;&amp;#039;-server&amp;#039;&amp;#039;&amp;#039; option to change the port. For example,&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;./openrave -server 3000&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
starts openrave to listen for connections on port 3000.&lt;br /&gt;
&lt;br /&gt;
== Tutorial ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;NOTE:&amp;#039;&amp;#039;&amp;#039; Remember that warnings and responses can appear both in the Matlab/Octave window and the console window where openrave is started from.&lt;br /&gt;
&lt;br /&gt;
=== Basic commands ===&lt;br /&gt;
&lt;br /&gt;
First start &amp;#039;&amp;#039;&amp;#039;openrave&amp;#039;&amp;#039;&amp;#039; and leave it in the background. Then start an Octave or Matlab instance and make sure the paths to the Octave/Matlab scripts are added to the path.&lt;br /&gt;
&lt;br /&gt;
To load a simple scene with the Barrett WAM and Hand:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orEnvLoadScene(&amp;#039;data/lab1.env.xml&amp;#039;, 1)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The 1 is a flag to reset the whole OpenRAVE scene before loading &amp;#039;&amp;#039;&amp;#039;lab1.env.xml&amp;#039;&amp;#039;&amp;#039;. If it wasn&amp;#039;t there, lab1.env.xml would get appended to the current OpenRAVE scene. Now let&amp;#039;s query and display all the objects in the scene&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
bodies = orEnvGetBodies()&lt;br /&gt;
celldisp(bodies)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Every object has a unique id. Use this id for any function that performs an operation on the object. We can move the first joint of the robot 0.5 radians by&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetDOFValues(1,0.5,0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or the first 10 joints:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetDOFValues(1,0.5*ones(1,10),0:9)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here &amp;#039;1&amp;#039; is the unique id of the robot.&lt;br /&gt;
&lt;br /&gt;
If the third argument is not specified, then the default degrees of fredom (joints) used will be the &amp;#039;&amp;#039;&amp;#039;active DOFs&amp;#039;&amp;#039;&amp;#039;. The default &amp;#039;&amp;#039;&amp;#039;active DOFs&amp;#039;&amp;#039;&amp;#039; are all the joints of the robot. To make only the first 7 joints active type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetActiveDOFs(1,0:6,0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get the number of active dofs type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotGetActiveDOF(1)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The concept of &amp;#039;&amp;#039;&amp;#039;active DOFs&amp;#039;&amp;#039;&amp;#039; is very powerful. All planners search only in the &amp;#039;&amp;#039;&amp;#039;active DOFs&amp;#039;&amp;#039;&amp;#039; when planning. In this example, the robot is a combination of an arm and a hand. Most of the time, we would only want to plan and move the arm while ignoring the hand. To do this, set the &amp;#039;&amp;#039;&amp;#039;active DOFs&amp;#039;&amp;#039;&amp;#039; to the joint indices of the arm only before calling the planner. &amp;#039;&amp;#039;&amp;#039;Active DOFs&amp;#039;&amp;#039;&amp;#039; are not limited to just joints, they can also be the translation or rotation components of the robot itself. For example, to plan for the robot arm while it is moving on the &amp;#039;&amp;#039;&amp;#039;xy&amp;#039;&amp;#039;&amp;#039; plane type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetActiveDOFs(1,0:6,3)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To have it rotate around the &amp;#039;&amp;#039;&amp;#039;z&amp;#039;&amp;#039;&amp;#039;-axis at the same time, type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetActiveDOFs(1,0:6,11,[0 0 1])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now,&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotGetActiveDOF(1)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
returns 10: 7 for the arm, 2 for &amp;#039;&amp;#039;&amp;#039;xy&amp;#039;&amp;#039;&amp;#039; planar translation, and 1 for the rotation around &amp;#039;&amp;#039;&amp;#039;z&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
To query the transformations of all the links of the robot type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
L = orBodyGetLinks(1)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will return a 12xN matrix for N links, where each column is a 3x4 transformation matrix (left 3x3 is a rotation, and last column is the translation component). For example, to extract the tranformation matrix of the second link, type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
T = reshape(L(:,2),[3 4])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To set the transformation of the base robot do&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orBodySetTransform(1,[0 0 1],[0.707 0.707 0 0])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will set the translation to (0,0,1). The third parameter is a rotation around the X axis by 90 degrees in quaternion form. It is also possible to directly input a 3x4 transformation matrix T by:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orBodySetTransform(1,reshape(T,[1 12]))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To add a cup on top of the table named &amp;#039;table&amp;#039; type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
destTransform = orBodyGetTransform(orEnvGetBody(&amp;#039;table&amp;#039;));&lt;br /&gt;
destPosition  = destTransform(10:12);&lt;br /&gt;
cupPosition   = destPosition + [0;0;0.1];&lt;br /&gt;
cupid         = orEnvCreateKinBody(&amp;#039;MyCup&amp;#039;,&amp;#039;data/mug1.kinbody.xml&amp;#039;);&lt;br /&gt;
orBodySetTransform(cupid, cupPosition,[0.707 0.707 0 0]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Executing planners - A Grasping Example ===&lt;br /&gt;
&lt;br /&gt;
[[image:Openrave_dishwasher.jpg|350px]] &lt;br /&gt;
&lt;br /&gt;
In this part, we&amp;#039;ll be loading the manipulation plugin and using its various features to plan in the lab1.env.xml workspace with the BarrettWAM. The manipulation plugin exposes a Manipulation ProblemInstance and the Inverse Kinematics functions for the Barrett WAM arm.&lt;br /&gt;
&lt;br /&gt;
First load&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orEnvLoadScene(&amp;#039;data/lab1.env.xml&amp;#039;, 1)&lt;br /&gt;
robotid = orEnvGetBody(&amp;#039;BarrettWAM&amp;#039;)&lt;br /&gt;
manipid = orEnvCreateProblem(&amp;#039;BaseManipulation&amp;#039;, &amp;#039;BarrettWAM&amp;#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each ProblemInstance supports a &amp;#039;SendCommand&amp;#039; function that is used to receive commands from the script server and send back responses. Matlab can communicate with this function by the &amp;#039;orProblemSendCommand&amp;#039; function.&lt;br /&gt;
&lt;br /&gt;
To move the hand safely to a particular preshape do:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
manips = orRobotGetManipulators(robotid);&lt;br /&gt;
orBodySetJointValues(robotid,[0 0 0 pi/2],manips{1}.handjoints);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Alternative: &amp;#039;&amp;#039;&amp;#039; Can move the robot safely to a preshape using planners by:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetActiveDOFs(robotid,manips{1}.armjoints);&lt;br /&gt;
handjoints = sprintf(&amp;#039;%d &amp;#039;,manips{1}.handjoints);&lt;br /&gt;
orProblemSendCommand([&amp;#039;MoveUnsyncJoints handjoints 4 0 0 0 1.57 &amp;#039; handjoints],manipid);&lt;br /&gt;
orBodySetJointValues(robotid,[0 0 0 pi/2],manips{1}.handjoints);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To plan for a configuration space goal for the arm joints of the robot, type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orProblemSendCommand(&amp;#039;MoveManipulator goal -0.005617 1.07 0.233 2.096 -4.194 -0.235 1.302520&amp;#039;,manipid)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Can squeeze the fingers of the hand by:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orProblemSendCommand(&amp;#039;CloseFingers&amp;#039;,manipid)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Grab the body by:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orProblemSendCommand(&amp;#039;GrabBody name mug6&amp;#039;,manipid)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Move to the table:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
tableTrans = [  -0.035588  -0.995502  -0.087805  -0.466866&lt;br /&gt;
                -0.994116   0.026269   0.105090   0.869644&lt;br /&gt;
                -0.102311   0.091028  -0.990579   1.000000 ];&lt;br /&gt;
orProblemSendCommand([&amp;#039;MoveToHandPosition matrix &amp;#039; sprintf(&amp;#039;%f &amp;#039;,tableTrans(1:3,1:4))],manipid)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Move the hand down a little:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orProblemSendCommand([&amp;#039;MoveHandStraight direction 0 0 -1 maxdist 0.3 matrix &amp;#039; sprintf(&amp;#039;%f &amp;#039;,tableTrans(1:3,1:4))],manipid)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally, to release the fingers use the ReleaseFingers command. ReleaseFingers is a little more general than CloseFingers because the fingers to move and the direction of movement can be specified.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetActiveDOFs(1,[7 8 9]); % want to move 3 joints&lt;br /&gt;
orProblemSendCommand(&amp;#039;releasefingers target mug6&amp;#039;,manipid);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Can now plan to original position:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orProblemSendCommand(&amp;#039;MoveManipulator goal 0 0 0 0 0 0 0&amp;#039;,manipid);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Can also test if an IK solution exists by giving the transformation matrix T of the wrist:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
s = orProblemSendCommand([&amp;#039;IKtest trans &amp;#039;, num2str(T(:,4)&amp;#039;), &amp;#039; rot &amp;#039;, num2str(T(1:9))],manipid)&lt;br /&gt;
if( ~isempty(s) )&lt;br /&gt;
    orRobotSetDOFValues(1, sscanf(s, &amp;#039;%f&amp;#039;),0:6)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Logging ===&lt;br /&gt;
&lt;br /&gt;
A scene can be easily saved by using the &amp;#039;&amp;#039;&amp;#039;logging&amp;#039;&amp;#039;&amp;#039; plugin. Once a scene is loaded and all the objects are in place, do the following commands:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
logid = orEnvCreateProblem(&amp;#039;logging&amp;#039;)&lt;br /&gt;
orProblemSendCommand(&amp;#039;savescene filename myscene.env.xml&amp;#039;,logid)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Matlab/Octave Partial Reference ==&lt;br /&gt;
&lt;br /&gt;
This is &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; a complete list and use this only to introduce yourself to the functions, the real reference and usages can be found in the help files of each function by typing &amp;#039;&amp;#039;&amp;#039;help function_name&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orBodyDestroy(bodyid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Destroys a body of id bodyid. bodyid can also be a robot.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;success = orBodyEnable(bodyid, enable)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Enables or disables the body. If a body is disabled, &lt;br /&gt;
 collision detection and physics will will be turned off for it.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;aabb = orBodyGetAABB(bodyid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Returns an axis-aligned boudning box of the body in world coordinates&lt;br /&gt;
 aabb is a 3x2  vector where the first column is the position of the&lt;br /&gt;
 box and the second is the extents.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;aabbs = orBodyGetAABBs(bodyid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 returns the axis-aligned boudning boxes of all the links of the body in world coordinates&lt;br /&gt;
 aabbs is a 6xn vector where each column describes the box for all n links.&lt;br /&gt;
 The first 3 values in each column describe the position of the aabb, and the next&lt;br /&gt;
 3 values describe the extents (half width/length/height) on each of the axes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;dof = orBodyGetDOF(robotid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Returns the number of active joints of the body.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;values = orBodyGetDOFValues(robotid, indices)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Gets the body&amp;#039;s dof values in a Nx1 vector where N is the DOF&lt;br /&gt;
 bodyid - unique id of the robot&lt;br /&gt;
 indices [optional]- The indices of the joints whose values should be returned.&lt;br /&gt;
                     If not specified, all joints are returned&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;values = orBodyGetLinks(bodyid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Returns the transformations of all the body&amp;#039;s links in a 12 x L matrix. Where L&lt;br /&gt;
 is the number of links and each column is a 3x4 transformation&lt;br /&gt;
 (use T=reshape(., [3 4]) to recover).&lt;br /&gt;
 T * [X;1] = Xnew&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orBodySetJointValues(bodyid, values, indices)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Set the raw joint values of a body. If bodyid is a robot, sets the robot&amp;#039;s&lt;br /&gt;
 joints ignoring its current active degrees of freedom. If a controller on&lt;br /&gt;
 the robot is running, this function might not have any effect. Instead&lt;br /&gt;
 use orRobotSetDOFValues&lt;br /&gt;
 indices [optional] - array specifying the indices to control&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orBodySetTransform&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 orBodySetTransform(bodyid, translation, quaternion)&lt;br /&gt;
 orBodySetTransform(bodyid, [quaternion translation])&lt;br /&gt;
 orBodySetTransform(bodyid, transform matrix) (12x1, 1x12, or 3x4)&lt;br /&gt;
 Set the affine transformation of the body. The transformation actually&lt;br /&gt;
 describes the first link of the body. The rest of the links are derived by&lt;br /&gt;
 the joint angles. A quaternion is related to axis and angle via: [cos(theta/2);sin(theta/2)*axis]&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[collision, colbody] = orEnvCheckCollision(bodyid,excludeid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Check collision of the robot with the environment. collision is 1 if the robot&lt;br /&gt;
 is colliding, colbodyid is the id of the object that body collided with&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orEnvClose(figureids)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
closes the figures and plots&lt;br /&gt;
figureids - array of ids returned from orEnvPlot or other plotting functions&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;bodyid = orEnvCreateKinBody(name, xmlfile)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;plannerid = orEnvCreatePlanner(plannertype)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orEnvCreateProblem&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 problemid = orEnvCreateProblem(problemname, args)&lt;br /&gt;
 problemid = orEnvCreateProblem([problemname, args])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;problemid = orEnvCreateProblem(problemname, args, destroyduplicates)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Creates an instance of a problem and returns its id for future communicate with it&lt;br /&gt;
 problemname - the problem name&lt;br /&gt;
 args - a string of arguments to send to the problem&amp;#039;s main function&lt;br /&gt;
 destroyduplicates [optional] - if 1, will destroy any previous problems with the same problem name.&lt;br /&gt;
                               If 0, will not destroy anything.&lt;br /&gt;
                               The default value is 1. &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;robotid = orEnvCreateRobot(robotname, xmlfile, type)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Creates a robot of the given type. If type is not specified, creates a generic robot&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orEnvDestroyProblem(problemid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Destroys problem instance whose id is problemid.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;bodies = orEnvGetBodies()&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 bodies is a cell array of all body objects in the scene&lt;br /&gt;
 every cell contains a struct with the following parameters&lt;br /&gt;
 id - bodyid&lt;br /&gt;
 filename - filename used to initialize the body with&lt;br /&gt;
 name - human robot name&lt;br /&gt;
 type - xml type of body&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;id = orEnvGetBody(bodyname)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 returns the id of the body that corresponds to bodyname&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;robots = orEnvGetRobots()&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 robots is a cell array of robots&lt;br /&gt;
 every cell contains a struct with the following parameters&lt;br /&gt;
 id - robotid&lt;br /&gt;
 filename - filename used to initialize the robot with&lt;br /&gt;
 name - human robot name&lt;br /&gt;
 type - type of robot&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;success = orEnvLoadPlugin(filename)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Loads a plugin.&lt;br /&gt;
 filename - the relative path of the plugin to load. (*.so for linux, *.dll for windows)&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orEnvLoadScene(filename, [ClearScene])&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Loads a new environment.&lt;br /&gt;
 filename - The filename of the scene to load. If a relative file&lt;br /&gt;
            is specified, note that it is relative to the current direction&lt;br /&gt;
            of the OpenRAVE executable.&lt;br /&gt;
 ClearScene - If 1, then clears the scene before loading. Else leaves the &lt;br /&gt;
              scene alone and loads in addition to it.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;figureid = orEnvPlot(points,...)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 plots points or lines in the openrave viewer&lt;br /&gt;
 points - Nx3 vector of xyz positions&lt;br /&gt;
 optional arguments include &amp;#039;size&amp;#039;, &amp;#039;color&amp;#039;, and &amp;#039;line&amp;#039;&lt;br /&gt;
   color - Nx3 vector of RGB values between 0 and 1&lt;br /&gt;
   size - Nx1 vector of the sizes in pixels of each point/line&lt;br /&gt;
   line (or linestrip) - if specified, then openrave renders a line strip&lt;br /&gt;
   linelist - if specified, openrave renders a line for every two points&lt;br /&gt;
   trilist - if specified, openrave renders a triangle for every three&lt;br /&gt;
             vertices should be specified in counter-clockwise order&lt;br /&gt;
   sphere - if specified, openrave renders each point as a sphere&lt;br /&gt;
   transparency - [0,1], set transparency of plotted objects (0 is opaque)&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[collision, colinfo] = orEnvRayCollision(rays)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 performs ray collision checks and returns the position and normals&lt;br /&gt;
 where all the rays collide&lt;br /&gt;
 rays - a 6xN matrix where the first 3&lt;br /&gt;
 rows are the ray position and last 3 are the ray direction&lt;br /&gt;
 collision - N dim vector that is 1 for colliding rays and 0&lt;br /&gt;
 for non-colliding rays colinfo is a 6xN vector that describes &lt;br /&gt;
 where the ray hit and the normal to the surface of the hit point&lt;br /&gt;
 where the first 3 columns are position and last 3 are normals&lt;br /&gt;
 if bodyid is specified, only checks collisions with that body&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orEnvSetOptions(&amp;#039;publishanytime 1&amp;#039;)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Current options:&lt;br /&gt;
 - simulation [start/stop] [time_step] - toggles the internal simulation loop, ie all the calls to SimulationStep. &lt;br /&gt;
 If time_step is specified, will set the simulation time step for all objects.&lt;br /&gt;
 Note that this is not tied to real time at all, how fast the  simulation goes in reality depends on complexity&lt;br /&gt;
 of the scene and the physics engine being used.&lt;br /&gt;
 - physics engine_name - switches the physics engine to another one with id &amp;#039;engine_name&amp;#039;&lt;br /&gt;
 - gravity [x y z] - changes to gravity vector&lt;br /&gt;
 - publishanytime [1/0] - switch between publishing the body transformations&lt;br /&gt;
          to the GUI anytime or only between stepsimulation and server  messsages.&lt;br /&gt;
          When publishing anytime, the GUI will reflect the body movements after every&lt;br /&gt;
          move. This is useful when visualizing internal C++ states. When off, the GUI&lt;br /&gt;
          will only reflect the state of robots after all calls to stepsimulation and&lt;br /&gt;
          server send messages have been done. The default is off.&lt;br /&gt;
 - debug [debug level] - toggles debugging messages by RAVELOG.&lt;br /&gt;
                        0  - only RAVEPRINT statements show&lt;br /&gt;
                        1+ - RAVELOG statements with various debug levels show&lt;br /&gt;
 - quit - closes the openrave instance&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[tripoints, triindices] = orEnvTriangulate(inclusive, ids)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Returns the triangulation of various objects in the scenes controlled by name and options&lt;br /&gt;
 Arguments:&lt;br /&gt;
   inclusive - if 1, will only triangulate the bodies pointed to by ids&lt;br /&gt;
               if 0, will triangulate all objects except the bodies pointed to by ids&lt;br /&gt;
               default value is 0.&lt;br /&gt;
   ids (optional) - the ids to include or exclude in the triangulation&lt;br /&gt;
 To triangulate everything, just do orEnvTriangulate(0,[]), or orEnvTriangulate()&lt;br /&gt;
&lt;br /&gt;
 Output:&lt;br /&gt;
   tripoints - 3xN matrix of 3D points&lt;br /&gt;
   tripoints - 3xK matrix of indices into tripoints for every triangle.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;success = orEnvWait(robotid, robot_timeout)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 wait until all previously sent commands to matlab are finished.&lt;br /&gt;
 Since problems are meant to last for a long time orEnvWait waits&lt;br /&gt;
 until the problem&amp;#039;s main function finishes.&lt;br /&gt;
 &lt;br /&gt;
 robotid - optional argument. If a robot id is specified, will wait until&lt;br /&gt;
 the robot finishes with its trajectory.&lt;br /&gt;
 &lt;br /&gt;
 robot_timeout (s) - function will return with success set to 0 if robot&lt;br /&gt;
 did not finish its commands by robot_timeout ms. If not specified, orEnvWait&lt;br /&gt;
 will not return until robot completes.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;success = orPlannerInit(planner, robot, parameters)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Initialize a planner to plan for a robot and give some parameters&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;trajectory = orPlannerPlan(planner)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Start planning. The planner returns a trajectory when successful (otherwise returns an empty matrix)&lt;br /&gt;
 trajectory - (DOF+1)xN matrix where N is the number of points in the trajectory.&lt;br /&gt;
              The first row are the time values of each trajectory point.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;output = orProblemSendCommand(cmd, problemid, dosync)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Sends a command to the problem. The function doesn&amp;#039;t return until&lt;br /&gt;
 ProblemInstance::SendCommand returns.&lt;br /&gt;
 cmd - the string command to send the problem&lt;br /&gt;
 problemid [optional] - returned id of the problem, if not specified, then&lt;br /&gt;
                       command is sent to all problems&lt;br /&gt;
 dosync [optional] - If 1, the SendCommand is called in the main thread, in sync&lt;br /&gt;
                       with the rest of the primitives. If 0, called in a different thread.&lt;br /&gt;
 output - the concatenated output of all the problems that the command is sent to&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orRender(cmd)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Controls rendering properties. Cmd can be&lt;br /&gt;
 start - starts the GUI to update the internal openrave state&lt;br /&gt;
 stop - stops the GUI from updating the internal openrave state (can be used to speed up loading)&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;success = orRobotControllerSend(robotid, controllercmd)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 &lt;br /&gt;
 sends a command to the current controller the robot is connected to.&lt;br /&gt;
 OpenRAVE sends directly to ControllerBase::SendCmd,&lt;br /&gt;
 ControllerBase::SupportsCmd is also used to check for support.&lt;br /&gt;
 &lt;br /&gt;
 success - 1 if command was accepted, 0 if not&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;success = orRobotControllerSet(robotid, controllername, controllerargs)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Sets a new robot controller and destroys the old.&lt;br /&gt;
 controllername - name used to query a controller&lt;br /&gt;
 controllerargs [optional] - the arguments to ControllerBase::Init&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;dof = orRobotGetActiveDOF(robotid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 returns the robot&amp;#039;s active degrees of freedom used for planning (not necessary corresponding to joints).&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;sensors = orRobotGetAttachedSensors(robotid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sensors is a cell array describing the attached sensors of the robot&lt;br /&gt;
 Each cell is a struct with fields:&lt;br /&gt;
   name - name of the attached sensor&lt;br /&gt;
   link - zero-based index of link sensor is attached to&lt;br /&gt;
   Trelative - 3x4 matrix of the relative transform of the camera with respect to the robot&lt;br /&gt;
   Tglobal - 3x4 matrix of the global transform of the sensor of the current robot&lt;br /&gt;
             Tglobal = Tlink * Trelative&lt;br /&gt;
   type - the xml id of the sensor that is attached&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;values = orRobotGetDOFLimits(robotid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Gets the robot&amp;#039;s dof limits in a Nx2 vector where N is the DOF, the first column&lt;br /&gt;
 is the low limit and the second column is the upper limit.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;values = orRobotGetDOFValues(robotid, indices)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Gets the robot&amp;#039;s dof values in a Nx1 vector where N is the DOF&lt;br /&gt;
 robotid - unique id of the robot&lt;br /&gt;
 indices [optional]- The indices of the joints whose values should be returned.&lt;br /&gt;
                     If not specified, the active degreees of freedeom set by&lt;br /&gt;
                     orRobotSetActiveDOFs will be used.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;manipulators = orRobotGetManipulators(robotid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 manipulators is a cell array describes the manipulators of the robot&lt;br /&gt;
 Each cell is a struct with fields&lt;br /&gt;
   baselink - zero-based index of base link manipulator is attached to&lt;br /&gt;
   eelink - zero-based index of link defining the end-effector&lt;br /&gt;
   Tgrasp - 3x4 matrix of the grasp frame relative to the end effector link,&lt;br /&gt;
            Tglobalgrasp = Tendeffector*Tgrasp&lt;br /&gt;
   joints - 1xK zero-based joint indices of the hand attached to the end effector&lt;br /&gt;
   armjoints - 1xN zero-based manipulator joint indices that have an&lt;br /&gt;
               effect on the end effector&lt;br /&gt;
   iksolvername - name of ik solver to use&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;data = orRobotSensorGetData(robotid, sensorindex)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Gets the sensor data. The format returned is dependent on the type&lt;br /&gt;
 of sensor. Look at the different data SensorData implementations in rave.h.&lt;br /&gt;
 Although the data returned is not necessarily one of them.&lt;br /&gt;
 options [optional] - options that specify what type of data to request (0 is default)&lt;br /&gt;
 data.type - contains the id of the data type (see SensorBase::SensorType)&lt;br /&gt;
 For laser data&lt;br /&gt;
  data.laserrange - 3xN array where each column is the direction * distance&lt;br /&gt;
  data.laserpos - 3xN array where each column is the corresponding origin of each range measurement&lt;br /&gt;
  data.laserint - 1xN optional laser intensity array&lt;br /&gt;
 For image data&lt;br /&gt;
  data.KK - 3x3 intrinsic matrix&lt;br /&gt;
  data.T - 3x4 camera matrix (to project a point multiply by KK*inv(T))&lt;br /&gt;
  data.I - the rgb image size(I) = [height width 3]&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;out = orRobotSensorSend(robotid, sensorindex, controllercmd)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sends a command to a sensor attached to the robot &lt;br /&gt;
 OpenRAVE sends directly to SensorBase::SendCmd,&lt;br /&gt;
 SensorBase::SupportsCmd is used to check for command support.&lt;br /&gt;
&lt;br /&gt;
 robotid - unique id of the robot&lt;br /&gt;
 sensorindex - zero-based index of sensor into robot&amp;#039;s attached sensor array&lt;br /&gt;
 out - the output of the command&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orRobotSetActiveDOfs(robotid, indices, affinedofs, rotationaxis)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 robotid - unique id of the robot&lt;br /&gt;
 indices - zero based indices of the robot joints to activate&lt;br /&gt;
 affinedofs [optional] - is a mask of affine transformation for planning&lt;br /&gt;
       1 - X, 2 - Y, 4 - Z, 8 - RotationAxis (rotationaxis has to be avlid, 16 - full 3D rotation&lt;br /&gt;
 rotationaxis [optional] - the rotation axis (if the RotationAxis bit is set in affinedofs)&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orRobotSetDofValues(robotid, values, indices)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Sets the DOF values of the robot&lt;br /&gt;
 robotid - unique id of the robot&lt;br /&gt;
 values - the joint values of the robot&lt;br /&gt;
 indices [optional] - the indices of the dofs to set of the robot. &lt;br /&gt;
                      If indices is not specified the active degrees of freedom&lt;br /&gt;
                      set by previous calls to orRobotSetActiveDOFs will be used.&lt;br /&gt;
                      Note that specifying indices will not change the active dofs of the robot.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orRobotStartActiveTrajectory(robotid, jointvalues, timestamps, transformations)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Starts/Queues a robot trajectory of the robot where the size of&lt;br /&gt;
 each trajectory point is the current active degrees of freedom&lt;br /&gt;
 of the robot (others are held constants)&lt;br /&gt;
 D is the number of active degrees of freedom.&lt;br /&gt;
 N is the number of points of the trajectory&lt;br /&gt;
 robotid - unique id of the robot&lt;br /&gt;
 jointvalues - DxN matrix of the joint values of each point in the trajrectory.&lt;br /&gt;
 timestamps [optional] - the time stamps in seconds of each trajectory point.&lt;br /&gt;
 transformations [optional] - 12xN or 7xN matrix. The base link transformations of&lt;br /&gt;
                              each trajectory point.&lt;br /&gt;
                              If the column size is 12, then it is a 3x4 matrix&lt;br /&gt;
                              in column first order&lt;br /&gt;
                              If the column size is 7, then it is a quaterion and a translation.&lt;br /&gt;
                              If active degrees of freedom contains a affine transformation component&lt;br /&gt;
                              it is overwritten with the transformations matrices&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=OctaveMATLAB&amp;diff=207</id>
		<title>OctaveMATLAB</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=OctaveMATLAB&amp;diff=207"/>
				<updated>2012-02-06T11:45:51Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Unfortunately, MATLAB mex file binaries cannot be re-distributed with OpenRAVE since there are many versions of the tool and the compilers are non-free. Therefore, starting with OpenRAVE 0.4, the mex source files are distributed in the &amp;#039;&amp;#039;&amp;#039;share/openrave-*/matlab&amp;#039;&amp;#039;&amp;#039; directory. In order to use MATLAB, will need to compile each of the &amp;#039;&amp;#039;&amp;#039;cpp&amp;#039;&amp;#039;&amp;#039; files into &amp;#039;&amp;#039;&amp;#039;mex&amp;#039;&amp;#039;&amp;#039; files and add that directory to your MATLAB path. The files are:&lt;br /&gt;
&lt;br /&gt;
- orcreate.cpp&lt;br /&gt;
- orread.cpp&lt;br /&gt;
- orwrite.cpp&lt;br /&gt;
&lt;br /&gt;
Windows users have a special &amp;#039;&amp;#039;&amp;#039;runmex.bat&amp;#039;&amp;#039;&amp;#039; file to help them with this.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Scripting ==&lt;br /&gt;
&lt;br /&gt;
One of the biggest features that separates OpenRAVE from other simulation/planning environments is that it supports scripting over the network. This makes it possible to free OpenRAVE of complex GUIs. At initialization, OpenRAVE starts listening on specific ports for the commands. This allows any computer to open a socket connection with OpenRAVE, which can be running on a different computer, and communicate with it. The official release supports Matlab and Octave as the scripting engines. Note that all script commands are sent as text across the network; therefore, it is possible to do everything in Python or Perl.&lt;br /&gt;
&lt;br /&gt;
The rest of this document is written using the Matlab/Octave functions found in the &amp;#039;&amp;#039;&amp;#039;matlab/&amp;#039;&amp;#039;&amp;#039; directory. For any function, type &amp;#039;help functionname&amp;#039; to get a help message describing its parameters and usage. Some formatting rules:&lt;br /&gt;
&lt;br /&gt;
* All OpenRAVE functions start with &amp;#039;&amp;#039;&amp;#039;or&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* All KinBody specific functions start with &amp;#039;&amp;#039;&amp;#039;orBody&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* All Robot specific functions start with &amp;#039;&amp;#039;&amp;#039;orRobot&amp;#039;&amp;#039;&amp;#039;. Every robot can use all &amp;#039;&amp;#039;&amp;#039;orBody&amp;#039;&amp;#039;&amp;#039; functions.&lt;br /&gt;
* All general environment functions start with &amp;#039;&amp;#039;&amp;#039;orEnv&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* All problem instance specific functions start with &amp;#039;&amp;#039;&amp;#039;orProblem&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Check out the RaveServer constructor in &amp;#039;&amp;#039;&amp;#039;src/server.cpp&amp;#039;&amp;#039;&amp;#039; for a complete list of commands supported.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
All examples can be found in &amp;#039;&amp;#039;&amp;#039;$INSTALL/share/openrave/octave&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
To run &amp;#039;&amp;#039;&amp;#039;MATLAB/Octave&amp;#039;&amp;#039;&amp;#039; examples, first start openrave and then in a separate terminal execute the &amp;#039;&amp;#039;&amp;#039;*.m&amp;#039;&amp;#039;&amp;#039; files.&lt;br /&gt;
&lt;br /&gt;
== Communicating with OpenRAVE ==&lt;br /&gt;
&lt;br /&gt;
Usually communicating with an OpenRAVE instance running on the same computer as the scripting environment is simple. Just call the methods in the &amp;lt;b&amp;gt;matlab&amp;lt;/b&amp;gt; folder directly without having to worry about setting ip address. If OpenRAVE is running on a different computer, the IP address will have to be set manually through a global variable &amp;#039;&amp;#039;&amp;#039;orConnectionParams&amp;#039;&amp;#039;&amp;#039;. To set the address of the remote OpenRAVE in Octave/Matlab instance type&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;global orConnectionParams&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;orConnectionParams.ip = &amp;#039;myopenrave_ip&amp;#039;; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;orConnectionParams.port = 4765; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The scripting environment can communicate with multiple OpenRAVE instances at once, just set orConnectionParams to the appropriate instance. Also, OpenRAVE can handle multiple scripting environments talking to the same instance simultaneously.&lt;br /&gt;
&lt;br /&gt;
[[image:Openrave_network.png|600px]]&lt;br /&gt;
&lt;br /&gt;
The default port openrave starts is 4765, use the &amp;#039;&amp;#039;&amp;#039;-server&amp;#039;&amp;#039;&amp;#039; option to change the port. For example,&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;./openrave -server 3000&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
starts openrave to listen for connections on port 3000.&lt;br /&gt;
&lt;br /&gt;
== Tutorial ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;NOTE:&amp;#039;&amp;#039;&amp;#039; Remember that warnings and responses can appear both in the Matlab/Octave window and the console window where openrave is started from.&lt;br /&gt;
&lt;br /&gt;
=== Basic commands ===&lt;br /&gt;
&lt;br /&gt;
First start &amp;#039;&amp;#039;&amp;#039;openrave&amp;#039;&amp;#039;&amp;#039; and leave it in the background. Then start an Octave or Matlab instance and make sure the paths to the Octave/Matlab scripts are added to the path.&lt;br /&gt;
&lt;br /&gt;
To load a simple scene with the Barrett WAM and Hand:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orEnvLoadScene(&amp;#039;data/lab1.env.xml&amp;#039;, 1)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The 1 is a flag to reset the whole OpenRAVE scene before loading &amp;#039;&amp;#039;&amp;#039;lab1.env.xml&amp;#039;&amp;#039;&amp;#039;. If it wasn&amp;#039;t there, lab1.env.xml would get appended to the current OpenRAVE scene. Now let&amp;#039;s query and display all the objects in the scene&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
bodies = orEnvGetBodies()&lt;br /&gt;
celldisp(bodies)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Every object has a unique id. Use this id for any function that performs an operation on the object. We can move the first joint of the robot 0.5 radians by&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetDOFValues(1,0.5,0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or the first 10 joints:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetDOFValues(1,0.5*ones(1,10),0:9)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here &amp;#039;1&amp;#039; is the unique id of the robot.&lt;br /&gt;
&lt;br /&gt;
If the third argument is not specified, then the default degrees of fredom (joints) used will be the &amp;#039;&amp;#039;&amp;#039;active DOFs&amp;#039;&amp;#039;&amp;#039;. The default &amp;#039;&amp;#039;&amp;#039;active DOFs&amp;#039;&amp;#039;&amp;#039; are all the joints of the robot. To make only the first 7 joints active type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetActiveDOFs(1,0:6,0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get the number of active dofs type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotGetActiveDOF(1)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The concept of &amp;#039;&amp;#039;&amp;#039;active DOFs&amp;#039;&amp;#039;&amp;#039; is very powerful. All planners search only in the &amp;#039;&amp;#039;&amp;#039;active DOFs&amp;#039;&amp;#039;&amp;#039; when planning. In this example, the robot is a combination of an arm and a hand. Most of the time, we would only want to plan and move the arm while ignoring the hand. To do this, set the &amp;#039;&amp;#039;&amp;#039;active DOFs&amp;#039;&amp;#039;&amp;#039; to the joint indices of the arm only before calling the planner. &amp;#039;&amp;#039;&amp;#039;Active DOFs&amp;#039;&amp;#039;&amp;#039; are not limited to just joints, they can also be the translation or rotation components of the robot itself. For example, to plan for the robot arm while it is moving on the &amp;#039;&amp;#039;&amp;#039;xy&amp;#039;&amp;#039;&amp;#039; plane type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetActiveDOFs(1,0:6,3)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To have it rotate around the &amp;#039;&amp;#039;&amp;#039;z&amp;#039;&amp;#039;&amp;#039;-axis at the same time, type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetActiveDOFs(1,0:6,11,[0 0 1])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now,&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotGetActiveDOF(1)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
returns 10: 7 for the arm, 2 for &amp;#039;&amp;#039;&amp;#039;xy&amp;#039;&amp;#039;&amp;#039; planar translation, and 1 for the rotation around &amp;#039;&amp;#039;&amp;#039;z&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
To query the transformations of all the links of the robot type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
L = orBodyGetLinks(1)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will return a 12xN matrix for N links, where each column is a 3x4 transformation matrix (left 3x3 is a rotation, and last column is the translation component). For example, to extract the tranformation matrix of the second link, type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
T = reshape(L(:,2),[3 4])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To set the transformation of the base robot do&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orBodySetTransform(1,[0 0 1],[0.707 0.707 0 0])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will set the translation to (0,0,1). The third parameter is a rotation around the X axis by 90 degrees in quaternion form. It is also possible to directly input a 3x4 transformation matrix T by:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orBodySetTransform(1,reshape(T,[1 12]))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To add a cup on top of the table named &amp;#039;table&amp;#039; type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
destTransform = orBodyGetTransform(orEnvGetBody(&amp;#039;table&amp;#039;));&lt;br /&gt;
destPosition  = destTransform(10:12);&lt;br /&gt;
cupPosition   = destPosition + [0;0;0.1];&lt;br /&gt;
cupid         = orEnvCreateKinBody(&amp;#039;MyCup&amp;#039;,&amp;#039;data/mug1.kinbody.xml&amp;#039;);&lt;br /&gt;
orBodySetTransform(cupid, cupPosition,[0.707 0.707 0 0]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Executing planners - A Grasping Example ===&lt;br /&gt;
&lt;br /&gt;
[[image:Openrave_dishwasher.jpg|right|350px]] &lt;br /&gt;
&lt;br /&gt;
In this part, we&amp;#039;ll be loading the manipulation plugin and using its various features to plan in the lab1.env.xml workspace with the BarrettWAM. The manipulation plugin exposes a Manipulation ProblemInstance and the Inverse Kinematics functions for the Barrett WAM arm.&lt;br /&gt;
&lt;br /&gt;
First load&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orEnvLoadScene(&amp;#039;data/lab1.env.xml&amp;#039;, 1)&lt;br /&gt;
robotid = orEnvGetBody(&amp;#039;BarrettWAM&amp;#039;)&lt;br /&gt;
manipid = orEnvCreateProblem(&amp;#039;BaseManipulation&amp;#039;, &amp;#039;BarrettWAM&amp;#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each ProblemInstance supports a &amp;#039;SendCommand&amp;#039; function that is used to receive commands from the script server and send back responses. Matlab can communicate with this function by the &amp;#039;orProblemSendCommand&amp;#039; function.&lt;br /&gt;
&lt;br /&gt;
To move the hand safely to a particular preshape do:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
manips = orRobotGetManipulators(robotid);&lt;br /&gt;
orBodySetJointValues(robotid,[0 0 0 pi/2],manips{1}.handjoints);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Alternative: &amp;#039;&amp;#039;&amp;#039; Can move the robot safely to a preshape using planners by:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetActiveDOFs(robotid,manips{1}.armjoints);&lt;br /&gt;
handjoints = sprintf(&amp;#039;%d &amp;#039;,manips{1}.handjoints);&lt;br /&gt;
orProblemSendCommand([&amp;#039;MoveUnsyncJoints handjoints 4 0 0 0 1.57 &amp;#039; handjoints],manipid);&lt;br /&gt;
orBodySetJointValues(robotid,[0 0 0 pi/2],manips{1}.handjoints);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To plan for a configuration space goal for the arm joints of the robot, type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orProblemSendCommand(&amp;#039;MoveManipulator goal -0.005617 1.07 0.233 2.096 -4.194 -0.235 1.302520&amp;#039;,manipid)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Can squeeze the fingers of the hand by:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orProblemSendCommand(&amp;#039;CloseFingers&amp;#039;,manipid)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Grab the body by:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orProblemSendCommand(&amp;#039;GrabBody name mug6&amp;#039;,manipid)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Move to the table:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
tableTrans = [  -0.035588  -0.995502  -0.087805  -0.466866&lt;br /&gt;
                -0.994116   0.026269   0.105090   0.869644&lt;br /&gt;
                -0.102311   0.091028  -0.990579   1.000000 ];&lt;br /&gt;
orProblemSendCommand([&amp;#039;MoveToHandPosition matrix &amp;#039; sprintf(&amp;#039;%f &amp;#039;,tableTrans(1:3,1:4))],manipid)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Move the hand down a little:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orProblemSendCommand([&amp;#039;MoveHandStraight direction 0 0 -1 maxdist 0.3 matrix &amp;#039; sprintf(&amp;#039;%f &amp;#039;,tableTrans(1:3,1:4))],manipid)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally, to release the fingers use the ReleaseFingers command. ReleaseFingers is a little more general than CloseFingers because the fingers to move and the direction of movement can be specified.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetActiveDOFs(1,[7 8 9]); % want to move 3 joints&lt;br /&gt;
orProblemSendCommand(&amp;#039;releasefingers target mug6&amp;#039;,manipid);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Can now plan to original position:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orProblemSendCommand(&amp;#039;MoveManipulator goal 0 0 0 0 0 0 0&amp;#039;,manipid);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Can also test if an IK solution exists by giving the transformation matrix T of the wrist:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
s = orProblemSendCommand([&amp;#039;IKtest trans &amp;#039;, num2str(T(:,4)&amp;#039;), &amp;#039; rot &amp;#039;, num2str(T(1:9))],manipid)&lt;br /&gt;
if( ~isempty(s) )&lt;br /&gt;
    orRobotSetDOFValues(1, sscanf(s, &amp;#039;%f&amp;#039;),0:6)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Logging ===&lt;br /&gt;
&lt;br /&gt;
A scene can be easily saved by using the &amp;#039;&amp;#039;&amp;#039;logging&amp;#039;&amp;#039;&amp;#039; plugin. Once a scene is loaded and all the objects are in place, do the following commands:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
logid = orEnvCreateProblem(&amp;#039;logging&amp;#039;)&lt;br /&gt;
orProblemSendCommand(&amp;#039;savescene filename myscene.env.xml&amp;#039;,logid)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Matlab/Octave Partial Reference ==&lt;br /&gt;
&lt;br /&gt;
This is &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; a complete list and use this only to introduce yourself to the functions, the real reference and usages can be found in the help files of each function by typing &amp;#039;&amp;#039;&amp;#039;help function_name&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orBodyDestroy(bodyid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Destroys a body of id bodyid. bodyid can also be a robot.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;success = orBodyEnable(bodyid, enable)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Enables or disables the body. If a body is disabled, &lt;br /&gt;
 collision detection and physics will will be turned off for it.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;aabb = orBodyGetAABB(bodyid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Returns an axis-aligned boudning box of the body in world coordinates&lt;br /&gt;
 aabb is a 3x2  vector where the first column is the position of the&lt;br /&gt;
 box and the second is the extents.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;aabbs = orBodyGetAABBs(bodyid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 returns the axis-aligned boudning boxes of all the links of the body in world coordinates&lt;br /&gt;
 aabbs is a 6xn vector where each column describes the box for all n links.&lt;br /&gt;
 The first 3 values in each column describe the position of the aabb, and the next&lt;br /&gt;
 3 values describe the extents (half width/length/height) on each of the axes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;dof = orBodyGetDOF(robotid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Returns the number of active joints of the body.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;values = orBodyGetDOFValues(robotid, indices)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Gets the body&amp;#039;s dof values in a Nx1 vector where N is the DOF&lt;br /&gt;
 bodyid - unique id of the robot&lt;br /&gt;
 indices [optional]- The indices of the joints whose values should be returned.&lt;br /&gt;
                     If not specified, all joints are returned&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;values = orBodyGetLinks(bodyid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Returns the transformations of all the body&amp;#039;s links in a 12 x L matrix. Where L&lt;br /&gt;
 is the number of links and each column is a 3x4 transformation&lt;br /&gt;
 (use T=reshape(., [3 4]) to recover).&lt;br /&gt;
 T * [X;1] = Xnew&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orBodySetJointValues(bodyid, values, indices)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Set the raw joint values of a body. If bodyid is a robot, sets the robot&amp;#039;s&lt;br /&gt;
 joints ignoring its current active degrees of freedom. If a controller on&lt;br /&gt;
 the robot is running, this function might not have any effect. Instead&lt;br /&gt;
 use orRobotSetDOFValues&lt;br /&gt;
 indices [optional] - array specifying the indices to control&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orBodySetTransform&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 orBodySetTransform(bodyid, translation, quaternion)&lt;br /&gt;
 orBodySetTransform(bodyid, [quaternion translation])&lt;br /&gt;
 orBodySetTransform(bodyid, transform matrix) (12x1, 1x12, or 3x4)&lt;br /&gt;
 Set the affine transformation of the body. The transformation actually&lt;br /&gt;
 describes the first link of the body. The rest of the links are derived by&lt;br /&gt;
 the joint angles. A quaternion is related to axis and angle via: [cos(theta/2);sin(theta/2)*axis]&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[collision, colbody] = orEnvCheckCollision(bodyid,excludeid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Check collision of the robot with the environment. collision is 1 if the robot&lt;br /&gt;
 is colliding, colbodyid is the id of the object that body collided with&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orEnvClose(figureids)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
closes the figures and plots&lt;br /&gt;
figureids - array of ids returned from orEnvPlot or other plotting functions&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;bodyid = orEnvCreateKinBody(name, xmlfile)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;plannerid = orEnvCreatePlanner(plannertype)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orEnvCreateProblem&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 problemid = orEnvCreateProblem(problemname, args)&lt;br /&gt;
 problemid = orEnvCreateProblem([problemname, args])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;problemid = orEnvCreateProblem(problemname, args, destroyduplicates)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Creates an instance of a problem and returns its id for future communicate with it&lt;br /&gt;
 problemname - the problem name&lt;br /&gt;
 args - a string of arguments to send to the problem&amp;#039;s main function&lt;br /&gt;
 destroyduplicates [optional] - if 1, will destroy any previous problems with the same problem name.&lt;br /&gt;
                               If 0, will not destroy anything.&lt;br /&gt;
                               The default value is 1. &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;robotid = orEnvCreateRobot(robotname, xmlfile, type)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Creates a robot of the given type. If type is not specified, creates a generic robot&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orEnvDestroyProblem(problemid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Destroys problem instance whose id is problemid.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;bodies = orEnvGetBodies()&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 bodies is a cell array of all body objects in the scene&lt;br /&gt;
 every cell contains a struct with the following parameters&lt;br /&gt;
 id - bodyid&lt;br /&gt;
 filename - filename used to initialize the body with&lt;br /&gt;
 name - human robot name&lt;br /&gt;
 type - xml type of body&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;id = orEnvGetBody(bodyname)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 returns the id of the body that corresponds to bodyname&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;robots = orEnvGetRobots()&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 robots is a cell array of robots&lt;br /&gt;
 every cell contains a struct with the following parameters&lt;br /&gt;
 id - robotid&lt;br /&gt;
 filename - filename used to initialize the robot with&lt;br /&gt;
 name - human robot name&lt;br /&gt;
 type - type of robot&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;success = orEnvLoadPlugin(filename)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Loads a plugin.&lt;br /&gt;
 filename - the relative path of the plugin to load. (*.so for linux, *.dll for windows)&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orEnvLoadScene(filename, [ClearScene])&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Loads a new environment.&lt;br /&gt;
 filename - The filename of the scene to load. If a relative file&lt;br /&gt;
            is specified, note that it is relative to the current direction&lt;br /&gt;
            of the OpenRAVE executable.&lt;br /&gt;
 ClearScene - If 1, then clears the scene before loading. Else leaves the &lt;br /&gt;
              scene alone and loads in addition to it.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;figureid = orEnvPlot(points,...)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 plots points or lines in the openrave viewer&lt;br /&gt;
 points - Nx3 vector of xyz positions&lt;br /&gt;
 optional arguments include &amp;#039;size&amp;#039;, &amp;#039;color&amp;#039;, and &amp;#039;line&amp;#039;&lt;br /&gt;
   color - Nx3 vector of RGB values between 0 and 1&lt;br /&gt;
   size - Nx1 vector of the sizes in pixels of each point/line&lt;br /&gt;
   line (or linestrip) - if specified, then openrave renders a line strip&lt;br /&gt;
   linelist - if specified, openrave renders a line for every two points&lt;br /&gt;
   trilist - if specified, openrave renders a triangle for every three&lt;br /&gt;
             vertices should be specified in counter-clockwise order&lt;br /&gt;
   sphere - if specified, openrave renders each point as a sphere&lt;br /&gt;
   transparency - [0,1], set transparency of plotted objects (0 is opaque)&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[collision, colinfo] = orEnvRayCollision(rays)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 performs ray collision checks and returns the position and normals&lt;br /&gt;
 where all the rays collide&lt;br /&gt;
 rays - a 6xN matrix where the first 3&lt;br /&gt;
 rows are the ray position and last 3 are the ray direction&lt;br /&gt;
 collision - N dim vector that is 1 for colliding rays and 0&lt;br /&gt;
 for non-colliding rays colinfo is a 6xN vector that describes &lt;br /&gt;
 where the ray hit and the normal to the surface of the hit point&lt;br /&gt;
 where the first 3 columns are position and last 3 are normals&lt;br /&gt;
 if bodyid is specified, only checks collisions with that body&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orEnvSetOptions(&amp;#039;publishanytime 1&amp;#039;)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Current options:&lt;br /&gt;
 - simulation [start/stop] [time_step] - toggles the internal simulation loop, ie all the calls to SimulationStep. &lt;br /&gt;
 If time_step is specified, will set the simulation time step for all objects.&lt;br /&gt;
 Note that this is not tied to real time at all, how fast the  simulation goes in reality depends on complexity&lt;br /&gt;
 of the scene and the physics engine being used.&lt;br /&gt;
 - physics engine_name - switches the physics engine to another one with id &amp;#039;engine_name&amp;#039;&lt;br /&gt;
 - gravity [x y z] - changes to gravity vector&lt;br /&gt;
 - publishanytime [1/0] - switch between publishing the body transformations&lt;br /&gt;
          to the GUI anytime or only between stepsimulation and server  messsages.&lt;br /&gt;
          When publishing anytime, the GUI will reflect the body movements after every&lt;br /&gt;
          move. This is useful when visualizing internal C++ states. When off, the GUI&lt;br /&gt;
          will only reflect the state of robots after all calls to stepsimulation and&lt;br /&gt;
          server send messages have been done. The default is off.&lt;br /&gt;
 - debug [debug level] - toggles debugging messages by RAVELOG.&lt;br /&gt;
                        0  - only RAVEPRINT statements show&lt;br /&gt;
                        1+ - RAVELOG statements with various debug levels show&lt;br /&gt;
 - quit - closes the openrave instance&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[tripoints, triindices] = orEnvTriangulate(inclusive, ids)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Returns the triangulation of various objects in the scenes controlled by name and options&lt;br /&gt;
 Arguments:&lt;br /&gt;
   inclusive - if 1, will only triangulate the bodies pointed to by ids&lt;br /&gt;
               if 0, will triangulate all objects except the bodies pointed to by ids&lt;br /&gt;
               default value is 0.&lt;br /&gt;
   ids (optional) - the ids to include or exclude in the triangulation&lt;br /&gt;
 To triangulate everything, just do orEnvTriangulate(0,[]), or orEnvTriangulate()&lt;br /&gt;
&lt;br /&gt;
 Output:&lt;br /&gt;
   tripoints - 3xN matrix of 3D points&lt;br /&gt;
   tripoints - 3xK matrix of indices into tripoints for every triangle.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;success = orEnvWait(robotid, robot_timeout)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 wait until all previously sent commands to matlab are finished.&lt;br /&gt;
 Since problems are meant to last for a long time orEnvWait waits&lt;br /&gt;
 until the problem&amp;#039;s main function finishes.&lt;br /&gt;
 &lt;br /&gt;
 robotid - optional argument. If a robot id is specified, will wait until&lt;br /&gt;
 the robot finishes with its trajectory.&lt;br /&gt;
 &lt;br /&gt;
 robot_timeout (s) - function will return with success set to 0 if robot&lt;br /&gt;
 did not finish its commands by robot_timeout ms. If not specified, orEnvWait&lt;br /&gt;
 will not return until robot completes.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;success = orPlannerInit(planner, robot, parameters)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Initialize a planner to plan for a robot and give some parameters&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;trajectory = orPlannerPlan(planner)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Start planning. The planner returns a trajectory when successful (otherwise returns an empty matrix)&lt;br /&gt;
 trajectory - (DOF+1)xN matrix where N is the number of points in the trajectory.&lt;br /&gt;
              The first row are the time values of each trajectory point.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;output = orProblemSendCommand(cmd, problemid, dosync)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Sends a command to the problem. The function doesn&amp;#039;t return until&lt;br /&gt;
 ProblemInstance::SendCommand returns.&lt;br /&gt;
 cmd - the string command to send the problem&lt;br /&gt;
 problemid [optional] - returned id of the problem, if not specified, then&lt;br /&gt;
                       command is sent to all problems&lt;br /&gt;
 dosync [optional] - If 1, the SendCommand is called in the main thread, in sync&lt;br /&gt;
                       with the rest of the primitives. If 0, called in a different thread.&lt;br /&gt;
 output - the concatenated output of all the problems that the command is sent to&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orRender(cmd)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Controls rendering properties. Cmd can be&lt;br /&gt;
 start - starts the GUI to update the internal openrave state&lt;br /&gt;
 stop - stops the GUI from updating the internal openrave state (can be used to speed up loading)&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;success = orRobotControllerSend(robotid, controllercmd)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 &lt;br /&gt;
 sends a command to the current controller the robot is connected to.&lt;br /&gt;
 OpenRAVE sends directly to ControllerBase::SendCmd,&lt;br /&gt;
 ControllerBase::SupportsCmd is also used to check for support.&lt;br /&gt;
 &lt;br /&gt;
 success - 1 if command was accepted, 0 if not&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;success = orRobotControllerSet(robotid, controllername, controllerargs)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Sets a new robot controller and destroys the old.&lt;br /&gt;
 controllername - name used to query a controller&lt;br /&gt;
 controllerargs [optional] - the arguments to ControllerBase::Init&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;dof = orRobotGetActiveDOF(robotid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 returns the robot&amp;#039;s active degrees of freedom used for planning (not necessary corresponding to joints).&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;sensors = orRobotGetAttachedSensors(robotid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sensors is a cell array describing the attached sensors of the robot&lt;br /&gt;
 Each cell is a struct with fields:&lt;br /&gt;
   name - name of the attached sensor&lt;br /&gt;
   link - zero-based index of link sensor is attached to&lt;br /&gt;
   Trelative - 3x4 matrix of the relative transform of the camera with respect to the robot&lt;br /&gt;
   Tglobal - 3x4 matrix of the global transform of the sensor of the current robot&lt;br /&gt;
             Tglobal = Tlink * Trelative&lt;br /&gt;
   type - the xml id of the sensor that is attached&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;values = orRobotGetDOFLimits(robotid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Gets the robot&amp;#039;s dof limits in a Nx2 vector where N is the DOF, the first column&lt;br /&gt;
 is the low limit and the second column is the upper limit.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;values = orRobotGetDOFValues(robotid, indices)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Gets the robot&amp;#039;s dof values in a Nx1 vector where N is the DOF&lt;br /&gt;
 robotid - unique id of the robot&lt;br /&gt;
 indices [optional]- The indices of the joints whose values should be returned.&lt;br /&gt;
                     If not specified, the active degreees of freedeom set by&lt;br /&gt;
                     orRobotSetActiveDOFs will be used.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;manipulators = orRobotGetManipulators(robotid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 manipulators is a cell array describes the manipulators of the robot&lt;br /&gt;
 Each cell is a struct with fields&lt;br /&gt;
   baselink - zero-based index of base link manipulator is attached to&lt;br /&gt;
   eelink - zero-based index of link defining the end-effector&lt;br /&gt;
   Tgrasp - 3x4 matrix of the grasp frame relative to the end effector link,&lt;br /&gt;
            Tglobalgrasp = Tendeffector*Tgrasp&lt;br /&gt;
   joints - 1xK zero-based joint indices of the hand attached to the end effector&lt;br /&gt;
   armjoints - 1xN zero-based manipulator joint indices that have an&lt;br /&gt;
               effect on the end effector&lt;br /&gt;
   iksolvername - name of ik solver to use&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;data = orRobotSensorGetData(robotid, sensorindex)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Gets the sensor data. The format returned is dependent on the type&lt;br /&gt;
 of sensor. Look at the different data SensorData implementations in rave.h.&lt;br /&gt;
 Although the data returned is not necessarily one of them.&lt;br /&gt;
 options [optional] - options that specify what type of data to request (0 is default)&lt;br /&gt;
 data.type - contains the id of the data type (see SensorBase::SensorType)&lt;br /&gt;
 For laser data&lt;br /&gt;
  data.laserrange - 3xN array where each column is the direction * distance&lt;br /&gt;
  data.laserpos - 3xN array where each column is the corresponding origin of each range measurement&lt;br /&gt;
  data.laserint - 1xN optional laser intensity array&lt;br /&gt;
 For image data&lt;br /&gt;
  data.KK - 3x3 intrinsic matrix&lt;br /&gt;
  data.T - 3x4 camera matrix (to project a point multiply by KK*inv(T))&lt;br /&gt;
  data.I - the rgb image size(I) = [height width 3]&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;out = orRobotSensorSend(robotid, sensorindex, controllercmd)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sends a command to a sensor attached to the robot &lt;br /&gt;
 OpenRAVE sends directly to SensorBase::SendCmd,&lt;br /&gt;
 SensorBase::SupportsCmd is used to check for command support.&lt;br /&gt;
&lt;br /&gt;
 robotid - unique id of the robot&lt;br /&gt;
 sensorindex - zero-based index of sensor into robot&amp;#039;s attached sensor array&lt;br /&gt;
 out - the output of the command&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orRobotSetActiveDOfs(robotid, indices, affinedofs, rotationaxis)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 robotid - unique id of the robot&lt;br /&gt;
 indices - zero based indices of the robot joints to activate&lt;br /&gt;
 affinedofs [optional] - is a mask of affine transformation for planning&lt;br /&gt;
       1 - X, 2 - Y, 4 - Z, 8 - RotationAxis (rotationaxis has to be avlid, 16 - full 3D rotation&lt;br /&gt;
 rotationaxis [optional] - the rotation axis (if the RotationAxis bit is set in affinedofs)&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orRobotSetDofValues(robotid, values, indices)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Sets the DOF values of the robot&lt;br /&gt;
 robotid - unique id of the robot&lt;br /&gt;
 values - the joint values of the robot&lt;br /&gt;
 indices [optional] - the indices of the dofs to set of the robot. &lt;br /&gt;
                      If indices is not specified the active degrees of freedom&lt;br /&gt;
                      set by previous calls to orRobotSetActiveDOFs will be used.&lt;br /&gt;
                      Note that specifying indices will not change the active dofs of the robot.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orRobotStartActiveTrajectory(robotid, jointvalues, timestamps, transformations)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Starts/Queues a robot trajectory of the robot where the size of&lt;br /&gt;
 each trajectory point is the current active degrees of freedom&lt;br /&gt;
 of the robot (others are held constants)&lt;br /&gt;
 D is the number of active degrees of freedom.&lt;br /&gt;
 N is the number of points of the trajectory&lt;br /&gt;
 robotid - unique id of the robot&lt;br /&gt;
 jointvalues - DxN matrix of the joint values of each point in the trajrectory.&lt;br /&gt;
 timestamps [optional] - the time stamps in seconds of each trajectory point.&lt;br /&gt;
 transformations [optional] - 12xN or 7xN matrix. The base link transformations of&lt;br /&gt;
                              each trajectory point.&lt;br /&gt;
                              If the column size is 12, then it is a 3x4 matrix&lt;br /&gt;
                              in column first order&lt;br /&gt;
                              If the column size is 7, then it is a quaterion and a translation.&lt;br /&gt;
                              If active degrees of freedom contains a affine transformation component&lt;br /&gt;
                              it is overwritten with the transformations matrices&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=OctaveMATLAB&amp;diff=206</id>
		<title>OctaveMATLAB</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=OctaveMATLAB&amp;diff=206"/>
				<updated>2012-02-06T11:42:53Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Unfortunately, MATLAB mex file binaries cannot be re-distributed with OpenRAVE since there are many versions of the tool and the compilers are non-free. Therefore, starting with OpenRAVE 0.4, the mex source files are distributed in the &amp;#039;&amp;#039;&amp;#039;share/openrave-*/matlab&amp;#039;&amp;#039;&amp;#039; directory. In order to use MATLAB, will need to compile each of the &amp;#039;&amp;#039;&amp;#039;cpp&amp;#039;&amp;#039;&amp;#039; files into &amp;#039;&amp;#039;&amp;#039;mex&amp;#039;&amp;#039;&amp;#039; files and add that directory to your MATLAB path. The files are:&lt;br /&gt;
&lt;br /&gt;
- orcreate.cpp&lt;br /&gt;
- orread.cpp&lt;br /&gt;
- orwrite.cpp&lt;br /&gt;
&lt;br /&gt;
Windows users have a special &amp;#039;&amp;#039;&amp;#039;runmex.bat&amp;#039;&amp;#039;&amp;#039; file to help them with this.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Scripting ==&lt;br /&gt;
&lt;br /&gt;
One of the biggest features that separates OpenRAVE from other simulation/planning environments is that it supports scripting over the network. This makes it possible to free OpenRAVE of complex GUIs. At initialization, OpenRAVE starts listening on specific ports for the commands. This allows any computer to open a socket connection with OpenRAVE, which can be running on a different computer, and communicate with it. The official release supports Matlab and Octave as the scripting engines. Note that all script commands are sent as text across the network; therefore, it is possible to do everything in Python or Perl.&lt;br /&gt;
&lt;br /&gt;
The rest of this document is written using the Matlab/Octave functions found in the &amp;#039;&amp;#039;&amp;#039;matlab/&amp;#039;&amp;#039;&amp;#039; directory. For any function, type &amp;#039;help functionname&amp;#039; to get a help message describing its parameters and usage. Some formatting rules:&lt;br /&gt;
&lt;br /&gt;
* All OpenRAVE functions start with &amp;#039;&amp;#039;&amp;#039;or&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* All KinBody specific functions start with &amp;#039;&amp;#039;&amp;#039;orBody&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* All Robot specific functions start with &amp;#039;&amp;#039;&amp;#039;orRobot&amp;#039;&amp;#039;&amp;#039;. Every robot can use all &amp;#039;&amp;#039;&amp;#039;orBody&amp;#039;&amp;#039;&amp;#039; functions.&lt;br /&gt;
* All general environment functions start with &amp;#039;&amp;#039;&amp;#039;orEnv&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* All problem instance specific functions start with &amp;#039;&amp;#039;&amp;#039;orProblem&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Check out the RaveServer constructor in &amp;#039;&amp;#039;&amp;#039;src/server.cpp&amp;#039;&amp;#039;&amp;#039; for a complete list of commands supported.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
All examples can be found in &amp;#039;&amp;#039;&amp;#039;$INSTALL/share/openrave/octave&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
To run &amp;#039;&amp;#039;&amp;#039;MATLAB/Octave&amp;#039;&amp;#039;&amp;#039; examples, first start openrave and then in a separate terminal execute the &amp;#039;&amp;#039;&amp;#039;*.m&amp;#039;&amp;#039;&amp;#039; files.&lt;br /&gt;
&lt;br /&gt;
== Communicating with OpenRAVE ==&lt;br /&gt;
&lt;br /&gt;
Usually communicating with an OpenRAVE instance running on the same computer as the scripting environment is simple. Just call the methods in the &amp;lt;b&amp;gt;matlab&amp;lt;/b&amp;gt; folder directly without having to worry about setting ip address. If OpenRAVE is running on a different computer, the IP address will have to be set manually through a global variable &amp;#039;&amp;#039;&amp;#039;orConnectionParams&amp;#039;&amp;#039;&amp;#039;. To set the address of the remote OpenRAVE in Octave/Matlab instance type&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;global orConnectionParams&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;orConnectionParams.ip = &amp;#039;myopenrave_ip&amp;#039;; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;orConnectionParams.port = 4765; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The scripting environment can communicate with multiple OpenRAVE instances at once, just set orConnectionParams to the appropriate instance. Also, OpenRAVE can handle multiple scripting environments talking to the same instance simultaneously.&lt;br /&gt;
&lt;br /&gt;
[[image:Openrave_network.png|600px]]&lt;br /&gt;
&lt;br /&gt;
The default port openrave starts is 4765, use the &amp;#039;&amp;#039;&amp;#039;-server&amp;#039;&amp;#039;&amp;#039; option to change the port. For example,&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;./openrave -server 3000&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
starts openrave to listen for connections on port 3000.&lt;br /&gt;
&lt;br /&gt;
== Tutorial ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;NOTE:&amp;#039;&amp;#039;&amp;#039; Remember that warnings and responses can appear both in the Matlab/Octave window and the console window where openrave is started from.&lt;br /&gt;
&lt;br /&gt;
=== Basic commands ===&lt;br /&gt;
&lt;br /&gt;
First start &amp;#039;&amp;#039;&amp;#039;openrave&amp;#039;&amp;#039;&amp;#039; and leave it in the background. Then start an Octave or Matlab instance and make sure the paths to the Octave/Matlab scripts are added to the path.&lt;br /&gt;
&lt;br /&gt;
To load a simple scene with the Barrett WAM and Hand:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orEnvLoadScene(&amp;#039;data/lab1.env.xml&amp;#039;, 1)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The 1 is a flag to reset the whole OpenRAVE scene before loading &amp;#039;&amp;#039;&amp;#039;lab1.env.xml&amp;#039;&amp;#039;&amp;#039;. If it wasn&amp;#039;t there, lab1.env.xml would get appended to the current OpenRAVE scene. Now let&amp;#039;s query and display all the objects in the scene&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
bodies = orEnvGetBodies()&lt;br /&gt;
celldisp(bodies)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Every object has a unique id. Use this id for any function that performs an operation on the object. We can move the first joint of the robot 0.5 radians by&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetDOFValues(1,0.5,0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or the first 10 joints:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetDOFValues(1,0.5*ones(1,10),0:9)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here &amp;#039;1&amp;#039; is the unique id of the robot.&lt;br /&gt;
&lt;br /&gt;
If the third argument is not specified, then the default degrees of fredom (joints) used will be the &amp;#039;&amp;#039;&amp;#039;active DOFs&amp;#039;&amp;#039;&amp;#039;. The default &amp;#039;&amp;#039;&amp;#039;active DOFs&amp;#039;&amp;#039;&amp;#039; are all the joints of the robot. To make only the first 7 joints active type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetActiveDOFs(1,0:6,0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get the number of active dofs type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotGetActiveDOF(1)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The concept of &amp;#039;&amp;#039;&amp;#039;active DOFs&amp;#039;&amp;#039;&amp;#039; is very powerful. All planners search only in the &amp;#039;&amp;#039;&amp;#039;active DOFs&amp;#039;&amp;#039;&amp;#039; when planning. In this example, the robot is a combination of an arm and a hand. Most of the time, we would only want to plan and move the arm while ignoring the hand. To do this, set the &amp;#039;&amp;#039;&amp;#039;active DOFs&amp;#039;&amp;#039;&amp;#039; to the joint indices of the arm only before calling the planner. &amp;#039;&amp;#039;&amp;#039;Active DOFs&amp;#039;&amp;#039;&amp;#039; are not limited to just joints, they can also be the translation or rotation components of the robot itself. For example, to plan for the robot arm while it is moving on the &amp;#039;&amp;#039;&amp;#039;xy&amp;#039;&amp;#039;&amp;#039; plane type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetActiveDOFs(1,0:6,3)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To have it rotate around the &amp;#039;&amp;#039;&amp;#039;z&amp;#039;&amp;#039;&amp;#039;-axis at the same time, type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetActiveDOFs(1,0:6,11,[0 0 1])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now,&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotGetActiveDOF(1)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
returns 10: 7 for the arm, 2 for &amp;#039;&amp;#039;&amp;#039;xy&amp;#039;&amp;#039;&amp;#039; planar translation, and 1 for the rotation around &amp;#039;&amp;#039;&amp;#039;z&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
To query the transformations of all the links of the robot type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
L = orBodyGetLinks(1)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will return a 12xN matrix for N links, where each column is a 3x4 transformation matrix (left 3x3 is a rotation, and last column is the translation component). For example, to extract the tranformation matrix of the second link, type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
T = reshape(L(:,2),[3 4])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To set the transformation of the base robot do&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orBodySetTransform(1,[0 0 1],[0.707 0.707 0 0])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will set the translation to (0,0,1). The third parameter is a rotation around the X axis by 90 degrees in quaternion form. It is also possible to directly input a 3x4 transformation matrix T by:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orBodySetTransform(1,reshape(T,[1 12]))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To add a cup on top of the table named &amp;#039;table&amp;#039; type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
destTransform = orBodyGetTransform(orEnvGetBody(&amp;#039;table&amp;#039;));&lt;br /&gt;
destPosition  = destTransform(10:12);&lt;br /&gt;
cupPosition   = destPosition + [0;0;0.1];&lt;br /&gt;
cupid         = orEnvCreateKinBody(&amp;#039;MyCup&amp;#039;,&amp;#039;data/mug1.kinbody.xml&amp;#039;);&lt;br /&gt;
orBodySetTransform(cupid, cupPosition,[0.707 0.707 0 0]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Executing planners - A Grasping Example ===&lt;br /&gt;
&lt;br /&gt;
[[image:Openrave_dishwasher.jpg|right|350px]] &lt;br /&gt;
&lt;br /&gt;
In this part, we&amp;#039;ll be loading the manipulation plugin and using its various features to plan in the lab1.env.xml workspace with the BarrettWAM. The manipulation plugin exposes a Manipulation ProblemInstance and the Inverse Kinematics functions for the Barrett WAM arm.&lt;br /&gt;
&lt;br /&gt;
First load&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orEnvLoadScene(&amp;#039;data/lab1.env.xml&amp;#039;, 1)&lt;br /&gt;
robotid = orEnvGetBody(&amp;#039;BarrettWAM&amp;#039;)&lt;br /&gt;
manipid = orEnvCreateProblem(&amp;#039;BaseManipulation&amp;#039;, &amp;#039;BarrettWAM&amp;#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each ProblemInstance supports a &amp;#039;SendCommand&amp;#039; function that is used to receive commands from the script server and send back responses. Matlab can communicate with this function by the &amp;#039;orProblemSendCommand&amp;#039; function.&lt;br /&gt;
&lt;br /&gt;
To move the hand safely to a particular preshape do:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
manips = orRobotGetManipulators(robotid);&lt;br /&gt;
orBodySetJointValues(robotid,[0 0 0 pi/2],manips{1}.handjoints);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Alternative: &amp;#039;&amp;#039;&amp;#039; Can move the robot safely to a preshape using planners by:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetActiveDOFs(robotid,manips{1}.armjoints);&lt;br /&gt;
handjoints = sprintf(&amp;#039;%d &amp;#039;,manips{1}.handjoints);&lt;br /&gt;
orProblemSendCommand([&amp;#039;MoveUnsyncJoints handjoints 4 0 0 0 1.57 &amp;#039; handjoints],manipid);&lt;br /&gt;
orBodySetJointValues(robotid,[0 0 0 pi/2],manips{1}.handjoints);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To plan for a configuration space goal for the arm joints of the robot, type:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orProblemSendCommand(&amp;#039;MoveManipulator armvals -0.005617 1.07 0.233 2.096 -4.194 -0.235 1.302520&amp;#039;,manipid)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Can squeeze the fingers of the hand by:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orProblemSendCommand(&amp;#039;CloseFingers&amp;#039;,manipid)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Grab the body by:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orProblemSendCommand(&amp;#039;GrabBody name mug6&amp;#039;,manipid)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Move to the table:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
tableTrans = [  -0.035588  -0.995502  -0.087805  -0.466866&lt;br /&gt;
                -0.994116   0.026269   0.105090   0.869644&lt;br /&gt;
                -0.102311   0.091028  -0.990579   1.000000 ];&lt;br /&gt;
orProblemSendCommand([&amp;#039;MoveToHandPosition matrix &amp;#039; sprintf(&amp;#039;%f &amp;#039;,tableTrans(1:3,1:4))],manipid)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Move the hand down a little:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orProblemSendCommand([&amp;#039;MoveHandStraight direction 0 0 -1 maxdist 0.3 matrix &amp;#039; sprintf(&amp;#039;%f &amp;#039;,tableTrans(1:3,1:4))],manipid)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally, to release the fingers use the ReleaseFingers command. ReleaseFingers is a little more general than CloseFingers because the fingers to move and the direction of movement can be specified.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orRobotSetActiveDOFs(1,[7 8 9]); % want to move 3 joints&lt;br /&gt;
orProblemSendCommand(&amp;#039;releasefingers target mug6&amp;#039;,manipid);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Can now plan to original position:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
orProblemSendCommand(&amp;#039;MoveManipulator armvals 0 0 0 0 0 0 0&amp;#039;,manipid);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Can also test if an IK solution exists by giving the transformation matrix T of the wrist:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
s = orProblemSendCommand([&amp;#039;IKtest trans &amp;#039;, num2str(T(:,4)&amp;#039;), &amp;#039; rot &amp;#039;, num2str(T(1:9))],manipid)&lt;br /&gt;
if( ~isempty(s) )&lt;br /&gt;
    orRobotSetDOFValues(1, sscanf(s, &amp;#039;%f&amp;#039;),0:6)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Logging ===&lt;br /&gt;
&lt;br /&gt;
A scene can be easily saved by using the &amp;#039;&amp;#039;&amp;#039;logging&amp;#039;&amp;#039;&amp;#039; plugin. Once a scene is loaded and all the objects are in place, do the following commands:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
logid = orEnvCreateProblem(&amp;#039;logging&amp;#039;)&lt;br /&gt;
orProblemSendCommand(&amp;#039;savescene filename myscene.env.xml&amp;#039;,logid)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Matlab/Octave Partial Reference ==&lt;br /&gt;
&lt;br /&gt;
This is &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; a complete list and use this only to introduce yourself to the functions, the real reference and usages can be found in the help files of each function by typing &amp;#039;&amp;#039;&amp;#039;help function_name&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orBodyDestroy(bodyid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Destroys a body of id bodyid. bodyid can also be a robot.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;success = orBodyEnable(bodyid, enable)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Enables or disables the body. If a body is disabled, &lt;br /&gt;
 collision detection and physics will will be turned off for it.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;aabb = orBodyGetAABB(bodyid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Returns an axis-aligned boudning box of the body in world coordinates&lt;br /&gt;
 aabb is a 3x2  vector where the first column is the position of the&lt;br /&gt;
 box and the second is the extents.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;aabbs = orBodyGetAABBs(bodyid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 returns the axis-aligned boudning boxes of all the links of the body in world coordinates&lt;br /&gt;
 aabbs is a 6xn vector where each column describes the box for all n links.&lt;br /&gt;
 The first 3 values in each column describe the position of the aabb, and the next&lt;br /&gt;
 3 values describe the extents (half width/length/height) on each of the axes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;dof = orBodyGetDOF(robotid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Returns the number of active joints of the body.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;values = orBodyGetDOFValues(robotid, indices)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Gets the body&amp;#039;s dof values in a Nx1 vector where N is the DOF&lt;br /&gt;
 bodyid - unique id of the robot&lt;br /&gt;
 indices [optional]- The indices of the joints whose values should be returned.&lt;br /&gt;
                     If not specified, all joints are returned&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;values = orBodyGetLinks(bodyid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Returns the transformations of all the body&amp;#039;s links in a 12 x L matrix. Where L&lt;br /&gt;
 is the number of links and each column is a 3x4 transformation&lt;br /&gt;
 (use T=reshape(., [3 4]) to recover).&lt;br /&gt;
 T * [X;1] = Xnew&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orBodySetJointValues(bodyid, values, indices)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Set the raw joint values of a body. If bodyid is a robot, sets the robot&amp;#039;s&lt;br /&gt;
 joints ignoring its current active degrees of freedom. If a controller on&lt;br /&gt;
 the robot is running, this function might not have any effect. Instead&lt;br /&gt;
 use orRobotSetDOFValues&lt;br /&gt;
 indices [optional] - array specifying the indices to control&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orBodySetTransform&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 orBodySetTransform(bodyid, translation, quaternion)&lt;br /&gt;
 orBodySetTransform(bodyid, [quaternion translation])&lt;br /&gt;
 orBodySetTransform(bodyid, transform matrix) (12x1, 1x12, or 3x4)&lt;br /&gt;
 Set the affine transformation of the body. The transformation actually&lt;br /&gt;
 describes the first link of the body. The rest of the links are derived by&lt;br /&gt;
 the joint angles. A quaternion is related to axis and angle via: [cos(theta/2);sin(theta/2)*axis]&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[collision, colbody] = orEnvCheckCollision(bodyid,excludeid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Check collision of the robot with the environment. collision is 1 if the robot&lt;br /&gt;
 is colliding, colbodyid is the id of the object that body collided with&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orEnvClose(figureids)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
closes the figures and plots&lt;br /&gt;
figureids - array of ids returned from orEnvPlot or other plotting functions&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;bodyid = orEnvCreateKinBody(name, xmlfile)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;plannerid = orEnvCreatePlanner(plannertype)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orEnvCreateProblem&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 problemid = orEnvCreateProblem(problemname, args)&lt;br /&gt;
 problemid = orEnvCreateProblem([problemname, args])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;problemid = orEnvCreateProblem(problemname, args, destroyduplicates)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Creates an instance of a problem and returns its id for future communicate with it&lt;br /&gt;
 problemname - the problem name&lt;br /&gt;
 args - a string of arguments to send to the problem&amp;#039;s main function&lt;br /&gt;
 destroyduplicates [optional] - if 1, will destroy any previous problems with the same problem name.&lt;br /&gt;
                               If 0, will not destroy anything.&lt;br /&gt;
                               The default value is 1. &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;robotid = orEnvCreateRobot(robotname, xmlfile, type)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Creates a robot of the given type. If type is not specified, creates a generic robot&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orEnvDestroyProblem(problemid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Destroys problem instance whose id is problemid.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;bodies = orEnvGetBodies()&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 bodies is a cell array of all body objects in the scene&lt;br /&gt;
 every cell contains a struct with the following parameters&lt;br /&gt;
 id - bodyid&lt;br /&gt;
 filename - filename used to initialize the body with&lt;br /&gt;
 name - human robot name&lt;br /&gt;
 type - xml type of body&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;id = orEnvGetBody(bodyname)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 returns the id of the body that corresponds to bodyname&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;robots = orEnvGetRobots()&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 robots is a cell array of robots&lt;br /&gt;
 every cell contains a struct with the following parameters&lt;br /&gt;
 id - robotid&lt;br /&gt;
 filename - filename used to initialize the robot with&lt;br /&gt;
 name - human robot name&lt;br /&gt;
 type - type of robot&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;success = orEnvLoadPlugin(filename)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Loads a plugin.&lt;br /&gt;
 filename - the relative path of the plugin to load. (*.so for linux, *.dll for windows)&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orEnvLoadScene(filename, [ClearScene])&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Loads a new environment.&lt;br /&gt;
 filename - The filename of the scene to load. If a relative file&lt;br /&gt;
            is specified, note that it is relative to the current direction&lt;br /&gt;
            of the OpenRAVE executable.&lt;br /&gt;
 ClearScene - If 1, then clears the scene before loading. Else leaves the &lt;br /&gt;
              scene alone and loads in addition to it.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;figureid = orEnvPlot(points,...)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 plots points or lines in the openrave viewer&lt;br /&gt;
 points - Nx3 vector of xyz positions&lt;br /&gt;
 optional arguments include &amp;#039;size&amp;#039;, &amp;#039;color&amp;#039;, and &amp;#039;line&amp;#039;&lt;br /&gt;
   color - Nx3 vector of RGB values between 0 and 1&lt;br /&gt;
   size - Nx1 vector of the sizes in pixels of each point/line&lt;br /&gt;
   line (or linestrip) - if specified, then openrave renders a line strip&lt;br /&gt;
   linelist - if specified, openrave renders a line for every two points&lt;br /&gt;
   trilist - if specified, openrave renders a triangle for every three&lt;br /&gt;
             vertices should be specified in counter-clockwise order&lt;br /&gt;
   sphere - if specified, openrave renders each point as a sphere&lt;br /&gt;
   transparency - [0,1], set transparency of plotted objects (0 is opaque)&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[collision, colinfo] = orEnvRayCollision(rays)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 performs ray collision checks and returns the position and normals&lt;br /&gt;
 where all the rays collide&lt;br /&gt;
 rays - a 6xN matrix where the first 3&lt;br /&gt;
 rows are the ray position and last 3 are the ray direction&lt;br /&gt;
 collision - N dim vector that is 1 for colliding rays and 0&lt;br /&gt;
 for non-colliding rays colinfo is a 6xN vector that describes &lt;br /&gt;
 where the ray hit and the normal to the surface of the hit point&lt;br /&gt;
 where the first 3 columns are position and last 3 are normals&lt;br /&gt;
 if bodyid is specified, only checks collisions with that body&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orEnvSetOptions(&amp;#039;publishanytime 1&amp;#039;)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Current options:&lt;br /&gt;
 - simulation [start/stop] [time_step] - toggles the internal simulation loop, ie all the calls to SimulationStep. &lt;br /&gt;
 If time_step is specified, will set the simulation time step for all objects.&lt;br /&gt;
 Note that this is not tied to real time at all, how fast the  simulation goes in reality depends on complexity&lt;br /&gt;
 of the scene and the physics engine being used.&lt;br /&gt;
 - physics engine_name - switches the physics engine to another one with id &amp;#039;engine_name&amp;#039;&lt;br /&gt;
 - gravity [x y z] - changes to gravity vector&lt;br /&gt;
 - publishanytime [1/0] - switch between publishing the body transformations&lt;br /&gt;
          to the GUI anytime or only between stepsimulation and server  messsages.&lt;br /&gt;
          When publishing anytime, the GUI will reflect the body movements after every&lt;br /&gt;
          move. This is useful when visualizing internal C++ states. When off, the GUI&lt;br /&gt;
          will only reflect the state of robots after all calls to stepsimulation and&lt;br /&gt;
          server send messages have been done. The default is off.&lt;br /&gt;
 - debug [debug level] - toggles debugging messages by RAVELOG.&lt;br /&gt;
                        0  - only RAVEPRINT statements show&lt;br /&gt;
                        1+ - RAVELOG statements with various debug levels show&lt;br /&gt;
 - quit - closes the openrave instance&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[tripoints, triindices] = orEnvTriangulate(inclusive, ids)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Returns the triangulation of various objects in the scenes controlled by name and options&lt;br /&gt;
 Arguments:&lt;br /&gt;
   inclusive - if 1, will only triangulate the bodies pointed to by ids&lt;br /&gt;
               if 0, will triangulate all objects except the bodies pointed to by ids&lt;br /&gt;
               default value is 0.&lt;br /&gt;
   ids (optional) - the ids to include or exclude in the triangulation&lt;br /&gt;
 To triangulate everything, just do orEnvTriangulate(0,[]), or orEnvTriangulate()&lt;br /&gt;
&lt;br /&gt;
 Output:&lt;br /&gt;
   tripoints - 3xN matrix of 3D points&lt;br /&gt;
   tripoints - 3xK matrix of indices into tripoints for every triangle.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;success = orEnvWait(robotid, robot_timeout)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 wait until all previously sent commands to matlab are finished.&lt;br /&gt;
 Since problems are meant to last for a long time orEnvWait waits&lt;br /&gt;
 until the problem&amp;#039;s main function finishes.&lt;br /&gt;
 &lt;br /&gt;
 robotid - optional argument. If a robot id is specified, will wait until&lt;br /&gt;
 the robot finishes with its trajectory.&lt;br /&gt;
 &lt;br /&gt;
 robot_timeout (s) - function will return with success set to 0 if robot&lt;br /&gt;
 did not finish its commands by robot_timeout ms. If not specified, orEnvWait&lt;br /&gt;
 will not return until robot completes.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;success = orPlannerInit(planner, robot, parameters)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Initialize a planner to plan for a robot and give some parameters&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;trajectory = orPlannerPlan(planner)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Start planning. The planner returns a trajectory when successful (otherwise returns an empty matrix)&lt;br /&gt;
 trajectory - (DOF+1)xN matrix where N is the number of points in the trajectory.&lt;br /&gt;
              The first row are the time values of each trajectory point.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;output = orProblemSendCommand(cmd, problemid, dosync)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Sends a command to the problem. The function doesn&amp;#039;t return until&lt;br /&gt;
 ProblemInstance::SendCommand returns.&lt;br /&gt;
 cmd - the string command to send the problem&lt;br /&gt;
 problemid [optional] - returned id of the problem, if not specified, then&lt;br /&gt;
                       command is sent to all problems&lt;br /&gt;
 dosync [optional] - If 1, the SendCommand is called in the main thread, in sync&lt;br /&gt;
                       with the rest of the primitives. If 0, called in a different thread.&lt;br /&gt;
 output - the concatenated output of all the problems that the command is sent to&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orRender(cmd)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Controls rendering properties. Cmd can be&lt;br /&gt;
 start - starts the GUI to update the internal openrave state&lt;br /&gt;
 stop - stops the GUI from updating the internal openrave state (can be used to speed up loading)&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;success = orRobotControllerSend(robotid, controllercmd)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 &lt;br /&gt;
 sends a command to the current controller the robot is connected to.&lt;br /&gt;
 OpenRAVE sends directly to ControllerBase::SendCmd,&lt;br /&gt;
 ControllerBase::SupportsCmd is also used to check for support.&lt;br /&gt;
 &lt;br /&gt;
 success - 1 if command was accepted, 0 if not&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;success = orRobotControllerSet(robotid, controllername, controllerargs)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Sets a new robot controller and destroys the old.&lt;br /&gt;
 controllername - name used to query a controller&lt;br /&gt;
 controllerargs [optional] - the arguments to ControllerBase::Init&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;dof = orRobotGetActiveDOF(robotid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 returns the robot&amp;#039;s active degrees of freedom used for planning (not necessary corresponding to joints).&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;sensors = orRobotGetAttachedSensors(robotid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sensors is a cell array describing the attached sensors of the robot&lt;br /&gt;
 Each cell is a struct with fields:&lt;br /&gt;
   name - name of the attached sensor&lt;br /&gt;
   link - zero-based index of link sensor is attached to&lt;br /&gt;
   Trelative - 3x4 matrix of the relative transform of the camera with respect to the robot&lt;br /&gt;
   Tglobal - 3x4 matrix of the global transform of the sensor of the current robot&lt;br /&gt;
             Tglobal = Tlink * Trelative&lt;br /&gt;
   type - the xml id of the sensor that is attached&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;values = orRobotGetDOFLimits(robotid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Gets the robot&amp;#039;s dof limits in a Nx2 vector where N is the DOF, the first column&lt;br /&gt;
 is the low limit and the second column is the upper limit.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;values = orRobotGetDOFValues(robotid, indices)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Gets the robot&amp;#039;s dof values in a Nx1 vector where N is the DOF&lt;br /&gt;
 robotid - unique id of the robot&lt;br /&gt;
 indices [optional]- The indices of the joints whose values should be returned.&lt;br /&gt;
                     If not specified, the active degreees of freedeom set by&lt;br /&gt;
                     orRobotSetActiveDOFs will be used.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;manipulators = orRobotGetManipulators(robotid)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 manipulators is a cell array describes the manipulators of the robot&lt;br /&gt;
 Each cell is a struct with fields&lt;br /&gt;
   baselink - zero-based index of base link manipulator is attached to&lt;br /&gt;
   eelink - zero-based index of link defining the end-effector&lt;br /&gt;
   Tgrasp - 3x4 matrix of the grasp frame relative to the end effector link,&lt;br /&gt;
            Tglobalgrasp = Tendeffector*Tgrasp&lt;br /&gt;
   joints - 1xK zero-based joint indices of the hand attached to the end effector&lt;br /&gt;
   armjoints - 1xN zero-based manipulator joint indices that have an&lt;br /&gt;
               effect on the end effector&lt;br /&gt;
   iksolvername - name of ik solver to use&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;data = orRobotSensorGetData(robotid, sensorindex)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Gets the sensor data. The format returned is dependent on the type&lt;br /&gt;
 of sensor. Look at the different data SensorData implementations in rave.h.&lt;br /&gt;
 Although the data returned is not necessarily one of them.&lt;br /&gt;
 options [optional] - options that specify what type of data to request (0 is default)&lt;br /&gt;
 data.type - contains the id of the data type (see SensorBase::SensorType)&lt;br /&gt;
 For laser data&lt;br /&gt;
  data.laserrange - 3xN array where each column is the direction * distance&lt;br /&gt;
  data.laserpos - 3xN array where each column is the corresponding origin of each range measurement&lt;br /&gt;
  data.laserint - 1xN optional laser intensity array&lt;br /&gt;
 For image data&lt;br /&gt;
  data.KK - 3x3 intrinsic matrix&lt;br /&gt;
  data.T - 3x4 camera matrix (to project a point multiply by KK*inv(T))&lt;br /&gt;
  data.I - the rgb image size(I) = [height width 3]&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;out = orRobotSensorSend(robotid, sensorindex, controllercmd)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sends a command to a sensor attached to the robot &lt;br /&gt;
 OpenRAVE sends directly to SensorBase::SendCmd,&lt;br /&gt;
 SensorBase::SupportsCmd is used to check for command support.&lt;br /&gt;
&lt;br /&gt;
 robotid - unique id of the robot&lt;br /&gt;
 sensorindex - zero-based index of sensor into robot&amp;#039;s attached sensor array&lt;br /&gt;
 out - the output of the command&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orRobotSetActiveDOfs(robotid, indices, affinedofs, rotationaxis)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 robotid - unique id of the robot&lt;br /&gt;
 indices - zero based indices of the robot joints to activate&lt;br /&gt;
 affinedofs [optional] - is a mask of affine transformation for planning&lt;br /&gt;
       1 - X, 2 - Y, 4 - Z, 8 - RotationAxis (rotationaxis has to be avlid, 16 - full 3D rotation&lt;br /&gt;
 rotationaxis [optional] - the rotation axis (if the RotationAxis bit is set in affinedofs)&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orRobotSetDofValues(robotid, values, indices)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Sets the DOF values of the robot&lt;br /&gt;
 robotid - unique id of the robot&lt;br /&gt;
 values - the joint values of the robot&lt;br /&gt;
 indices [optional] - the indices of the dofs to set of the robot. &lt;br /&gt;
                      If indices is not specified the active degrees of freedom&lt;br /&gt;
                      set by previous calls to orRobotSetActiveDOFs will be used.&lt;br /&gt;
                      Note that specifying indices will not change the active dofs of the robot.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orRobotStartActiveTrajectory(robotid, jointvalues, timestamps, transformations)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Starts/Queues a robot trajectory of the robot where the size of&lt;br /&gt;
 each trajectory point is the current active degrees of freedom&lt;br /&gt;
 of the robot (others are held constants)&lt;br /&gt;
 D is the number of active degrees of freedom.&lt;br /&gt;
 N is the number of points of the trajectory&lt;br /&gt;
 robotid - unique id of the robot&lt;br /&gt;
 jointvalues - DxN matrix of the joint values of each point in the trajrectory.&lt;br /&gt;
 timestamps [optional] - the time stamps in seconds of each trajectory point.&lt;br /&gt;
 transformations [optional] - 12xN or 7xN matrix. The base link transformations of&lt;br /&gt;
                              each trajectory point.&lt;br /&gt;
                              If the column size is 12, then it is a 3x4 matrix&lt;br /&gt;
                              in column first order&lt;br /&gt;
                              If the column size is 7, then it is a quaterion and a translation.&lt;br /&gt;
                              If active degrees of freedom contains a affine transformation component&lt;br /&gt;
                              it is overwritten with the transformations matrices&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Format:COLLADA&amp;diff=205</id>
		<title>Format:COLLADA</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Format:COLLADA&amp;diff=205"/>
				<updated>2011-12-26T02:43:12Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
= COLLADA Robot Specification Version 0.2 =&lt;br /&gt;
&lt;br /&gt;
The [https://collada.org/mediawiki/index.php/COLLADA_-_Digital_Asset_and_FX_Exchange_Schema COLLADA] format is used to specify all robot and scene related information. By default, COLLADA 1.5 handles geometry, visual effects, physical properties, and kinematics. This document describes how to extend the format to handle robot-specific information. An official example of a COLLADA extension can be found [http://www.collada.org/mediawiki/index.php/Morph_weights_EXT_extension here].&lt;br /&gt;
&lt;br /&gt;
COLLADA allows extensions of any of its tags using the &amp;#039;&amp;#039;&amp;#039;&amp;lt;extra&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag. Each &amp;#039;&amp;#039;&amp;#039;&amp;lt;extra&amp;gt;&amp;#039;&amp;#039;&amp;#039; defines what type of information to provide (ie manipulator, sensor, collision), and a format for that information, also called &amp;#039;&amp;#039;&amp;#039;technique&amp;#039;&amp;#039;&amp;#039;. All custom data defined here uses the &amp;#039;&amp;#039;&amp;#039;OpenRAVE&amp;#039;&amp;#039;&amp;#039; technique. &lt;br /&gt;
&lt;br /&gt;
There are one-to-one correspondences between the OpenRAVE interface types and COLLADA tags:&lt;br /&gt;
&lt;br /&gt;
* Robot &amp;lt;-&amp;gt; articulated_system&lt;br /&gt;
* KinBody &amp;lt;-&amp;gt; kinematics_model&lt;br /&gt;
* Sensor &amp;lt;-&amp;gt; sensor (new)&lt;br /&gt;
&lt;br /&gt;
= interface_type =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Specifies the type of kinematics body/robot type to instantiate inside the code.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
All of the kinematics body methods can be overridden with new implementations. Because this requires loading user code, a user-provided instantiation has to be used. The interface type specifies what this type is and where to load it from.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;articulated_system&amp;gt;, &amp;lt;kinematics_model&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Child elements || See the following subsection.&lt;br /&gt;
|-&lt;br /&gt;
| Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;interface&amp;gt; || Contains the string id of the interface || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;plugin&amp;gt; || Optional. Contains the string of the location of the shared object object to load. Because plugin prefixes and suffixes depends on the OS, a prefix and suffix independent name can be specified. || 0 or 1&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;interface_type&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interface&amp;gt;MyGenericRobot&amp;lt;/interface&amp;gt;&lt;br /&gt;
    &amp;lt;plugin&amp;gt;myplugin&amp;lt;/plugin&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= manipulator =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Defines a subset of the robot that acts as an &amp;#039;&amp;#039;&amp;#039;arm&amp;#039;&amp;#039;&amp;#039; and a &amp;#039;&amp;#039;&amp;#039;gripper&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
The arm is a chain of joints whose &amp;#039;&amp;#039;&amp;#039;end effector&amp;#039;&amp;#039;&amp;#039; is treated as a gripper. The arm is extracted from the &amp;#039;&amp;#039;&amp;#039;origin&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;tip&amp;#039;&amp;#039;&amp;#039; links. The &amp;#039;&amp;#039;&amp;#039;tip&amp;#039;&amp;#039;&amp;#039; contains the manipulator frame of reference. The gripper axes have to be specified manually. The direction is used as a hint for grasping and inverse kinematics.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;articulated_system&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;frame_origin&amp;gt; || The base frame that the arm starts at || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;frame_tip&amp;gt; || The end effector frame the arm ends at || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;gripper_joint&amp;gt; || Defines one joint of the gripper || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;iksolver&amp;gt; || Defines properties of inverse kinematics functions when used with the arm || 0 or more&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;frame_origin&amp;gt;/&amp;lt;frame_tip&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| link || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. References the SID of a &amp;lt;link&amp;gt; defined in &amp;lt;kinematics_model&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements for &amp;lt;frame_tip&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;translate&amp;gt; || Translation. See main entry in Core. || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;rotate&amp;gt; || Rotation axis. See main entry in Core. || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;direction&amp;gt; || Direction meta information. Sometimes IK and other modules require the manipulator to have a direction to measure angles from. This is defined inside the frame tip coordinate system. || 0 or 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;gripper_joint&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| joint || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The reference of the joint in the instantiated kinematics model that is part of the gripper.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements for &amp;lt;gripper_joint&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;closing_direction&amp;gt; || &amp;#039;&amp;#039;&amp;#039;common_float_or_param_type&amp;#039;&amp;#039;&amp;#039; that contains the default closing direction of an axis on the joint. If a closing direction is not specified for an axis in the joint, it defaults to 0. || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;gripper_joint&amp;gt;/&amp;lt;closing_direction&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| axis || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The SID of the axis inside the referenced joint.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;iksolver&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| type || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The type of the inverse kinematics to set a property for. Possible types are: &amp;#039;&amp;#039;&amp;#039;Transform6D, Rotation3D, Translation3D, Direction3D, Ray4D, Lookat3D, TranslationDirection5D&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements for &amp;lt;iksolver&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;free_joint&amp;gt; || Specifies one free joint to use for ik. || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;interface_type&amp;gt; || Optional. Specifies the interface of the inverse kinematics solver. || 0 or 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;iksolver&amp;gt;/&amp;lt;free_joint&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| joint || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The reference of the joint in the instantiated kinematics model that is part of the manipulator chain.&lt;br /&gt;
|-&lt;br /&gt;
| stepsize || &amp;#039;&amp;#039;&amp;#039;xs:float&amp;#039;&amp;#039;&amp;#039; || The discretization value of this joint when searching for solutions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
The current IK types are:&lt;br /&gt;
&lt;br /&gt;
* Transform6D - end effector reaches desired 6D transformation&lt;br /&gt;
* Rotation3D - end effector reaches desired 3D rotation&lt;br /&gt;
* Translation3D - end effector origin reaches desired 3D translation&lt;br /&gt;
* Direction3D - direction on end effector coordinate system reaches desired direction&lt;br /&gt;
* Ray4D - ray on end effector coordinate system reaches desired global ray&lt;br /&gt;
* Lookat3D - direction on end effector coordinate system points to desired 3D position&lt;br /&gt;
* TranslationDirection5D - end effector origin and direction reaches desired 3D translation and direction. Can be thought of as Ray IK where the origin of the ray must coincide.&lt;br /&gt;
&lt;br /&gt;
The IK types are meant to be hints as to how a manipulator can be used. Multiple IK types can be set for one manipulator and differing free joint values. It is possible for a post-processing stage to determine what IK types are best suited for a particular manipulator structure, and then add those into the COLLADA file.&lt;br /&gt;
&lt;br /&gt;
* Why is a manipulator frame necessary?&lt;br /&gt;
** Answer: Manipulator frames allow the user to define a coordinate system where it makes target tasks easier to complete. In this regard, the manipulator frame can be freely chosen by the user without worrying about destroying the link coordinate systems. For example, link frames are usually aligned with joint axes and center of masses and robot state is defined by their 6D transform in space. Having them also represent task-specific information could destroy consistency when the task changes. Also, the z-axis of the manipulator frame can define the &amp;quot;direction&amp;quot; of the manipulator. Direction can be used in many places like sensor line of sight and grasping approach, which makes it possible to quickly use the robot for planning.&lt;br /&gt;
&lt;br /&gt;
* Question: For dual arm manipulation, would a leftright manipulator ever be used including all joints? In this case, will it might be necessary to define two frame tips (one for left arm and one for right arm)?&lt;br /&gt;
** Answer: Having a leftright manipulator destroys the one-to-one correspondence between gripper joints and ik solver, and not much is gained. So better to have only have one frame tip and origin and treat two arms as separate. The constraint between the end effectors of the two arms is not always rigid, it very task dependent. Therefore, the user should take care of the dual relation.&lt;br /&gt;
&lt;br /&gt;
* Question: What about closing gripper direction for complex hands? Fingers with many DOF might need special grasping strategies.&lt;br /&gt;
** Answer: The closing direction just provide a hint as to the usage. The real gripper movement depends on the grasp strategy, which is beyond the definition of this scope. &lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
The example defines an arm with an end effector at link wam7 with a local coordinate system. It also defines two gripper axes. For the &amp;#039;transform6d&amp;#039; inverse kinematics type, it specifies that the free joint should be &amp;#039;joint4&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;manipulator&amp;quot; name=&amp;quot;leftarm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;frame_origin link=&amp;quot;wam0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;frame_tip link=&amp;quot;wam7&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;translate&amp;gt;0.0 0.0 0.22&amp;lt;/translate&amp;gt;&lt;br /&gt;
      &amp;lt;rotate&amp;gt;0.0 1.0 0.0 90.0&amp;lt;/rotate&amp;gt;&lt;br /&gt;
      &amp;lt;direction&amp;gt;0.0 0.0 1.0&amp;lt;/direction&amp;gt;&lt;br /&gt;
    &amp;lt;/frame_tip&amp;gt;&lt;br /&gt;
    &amp;lt;gripper_joint joint=&amp;quot;jointname&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;closing_direction axis=&amp;quot;axis0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;float&amp;gt;1&amp;lt;/float&amp;gt;&lt;br /&gt;
      &amp;lt;/closing_direction&amp;gt;&lt;br /&gt;
    &amp;lt;/gripper_joint&amp;gt;&lt;br /&gt;
    &amp;lt;gripper_joint joint=&amp;quot;jointname2&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;closing_direction axis=&amp;quot;axis0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;float&amp;gt;-1&amp;lt;/float&amp;gt;&lt;br /&gt;
      &amp;lt;/closing_direction&amp;gt;&lt;br /&gt;
    &amp;lt;/gripper_joint&amp;gt;&lt;br /&gt;
    &amp;lt;iksolver type=&amp;quot;Transform6D&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;free_joint joint=&amp;quot;jointname3&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;interface_type&amp;gt;&lt;br /&gt;
        &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;interface&amp;gt;WAM7ikfast&amp;lt;/interface&amp;gt;&lt;br /&gt;
          &amp;lt;plugin&amp;gt;WAM7ikfast&amp;lt;/plugin&amp;gt;&lt;br /&gt;
        &amp;lt;/technique&amp;gt;&lt;br /&gt;
      &amp;lt;/interface_type&amp;gt;&lt;br /&gt;
    &amp;lt;/iksolver&amp;gt;&lt;br /&gt;
    &amp;lt;iksolver type=&amp;quot;Translation3D&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;free_joint joint=&amp;quot;jointname4&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/iksolver&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= collision =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Links all possible collision meshes and properties for one kinematics body. The meshes depends on the usage.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
A link can have three different collision meshes:&lt;br /&gt;
* for visual rendering&lt;br /&gt;
* for self-collisions&lt;br /&gt;
* for environment collisions&lt;br /&gt;
&lt;br /&gt;
For each link, COLLADA will store three geometries in the &amp;#039;&amp;#039;&amp;#039;&amp;lt;library_geometries&amp;gt;&amp;#039;&amp;#039;&amp;#039;. The geometries will have an &amp;lt;extra&amp;gt; tag that specifies which usage they are meant to. The &amp;#039;&amp;#039;&amp;#039;self&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;env&amp;#039;&amp;#039;&amp;#039; will be referenced inside the visual geometry.&lt;br /&gt;
&lt;br /&gt;
The tag also stores information about what pairs of links can be completely ignored from self-collision detection. These links are either adjacent to each other, or so far from each other that no configuration of the robot can get them into possible collision.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;kinematics_model&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;bind_instance_geometry&amp;gt; || The geometry used for a particular link || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ignore_link_pair&amp;gt; || Specifies two links pairs whose self-collision should not be checked || 0 or more&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;bind_instance_geometry&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| type || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The usage type: &amp;#039;&amp;#039;&amp;#039;environment&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;self&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| link || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. References the SID of a &amp;lt;link&amp;gt; defined in &amp;lt;kinematics_model&amp;gt;. This link is where the geometries will be added.&lt;br /&gt;
|-&lt;br /&gt;
| url || &amp;#039;&amp;#039;&amp;#039;xs:anyURI&amp;#039;&amp;#039;&amp;#039; || Required. The URL of the location of the &amp;lt;geometry&amp;gt; element to instantiate. Can refer to a local instance or external reference.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;ignore_link_pair&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| link0 || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. References the SID of a &amp;lt;link&amp;gt; defined in &amp;lt;kinematics_model&amp;gt;. One of the links defining the pair to be ignored.&lt;br /&gt;
|-&lt;br /&gt;
| link1 || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. References the SID of a &amp;lt;link&amp;gt; defined in &amp;lt;kinematics_model&amp;gt;. One of the links defining the pair to be ignored.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
Convex decompositions can be defined by using one geometry per convex hull and attaching multiple geometries to the same link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ignore_link_pair&amp;gt; tags help self-collision detection to help prune possibilities. The adjacency information is not just the neighboring links. It is also meant to prune any collisions between two links that *cannot* possibly happen if the robot maintains its joint limits. This information depends not only on the kinematics of the robot, but also on the geometry of every link. Also for triplets of joints j1, j2, j3 that intersect at a common axis, you would want to add (j1,j2),(j2,j3),(j1,j3).&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;library_visual_scenes&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;mynode&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;instance_geometry url=&amp;quot;#linka_vis0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;instance_geometry url=&amp;quot;#linka_vis1&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&amp;lt;/library_visual_scenes&amp;gt;&lt;br /&gt;
&amp;lt;library_geometries&amp;gt;&lt;br /&gt;
  &amp;lt;geometry id=&amp;quot;linka_vis0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;geometry id=&amp;quot;linka_vis1&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;geometry id=&amp;quot;linka_env0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;geometry id=&amp;quot;linka_env1&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;geometry id=&amp;quot;linka_self&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;geometry id=&amp;quot;linkb_env0&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/library_geometries&amp;gt;&lt;br /&gt;
&amp;lt;library_kinematics_models&amp;gt;&lt;br /&gt;
  &amp;lt;kinematics_model&amp;gt;&lt;br /&gt;
    &amp;lt;extra type=&amp;quot;collision&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;bind_instance_geometry type=&amp;quot;environment&amp;quot; link=&amp;quot;linka&amp;quot; url=&amp;quot;#linka_env0&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;bind_instance_geometry type=&amp;quot;environment&amp;quot; link=&amp;quot;linka&amp;quot; url=&amp;quot;#linka_env1&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;bind_instance_geometry type=&amp;quot;self&amp;quot; link=&amp;quot;linka&amp;quot; url=&amp;quot;#linka_self&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;bind_instance_geometry type=&amp;quot;environment&amp;quot; link=&amp;quot;linkb&amp;quot; url=&amp;quot;#linkb_env0&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;ignore_link_pair link0=&amp;quot;linka&amp;quot; link1=&amp;quot;linkb&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/technique&amp;gt;&lt;br /&gt;
    &amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/library_kinematics_models&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= library_sensors =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Provides a library in which to place &amp;lt;sensor&amp;gt; elements.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
Allows sensors to be stored as modular resources in libraries. Can be easily referenced through files.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;COLLADA&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= sensor =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Defines a sensor&amp;#039;s type and the geometric and intrinsic parameters.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
Each sensor will be associated with a particular sensor type; depending on the sensor type, the parameters that need to be set will change. The parameters should contain everything necessary to simulate the sensor accurately. They *should not* contain parameters that define the format and transfer of the data.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;articulated_system&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| type || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The type of the sensor. Possible types are: &amp;#039;&amp;#039;&amp;#039;base_pinhole_camera, base_stereo_camera, base_laser2d, base_laser3d, base_flash_laser, base_encoder, base_force6d, base_imu, base_odometry&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;#039;&amp;#039;&amp;#039;xs:ID&amp;#039;&amp;#039;&amp;#039; || Required. A text string containing the unique identifier of the &amp;lt;sensor&amp;gt; element. This value must be unique within the instance document.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;common&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;interface_type&amp;gt; || Optional. Contains the interface type to load the sensor with. || 0 or 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_pinhole_camera&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
Simple pin hole camera defined by an intrinsic matrix. The camera can support multiple image dimensions with multiple channel formats. It is not clear whether all supported formats for one camera should be enumerated in one &amp;lt;sensor&amp;gt; tag, or there should be multiple sensor tags for each different type where the sensors are exclusively mutual.&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;image_dimensions&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;int3_type&amp;#039;&amp;#039;&amp;#039; that specifies the image width, height, and channels. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;format&amp;gt; || Contains a string that specifies the format of every value in the image. Possible types are &amp;#039;&amp;#039;&amp;#039;uint8, uint16, uint32, int8, int16, int32, float32, float64&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;measurement_time&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies time between images (ie exposure time). || 0 or 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;intrinsic&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float2x3_type&amp;#039;&amp;#039;&amp;#039; that specifies the intrinsic parameters defining the principal point, field of view, and skew. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;focal_length&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the physical focal length of the camera. || 0 or 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;distortion_model&amp;gt; || The distortion model to use. It has a &amp;#039;&amp;#039;&amp;#039;type&amp;#039;&amp;#039;&amp;#039; attribute specifying the actual model type, and contains a &amp;#039;&amp;#039;&amp;#039;list_of_floats_type&amp;#039;&amp;#039;&amp;#039; that specifies the distortion coefficients of the model. || 0 or 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_stereo_camera:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Uses two cameras together to extract a depth map. The stereo camera&amp;#039;s coordinate system is in the first instanced camera.&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;instance_sensor&amp;gt; || The camera sensors, the scan time should be equal || 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;instance_sensor&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| url || &amp;#039;&amp;#039;&amp;#039;xs:anyURI&amp;#039;&amp;#039;&amp;#039; || Required. The URL of the location of the &amp;lt;sensor&amp;gt; element to instantiate.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements for &amp;lt;instance_sensor&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;rectification&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float3x3_type&amp;#039;&amp;#039;&amp;#039; that specifies a homography which takes an image to the ideal stereo image plane so that epipolar lines in both stereo images are parallel. The homography transforms from the second image to the first image. || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_laser2d&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
Single scan from a planar laser range-finder along the xy plane.&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;angle_range&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float2_type&amp;#039;&amp;#039;&amp;#039; that specifies the minimum and maximum angles (degrees) of the laser range. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;distance_range&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float2_type&amp;#039;&amp;#039;&amp;#039; that specifies the minimum and maximum distance of the laser. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;angle_increment&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the angular distance between measurements (degrees). || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;time_increment&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the time between measurements (seconds). If your scanner is moving, this will be used in interpolating position of 3d points. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;measurement_time&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the time between scans (seconds) || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_laser3d:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_flash_laser:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_encoder:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_force6d:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_imu:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;measurement_time&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the time between scans (seconds). || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;rotation_covariance&amp;gt; || The uncertainty covariance matrix (3x3 row-major matrix) in x, y, and z axes. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;angular_velocity_covariance&amp;gt; || The uncertainty covariance matrix (3x3 row-major matrix) in x, y, and z axes. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;linear_acceleration_covariance&amp;gt; || The uncertainty covariance matrix (3x3 row-major matrix) in x, y, and z axes. || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_odometry:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;measurement_time&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the time between scans (seconds). || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;target&amp;gt; || The name of the target whose odometry is being measured || 0 or 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
Example using a default sensor with a custom interface&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;library_sensors&amp;quot; id=&amp;quot;libsensors&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor type=&amp;quot;base_laser2d&amp;quot; id=&amp;quot;ExampleLaser1&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;angle_min&amp;gt;-90&amp;lt;/angle_min&amp;gt;&lt;br /&gt;
      &amp;lt;angle_max&amp;gt;90&amp;lt;/angle_max&amp;gt;&lt;br /&gt;
      &amp;lt;range_min&amp;gt;0.01&amp;lt;/range_min&amp;gt;&lt;br /&gt;
      &amp;lt;range_max&amp;gt;4.0&amp;lt;/range_max&amp;gt;&lt;br /&gt;
      &amp;lt;angle_increment&amp;gt;1&amp;lt;/angle_increment&amp;gt;&lt;br /&gt;
      &amp;lt;time_increment&amp;gt;0.0005&amp;lt;/time_increment&amp;gt;&lt;br /&gt;
      &amp;lt;measurement_time&amp;gt;0.025&amp;lt;/measurement_time&amp;gt;&lt;br /&gt;
      &amp;lt;interface_type&amp;gt;&lt;br /&gt;
        &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;interface&amp;gt;BaseLaser2D&amp;lt;/interface&amp;gt;&lt;br /&gt;
        &amp;lt;/technique&amp;gt;&lt;br /&gt;
      &amp;lt;/interface_type&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using a non-default, custom sensor&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;library_sensors&amp;quot; id=&amp;quot;libsensors&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor type=&amp;quot;BaseLaser2D&amp;quot; id=&amp;quot;ExampleLaser1&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;minangle&amp;gt;-135&amp;lt;/minangle&amp;gt;&lt;br /&gt;
      &amp;lt;maxangle&amp;gt;135&amp;lt;/maxangle&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;0.35&amp;lt;/resolution&amp;gt;&lt;br /&gt;
      &amp;lt;maxrange&amp;gt;5&amp;lt;/maxrange&amp;gt;&lt;br /&gt;
      &amp;lt;scantime&amp;gt;0.1&amp;lt;/scantime&amp;gt;&lt;br /&gt;
      &amp;lt;color&amp;gt;0.5 0.5 1&amp;lt;/color&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Develop a formal sensor XML file format for different sensor types.&lt;br /&gt;
&lt;br /&gt;
= attach_sensor =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Attaches a sensor to a link of the robot.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
The sensor comes from the sensor library. It can be attached anywhere onto a link defined from the kinematics section. The sensor will maintain a constant transformation between the link.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;articulated_system&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;instance_sensor&amp;gt; || Instantiate a sensor. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;frame_origin&amp;gt; || The base link that the sensor is attached to. || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;frame_origin&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| link || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. References the SID of a &amp;lt;link&amp;gt; defined in &amp;lt;kinematics_model&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements for &amp;lt;frame_origin&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;translate&amp;gt; || Translation. See main entry in Core. || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;rotate&amp;gt; || Rotation axis. See main entry in Core. || 0 or more&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;attach_sensor&amp;quot; name=&amp;quot;left_head_camera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;instance_sensor url=&amp;quot;#pgr_camera&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;frame_origin link=&amp;quot;head&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;translate&amp;gt;0 1 0&amp;lt;/translate&amp;gt;&lt;br /&gt;
      &amp;lt;rotate&amp;gt;0 1 0 90&amp;lt;/rotate&amp;gt;&lt;br /&gt;
    &amp;lt;/frame_origin&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= formula/technique =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Full specifies a formula for a joint and annotates it with extra information necessary for robotics.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
The original &amp;lt;formula&amp;gt;/&amp;lt;technique_common&amp;gt; supports only one equation for the value of the joint. More complex kinematics systems have more than one degree of freedom per joint and use the partial derivatives of the equation to compute Jacobians and simulate physics. &lt;br /&gt;
&lt;br /&gt;
This &amp;quot;OpenRAVE&amp;quot; technique for &amp;lt;formula&amp;gt; can specify partial derivatives of the position &lt;br /&gt;
equation for computing velocity and accelerations.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;formula&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;equation&amp;gt; || Equation in MathML format. Used to specify the position and partial derivatives. || 0 or more&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;equation&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| type || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. can be one of &amp;quot;position&amp;quot;, &amp;quot;first_partial&amp;quot;, or &amp;quot;second_partial&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| target || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || If &amp;#039;type&amp;#039; is &amp;quot;first_partial&amp;quot; or &amp;quot;second_partial&amp;quot;, then fill this with the variable taking the partial derivative with respect to. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;equation type=&amp;quot;position&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;&lt;br /&gt;
      &amp;lt;apply&amp;gt;&lt;br /&gt;
        &amp;lt;plus/&amp;gt;&lt;br /&gt;
        &amp;lt;apply&amp;gt;&lt;br /&gt;
          &amp;lt;times/&amp;gt;&lt;br /&gt;
          &amp;lt;cn&amp;gt;0.333330&amp;lt;/cn&amp;gt;&lt;br /&gt;
          &amp;lt;csymbol encoding=&amp;quot;COLLADA&amp;quot;&amp;gt;kmodel1/joint0&amp;lt;/csymbol&amp;gt;&lt;br /&gt;
        &amp;lt;/apply&amp;gt;&lt;br /&gt;
        &amp;lt;cn&amp;gt;0.872700&amp;lt;/cn&amp;gt;&lt;br /&gt;
      &amp;lt;/apply&amp;gt;&lt;br /&gt;
    &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;/equation&amp;gt;&lt;br /&gt;
  &amp;lt;equation type=&amp;quot;first_partial&amp;quot; target=&amp;quot;kmodel1/joint0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;&lt;br /&gt;
      &amp;lt;cn&amp;gt;0.333330&amp;lt;/cn&amp;gt;&lt;br /&gt;
    &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= library_actuators =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Provides a library in which to place &amp;lt;actuator&amp;gt; elements.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
Allows actuators to be stored as modular resources in libraries. Can be easily referenced through files.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;COLLADA&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= actuator =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
An actuator provides force/momentum/action to kinematics joints.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
Defines a actuator&amp;#039;s physical properties necessary to simulate dynamics and control algorithms of a robot. They &amp;#039;&amp;#039;&amp;#039;should not&amp;#039;&amp;#039;&amp;#039; contain parameters that define the format and transfer of the data to and from actuators. &lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;articulated_system&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| type || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The type of the actuator. Possible types are: &amp;#039;&amp;#039;&amp;#039;motor&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;#039;&amp;#039;&amp;#039;xs:ID&amp;#039;&amp;#039;&amp;#039; || Required. A text string containing the unique identifier of the &amp;lt;actuator&amp;gt; element. This value must be unique within the instance document.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;common&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;interface_type&amp;gt; || Optional. Contains the interface type to load the actuator with. || 0 or 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type electric_motor&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
Converts electrical energy into mechanical energy usually using magnetic fields and conductors. The &amp;#039;&amp;#039;&amp;#039;speed&amp;#039;&amp;#039;&amp;#039; of a motor is measured in revolutions/Time (Time is defined by the &amp;lt;asset&amp;gt; tag and usually measured in seconds). DC Motor Theory References:&lt;br /&gt;
&lt;br /&gt;
* http://hades.mech.northwestern.edu/index.php/Brushed_DC_Motor_Theory&lt;br /&gt;
&lt;br /&gt;
* http://en.wikipedia.org/wiki/Brushed_DC_electric_motor&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;assigned_power_rating&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the nominal power the electric motor can safely produce. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance² * Time-³&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;max_speed&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the maximum speed of the motor. Units are &amp;#039;&amp;#039;&amp;#039;Time-¹&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;no_load_speed&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the speed of the motor powered by the nominal voltage when the motor provides zero torque. Units are &amp;#039;&amp;#039;&amp;#039;Time-¹&amp;#039;&amp;#039;&amp;#039;. || 0 or 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nominal_torque&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the maximum torque the motor can provide continuously without overheating. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance * Time-²&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nominal_voltage&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the nominal voltage the electric motor can safely produce. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance² * Time-² * Charge&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;rotor_inertia&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the inertia of the rotating element about the axis of rotation. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance²&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;speed_constant&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the constant of proportionality relating speed to voltage. Units are &amp;#039;&amp;#039;&amp;#039;Mass-¹ * Distance-² * Time * Charge-¹&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;speed_torque_gradient&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the slope of the speed-torque curve, approximately equal to the no load speed divided by the stall torque. Units are &amp;#039;&amp;#039;&amp;#039; Mass-¹ * Distance-¹ * Time-¹&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;starting_current&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the current through the motor at zero velocity, equal to the nominal voltage divided by the terminal resistance. Also called the stall current.  Units are &amp;#039;&amp;#039;&amp;#039;Time-¹ * Charge&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;terminal_resistance&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the resistance of the motor windings. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance² * Time-¹ * Charge-²&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;torque_constant&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the proportion relating current to torque. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance * Time-¹ * Charge-¹&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Related variables, but not inserted in the electric_motor specification:&lt;br /&gt;
&lt;br /&gt;
* Stall torque - The time it takes the unloaded motor to reach 63% of its no load speed under a constant voltage, starting from rest. Proportional to the inertia of the rotor and inversely proportional to the square of the the torque constant. &lt;br /&gt;
* Max. efficiency - The maximum efficiency of the motor in converting electrical power to mechanical power. This maximum efficiency typically occurs at high speed and low torque; the efficiency is zero at zero speed and zero torque, since the mechanical power is τω. &lt;br /&gt;
* No load current - The current required to spin the motor at the no load condition (i.e., the current needed to provide the torque necessary to overcome friction).&lt;br /&gt;
* Nominal current (max. continuous current) - The current that yields the maximum continuous torque. This maximum is determined by thermal characteristics of the motor. The power dissipated by the motor as heat is i2R. Larger currents are acceptable intermittently, but large continuous currents may cause the motor to overheat. &lt;br /&gt;
* Mechanical time constant - The time it takes the unloaded motor to reach 63% of its no load speed under a constant voltage, starting from rest. Proportional to the inertia of the rotor and inversely proportional to the square of the the torque constant.&lt;br /&gt;
* Terminal inductance - The inductance of the motor windings. &lt;br /&gt;
* Thermal resistance housing-ambient &lt;br /&gt;
* Thermal resistance winding-housing&lt;br /&gt;
* Thermal time constant winding.&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;library_actuators&amp;quot; id=&amp;quot;libactuators&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;actuator type=&amp;quot;electric_motor&amp;quot; id=&amp;quot;ExampleMotor1&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;assigned_power_rating&amp;gt;1.0&amp;lt;/assigned_power_rating&amp;gt;&lt;br /&gt;
      &amp;lt;max_speed&amp;gt;3000&amp;lt;/max_speed&amp;gt;&lt;br /&gt;
      &amp;lt;no_load_speed&amp;gt;3990&amp;lt;/no_load_speed&amp;gt;&lt;br /&gt;
      &amp;lt;nominal_torque&amp;gt;0.012&amp;lt;/nominal_torque&amp;gt;&lt;br /&gt;
      &amp;lt;nominal_voltage&amp;gt;24.0&amp;lt;/nominal_voltage&amp;gt;&lt;br /&gt;
      &amp;lt;rotor_inertia&amp;gt;0.0000023&amp;lt;/rotor_inertia&amp;gt;&lt;br /&gt;
      &amp;lt;speed_constant&amp;gt;173.0&amp;lt;/speed_constant&amp;gt;&lt;br /&gt;
      &amp;lt;speed_torque_gradient&amp;gt;130000.0&amp;lt;/speed_torque_gradient&amp;gt;&lt;br /&gt;
      &amp;lt;starting_current&amp;gt;0.578&amp;lt;/starting_current&amp;gt;&lt;br /&gt;
      &amp;lt;terminal_resistance&amp;gt;41.5&amp;lt;/terminal_resistance&amp;gt;&lt;br /&gt;
      &amp;lt;torque_constant&amp;gt;0.0552&amp;lt;/torque_constant&amp;gt;&lt;br /&gt;
    &amp;lt;/actuator&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= attach_actuator =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Attaches an actuator to a joint.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
The actuator comes from the actuator library.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;articulated_system&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;instance_actuator&amp;gt; || Instantiate an actuator. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;bind_actuator&amp;gt; || Binds the actuator to a joint. || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;bind_actuator&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| joint || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The reference of the joint in the instantiated kinematics model that is part of the manipulator chain.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;attach_actuator&amp;quot; name=&amp;quot;motor0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;instance_actuator url=&amp;quot;#ExampleMotor1&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;bind_actuator joint=&amp;quot;kmodel0/myjoint&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= COLLADA Usage =&lt;br /&gt;
&lt;br /&gt;
== COLLADA Format Notes ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;articulated_system&amp;#039;&amp;#039;&amp;#039; tag is equivalent to OpenRAVE robot&lt;br /&gt;
** if child is a &amp;#039;&amp;#039;&amp;#039;motion&amp;#039;&amp;#039;&amp;#039; tag, get accelerations and velocity limits from it&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;kinematics_model&amp;#039;&amp;#039;&amp;#039; tag is equivalent to KinBody&lt;br /&gt;
* If visual_scene tag present, but no kinematics, then add each node tree as a rigid link.&lt;br /&gt;
* In order to set a static link in physics, use the &amp;lt;instance_rigid_body&amp;gt;/&amp;lt;dynamic&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
== Hard and Soft Joint Limits ==&lt;br /&gt;
&lt;br /&gt;
In many scenarios, the controllers on the robots use joints limits which are smaller than the maximum limits. The controller limits are called &amp;#039;&amp;#039;&amp;#039;soft limits&amp;#039;&amp;#039;&amp;#039;, while the hardware limits are called &amp;#039;&amp;#039;&amp;#039;hard limits&amp;#039;&amp;#039;&amp;#039;. In COLLADA, the specification is:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;hard limits&amp;#039;&amp;#039;&amp;#039; - specified inside the &amp;lt;joint&amp;gt; tag using the &amp;lt;limits&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;soft limits&amp;#039;&amp;#039;&amp;#039; - specified inside the &amp;lt;articulated_system&amp;gt;/&amp;lt;kinematics&amp;gt;/&amp;lt;technique_common&amp;gt;/&amp;lt;axis_info&amp;gt; tag using the &amp;lt;limits&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Planning Weights ==&lt;br /&gt;
&lt;br /&gt;
For each joint, a measure of how much a joint&amp;#039;s movement impacts the robot (base joints have more impact than end effector joints). this information should be used by all planners to evaluate importance of joints. Calculating this accurately might require an offline process.&lt;br /&gt;
&lt;br /&gt;
== Composition ==&lt;br /&gt;
&lt;br /&gt;
Robots usually have grippers, robot arms, and robot bases in separate files, then we have one file that references all of them and specifies the links to merge together (ie, we do not complicate things by creating dummy joints). This can be done with articulated systems (&amp;lt;kinematics&amp;gt; tag supports multiple &amp;lt;instance_kinematics_model&amp;gt; tags).&lt;br /&gt;
&lt;br /&gt;
== Geometric Primitives ==&lt;br /&gt;
&lt;br /&gt;
Use COLLADA &amp;lt;brep&amp;gt; for spheres, cylinders, boxes, etc. &lt;br /&gt;
&lt;br /&gt;
== Storing Convex Decompositions ==&lt;br /&gt;
&lt;br /&gt;
Each link is composed of a set of convex hulls. Need to create one geometry per convex hull (&amp;lt;convex_mesh&amp;gt;?) and specify multiple geometries per &amp;lt;node&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Calibration vs Static Data ==&lt;br /&gt;
&lt;br /&gt;
One thing that separates a base description of the robot from the real&lt;br /&gt;
robot that will be used in labs is calibration:&lt;br /&gt;
* where each sensor is with respect to the robot (6D pose)&lt;br /&gt;
* intrinsic parameters for each sensor&lt;br /&gt;
* joint offsets for encoder calibration&lt;br /&gt;
* controller parameters like PID gains for dynamic properties of motors&lt;br /&gt;
* possibly even link lengths depending on how much you trust the manufacturer&lt;br /&gt;
&lt;br /&gt;
All these parameters will change per robot, and it won&amp;#039;t be a good&lt;br /&gt;
idea asking every person to go and modify their one robot file.&lt;br /&gt;
Instead we should have a different calibration file that the main&lt;br /&gt;
collada file always references. It should be setup in such a way that the calibration file becomes optional.&lt;br /&gt;
&lt;br /&gt;
== Controllers ==&lt;br /&gt;
&lt;br /&gt;
Specifying controller parameters in the collada file falls somewhere&lt;br /&gt;
in between calibration parameters and parameters that will never&lt;br /&gt;
change and should be in the main robot file. In my opinion it is very&lt;br /&gt;
hard to find static parameters especially when considering controllers&lt;br /&gt;
in simulation along with real world controllers. Also, there&amp;#039;s as many&lt;br /&gt;
control algorithms out there as planners, and I wouldn&amp;#039;t feel&lt;br /&gt;
comfortable specifying planning algorithms and parameters inside a&lt;br /&gt;
robot file.&lt;br /&gt;
&lt;br /&gt;
= COLLADA Samples Using OpenRAVE Extensions =&lt;br /&gt;
&lt;br /&gt;
[https://openrave.svn.sourceforge.net/svnroot/openrave/data/robots/ Robot Database]&lt;br /&gt;
&lt;br /&gt;
== Contributors ==&lt;br /&gt;
&lt;br /&gt;
* University of Tokyo - Rosen Diankov and Ryohei Ueda&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=200</id>
		<title>Format:XML</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=200"/>
				<updated>2011-12-03T12:16:46Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
= OpenRAVE Custom XML Format =&lt;br /&gt;
&lt;br /&gt;
[[image:Openrave_robots.jpg|600px]] &lt;br /&gt;
&lt;br /&gt;
TODO: Decide on the versioning scheme&lt;br /&gt;
&lt;br /&gt;
OpenRAVE uses XML to store all robot and scene descriptions. The XML format is flexible enough to link one XML file from another like including already created objects/robots in an environment. It is also possible to specify vrml or iv formatted files within it to import models. &lt;br /&gt;
&lt;br /&gt;
All interface types can be created. Furthermore, an &amp;lt;environment&amp;gt; tag can optionally be specified to put all bodies/interfaces in.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Environment&amp;#039;&amp;#039;&amp;#039; - specify multiple objects and robots. Can also define some GUI properties like camera start location and background color. The environment allows the creation of &amp;#039;&amp;#039;&amp;#039;any&amp;#039;&amp;#039;&amp;#039; OpenRAVE interfaces. Each interface can take the &amp;#039;&amp;#039;&amp;#039;type&amp;#039;&amp;#039;&amp;#039; attribute specifying the interface type and can define custom XML readers.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039; - The basic object that all other objects derive from. A kinematic body consists of a collection of rigid bodies and joints that connect these bodies.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; - The basic robot that derives from &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039;. Usually every Robot has at least one KinBody declaration inside it. A robot can also hold a list of &amp;#039;&amp;#039;&amp;#039;Manipulator&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;AttachedSensor&amp;#039;&amp;#039;&amp;#039; objects describing the manipulation/sensing capabilities of the robot. Since plugin authors can create different robots, it is also possible to define custom fields in &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; to hold other information like balance control parameters for humanoids.&lt;br /&gt;
&lt;br /&gt;
== Transformations ==&lt;br /&gt;
&lt;br /&gt;
Most tags for links/bodies/robots hold a transformation. The following fields modify this transformation:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- xyz --&amp;gt;&lt;br /&gt;
&amp;lt;translation&amp;gt;0 1 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- w x y z --&amp;gt;&lt;br /&gt;
&amp;lt;quat&amp;gt;1 0 0 0&amp;lt;/quat&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- a 3x3 rotation matrix specified as rows first&lt;br /&gt;
r00, r01, r02,    r10, r11, r12,     r20, r21, r21 --&amp;gt;&lt;br /&gt;
&amp;lt;rotationmat&amp;gt;1 0 0 0 1 0 0 0 1&amp;lt;/rotationmat&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- axis_x axis_y axis_z angle(deg) --&amp;gt;&lt;br /&gt;
&amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multiple of the same tags can be specified, resulting in the transformations being compounded. During compounding, the translation and rotation are treated separately.&lt;br /&gt;
&lt;br /&gt;
== KinBody ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody name=&amp;quot;TestKinBody&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Create a rigid body named Body1 and declare it as &amp;#039;dynamic&amp;#039;.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;#039;dynamic&amp;#039; bodies are subject to physics laws, &amp;#039;static&amp;#039; bodies will never move--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- due to physical forces. It is recommended EVERYTHING is declared as &amp;#039;dynamic&amp;#039; --&amp;gt;&lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that the body transforms affects all geometry objects attached. --&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- translation of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;!--rotation of the body specified as a rotation axis. First three numbers are the axis.--&amp;gt;&lt;br /&gt;
    &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- defines mass properties for the entire kinbody. possible mass types are--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- mimicgeom - &amp;lt;density&amp;gt;. Adds a mass equivalent to all the geometry--&amp;gt;&lt;br /&gt;
    &amp;lt;!--    objects. trimesh and plane are not supported.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- box - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;extents&amp;gt; Adds a simple box--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- sphere - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;radius&amp;gt;--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;density&amp;gt;1000&amp;lt;/density&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Define a geometry object attached to the body. The functionality of --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- geometry objects is to define the collision and render geometries of the body. --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- All geometry types have Rotation(Mat/Quat), Translation, and Render components.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Possible geom types are box, sphere, trimesh, plane.--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *box - extents--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *sphere - radius--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *cylinder - radius, height (axis is along y)--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *trimesh - data--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- extents of the box - half width, height, length--&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;1 1 1&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;!-- set the translation and rotation of the box. Note that the transforamtions--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- are all relative to the parent body.--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;0 1 0 45&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Can create multiple geometries per body--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;2 1 2&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 1 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;!-- RotationMat is a 3x3 rotation matrix specified as rows first--&amp;gt;&lt;br /&gt;
      &amp;lt;RotationMat&amp;gt;1 0 0 0 1 0 0 0 1&amp;lt;/RotationMat&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Set the transparency of the geometry, 0 is opaque--&amp;gt;&lt;br /&gt;
      &amp;lt;transparency&amp;gt;0.4&amp;lt;/transparency&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- change the mass properties of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the total mass--&amp;gt;&lt;br /&gt;
      &amp;lt;total&amp;gt;0.40605&amp;lt;/total&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the 3x3 inertia matrix--&amp;gt;&lt;br /&gt;
      &amp;lt;inertia&amp;gt;2 0 0 0 3 0 0 0 5&amp;lt;/inertia&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the center of mass (if using ODE physics engine, should be 0)--&amp;gt;&lt;br /&gt;
      &amp;lt;com&amp;gt;0.008842 -0.000018 0.07367&amp;lt;/com&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a sphere--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;sphere&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- although the underlying collision geometry will be a sphere,--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- render it as a coffee pot--&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/coffeepot.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 -1.5 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Radius&amp;gt;1.5&amp;lt;/Radius&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a triangle mesh--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/cup.iv 0.01&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;!-- use the cup triangles for collision detection.--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The last number is the scale, in case the iv files are scaled improperly.--&amp;gt;&lt;br /&gt;
      &amp;lt;collision&amp;gt;models/objects/cup.iv 0.01&amp;lt;/collision&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1.5 -2 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Create a joint between the two bodies.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Possible joint types are: hinge, slider, universal, hinge2, and spherical.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Hinges are the most common joint type used in robots.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- For amotors, can specify mode, axis1, axis2, axis3. For each axis, first 3 values are the axis and the last value is the relative coord system (see ODE documentation).--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Every joint can have certain properties:--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxforce&amp;gt; are in number of degrees of freedom.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxvel&amp;gt;, &amp;lt;resolution&amp;gt; are scalar and apply to all DOFs.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;limits&amp;gt;, &amp;lt;limitsdeg&amp;gt;, &amp;lt;limitsrad&amp;gt; specify the joint limits --&amp;gt;&lt;br /&gt;
  &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Specify the names of the bodies, names are not case sensitive.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body1&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body2&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- anchor and axis of the hinge--&amp;gt;&lt;br /&gt;
    &amp;lt;Anchor&amp;gt;0 0 0&amp;lt;/Anchor&amp;gt;&lt;br /&gt;
    &amp;lt;Axis&amp;gt;0 1 0&amp;lt;/Axis&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Weight for configuration distance, mostly used in planners.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- for joints with &amp;gt; 1 DOF, specify 2+ values--&amp;gt;&lt;br /&gt;
    &amp;lt;Weight&amp;gt;1.0&amp;lt;/Weight&amp;gt;&lt;br /&gt;
  &amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Models Directory ===&lt;br /&gt;
&lt;br /&gt;
By default, the root directory for all models files is the folder openrave is launched at. To change this, &amp;#039;&amp;#039;&amp;#039;&amp;lt;modelsdir&amp;gt;&amp;#039;&amp;#039;&amp;#039; can be used to specify model files relative to where the current xml file is. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;modelsdir&amp;gt;../mymodels&amp;lt;/modelsdir&amp;gt;&lt;br /&gt;
  &amp;lt;Body&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;render&amp;gt;kitchen/myfile.wrl&amp;lt;/render&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Circular Joints ===&lt;br /&gt;
&lt;br /&gt;
Sometimes joints will have the upper and lower limits identified, meaning that as soon as the joint gets past one limit it will wrap around to the other. Infinitely revolving hinge joints are the most common example of &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; joints where the &amp;lt;math&amp;gt;-\pi&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; limits are identified. In openrave, it is possible to set a joint as &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; like this:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint circular=&amp;quot;true&amp;quot; ...&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Adjacent Links ===&lt;br /&gt;
&lt;br /&gt;
Robot self-collision usually checks all pairs of non-adjacent links for collision; links are adjacent if they are connected to a joint. In order to reduce self-collision computation time and spurious collisions of small links, it is possible to force pairs of links to be treated as adjacent by specifying an &amp;#039;&amp;#039;&amp;#039;&amp;lt;adjacent&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag.&lt;br /&gt;
&lt;br /&gt;
=== Scale ===&lt;br /&gt;
&lt;br /&gt;
The first thing when importing a new model is to check that all the units are in meters (it is very common for robots to be in millimeters), otherwise the visualization model and the collision model will be in a different scale. to check this, open the robot and go to View-&amp;gt;Geometry-&amp;gt;Collision, this will show the collision model. If it is not the same scale, you need to go inside your model files and change the units. You can also enter a scale factor after model filenames like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;collision&amp;gt;mydata.iv 0.001&amp;lt;/collision&amp;gt;&lt;br /&gt;
&amp;lt;render&amp;gt;mydata.iv 0.001&amp;lt;/render&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this will scale the models by 0.001.&lt;br /&gt;
&lt;br /&gt;
== Robot ==&lt;br /&gt;
&lt;br /&gt;
=== A simple 3DOF planar arm in XZ ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;3DOFRobot&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Create the base body, it should never move--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that all translations and rotations are with respect to this base--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- For example, the robot at the identity transformation is equivalent to the identity transformation of the first body.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Base&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.0  0.0  0.0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;radius&amp;gt;0.03&amp;lt;/radius&amp;gt;&lt;br /&gt;
        &amp;lt;height&amp;gt;0.02&amp;lt;/height&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;0.05 0.05 0.05&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the first movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm0&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Offset from is a fast way of specifying that the translation and rotation of this--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- body should be relative to another link--&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Base&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Translation relative to Base--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.01 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm0&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Base&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;4&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;3&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the second movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0.0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.0075 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the third movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.04 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.04 0.005 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;2&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;2&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Create the gripper joints:--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;RClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/RClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/RClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;RClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;RClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!--left gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;LClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0.005 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/LClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/LClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;LClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;LClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 -1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the transparency of every geometry in the KinBody--&amp;gt;&lt;br /&gt;
    &amp;lt;transparency&amp;gt;0.1&amp;lt;/transparency&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specifying the manipulator structure--&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;Arm2&amp;lt;/effector&amp;gt;   &amp;lt;!-- last link where end effector is attached--&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;Base&amp;lt;/base&amp;gt;           &amp;lt;!-- base link--&amp;gt;&lt;br /&gt;
    &amp;lt;joints&amp;gt;j1 j2&amp;lt;/joints&amp;gt;      &amp;lt;!-- the gripper joints used for contact--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- the id of the inverse kinematics solver, it is not necessary to--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify an ik solver for every robot. But if there is one,--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- use iksolver field to identity it.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;lt;iksolver&amp;gt;MyTriDOFSolver&amp;lt;/iksolver&amp;gt; --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- joint values of the closed and opened positions--&amp;gt;&lt;br /&gt;
    &amp;lt;closingdirection&amp;gt;1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
    &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
    &amp;lt;!-- grasp goal with respect to the effector--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0.125 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DOFRobot Robot:  [[image:tridof.jpg|200px]] &lt;br /&gt;
&lt;br /&gt;
=== Defining Manipulators ===&lt;br /&gt;
&lt;br /&gt;
A robot manipulator defines a kinematic chain of the robot joint hierarchy along with optional gripper joint values that are not used in the inverse kinematics computation but are needed for grasping purposes (chains for heads, legs do not need the joint values). A manipulator defines a new frame of reference with respect to the end effector link; all inverse kinematics computations are computed using it. Furthermore, a manipulator can have a &amp;#039;&amp;#039;&amp;#039;&amp;lt;direction&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying an axis for approaching objects or line-of-sight. For example the &amp;#039;&amp;#039;&amp;#039;robots/barrettwam.robot.xml&amp;#039;&amp;#039;&amp;#039; gripper is defined by&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;base&amp;gt;wam0&amp;lt;/base&amp;gt;&lt;br /&gt;
  &amp;lt;effector&amp;gt;wam7&amp;lt;/effector&amp;gt;&lt;br /&gt;
  &amp;lt;Translation&amp;gt;0 0 0.22&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;joints&amp;gt;JF1 JF2 JF3 JF4&amp;lt;/joints&amp;gt;&lt;br /&gt;
  &amp;lt;closingdirection&amp;gt;1 1 1 0&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
  &amp;lt;direction&amp;gt;0 0 1&amp;lt;/direction&amp;gt;&lt;br /&gt;
  &amp;lt;iksolver&amp;gt;WAM7ikfast 0.05&amp;lt;/iksolver&amp;gt;&lt;br /&gt;
&amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The manipulator can optionally define a &amp;#039;&amp;#039;&amp;#039;&amp;lt;iksolver&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying the iksolver interface that is used for getting IK solutions, or a shared object (DLL) to load an [[Component:Ikfast|ikfast]] solver from.&lt;br /&gt;
&lt;br /&gt;
=== Closed-chains and Mimic Joints ===&lt;br /&gt;
&lt;br /&gt;
OpenRAVE allows closed-chains and complex kinematics to be simulated using mimic joints. A mimic joint&amp;#039;s position, velocity, and acceleration values are computed from user-specified formulas using the values of other joints. OpenRAVE uses the Function Parser library to allow any formula to be specified. Refer to the documentation for more information [http://openrave.programmingvision.com/en/coreapihtml/classOpenRAVE_1_1KinBody_1_1Joint.html#a0e31c5be31c4145afa786e0c0d6a46ae here].&lt;br /&gt;
&lt;br /&gt;
A mimic joint requires at least the position equation and its partial derivatives (for velocity) to be manually entered. &lt;br /&gt;
&lt;br /&gt;
For example, the Barrett Hand mimic joints are defined as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;JF1&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;JF1mimic&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot; mimic_pos=&amp;quot;JF1/3+0.8727&amp;quot; mimic_vel=&amp;quot;|JF1 0.33333&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Of course, it is possible to have a mimic joint depend on more than one other joint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;b&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;c&amp;quot; type=&amp;quot;hinge&amp;quot; mimic_pos=&amp;quot;a+b+atan(a)&amp;quot; mimic_vel=&amp;quot;|a 1 + 1/(1+a*a) |b 1&amp;quot; mimic_accel=&amp;quot;|a -2*a/((1+a*a)*(1+a*a)) |b 0&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using mimic joints, it is important to still make all the correct joint connections so that loops are discovered and forces can be computed correctly.&lt;br /&gt;
&lt;br /&gt;
If a joint has more than one degree of freedom, attach the axis index at the end. For example: &amp;quot;mimic_pos0&amp;quot;, &amp;quot;mimic_pos1&amp;quot;, &amp;quot;mimic_vel0&amp;quot;, &amp;quot;mimic_vel1&amp;quot;, &amp;quot;mimic_accel0&amp;quot;, and &amp;quot;mimic_accel1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Attaching Robot Sensors ===&lt;br /&gt;
&lt;br /&gt;
Every robot can be attached a number of sensors onto it. The way to specify this in XML is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specify an attached sensor--&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyFirstLaser&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;link&amp;gt;wam1&amp;lt;/link&amp;gt; &amp;lt;!-- the robot link that the sensor is attached to. As the robot moves, the sensor will move with it--&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 0.2 0.4&amp;lt;/translation&amp;gt; &amp;lt;!-- the local translation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt; &amp;lt;!-- the local rotation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify the real sensor attached--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;#039;type&amp;#039; is the sensor interface identifier--&amp;gt;&lt;br /&gt;
    &amp;lt;sensor type=&amp;quot;BaseLaser2D&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The rest are specific fields to BaseLaser2D, these change as the type changes--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The best way to find out what fields are supported is to look for the documentation--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- for the type of sensor using--&amp;gt;&lt;br /&gt;
      &amp;lt;minangle&amp;gt;-135&amp;lt;/minangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;maxangle&amp;gt;135&amp;lt;/maxangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;0.35&amp;lt;/resolution&amp;gt; &amp;lt;!-- degrees between laser points--&amp;gt;&lt;br /&gt;
      &amp;lt;maxrange&amp;gt;5&amp;lt;/maxrange&amp;gt; &amp;lt;!-- max range of robot--&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting joint values for initial state ===&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot&amp;#039;s initial state is not when all the joints are at 0. Instead of transforming each of the geometry to the zero pose, it is possible to set the initial angle to use using the &amp;lt;initial&amp;gt; tag inside the &amp;lt;joint&amp;gt;. The definition for setting the initial angle to pi/2 radius is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link0&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link1&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;initial&amp;gt;1.570796326794&amp;lt;/initial&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Changing the Body Coordinate System ===&lt;br /&gt;
&lt;br /&gt;
[[image:Barrettwam_coordchange.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot origin and rotation should be defined in a different coordinate system. It is possible to create a new robot file that references the old one and changes its origin. This requires adding a new root link before the robot is defined. For example, consider the robots/barrettwam.robot.xml file whre the first link&amp;#039;s name is &amp;#039;wam0&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- add new first link --&amp;gt;&lt;br /&gt;
  &amp;lt;kinbody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;root&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;robot file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;!-- change the coordinate system of the original first link and attach a dummy joint --&amp;gt;&lt;br /&gt;
    &amp;lt;kinbody&amp;gt;&lt;br /&gt;
      &amp;lt;body name=&amp;quot;wam0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0.3 0.4 0.3&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;root&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;wam0&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;limitsdeg&amp;gt;0 0&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
== Environment Example ==&lt;br /&gt;
&lt;br /&gt;
This example is part of the &amp;#039;&amp;#039;&amp;#039;bin/data/intel/lab1.env.xml&amp;#039;&amp;#039;&amp;#039; file. The most important thing to note about this example is the use of the &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; attribute to import other XML files. The filename specified with &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; has to be &amp;#039;&amp;#039;&amp;#039;relative&amp;#039;&amp;#039;&amp;#039; to the current directory where the file calling it resides. Note the differences between segway.kinbody.xml and barrettwam.robot.xml.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the background color of the environment--&amp;gt;&lt;br /&gt;
  &amp;lt;bkgndcolor&amp;gt;0.3 0.7 0.8&amp;lt;/bkgndcolor&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera translation--&amp;gt;&lt;br /&gt;
  &amp;lt;camtrans&amp;gt;1.418 -1.234 2.963&amp;lt;/camtrans&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera rotation specified by rotation-axis--&amp;gt;&lt;br /&gt;
  &amp;lt;camrotaxis&amp;gt;0.724 0.302 0.619 68&amp;lt;/camrotaxis&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import the segway model and place it somewhere--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;data/segway.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;-0.0671   -0.0819    0.7550&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import a robot file and add an additional body for a cylindrical base--&amp;gt;&lt;br /&gt;
  &amp;lt;Robot file=&amp;quot;../../robots/barrettwam.robot.xml&amp;quot; name=&amp;quot;BarrettWAM&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;-.22 -.14 -.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Body type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
          &amp;lt;radius&amp;gt;0.08&amp;lt;/radius&amp;gt;&lt;br /&gt;
          &amp;lt;height&amp;gt;0.6&amp;lt;/height&amp;gt;&lt;br /&gt;
          &amp;lt;diffusecolor&amp;gt;0.3 0.3 0.3&amp;lt;/diffusecolor&amp;gt;&lt;br /&gt;
          &amp;lt;Translation&amp;gt; 0.2286 0.1397 -0.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;/Geom&amp;gt;&lt;br /&gt;
      &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;-0.754 0.3265 1.036&amp;lt;/translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Robot&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- add the floor as a box--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody name=&amp;quot;floor&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- floor should never move, so make it static--&amp;gt;&lt;br /&gt;
    &amp;lt;Body type=&amp;quot;static&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;2 2 0.005&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;.6 .6 .6&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      	&amp;lt;ambientColor&amp;gt;0.6 0.6 0.6&amp;lt;/ambientColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting Robot Joint Values ===&lt;br /&gt;
&lt;br /&gt;
It is possible to set the joint values of the kinbody in the scene using the &amp;#039;&amp;#039;&amp;#039;&amp;lt;jointvalues&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag. The order of the values should be the order of the DOF indices of each joint (passive/mimic joints are ignored).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;environment&amp;gt;&lt;br /&gt;
  &amp;lt;robot file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;jointvalues&amp;gt;1 1 0 0 0 0 0 0.5 0 0 0&amp;lt;/jointvalues&amp;gt;&lt;br /&gt;
  &amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot Composition ==&lt;br /&gt;
&lt;br /&gt;
The way we recommend managing robots composed of several sub-robots (like a humanoid composed of arms, legs, hands, etc) is to first create separate .kinbody files for just the kinematics and geometry of each separate&lt;br /&gt;
part (ie a hand.kinbody.xml and a arm.kinbody.xml). Then create a robot file that includes both the kinematics and defines the manipulators, sensors, and controllers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;attachedsensor&amp;gt;&lt;br /&gt;
     ....&lt;br /&gt;
 &amp;lt;/attachedsensor&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sometimes for grasp planning, the hand needs to be treated as a robot, so we create a hand.robot.xml file as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. A robot can reference other robots through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;a.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;b.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both a&amp;#039;s and b&amp;#039;s &amp;#039;&amp;#039;&amp;#039;&amp;lt;Manipulator&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;AttachedSensor&amp;gt;&amp;#039;&amp;#039;&amp;#039; tags will be used&lt;br /&gt;
in the parent robot, so you don&amp;#039; t have to copy their definitions.&lt;br /&gt;
&lt;br /&gt;
2. It is possible to prefix the links and joints of a child robot by using the&lt;br /&gt;
&amp;#039;prefix&amp;#039; attribute:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;left_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;right_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now all links and joints will either start with &amp;#039;&amp;#039;&amp;#039;left_&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;right_&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
3. When the xml parser sees a body with the same name as another body,&lt;br /&gt;
it &amp;#039;appends&amp;#039; the specified geometries to the original body. This allows the same link to be referenced/defined in multiple robot files (Note that it is not possible to change the original body coordinate system).&lt;br /&gt;
&lt;br /&gt;
=== Attaching Separate Links ===&lt;br /&gt;
&lt;br /&gt;
When a robot is composed of multiple parts defined in different files, it is necessary to attach links from the different files together so that the robot hierarchy can be complete. This is done by defining &amp;#039;&amp;#039;&amp;#039;disabled&amp;#039;&amp;#039;&amp;#039; dummy joints that attach two links together. These disabled joints do not show up in the robot&amp;#039;s description and are only present to maintain the relative transformation between two links. For example, the robot &amp;#039;&amp;#039;&amp;#039;robots/pa10schunk.robot.xml&amp;#039;&amp;#039;&amp;#039; is composed of &amp;#039;&amp;#039;&amp;#039;robots/pa10.kinbody.xml&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;robots/schunk_manip.kinbody.xml&amp;#039;&amp;#039;&amp;#039;, in order to join the two, the robot  is defined in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;pa10.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody file=&amp;quot;schunk_manip.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;False&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;link7&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;gripper_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;#039;&amp;#039;&amp;#039;link7&amp;#039;&amp;#039;&amp;#039; is a link of the pa10 arm and &amp;#039;&amp;#039;&amp;#039;gripper_base&amp;#039;&amp;#039;&amp;#039; is a link of the gripper. The lower and upper joint limits are all 0, which OpenRAVE recognizes as a dummy joint.&lt;br /&gt;
&lt;br /&gt;
=== Joining A Robot Arm and Hand ===&lt;br /&gt;
&lt;br /&gt;
It is possible to load robots and bodies from COLLADA files by specifying the collada filename through the &amp;#039;&amp;#039;&amp;#039;file&amp;#039;&amp;#039;&amp;#039; attribute. For example, the following robot is a combination of an arm defined in OpenRAVE XML and a hand defined in COLLADA (download schunkSDHHand from [http://opengrasp.sourceforge.net/Downloads.html OpenGrasp]). The dummy joint is used to join the arm end effector with the hand base.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot file=&amp;quot;robots/kuka-kr5-r650.robot.xml&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot prefix=&amp;quot;hand_&amp;quot; file=&amp;quot;schunkSDHhand.dae&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody&amp;gt;&lt;br /&gt;
   &amp;lt;body name=&amp;quot;hand_root&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;offsetfrom&amp;gt;link6&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
     &amp;lt;translation&amp;gt;0.03 0 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
     &amp;lt;rotationaxis&amp;gt;0 1 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;joint type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;link6&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;hand_root&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
   &amp;lt;/joint&amp;gt;&lt;br /&gt;
 &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;base&amp;gt;base&amp;lt;/base&amp;gt;&lt;br /&gt;
   &amp;lt;effector&amp;gt;link6&amp;lt;/effector&amp;gt;&lt;br /&gt;
   &amp;lt;joints&amp;gt;hand_Bone_B1_Joint hand_Bone_B2_Joint hand_Bone_B3_Joint hand_Bone_A1_Joint hand_Bone_A2_Joint hand_Bone_A3_Joint hand_Bone_C1_Joint hand_Bone_C2_Joint hand_Bone_C3_Joint&amp;lt;/joints&amp;gt;&lt;br /&gt;
   &amp;lt;closingdirection&amp;gt;0 1 1 0 1 1 0 1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
   &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Final robot: [[image:collada_sdh_kuka.jpg|150px]]&lt;br /&gt;
&lt;br /&gt;
=== Dual-arm example ===&lt;br /&gt;
&lt;br /&gt;
Here is an example file of having a robot composed of two arms attached to a common link named &amp;#039;&amp;#039;&amp;#039;chest&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;schunk-dualarm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;chest&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;0.1 0.1 0.4&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0 0 0.4&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/geom&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- left arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody prefix=&amp;quot;l_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 -0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody&amp;gt;prefix=&amp;quot;r_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- connect the two arms with dummy joints --&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;leftdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;l_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;rightdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;r_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;!-- define the manipulators --&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;leftarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;l_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;l_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
    &amp;lt;armjoints&amp;gt;l_j0 l_j1 l_j2 l_j3 l_j4 l_j5 l_j6&amp;lt;/armjoints&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;rightarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;r_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;r_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
    &amp;lt;armjoints&amp;gt;r_j0 r_j1 r_j2 r_j3 r_j4 r_j5 r_j6&amp;lt;/armjoints&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Single arm: [[image:schunk-lwa3.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
Dual arm: [[image:schunk-lwa3-dual.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
== Custom XML ==&lt;br /&gt;
&lt;br /&gt;
Openrave provides much more flexibility in creating and defining custom XML readers for interfaces. First the &amp;lt;environment&amp;gt; XML tag supports creating any interface type and supports loading plugins. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;plugin&amp;gt;libcustomreader&amp;lt;/plugin&amp;gt;&lt;br /&gt;
  &amp;lt;robot name=&amp;quot;wam&amp;quot; file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;controller type=&amp;quot;CustomController&amp;quot; robot=&amp;quot;wam&amp;quot; args=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    ..custom data....&lt;br /&gt;
  &amp;lt;/controller&amp;gt;&lt;br /&gt;
  &amp;lt;module type=&amp;quot;basemanipulation&amp;quot; args=&amp;quot;wam&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example, openrave will first load the plugin, then will create a robot, and then will create a controller that is attached to the robot, then will create the basemanipulation module giving it the robot name as the argument.&lt;br /&gt;
&lt;br /&gt;
Furthermore, using EnvironmentBase::RegisterXMLReader, it is possible to set a parser for custom XML tags for each interface type.  For those curious on how to take advantage of custom readers, please refer to examples/plugincpp/customreader.cpp on how to attach a custom XML reader to a controller.&lt;br /&gt;
&lt;br /&gt;
These changes will allow people to setup all their specific environment settings in the XML files without having to rely on external scripts or other programs to do it. Note that OpenRAVE processes tags in depth first order.&lt;br /&gt;
&lt;br /&gt;
== Sensor ==&lt;br /&gt;
&lt;br /&gt;
It is possible to have XML files that declare a sensor and its internal parameters. For example, &amp;#039;&amp;#039;&amp;#039;data/camera.sensor.xml&amp;#039;&amp;#039;&amp;#039; can look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;sensor type=&amp;quot;BaseCamera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KK&amp;gt;640 640 320 240&amp;lt;/KK&amp;gt;&lt;br /&gt;
  &amp;lt;width&amp;gt;640&amp;lt;/width&amp;gt;&lt;br /&gt;
  &amp;lt;height&amp;gt;480&amp;lt;/height&amp;gt;&lt;br /&gt;
  &amp;lt;framerate&amp;gt;5&amp;lt;/framerate&amp;gt;&lt;br /&gt;
  &amp;lt;color&amp;gt;0.5 0.5 1&amp;lt;/color&amp;gt;&lt;br /&gt;
&amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to attach a sensor defined by a file to a robot link do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyCamera&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is also possible to put a sensor directly in the environment without a robot. Such a sensor will not have any geometry associated with it, and will only act as a sensing source.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... environment definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;sensor name=&amp;quot;mysensor&amp;quot; file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the sensor transform --&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 1 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
  &amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== XML Reference ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; All XML handling is done in &amp;#039;&amp;#039;&amp;#039;src/libopenrave-core/xmlreaders.cpp&amp;#039;&amp;#039;&amp;#039;. If there&amp;#039;s any parameters that are not explained well, make sure to check out that source file for further reference.&lt;br /&gt;
&lt;br /&gt;
Here&amp;#039;s a list of all possible fields the XML supports in a hierarchical structure.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;environment&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;bkgndcolor&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camrotaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camtrans&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;planner&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensorsystem&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file, robot, args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;inversekinematicssolver&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;physicsengine&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;collisionchecker&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;trajectory&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;viewer&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;server&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type, makejoinedlinksadjacent&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;adjacent&amp;#039;&amp;#039;&amp;#039; - 2 body names&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (dynamic, static)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;geom&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (box, sphere, trimesh, cylinder), render (true,false), modifiable (true,false)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;ambientcolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;collision&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;diffusecolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;extents&amp;#039;&amp;#039;&amp;#039; - 3 float [box]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;height&amp;#039;&amp;#039;&amp;#039; - float [cylinder]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float [cylinder, sphere]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;render&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;vertices&amp;#039;&amp;#039;&amp;#039; - 9*N floats where each 9 values defines 1 triangle with 3 vertices&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;com&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;inertia&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - body/link name&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;joint&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; enable (true, false), type (hinge, slider, universal, hinge2, spherical), circular(true, false), mimic_pos (math equation), mimic_vel (math equation), mimic_accel (math equation)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;anchor&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, hinge2, universal, spherical]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, slider]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis1&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis2&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limits&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsdeg&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in degrees if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsrad&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxvel&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxveldeg&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxaccel&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxacceldeg&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mode&amp;#039;&amp;#039;&amp;#039; - int [amotor]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - body/link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;resolution&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;weight&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;modelsdir&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - bodyname&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type (robot plugin type)&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;attachedsensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;link&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;...&amp;#039;&amp;#039;&amp;#039; - fields defined by SensorBase class instantiated by type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - type args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - name&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;manipulator&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;armjoints&amp;#039;&amp;#039;&amp;#039; - n joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;base&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closed&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;effector&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;iksolver&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;gripperjoints&amp;#039;&amp;#039;&amp;#039; - k joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closingdirection&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;direction&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - name, file, type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
&amp;lt;math&amp;gt;Insert formula here&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=FAQ&amp;diff=199</id>
		<title>FAQ</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=FAQ&amp;diff=199"/>
				<updated>2011-11-30T01:32:54Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installation Questions ==&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;openrave_robot_control and roscpp_sessions won&amp;#039;t compile in the ros package&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
#: These are broken for now, but you don&amp;#039;t need them for the openrave packages.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;How do I use OpenRAVE with ROS?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
#* Install the &amp;#039;&amp;#039;&amp;#039;rospackages&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;openrave&amp;#039;&amp;#039;, &amp;#039;&amp;#039;collada_robots&amp;#039;&amp;#039;, and &amp;#039;&amp;#039;soqt&amp;#039;&amp;#039; found on the ROS website.  Also make sure you have &amp;#039;&amp;#039;python-sympy&amp;#039;&amp;#039; from your OS repo.  Now, whenever you want to use openrave, just update your manifest.xml with a&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;depend package=&amp;quot;openrave&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
#* You also have another option, download openrave from source.  Compile and install it.  To add it to your ROS_PATH, you need a manifest.xml in an &amp;quot;openrave&amp;quot; folder inside your &amp;#039;&amp;#039;&amp;#039;ROS_PACKAGE_PATH&amp;#039;&amp;#039;&amp;#039;.  I need to update this and add a manifest.xml you can use. (just the same one from the ros repo install)&lt;br /&gt;
&lt;br /&gt;
== Physics and OpenRAVE ==&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;When I turned physics on, my robot fell apart.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
#: This is because the time step of your simulation is too large.  Try setting a smaller timestep (&amp;lt;= 0.001).&lt;br /&gt;
#: In python:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
env.StopSimulation()&lt;br /&gt;
env.StartSimularion(0.001)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
#: In C++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
EnvironmentBasePtr env = RaveCreateEnvironment;&lt;br /&gt;
env-&amp;gt;StopSimulation();&lt;br /&gt;
env-&amp;gt;StartSimularion(0.001);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Is there a parallel/modified ODE plugin?  What about setting contact joints?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
#* The ode engine from ROS (&amp;#039;&amp;#039;opende&amp;#039;&amp;#039;) employs a few patches, as well as a parallelization patch.  You can rosmake the opende package.  HOWEVER, then you must recompile the odeplugin (OpenRAVE plugin) and force OpenRAVE to use the sources and shared libraries from the modified ODE engine.  Lucky for you, the opende package has an odeconfig tool which spits out the correct flags for you.&lt;br /&gt;
#* There is also a plugin developed by CSIRO ASL.  Among the things they changed is allowing the individual parameter setting of contact joints in the xml. [https://code.launchpad.net/csiro-asl-ros-pkg Here] is the repo.  You need openrave in your &amp;#039;&amp;#039;&amp;#039;ROS_PACKAGE_PATH&amp;#039;&amp;#039;&amp;#039; to use its CMake.  It may be possible to modify the CMake file using openrave-config to get all the flags.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;My physics is unstable what can I do?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
#* The first most important thing you should do, is lower the timestep as stated above.&lt;br /&gt;
#* The second most important thing to do, is set your erp and cfm.  The OpenRAVE ODE plugin by default sets them extremely low.  An explanation can be found [http://opende.sourceforge.net/wiki/index.php/Manual_(Concepts)#Soft_constraint_and_constraint_force_mixing_.28CFM.29 here].&lt;br /&gt;
#** Just setting the &amp;lt;erp&amp;gt;0.4&amp;lt;/erp&amp;gt; drastically stabilized my simulations.&lt;br /&gt;
&lt;br /&gt;
== OpenRAVE Planners ==&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=BaseManipulation&amp;diff=198</id>
		<title>BaseManipulation</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=BaseManipulation&amp;diff=198"/>
				<updated>2011-11-30T01:30:56Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Code Examples ==&lt;br /&gt;
=== Setting A Robots Manipulators To Default ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt; &lt;br /&gt;
baseManip = RaveCreateModule(penv, &amp;quot;BaseManipulation&amp;quot;);&lt;br /&gt;
if(baseManip == NULL)&lt;br /&gt;
{&lt;br /&gt;
	ROS_FATAL(&amp;quot;Was unable to create module BaseManipulation.  Check your $OPENRAVE_PLUGINS\n&amp;quot;);&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
penv-&amp;gt;AddModule(baseManip, myRobot-&amp;gt;GetName());&lt;br /&gt;
//Move our manipulators to default positions so they don&amp;#039;t fall with physics...&lt;br /&gt;
stringstream sinput, soutput;&lt;br /&gt;
for(vector&amp;lt;RobotBase::ManipulatorPtr&amp;gt;::const_iterator myIt = myRobot-&amp;gt;GetManipulators().begin();&lt;br /&gt;
	myIt != myRobot-&amp;gt;GetManipulators().end(); myIt++)&lt;br /&gt;
{&lt;br /&gt;
	sinput.clear();&lt;br /&gt;
	sinput.str(&amp;quot;&amp;quot;);&lt;br /&gt;
	sinput &amp;lt;&amp;lt; &amp;quot;MoveManipulator goal&amp;quot;;&lt;br /&gt;
	for(unsigned int i = 0; i &amp;lt; (*myIt)-&amp;gt;GetArmIndices().size(); i++)&lt;br /&gt;
		sinput &amp;lt;&amp;lt; &amp;quot; 0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	myRobot-&amp;gt;SetActiveManipulator((*myIt)-&amp;gt;GetName());&lt;br /&gt;
	baseManip-&amp;gt;SendCommand(soutput, sinput);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=192</id>
		<title>Format:XML</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=192"/>
				<updated>2011-10-22T02:20:06Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
= OpenRAVE Custom XML Format =&lt;br /&gt;
&lt;br /&gt;
[[image:Openrave_robots.jpg|600px]] &lt;br /&gt;
&lt;br /&gt;
TODO: Decide on the versioning scheme&lt;br /&gt;
&lt;br /&gt;
OpenRAVE uses XML to store all robot and scene descriptions. The XML format is flexible enough to link one XML file from another like including already created objects/robots in an environment. It is also possible to specify vrml or iv formatted files within it to import models. &lt;br /&gt;
&lt;br /&gt;
All interface types can be created. Furthermore, an &amp;lt;environment&amp;gt; tag can optionally be specified to put all bodies/interfaces in.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Environment&amp;#039;&amp;#039;&amp;#039; - specify multiple objects and robots. Can also define some GUI properties like camera start location and background color. The environment allows the creation of &amp;#039;&amp;#039;&amp;#039;any&amp;#039;&amp;#039;&amp;#039; OpenRAVE interfaces. Each interface can take the &amp;#039;&amp;#039;&amp;#039;type&amp;#039;&amp;#039;&amp;#039; attribute specifying the interface type and can define custom XML readers.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039; - The basic object that all other objects derive from. A kinematic body consists of a collection of rigid bodies and joints that connect these bodies.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; - The basic robot that derives from &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039;. Usually every Robot has at least one KinBody declaration inside it. A robot can also hold a list of &amp;#039;&amp;#039;&amp;#039;Manipulator&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;AttachedSensor&amp;#039;&amp;#039;&amp;#039; objects describing the manipulation/sensing capabilities of the robot. Since plugin authors can create different robots, it is also possible to define custom fields in &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; to hold other information like balance control parameters for humanoids.&lt;br /&gt;
&lt;br /&gt;
== KinBody ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody name=&amp;quot;TestKinBody&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Create a rigid body named Body1 and declare it as &amp;#039;dynamic&amp;#039;.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;#039;dynamic&amp;#039; bodies are subject to physics laws, &amp;#039;static&amp;#039; bodies will never move--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- due to physical forces. It is recommended EVERYTHING is declared as &amp;#039;dynamic&amp;#039; --&amp;gt;&lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that the body transforms affects all geometry objects attached. --&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- translation of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;!--rotation of the body specified as a rotation axis. First three numbers are the axis.--&amp;gt;&lt;br /&gt;
    &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- defines mass properties for the entire kinbody. possible mass types are--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- mimicgeom - &amp;lt;density&amp;gt;. Adds a mass equivalent to all the geometry--&amp;gt;&lt;br /&gt;
    &amp;lt;!--    objects. trimesh and plane are not supported.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- box - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;extents&amp;gt; Adds a simple box--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- sphere - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;radius&amp;gt;--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;density&amp;gt;1000&amp;lt;/density&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Define a geometry object attached to the body. The functionality of --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- geometry objects is to define the collision and render geometries of the body. --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- All geometry types have Rotation(Mat/Quat), Translation, and Render components.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Possible geom types are box, sphere, trimesh, plane.--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *box - extents--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *sphere - radius--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *cylinder - radius, height (axis is along y)--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *trimesh - data--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- extents of the box - half width, height, length--&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;1 1 1&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;!-- set the translation and rotation of the box. Note that the transforamtions--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- are all relative to the parent body.--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;0 1 0 45&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Can create multiple geometries per body--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;2 1 2&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 1 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;!-- RotationMat is a 3x3 rotation matrix specified as rows first--&amp;gt;&lt;br /&gt;
      &amp;lt;RotationMat&amp;gt;1 0 0 0 1 0 0 0 1&amp;lt;/RotationMat&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Set the transparency of the geometry, 0 is opaque--&amp;gt;&lt;br /&gt;
      &amp;lt;transparency&amp;gt;0.4&amp;lt;/transparency&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- change the mass properties of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the total mass--&amp;gt;&lt;br /&gt;
      &amp;lt;total&amp;gt;0.40605&amp;lt;/total&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the 3x3 inertia matrix--&amp;gt;&lt;br /&gt;
      &amp;lt;inertia&amp;gt;2 0 0 0 3 0 0 0 5&amp;lt;/inertia&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the center of mass (if using ODE physics engine, should be 0)--&amp;gt;&lt;br /&gt;
      &amp;lt;com&amp;gt;0.008842 -0.000018 0.07367&amp;lt;/com&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a sphere--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;sphere&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- although the underlying collision geometry will be a sphere,--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- render it as a coffee pot--&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/coffeepot.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 -1.5 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Radius&amp;gt;1.5&amp;lt;/Radius&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a triangle mesh--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/cup.iv 0.01&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;!-- use the cup triangles for collision detection.--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The last number is the scale, in case the iv files are scaled improperly.--&amp;gt;&lt;br /&gt;
      &amp;lt;collision&amp;gt;models/objects/cup.iv 0.01&amp;lt;/collision&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1.5 -2 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Create a joint between the two bodies.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Possible joint types are: hinge, slider, universal, hinge2, and spherical.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Hinges are the most common joint type used in robots.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- For amotors, can specify mode, axis1, axis2, axis3. For each axis, first 3 values are the axis and the last value is the relative coord system (see ODE documentation).--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Every joint can have certain properties:--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxforce&amp;gt; are in number of degrees of freedom.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxvel&amp;gt;, &amp;lt;resolution&amp;gt; are scalar and apply to all DOFs.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;limits&amp;gt;, &amp;lt;limitsdeg&amp;gt;, &amp;lt;limitsrad&amp;gt; specify the joint limits --&amp;gt;&lt;br /&gt;
  &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Specify the names of the bodies, names are not case sensitive.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body1&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body2&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- anchor and axis of the hinge--&amp;gt;&lt;br /&gt;
    &amp;lt;Anchor&amp;gt;0 0 0&amp;lt;/Anchor&amp;gt;&lt;br /&gt;
    &amp;lt;Axis&amp;gt;0 1 0&amp;lt;/Axis&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Weight for configuration distance, mostly used in planners.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- for joints with &amp;gt; 1 DOF, specify 2+ values--&amp;gt;&lt;br /&gt;
    &amp;lt;Weight&amp;gt;1.0&amp;lt;/Weight&amp;gt;&lt;br /&gt;
  &amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Models Directory ===&lt;br /&gt;
&lt;br /&gt;
By default, the root directory for all models files is the folder openrave is launched at. To change this, &amp;#039;&amp;#039;&amp;#039;&amp;lt;modelsdir&amp;gt;&amp;#039;&amp;#039;&amp;#039; can be used to specify model files relative to where the current xml file is. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;modelsdir&amp;gt;../mymodels&amp;lt;/modelsdir&amp;gt;&lt;br /&gt;
  &amp;lt;Body&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;render&amp;gt;kitchen/myfile.wrl&amp;lt;/render&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Circular Joints ===&lt;br /&gt;
&lt;br /&gt;
Sometimes joints will have the upper and lower limits identified, meaning that as soon as the joint gets past one limit it will wrap around to the other. Infinitely revolving hinge joints are the most common example of &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; joints where the &amp;lt;math&amp;gt;-\pi&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; limits are identified. In openrave, it is possible to set a joint as &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; like this:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint circular=&amp;quot;true&amp;quot; ...&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Adjacent Links ===&lt;br /&gt;
&lt;br /&gt;
Robot self-collision usually checks all pairs of non-adjacent links for collision; links are adjacent if they are connected to a joint. In order to reduce self-collision computation time and spurious collisions of small links, it is possible to force pairs of links to be treated as adjacent by specifying an &amp;#039;&amp;#039;&amp;#039;&amp;lt;adjacent&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag.&lt;br /&gt;
&lt;br /&gt;
=== Scale ===&lt;br /&gt;
&lt;br /&gt;
The first thing when importing a new model is to check that all the units are in meters (it is very common for robots to be in millimeters), otherwise the visualization model and the collision model will be in a different scale. to check this, open the robot and go to View-&amp;gt;Geometry-&amp;gt;Collision, this will show the collision model. If it is not the same scale, you need to go inside your model files and change the units. You can also enter a scale factor after model filenames like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;collision&amp;gt;mydata.iv 0.001&amp;lt;/collision&amp;gt;&lt;br /&gt;
&amp;lt;render&amp;gt;mydata.iv 0.001&amp;lt;/render&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this will scale the models by 0.001.&lt;br /&gt;
&lt;br /&gt;
== Robot ==&lt;br /&gt;
&lt;br /&gt;
=== A simple 3DOF planar arm in XZ ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;3DOFRobot&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Create the base body, it should never move--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that all translations and rotations are with respect to this base--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- For example, the robot at the identity transformation is equivalent to the identity transformation of the first body.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Base&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.0  0.0  0.0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;radius&amp;gt;0.03&amp;lt;/radius&amp;gt;&lt;br /&gt;
        &amp;lt;height&amp;gt;0.02&amp;lt;/height&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;0.05 0.05 0.05&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the first movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm0&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Offset from is a fast way of specifying that the translation and rotation of this--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- body should be relative to another link--&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Base&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Translation relative to Base--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.01 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm0&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Base&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;4&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;3&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the second movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0.0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.0075 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the third movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.04 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.04 0.005 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;2&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;2&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Create the gripper joints:--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;RClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/RClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/RClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;RClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;RClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!--left gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;LClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0.005 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/LClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/LClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;LClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;LClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 -1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the transparency of every geometry in the KinBody--&amp;gt;&lt;br /&gt;
    &amp;lt;transparency&amp;gt;0.1&amp;lt;/transparency&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specifying the manipulator structure--&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;Arm2&amp;lt;/effector&amp;gt;   &amp;lt;!-- last link where end effector is attached--&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;Base&amp;lt;/base&amp;gt;           &amp;lt;!-- base link--&amp;gt;&lt;br /&gt;
    &amp;lt;joints&amp;gt;j1 j2&amp;lt;/joints&amp;gt;      &amp;lt;!-- the gripper joints used for contact--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- the id of the inverse kinematics solver, it is not necessary to--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify an ik solver for every robot. But if there is one,--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- use iksolver field to identity it.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;lt;iksolver&amp;gt;MyTriDOFSolver&amp;lt;/iksolver&amp;gt; --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- joint values of the closed and opened positions--&amp;gt;&lt;br /&gt;
    &amp;lt;closingdirection&amp;gt;1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
    &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
    &amp;lt;!-- grasp goal with respect to the effector--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0.125 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DOFRobot Robot:  [[image:tridof.jpg|200px]] &lt;br /&gt;
&lt;br /&gt;
=== Defining Manipulators ===&lt;br /&gt;
&lt;br /&gt;
A robot manipulator defines a kinematic chain of the robot joint hierarchy along with optional gripper joint values that are not used in the inverse kinematics computation but are needed for grasping purposes (chains for heads, legs do not need the joint values). A manipulator defines a new frame of reference with respect to the end effector link; all inverse kinematics computations are computed using it. Furthermore, a manipulator can have a &amp;#039;&amp;#039;&amp;#039;&amp;lt;direction&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying an axis for approaching objects or line-of-sight. For example the &amp;#039;&amp;#039;&amp;#039;robots/barrettwam.robot.xml&amp;#039;&amp;#039;&amp;#039; gripper is defined by&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;base&amp;gt;wam0&amp;lt;/base&amp;gt;&lt;br /&gt;
  &amp;lt;effector&amp;gt;wam7&amp;lt;/effector&amp;gt;&lt;br /&gt;
  &amp;lt;Translation&amp;gt;0 0 0.22&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;joints&amp;gt;JF1 JF2 JF3 JF4&amp;lt;/joints&amp;gt;&lt;br /&gt;
  &amp;lt;closingdirection&amp;gt;1 1 1 0&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
  &amp;lt;direction&amp;gt;0 0 1&amp;lt;/direction&amp;gt;&lt;br /&gt;
  &amp;lt;iksolver&amp;gt;WAM7ikfast 0.05&amp;lt;/iksolver&amp;gt;&lt;br /&gt;
&amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The manipulator can optionally define a &amp;#039;&amp;#039;&amp;#039;&amp;lt;iksolver&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying the iksolver interface that is used for getting IK solutions, or a shared object (DLL) to load an [[Component:Ikfast|ikfast]] solver from.&lt;br /&gt;
&lt;br /&gt;
=== Closed-chains and Mimic Joints ===&lt;br /&gt;
&lt;br /&gt;
OpenRAVE allows closed-chains and complex kinematics to be simulated using mimic joints. A mimic joint&amp;#039;s position, velocity, and acceleration values are computed from user-specified formulas using the values of other joints. OpenRAVE uses the Function Parser library to allow any formula to be specified. Refer to the documentation for more information [http://openrave.programmingvision.com/en/coreapihtml/classOpenRAVE_1_1KinBody_1_1Joint.html#a0e31c5be31c4145afa786e0c0d6a46ae here].&lt;br /&gt;
&lt;br /&gt;
A mimic joint requires at least the position equation and its partial derivatives (for velocity) to be manually entered. &lt;br /&gt;
&lt;br /&gt;
For example, the Barrett Hand mimic joints are defined as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;JF1&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;JF1mimic&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot; mimic_pos=&amp;quot;JF1/3+0.8727&amp;quot; mimic_vel=&amp;quot;|JF1 0.33333&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Of course, it is possible to have a mimic joint depend on more than one other joint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;b&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;c&amp;quot; type=&amp;quot;hinge&amp;quot; mimic_pos=&amp;quot;a+b+atan(a)&amp;quot; mimic_vel=&amp;quot;|a 1 + 1/(1+a*a) |b 1&amp;quot; mimic_accel=&amp;quot;|a -2*a/((1+a*a)*(1+a*a)) |b 0&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using mimic joints, it is important to still make all the correct joint connections so that loops are discovered and forces can be computed correctly.&lt;br /&gt;
&lt;br /&gt;
If a joint has more than one degree of freedom, attach the axis index at the end. For example: &amp;quot;mimic_pos0&amp;quot;, &amp;quot;mimic_pos1&amp;quot;, &amp;quot;mimic_vel0&amp;quot;, &amp;quot;mimic_vel1&amp;quot;, &amp;quot;mimic_accel0&amp;quot;, and &amp;quot;mimic_accel1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Attaching Robot Sensors ===&lt;br /&gt;
&lt;br /&gt;
Every robot can be attached a number of sensors onto it. The way to specify this in XML is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specify an attached sensor--&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyFirstLaser&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;link&amp;gt;wam1&amp;lt;/link&amp;gt; &amp;lt;!-- the robot link that the sensor is attached to. As the robot moves, the sensor will move with it--&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 0.2 0.4&amp;lt;/translation&amp;gt; &amp;lt;!-- the local translation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt; &amp;lt;!-- the local rotation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify the real sensor attached--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;#039;type&amp;#039; is the sensor interface identifier--&amp;gt;&lt;br /&gt;
    &amp;lt;sensor type=&amp;quot;BaseLaser2D&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The rest are specific fields to BaseLaser2D, these change as the type changes--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The best way to find out what fields are supported is to look for the documentation--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- for the type of sensor using--&amp;gt;&lt;br /&gt;
      &amp;lt;minangle&amp;gt;-135&amp;lt;/minangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;maxangle&amp;gt;135&amp;lt;/maxangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;0.35&amp;lt;/resolution&amp;gt; &amp;lt;!-- degrees between laser points--&amp;gt;&lt;br /&gt;
      &amp;lt;maxrange&amp;gt;5&amp;lt;/maxrange&amp;gt; &amp;lt;!-- max range of robot--&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting joint values for initial state ===&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot&amp;#039;s initial state is not when all the joints are at 0. Instead of transforming each of the geometry to the zero pose, it is possible to set the initial angle to use using the &amp;lt;initial&amp;gt; tag inside the &amp;lt;joint&amp;gt;. The definition for setting the initial angle to pi/2 radius is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link0&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link1&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;initial&amp;gt;1.570796326794&amp;lt;/initial&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Changing the Body Coordinate System ===&lt;br /&gt;
&lt;br /&gt;
[[image:Barrettwam_coordchange.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot origin and rotation should be defined in a different coordinate system. It is possible to create a new robot file that references the old one and changes its origin. This requires adding a new root link before the robot is defined. For example, consider the robots/barrettwam.robot.xml file whre the first link&amp;#039;s name is &amp;#039;wam0&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- add new first link --&amp;gt;&lt;br /&gt;
  &amp;lt;kinbody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;root&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;robot file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;!-- change the coordinate system of the original first link and attach a dummy joint --&amp;gt;&lt;br /&gt;
    &amp;lt;kinbody&amp;gt;&lt;br /&gt;
      &amp;lt;body name=&amp;quot;wam0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0.3 0.4 0.3&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;root&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;wam0&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;limitsdeg&amp;gt;0 0&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
== Environment Example ==&lt;br /&gt;
&lt;br /&gt;
This example is part of the &amp;#039;&amp;#039;&amp;#039;bin/data/intel/lab1.env.xml&amp;#039;&amp;#039;&amp;#039; file. The most important thing to note about this example is the use of the &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; attribute to import other XML files. The filename specified with &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; has to be &amp;#039;&amp;#039;&amp;#039;relative&amp;#039;&amp;#039;&amp;#039; to the current directory where the file calling it resides. Note the differences between segway.kinbody.xml and barrettwam.robot.xml.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the background color of the environment--&amp;gt;&lt;br /&gt;
  &amp;lt;bkgndcolor&amp;gt;0.3 0.7 0.8&amp;lt;/bkgndcolor&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera translation--&amp;gt;&lt;br /&gt;
  &amp;lt;camtrans&amp;gt;1.418 -1.234 2.963&amp;lt;/camtrans&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera rotation specified by rotation-axis--&amp;gt;&lt;br /&gt;
  &amp;lt;camrotaxis&amp;gt;0.724 0.302 0.619 68&amp;lt;/camrotaxis&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import the segway model and place it somewhere--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;data/segway.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;-0.0671   -0.0819    0.7550&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import a robot file and add an additional body for a cylindrical base--&amp;gt;&lt;br /&gt;
  &amp;lt;Robot file=&amp;quot;../../robots/barrettwam.robot.xml&amp;quot; name=&amp;quot;BarrettWAM&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;-.22 -.14 -.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Body type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
          &amp;lt;radius&amp;gt;0.08&amp;lt;/radius&amp;gt;&lt;br /&gt;
          &amp;lt;height&amp;gt;0.6&amp;lt;/height&amp;gt;&lt;br /&gt;
          &amp;lt;diffusecolor&amp;gt;0.3 0.3 0.3&amp;lt;/diffusecolor&amp;gt;&lt;br /&gt;
          &amp;lt;Translation&amp;gt; 0.2286 0.1397 -0.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;/Geom&amp;gt;&lt;br /&gt;
      &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;-0.754 0.3265 1.036&amp;lt;/translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Robot&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- add the floor as a box--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody name=&amp;quot;floor&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- floor should never move, so make it static--&amp;gt;&lt;br /&gt;
    &amp;lt;Body type=&amp;quot;static&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;2 2 0.005&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;.6 .6 .6&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      	&amp;lt;ambientColor&amp;gt;0.6 0.6 0.6&amp;lt;/ambientColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting Robot Joint Values ===&lt;br /&gt;
&lt;br /&gt;
It is possible to set the joint values of the kinbody in the scene using the &amp;#039;&amp;#039;&amp;#039;&amp;lt;jointvalues&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag. The order of the values should be the order of the DOF indices of each joint (passive/mimic joints are ignored).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;environment&amp;gt;&lt;br /&gt;
  &amp;lt;robot file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;jointvalues&amp;gt;1 1 0 0 0 0 0 0.5 0 0 0&amp;lt;/jointvalues&amp;gt;&lt;br /&gt;
  &amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot Composition ==&lt;br /&gt;
&lt;br /&gt;
The way we recommend managing robots composed of several sub-robots (like a humanoid composed of arms, legs, hands, etc) is to first create separate .kinbody files for just the kinematics and geometry of each separate&lt;br /&gt;
part (ie a hand.kinbody.xml and a arm.kinbody.xml). Then create a robot file that includes both the kinematics and defines the manipulators, sensors, and controllers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;attachedsensor&amp;gt;&lt;br /&gt;
     ....&lt;br /&gt;
 &amp;lt;/attachedsensor&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sometimes for grasp planning, the hand needs to be treated as a robot, so we create a hand.robot.xml file as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. A robot can reference other robots through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;a.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;b.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both a&amp;#039;s and b&amp;#039;s &amp;#039;&amp;#039;&amp;#039;&amp;lt;Manipulator&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;AttachedSensor&amp;gt;&amp;#039;&amp;#039;&amp;#039; tags will be used&lt;br /&gt;
in the parent robot, so you don&amp;#039; t have to copy their definitions.&lt;br /&gt;
&lt;br /&gt;
2. It is possible to prefix the links and joints of a child robot by using the&lt;br /&gt;
&amp;#039;prefix&amp;#039; attribute:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;left_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;right_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now all links and joints will either start with &amp;#039;&amp;#039;&amp;#039;left_&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;right_&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
3. When the xml parser sees a body with the same name as another body,&lt;br /&gt;
it &amp;#039;appends&amp;#039; the specified geometries to the original body. This allows the same link to be referenced/defined in multiple robot files (Note that it is not possible to change the original body coordinate system).&lt;br /&gt;
&lt;br /&gt;
=== Attaching Separate Links ===&lt;br /&gt;
&lt;br /&gt;
When a robot is composed of multiple parts defined in different files, it is necessary to attach links from the different files together so that the robot hierarchy can be complete. This is done by defining &amp;#039;&amp;#039;&amp;#039;disabled&amp;#039;&amp;#039;&amp;#039; dummy joints that attach two links together. These disabled joints do not show up in the robot&amp;#039;s description and are only present to maintain the relative transformation between two links. For example, the robot &amp;#039;&amp;#039;&amp;#039;robots/pa10schunk.robot.xml&amp;#039;&amp;#039;&amp;#039; is composed of &amp;#039;&amp;#039;&amp;#039;robots/pa10.kinbody.xml&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;robots/schunk_manip.kinbody.xml&amp;#039;&amp;#039;&amp;#039;, in order to join the two, the robot  is defined in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;pa10.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody file=&amp;quot;schunk_manip.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;False&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;link7&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;gripper_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;#039;&amp;#039;&amp;#039;link7&amp;#039;&amp;#039;&amp;#039; is a link of the pa10 arm and &amp;#039;&amp;#039;&amp;#039;gripper_base&amp;#039;&amp;#039;&amp;#039; is a link of the gripper. The lower and upper joint limits are all 0, which OpenRAVE recognizes as a dummy joint.&lt;br /&gt;
&lt;br /&gt;
=== Joining A Robot Arm and Hand ===&lt;br /&gt;
&lt;br /&gt;
It is possible to load robots and bodies from COLLADA files by specifying the collada filename through the &amp;#039;&amp;#039;&amp;#039;file&amp;#039;&amp;#039;&amp;#039; attribute. For example, the following robot is a combination of an arm defined in OpenRAVE XML and a hand defined in COLLADA (download schunkSDHHand from [http://opengrasp.sourceforge.net/Downloads.html OpenGrasp]). The dummy joint is used to join the arm end effector with the hand base.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot file=&amp;quot;robots/kuka-kr5-r650.robot.xml&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot prefix=&amp;quot;hand_&amp;quot; file=&amp;quot;schunkSDHhand.dae&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody&amp;gt;&lt;br /&gt;
   &amp;lt;body name=&amp;quot;hand_root&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;offsetfrom&amp;gt;link6&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
     &amp;lt;translation&amp;gt;0.03 0 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
     &amp;lt;rotationaxis&amp;gt;0 1 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;joint type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;link6&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;hand_root&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
   &amp;lt;/joint&amp;gt;&lt;br /&gt;
 &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;base&amp;gt;base&amp;lt;/base&amp;gt;&lt;br /&gt;
   &amp;lt;effector&amp;gt;link6&amp;lt;/effector&amp;gt;&lt;br /&gt;
   &amp;lt;joints&amp;gt;hand_Bone_B1_Joint hand_Bone_B2_Joint hand_Bone_B3_Joint hand_Bone_A1_Joint hand_Bone_A2_Joint hand_Bone_A3_Joint hand_Bone_C1_Joint hand_Bone_C2_Joint hand_Bone_C3_Joint&amp;lt;/joints&amp;gt;&lt;br /&gt;
   &amp;lt;closingdirection&amp;gt;0 1 1 0 1 1 0 1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
   &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Final robot: [[image:collada_sdh_kuka.jpg|150px]]&lt;br /&gt;
&lt;br /&gt;
=== Dual-arm example ===&lt;br /&gt;
&lt;br /&gt;
Here is an example file of having a robot composed of two arms attached to a common link named &amp;#039;&amp;#039;&amp;#039;chest&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;schunk-dualarm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;chest&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;0.1 0.1 0.4&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0 0 0.4&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/geom&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- left arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody prefix=&amp;quot;l_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 -0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody&amp;gt;prefix=&amp;quot;r_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- connect the two arms with dummy joints --&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;leftdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;l_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;rightdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;r_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;!-- define the manipulators --&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;leftarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;l_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;l_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
    &amp;lt;armjoints&amp;gt;l_j0 l_j1 l_j2 l_j3 l_j4 l_j5 l_j6&amp;lt;/armjoints&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;rightarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;r_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;r_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
    &amp;lt;armjoints&amp;gt;r_j0 r_j1 r_j2 r_j3 r_j4 r_j5 r_j6&amp;lt;/armjoints&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Single arm: [[image:schunk-lwa3.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
Dual arm: [[image:schunk-lwa3-dual.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
== Custom XML ==&lt;br /&gt;
&lt;br /&gt;
Openrave provides much more flexibility in creating and defining custom XML readers for interfaces. First the &amp;lt;environment&amp;gt; XML tag supports creating any interface type and supports loading plugins. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;plugin&amp;gt;libcustomreader&amp;lt;/plugin&amp;gt;&lt;br /&gt;
  &amp;lt;robot name=&amp;quot;wam&amp;quot; file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;controller type=&amp;quot;CustomController&amp;quot; robot=&amp;quot;wam&amp;quot; args=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    ..custom data....&lt;br /&gt;
  &amp;lt;/controller&amp;gt;&lt;br /&gt;
  &amp;lt;module type=&amp;quot;basemanipulation&amp;quot; args=&amp;quot;wam&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example, openrave will first load the plugin, then will create a robot, and then will create a controller that is attached to the robot, then will create the basemanipulation module giving it the robot name as the argument.&lt;br /&gt;
&lt;br /&gt;
Furthermore, using EnvironmentBase::RegisterXMLReader, it is possible to set a parser for custom XML tags for each interface type.  For those curious on how to take advantage of custom readers, please refer to examples/plugincpp/customreader.cpp on how to attach a custom XML reader to a controller.&lt;br /&gt;
&lt;br /&gt;
These changes will allow people to setup all their specific environment settings in the XML files without having to rely on external scripts or other programs to do it. Note that OpenRAVE processes tags in depth first order.&lt;br /&gt;
&lt;br /&gt;
== Sensor ==&lt;br /&gt;
&lt;br /&gt;
It is possible to have XML files that declare a sensor and its internal parameters. For example, &amp;#039;&amp;#039;&amp;#039;data/camera.sensor.xml&amp;#039;&amp;#039;&amp;#039; can look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;sensor type=&amp;quot;BaseCamera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KK&amp;gt;640 640 320 240&amp;lt;/KK&amp;gt;&lt;br /&gt;
  &amp;lt;width&amp;gt;640&amp;lt;/width&amp;gt;&lt;br /&gt;
  &amp;lt;height&amp;gt;480&amp;lt;/height&amp;gt;&lt;br /&gt;
  &amp;lt;framerate&amp;gt;5&amp;lt;/framerate&amp;gt;&lt;br /&gt;
  &amp;lt;color&amp;gt;0.5 0.5 1&amp;lt;/color&amp;gt;&lt;br /&gt;
&amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to attach a sensor defined by a file to a robot link do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyCamera&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is also possible to put a sensor directly in the environment without a robot. Such a sensor will not have any geometry associated with it, and will only act as a sensing source.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... environment definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;sensor name=&amp;quot;mysensor&amp;quot; file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the sensor transform --&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 1 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
  &amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== XML Reference ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; All XML handling is done in &amp;#039;&amp;#039;&amp;#039;src/libopenrave-core/xmlreaders.cpp&amp;#039;&amp;#039;&amp;#039;. If there&amp;#039;s any parameters that are not explained well, make sure to check out that source file for further reference.&lt;br /&gt;
&lt;br /&gt;
Here&amp;#039;s a list of all possible fields the XML supports in a hierarchical structure.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;environment&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;bkgndcolor&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camrotaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camtrans&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;planner&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensorsystem&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file, robot, args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;inversekinematicssolver&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;physicsengine&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;collisionchecker&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;trajectory&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;viewer&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;server&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type, makejoinedlinksadjacent&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;adjacent&amp;#039;&amp;#039;&amp;#039; - 2 body names&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (dynamic, static)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;geom&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (box, sphere, trimesh, cylinder), render (true,false), modifiable (true,false)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;ambientcolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;collision&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;diffusecolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;extents&amp;#039;&amp;#039;&amp;#039; - 3 float [box]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;height&amp;#039;&amp;#039;&amp;#039; - float [cylinder]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float [cylinder, sphere]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;render&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;vertices&amp;#039;&amp;#039;&amp;#039; - 9*N floats where each 9 values defines 1 triangle with 3 vertices&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;com&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;inertia&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - body/link name&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;joint&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; enable (true, false), type (hinge, slider, universal, hinge2, spherical), circular(true, false), mimic_pos (math equation), mimic_vel (math equation), mimic_accel (math equation)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;anchor&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, hinge2, universal, spherical]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, slider]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis1&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis2&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limits&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsdeg&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in degrees if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsrad&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxvel&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxveldeg&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxaccel&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxacceldeg&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mode&amp;#039;&amp;#039;&amp;#039; - int [amotor]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - body/link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;resolution&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;weight&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;modelsdir&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - bodyname&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type (robot plugin type)&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;attachedsensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;link&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;...&amp;#039;&amp;#039;&amp;#039; - fields defined by SensorBase class instantiated by type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - type args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - name&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;manipulator&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;armjoints&amp;#039;&amp;#039;&amp;#039; - n joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;base&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closed&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;effector&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;iksolver&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;gripperjoints&amp;#039;&amp;#039;&amp;#039; - k joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closingdirection&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;direction&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - name, file, type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
&amp;lt;math&amp;gt;Insert formula here&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=191</id>
		<title>Format:XML</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=191"/>
				<updated>2011-09-29T16:23:55Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
= OpenRAVE Custom XML Format =&lt;br /&gt;
&lt;br /&gt;
[[image:Openrave_robots.jpg|600px]] &lt;br /&gt;
&lt;br /&gt;
TODO: Decide on the versioning scheme&lt;br /&gt;
&lt;br /&gt;
OpenRAVE uses XML to store all robot and scene descriptions. The XML format is flexible enough to link one XML file from another like including already created objects/robots in an environment. It is also possible to specify vrml or iv formatted files within it to import models. &lt;br /&gt;
&lt;br /&gt;
All interface types can be created. Furthermore, an &amp;lt;environment&amp;gt; tag can optionally be specified to put all bodies/interfaces in.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Environment&amp;#039;&amp;#039;&amp;#039; - specify multiple objects and robots. Can also define some GUI properties like camera start location and background color. The environment allows the creation of &amp;#039;&amp;#039;&amp;#039;any&amp;#039;&amp;#039;&amp;#039; OpenRAVE interfaces. Each interface can take the &amp;#039;&amp;#039;&amp;#039;type&amp;#039;&amp;#039;&amp;#039; attribute specifying the interface type and can define custom XML readers.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039; - The basic object that all other objects derive from. A kinematic body consists of a collection of rigid bodies and joints that connect these bodies.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; - The basic robot that derives from &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039;. Usually every Robot has at least one KinBody declaration inside it. A robot can also hold a list of &amp;#039;&amp;#039;&amp;#039;Manipulator&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;AttachedSensor&amp;#039;&amp;#039;&amp;#039; objects describing the manipulation/sensing capabilities of the robot. Since plugin authors can create different robots, it is also possible to define custom fields in &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; to hold other information like balance control parameters for humanoids.&lt;br /&gt;
&lt;br /&gt;
== KinBody ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody name=&amp;quot;TestKinBody&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Create a rigid body named Body1 and declare it as &amp;#039;dynamic&amp;#039;.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;#039;dynamic&amp;#039; bodies are subject to physics laws, &amp;#039;static&amp;#039; bodies will never move--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- due to physical forces. It is recommended EVERYTHING is declared as &amp;#039;dynamic&amp;#039; --&amp;gt;&lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that the body transforms affects all geometry objects attached. --&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- translation of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;!--rotation of the body specified as a rotation axis. First three numbers are the axis.--&amp;gt;&lt;br /&gt;
    &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- defines mass properties for the entire kinbody. possible mass types are--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- mimicgeom - &amp;lt;density&amp;gt;. Adds a mass equivalent to all the geometry--&amp;gt;&lt;br /&gt;
    &amp;lt;!--    objects. trimesh and plane are not supported.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- box - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;extents&amp;gt; Adds a simple box--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- sphere - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;radius&amp;gt;--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;density&amp;gt;1000&amp;lt;/density&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Define a geometry object attached to the body. The functionality of --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- geometry objects is to define the collision and render geometries of the body. --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- All geometry types have Rotation(Mat/Quat), Translation, and Render components.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Possible geom types are box, sphere, trimesh, plane.--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *box - extents--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *sphere - radius--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *cylinder - radius, height (axis is along y)--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *trimesh - data--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- extents of the box - half width, height, length--&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;1 1 1&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;!-- set the translation and rotation of the box. Note that the transforamtions--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- are all relative to the parent body.--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;0 1 0 45&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Can create multiple geometries per body--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;2 1 2&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 1 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;!-- RotationMat is a 3x3 rotation matrix specified as rows first--&amp;gt;&lt;br /&gt;
      &amp;lt;RotationMat&amp;gt;1 0 0 0 1 0 0 0 1&amp;lt;/RotationMat&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Set the transparency of the geometry, 0 is opaque--&amp;gt;&lt;br /&gt;
      &amp;lt;transparency&amp;gt;0.4&amp;lt;/transparency&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- change the mass properties of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the total mass--&amp;gt;&lt;br /&gt;
      &amp;lt;total&amp;gt;0.40605&amp;lt;/total&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the 3x3 inertia matrix--&amp;gt;&lt;br /&gt;
      &amp;lt;inertia&amp;gt;2 0 0 0 3 0 0 0 5&amp;lt;/inertia&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the center of mass (if using ODE physics engine, should be 0)--&amp;gt;&lt;br /&gt;
      &amp;lt;com&amp;gt;0.008842 -0.000018 0.07367&amp;lt;/com&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a sphere--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;sphere&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- although the underlying collision geometry will be a sphere,--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- render it as a coffee pot--&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/coffeepot.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 -1.5 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Radius&amp;gt;1.5&amp;lt;/Radius&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a triangle mesh--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/cup.iv 0.01&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;!-- use the cup triangles for collision detection.--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The last number is the scale, in case the iv files are scaled improperly.--&amp;gt;&lt;br /&gt;
      &amp;lt;collision&amp;gt;models/objects/cup.iv 0.01&amp;lt;/collision&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1.5 -2 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Create a joint between the two bodies.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Possible joint types are: hinge, slider, universal, hinge2, and spherical.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Hinges are the most common joint type used in robots.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- For amotors, can specify mode, axis1, axis2, axis3. For each axis, first 3 values are the axis and the last value is the relative coord system (see ODE documentation).--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Every joint can have certain properties:--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxforce&amp;gt; are in number of degrees of freedom.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxvel&amp;gt;, &amp;lt;resolution&amp;gt; are scalar and apply to all DOFs.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;limits&amp;gt;, &amp;lt;limitsdeg&amp;gt;, &amp;lt;limitsrad&amp;gt; specify the joint limits --&amp;gt;&lt;br /&gt;
  &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Specify the names of the bodies, names are not case sensitive.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body1&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body2&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- anchor and axis of the hinge--&amp;gt;&lt;br /&gt;
    &amp;lt;Anchor&amp;gt;0 0 0&amp;lt;/Anchor&amp;gt;&lt;br /&gt;
    &amp;lt;Axis&amp;gt;0 1 0&amp;lt;/Axis&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Weight for configuration distance, mostly used in planners.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- for joints with &amp;gt; 1 DOF, specify 2+ values--&amp;gt;&lt;br /&gt;
    &amp;lt;Weight&amp;gt;1.0&amp;lt;/Weight&amp;gt;&lt;br /&gt;
  &amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Models Directory ===&lt;br /&gt;
&lt;br /&gt;
By default, the root directory for all models files is the folder openrave is launched at. To change this, &amp;#039;&amp;#039;&amp;#039;&amp;lt;modelsdir&amp;gt;&amp;#039;&amp;#039;&amp;#039; can be used to specify model files relative to where the current xml file is. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;modelsdir&amp;gt;../mymodels&amp;lt;/modelsdir&amp;gt;&lt;br /&gt;
  &amp;lt;Body&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;render&amp;gt;kitchen/myfile.wrl&amp;lt;/render&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Circular Joints ===&lt;br /&gt;
&lt;br /&gt;
Sometimes joints will have the upper and lower limits identified, meaning that as soon as the joint gets past one limit it will wrap around to the other. Infinitely revolving hinge joints are the most common example of &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; joints where the &amp;lt;math&amp;gt;-\pi&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; limits are identified. In openrave, it is possible to set a joint as &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; like this:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint circular=&amp;quot;true&amp;quot; ...&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Adjacent Links ===&lt;br /&gt;
&lt;br /&gt;
Robot self-collision usually checks all pairs of non-adjacent links for collision; links are adjacent if they are connected to a joint. In order to reduce self-collision computation time and spurious collisions of small links, it is possible to force pairs of links to be treated as adjacent by specifying an &amp;#039;&amp;#039;&amp;#039;&amp;lt;adjacent&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag.&lt;br /&gt;
&lt;br /&gt;
=== Scale ===&lt;br /&gt;
&lt;br /&gt;
The first thing when importing a new model is to check that all the units are in meters (it is very common for robots to be in millimeters), otherwise the visualization model and the collision model will be in a different scale. to check this, open the robot and go to View-&amp;gt;Geometry-&amp;gt;Collision, this will show the collision model. If it is not the same scale, you need to go inside your model files and change the units. You can also enter a scale factor after model filenames like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;collision&amp;gt;mydata.iv 0.001&amp;lt;/collision&amp;gt;&lt;br /&gt;
&amp;lt;render&amp;gt;mydata.iv 0.001&amp;lt;/render&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this will scale the models by 0.001.&lt;br /&gt;
&lt;br /&gt;
== Robot ==&lt;br /&gt;
&lt;br /&gt;
=== A simple 3DOF planar arm in XZ ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;3DOFRobot&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Create the base body, it should never move--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that all translations and rotations are with respect to this base--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- For example, the robot at the identity transformation is equivalent to the identity transformation of the first body.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Base&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.0  0.0  0.0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;radius&amp;gt;0.03&amp;lt;/radius&amp;gt;&lt;br /&gt;
        &amp;lt;height&amp;gt;0.02&amp;lt;/height&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;0.05 0.05 0.05&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the first movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm0&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Offset from is a fast way of specifying that the translation and rotation of this--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- body should be relative to another link--&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Base&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Translation relative to Base--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.01 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm0&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Base&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;4&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;3&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the second movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0.0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.0075 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the third movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.04 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.04 0.005 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;2&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;2&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Create the gripper joints:--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;RClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/RClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/RClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;RClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;RClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!--left gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;LClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0.005 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/LClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/LClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;LClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;LClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 -1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the transparency of every geometry in the KinBody--&amp;gt;&lt;br /&gt;
    &amp;lt;transparency&amp;gt;0.1&amp;lt;/transparency&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specifying the manipulator structure--&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;Arm2&amp;lt;/effector&amp;gt;   &amp;lt;!-- last link where end effector is attached--&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;Base&amp;lt;/base&amp;gt;           &amp;lt;!-- base link--&amp;gt;&lt;br /&gt;
    &amp;lt;joints&amp;gt;j1 j2&amp;lt;/joints&amp;gt;      &amp;lt;!-- the gripper joints used for contact--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- the id of the inverse kinematics solver, it is not necessary to--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify an ik solver for every robot. But if there is one,--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- use iksolver field to identity it.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;lt;iksolver&amp;gt;MyTriDOFSolver&amp;lt;/iksolver&amp;gt; --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- joint values of the closed and opened positions--&amp;gt;&lt;br /&gt;
    &amp;lt;closingdirection&amp;gt;1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
    &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
    &amp;lt;!-- grasp goal with respect to the effector--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0.125 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DOFRobot Robot:  [[image:tridof.jpg|200px]] &lt;br /&gt;
&lt;br /&gt;
=== Defining Manipulators ===&lt;br /&gt;
&lt;br /&gt;
A robot manipulator defines a kinematic chain of the robot joint hierarchy along with optional gripper joint values that are not used in the inverse kinematics computation but are needed for grasping purposes (chains for heads, legs do not need the joint values). A manipulator defines a new frame of reference with respect to the end effector link; all inverse kinematics computations are computed using it. Furthermore, a manipulator can have a &amp;#039;&amp;#039;&amp;#039;&amp;lt;direction&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying an axis for approaching objects or line-of-sight. For example the &amp;#039;&amp;#039;&amp;#039;robots/barrettwam.robot.xml&amp;#039;&amp;#039;&amp;#039; gripper is defined by&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;base&amp;gt;wam0&amp;lt;/base&amp;gt;&lt;br /&gt;
  &amp;lt;effector&amp;gt;wam7&amp;lt;/effector&amp;gt;&lt;br /&gt;
  &amp;lt;Translation&amp;gt;0 0 0.22&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;joints&amp;gt;JF1 JF2 JF3 JF4&amp;lt;/joints&amp;gt;&lt;br /&gt;
  &amp;lt;closingdirection&amp;gt;1 1 1 0&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
  &amp;lt;direction&amp;gt;0 0 1&amp;lt;/direction&amp;gt;&lt;br /&gt;
  &amp;lt;iksolver&amp;gt;WAM7ikfast 0.05&amp;lt;/iksolver&amp;gt;&lt;br /&gt;
&amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The manipulator can optionally define a &amp;#039;&amp;#039;&amp;#039;&amp;lt;iksolver&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying the iksolver interface that is used for getting IK solutions, or a shared object (DLL) to load an [[Component:Ikfast|ikfast]] solver from.&lt;br /&gt;
&lt;br /&gt;
=== Closed-chains and Mimic Joints ===&lt;br /&gt;
&lt;br /&gt;
OpenRAVE allows closed-chains and complex kinematics to be simulated using mimic joints. A mimic joint&amp;#039;s position, velocity, and acceleration values are computed from user-specified formulas using the values of other joints. OpenRAVE uses the Function Parser library to allow any formula to be specified. Refer to the documentation for more information [http://openrave.programmingvision.com/en/coreapihtml/classOpenRAVE_1_1KinBody_1_1Joint.html#a0e31c5be31c4145afa786e0c0d6a46ae here].&lt;br /&gt;
&lt;br /&gt;
A mimic joint requires at least the position equation and its partial derivatives (for velocity) to be manually entered. &lt;br /&gt;
&lt;br /&gt;
For example, the Barrett Hand mimic joints are defined as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;JF1&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;JF1mimic&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot; mimic_pos=&amp;quot;JF1/3+0.8727&amp;quot; mimic_vel=&amp;quot;|JF1 0.33333&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Of course, it is possible to have a mimic joint depend on more than one other joint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;b&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;c&amp;quot; type=&amp;quot;hinge&amp;quot; mimic_pos=&amp;quot;a+b+atan(a)&amp;quot; mimic_vel=&amp;quot;|a 1 + 1/(1+a*a) |b 1&amp;quot; mimic_accel=&amp;quot;|a -2*a/((1+a*a)*(1+a*a)) |b 0&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using mimic joints, it is important to still make all the correct joint connections so that loops are discovered and forces can be computed correctly.&lt;br /&gt;
&lt;br /&gt;
If a joint has more than one degree of freedom, attach the axis index at the end. For example: &amp;quot;mimic_pos0&amp;quot;, &amp;quot;mimic_pos1&amp;quot;, &amp;quot;mimic_vel0&amp;quot;, &amp;quot;mimic_vel1&amp;quot;, &amp;quot;mimic_accel0&amp;quot;, and &amp;quot;mimic_accel1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Attaching Robot Sensors ===&lt;br /&gt;
&lt;br /&gt;
Every robot can be attached a number of sensors onto it. The way to specify this in XML is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specify an attached sensor--&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyFirstLaser&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;link&amp;gt;wam1&amp;lt;/link&amp;gt; &amp;lt;!-- the robot link that the sensor is attached to. As the robot moves, the sensor will move with it--&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 0.2 0.4&amp;lt;/translation&amp;gt; &amp;lt;!-- the local translation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt; &amp;lt;!-- the local rotation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify the real sensor attached--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;#039;type&amp;#039; is the sensor interface identifier--&amp;gt;&lt;br /&gt;
    &amp;lt;sensor type=&amp;quot;BaseLaser2D&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The rest are specific fields to BaseLaser2D, these change as the type changes--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The best way to find out what fields are supported is to look for the documentation--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- for the type of sensor using--&amp;gt;&lt;br /&gt;
      &amp;lt;minangle&amp;gt;-135&amp;lt;/minangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;maxangle&amp;gt;135&amp;lt;/maxangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;0.35&amp;lt;/resolution&amp;gt; &amp;lt;!-- degrees between laser points--&amp;gt;&lt;br /&gt;
      &amp;lt;maxrange&amp;gt;5&amp;lt;/maxrange&amp;gt; &amp;lt;!-- max range of robot--&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting joint values for initial state ===&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot&amp;#039;s initial state is not when all the joints are at 0. Instead of transforming each of the geometry to the zero pose, it is possible to set the initial angle to use using the &amp;lt;initial&amp;gt; tag inside the &amp;lt;joint&amp;gt;. The definition for setting the initial angle to pi/2 radius is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link0&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link1&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;initial&amp;gt;1.570796326794&amp;lt;/initial&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Changing the Body Coordinate System ===&lt;br /&gt;
&lt;br /&gt;
[[image:Barrettwam_coordchange.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot origin and rotation should be defined in a different coordinate system. It is possible to create a new robot file that references the old one and changes its origin. This requires adding a new root link before the robot is defined. For example, consider the robots/barrettwam.robot.xml file whre the first link&amp;#039;s name is &amp;#039;wam0&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- add new first link --&amp;gt;&lt;br /&gt;
  &amp;lt;kinbody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;root&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;robot file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;!-- change the coordinate system of the original first link and attach a dummy joint --&amp;gt;&lt;br /&gt;
    &amp;lt;kinbody&amp;gt;&lt;br /&gt;
      &amp;lt;body name=&amp;quot;wam0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0.3 0.4 0.3&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;root&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;wam0&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;limitsdeg&amp;gt;0 0&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
== Environment Example ==&lt;br /&gt;
&lt;br /&gt;
This example is part of the &amp;#039;&amp;#039;&amp;#039;bin/data/intel/lab1.env.xml&amp;#039;&amp;#039;&amp;#039; file. The most important thing to note about this example is the use of the &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; attribute to import other XML files. The filename specified with &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; has to be &amp;#039;&amp;#039;&amp;#039;relative&amp;#039;&amp;#039;&amp;#039; to the current directory where the file calling it resides. Note the differences between segway.kinbody.xml and barrettwam.robot.xml.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the background color of the environment--&amp;gt;&lt;br /&gt;
  &amp;lt;bkgndcolor&amp;gt;0.3 0.7 0.8&amp;lt;/bkgndcolor&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera translation--&amp;gt;&lt;br /&gt;
  &amp;lt;camtrans&amp;gt;1.418 -1.234 2.963&amp;lt;/camtrans&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera rotation specified by rotation-axis--&amp;gt;&lt;br /&gt;
  &amp;lt;camrotaxis&amp;gt;0.724 0.302 0.619 68&amp;lt;/camrotaxis&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import the segway model and place it somewhere--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;data/segway.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;-0.0671   -0.0819    0.7550&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import a robot file and add an additional body for a cylindrical base--&amp;gt;&lt;br /&gt;
  &amp;lt;Robot file=&amp;quot;../../robots/barrettwam.robot.xml&amp;quot; name=&amp;quot;BarrettWAM&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;-.22 -.14 -.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Body type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
          &amp;lt;radius&amp;gt;0.08&amp;lt;/radius&amp;gt;&lt;br /&gt;
          &amp;lt;height&amp;gt;0.6&amp;lt;/height&amp;gt;&lt;br /&gt;
          &amp;lt;diffusecolor&amp;gt;0.3 0.3 0.3&amp;lt;/diffusecolor&amp;gt;&lt;br /&gt;
          &amp;lt;Translation&amp;gt; 0.2286 0.1397 -0.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;/Geom&amp;gt;&lt;br /&gt;
      &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;-0.754 0.3265 1.036&amp;lt;/translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Robot&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- add the floor as a box--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody name=&amp;quot;floor&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- floor should never move, so make it static--&amp;gt;&lt;br /&gt;
    &amp;lt;Body type=&amp;quot;static&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;2 2 0.005&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;.6 .6 .6&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      	&amp;lt;ambientColor&amp;gt;0.6 0.6 0.6&amp;lt;/ambientColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting Robot Joint Values ===&lt;br /&gt;
&lt;br /&gt;
It is possible to set the joint values of the kinbody in the scene using the &amp;#039;&amp;#039;&amp;#039;&amp;lt;jointvalues&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag. The order of the values should be the order of the DOF indices of each joint (passive/mimic joints are ignored).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;environment&amp;gt;&lt;br /&gt;
  &amp;lt;robot file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;jointvalues&amp;gt;1 1 0 0 0 0 0 0.5 0 0 0&amp;lt;/jointvalues&amp;gt;&lt;br /&gt;
  &amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot Composition ==&lt;br /&gt;
&lt;br /&gt;
The way we recommend managing robots composed of several sub-robots (like a humanoid composed of arms, legs, hands, etc) is to first create separate .kinbody files for just the kinematics and geometry of each separate&lt;br /&gt;
part (ie a hand.kinbody.xml and a arm.kinbody.xml). Then create a robot file that includes both the kinematics and defines the manipulators, sensors, and controllers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;attachedsensor&amp;gt;&lt;br /&gt;
     ....&lt;br /&gt;
 &amp;lt;/attachedsensor&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sometimes for grasp planning, the hand needs to be treated as a robot, so we create a hand.robot.xml file as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. A robot can reference other robots through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;a.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;b.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both a&amp;#039;s and b&amp;#039;s &amp;#039;&amp;#039;&amp;#039;&amp;lt;Manipulator&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;AttachedSensor&amp;gt;&amp;#039;&amp;#039;&amp;#039; tags will be used&lt;br /&gt;
in the parent robot, so you don&amp;#039; t have to copy their definitions.&lt;br /&gt;
&lt;br /&gt;
2. It is possible to prefix the links and joints of a child robot by using the&lt;br /&gt;
&amp;#039;prefix&amp;#039; attribute:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;left_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;right_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now all links and joints will either start with &amp;#039;&amp;#039;&amp;#039;left_&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;right_&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
3. When the xml parser sees a body with the same name as another body,&lt;br /&gt;
it &amp;#039;appends&amp;#039; the specified geometries to the original body. This allows the same link to be referenced/defined in multiple robot files (Note that it is not possible to change the original body coordinate system).&lt;br /&gt;
&lt;br /&gt;
=== Attaching Separate Links ===&lt;br /&gt;
&lt;br /&gt;
When a robot is composed of multiple parts defined in different files, it is necessary to attach links from the different files together so that the robot hierarchy can be complete. This is done by defining &amp;#039;&amp;#039;&amp;#039;disabled&amp;#039;&amp;#039;&amp;#039; dummy joints that attach two links together. These disabled joints do not show up in the robot&amp;#039;s description and are only present to maintain the relative transformation between two links. For example, the robot &amp;#039;&amp;#039;&amp;#039;robots/pa10schunk.robot.xml&amp;#039;&amp;#039;&amp;#039; is composed of &amp;#039;&amp;#039;&amp;#039;robots/pa10.kinbody.xml&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;robots/schunk_manip.kinbody.xml&amp;#039;&amp;#039;&amp;#039;, in order to join the two, the robot  is defined in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;pa10.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody file=&amp;quot;schunk_manip.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;False&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;link7&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;gripper_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;#039;&amp;#039;&amp;#039;link7&amp;#039;&amp;#039;&amp;#039; is a link of the pa10 arm and &amp;#039;&amp;#039;&amp;#039;gripper_base&amp;#039;&amp;#039;&amp;#039; is a link of the gripper. The lower and upper joint limits are all 0, which OpenRAVE recognizes as a dummy joint.&lt;br /&gt;
&lt;br /&gt;
=== Joining A Robot Arm and Hand ===&lt;br /&gt;
&lt;br /&gt;
It is possible to load robots and bodies from COLLADA files by specifying the collada filename through the &amp;#039;&amp;#039;&amp;#039;file&amp;#039;&amp;#039;&amp;#039; attribute. For example, the following robot is a combination of an arm defined in OpenRAVE XML and a hand defined in COLLADA (download schunkSDHHand from [http://opengrasp.sourceforge.net/Downloads.html OpenGrasp]). The dummy joint is used to join the arm end effector with the hand base.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot file=&amp;quot;robots/kuka-kr5-r650.robot.xml&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot prefix=&amp;quot;hand_&amp;quot; file=&amp;quot;schunkSDHhand.dae&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody&amp;gt;&lt;br /&gt;
   &amp;lt;body name=&amp;quot;hand_root&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;offsetfrom&amp;gt;link6&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
     &amp;lt;translation&amp;gt;0.03 0 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
     &amp;lt;rotationaxis&amp;gt;0 1 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;joint type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;link6&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;hand_root&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
   &amp;lt;/joint&amp;gt;&lt;br /&gt;
 &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;base&amp;gt;base&amp;lt;/base&amp;gt;&lt;br /&gt;
   &amp;lt;effector&amp;gt;link6&amp;lt;/effector&amp;gt;&lt;br /&gt;
   &amp;lt;joints&amp;gt;hand_Bone_B1_Joint hand_Bone_B2_Joint hand_Bone_B3_Joint hand_Bone_A1_Joint hand_Bone_A2_Joint hand_Bone_A3_Joint hand_Bone_C1_Joint hand_Bone_C2_Joint hand_Bone_C3_Joint&amp;lt;/joints&amp;gt;&lt;br /&gt;
   &amp;lt;closingdirection&amp;gt;0 1 1 0 1 1 0 1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
   &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Final robot: [[image:collada_sdh_kuka.jpg|150px]]&lt;br /&gt;
&lt;br /&gt;
=== Dual-arm example ===&lt;br /&gt;
&lt;br /&gt;
Here is an example file of having a robot composed of two arms attached to a common link named &amp;#039;&amp;#039;&amp;#039;chest&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;schunk-dualarm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;chest&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;0.1 0.1 0.4&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0 0 0.4&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/geom&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- left arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody prefix=&amp;quot;l_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 -0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody&amp;gt;prefix=&amp;quot;r_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- connect the two arms with dummy joints --&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;leftdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;l_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;rightdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;r_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;!-- define the manipulators --&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;leftarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;l_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;l_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
    &amp;lt;armjoints&amp;gt;l_j0 l_j1 l_j2 l_j3 l_j4 l_j5 l_j6&amp;lt;/armjoints&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;rightarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;r_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;r_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
    &amp;lt;armjoints&amp;gt;r_j0 r_j1 r_j2 r_j3 r_j4 r_j5 r_j6&amp;lt;/armjoints&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Single arm: [[image:schunk-lwa3.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
Dual arm: [[image:schunk-lwa3-dual.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
== Custom XML ==&lt;br /&gt;
&lt;br /&gt;
Openrave provides much more flexibility in creating and defining custom XML readers for interfaces. First the &amp;lt;environment&amp;gt; XML tag supports creating any interface type and supports loading plugins. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;plugin&amp;gt;libcustomreader&amp;lt;/plugin&amp;gt;&lt;br /&gt;
  &amp;lt;robot name=&amp;quot;wam&amp;quot; file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;controller type=&amp;quot;CustomController&amp;quot; robot=&amp;quot;wam&amp;quot; args=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    ..custom data....&lt;br /&gt;
  &amp;lt;/controller&amp;gt;&lt;br /&gt;
  &amp;lt;module type=&amp;quot;basemanipulation&amp;quot; args=&amp;quot;wam&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example, openrave will first load the plugin, then will create a robot, and then will create a controller that is attached to the robot, then will create the basemanipulation module giving it the robot name as the argument.&lt;br /&gt;
&lt;br /&gt;
Furthermore, using EnvironmentBase::RegisterXMLReader, it is possible to set a parser for custom XML tags for each interface type.  For those curious on how to take advantage of custom readers, please refer to examples/plugincpp/customreader.cpp on how to attach a custom XML reader to a controller.&lt;br /&gt;
&lt;br /&gt;
These changes will allow people to setup all their specific environment settings in the XML files without having to rely on external scripts or other programs to do it. Note that OpenRAVE processes tags in depth first order.&lt;br /&gt;
&lt;br /&gt;
== Sensor ==&lt;br /&gt;
&lt;br /&gt;
It is possible to have XML files that declare a sensor and its internal parameters. For example, &amp;#039;&amp;#039;&amp;#039;data/camera.sensor.xml&amp;#039;&amp;#039;&amp;#039; can look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;sensor type=&amp;quot;BaseCamera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KK&amp;gt;640 640 320 240&amp;lt;/KK&amp;gt;&lt;br /&gt;
  &amp;lt;width&amp;gt;640&amp;lt;/width&amp;gt;&lt;br /&gt;
  &amp;lt;height&amp;gt;480&amp;lt;/height&amp;gt;&lt;br /&gt;
  &amp;lt;framerate&amp;gt;5&amp;lt;/framerate&amp;gt;&lt;br /&gt;
  &amp;lt;color&amp;gt;0.5 0.5 1&amp;lt;/color&amp;gt;&lt;br /&gt;
&amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to attach a sensor defined by a file to a robot link do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyCamera&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is also possible to put a sensor directly in the environment without a robot. Such a sensor will not have any geometry associated with it, and will only act as a sensing source.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... environment definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;sensor name=&amp;quot;mysensor&amp;quot; file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the sensor transform --&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 1 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
  &amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== XML Reference ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; All XML handling is done in &amp;#039;&amp;#039;&amp;#039;src/libopenrave-core/xmlreaders.cpp&amp;#039;&amp;#039;&amp;#039;. If there&amp;#039;s any parameters that are not explained well, make sure to check out that source file for further reference.&lt;br /&gt;
&lt;br /&gt;
Here&amp;#039;s a list of all possible fields the XML supports in a hierarchical structure.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;environment&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;bkgndcolor&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camrotaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camtrans&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;planner&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensorsystem&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file, robot, args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;inversekinematicssolver&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;physicsengine&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;collisionchecker&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;trajectory&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;viewer&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;server&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type, makejoinedlinksadjacent&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;adjacent&amp;#039;&amp;#039;&amp;#039; - 2 body names&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (dynamic, static)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;geom&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (box, sphere, trimesh, cylinder), render (true,false), modifiable (true,false)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;ambientcolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;collision&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;diffusecolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;extents&amp;#039;&amp;#039;&amp;#039; - 3 float [box]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;height&amp;#039;&amp;#039;&amp;#039; - float [cylinder]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float [cylinder, sphere]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;render&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;vertices&amp;#039;&amp;#039;&amp;#039; - 9*N floats where each 9 values defines 1 triangle with 3 vertices&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;com&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;inertia&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - body/link name&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;joint&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; enable (true, false), type (hinge, slider, universal, hinge2, spherical), circular(true, false), mimic_pos (math equation), mimic_vel (math equation), mimic_accel (math equation)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;anchor&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, hinge2, universal, spherical]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, slider]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis1&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis2&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limits&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsdeg&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in degrees if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsrad&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxvel&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxveldeg&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxaccel&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxacceldeg&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mode&amp;#039;&amp;#039;&amp;#039; - int [amotor]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - body/link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;resolution&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;weight&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;modelsdir&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - bodyname&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type (robot plugin type)&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;attachedsensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;link&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;...&amp;#039;&amp;#039;&amp;#039; - fields defined by SensorBase class instantiated by type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - type args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - name&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;manipulator&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;armjoints&amp;#039;&amp;#039;&amp;#039; - n joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;base&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closed&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;effector&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;iksolver&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;gripperjoints&amp;#039;&amp;#039;&amp;#039; - k joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closingdirection&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;palmdirection&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - name, file, type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
&amp;lt;math&amp;gt;Insert formula here&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=190</id>
		<title>Format:XML</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=190"/>
				<updated>2011-09-29T16:12:46Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
= OpenRAVE Custom XML Format =&lt;br /&gt;
&lt;br /&gt;
[[image:Openrave_robots.jpg|600px]] &lt;br /&gt;
&lt;br /&gt;
TODO: Decide on the versioning scheme&lt;br /&gt;
&lt;br /&gt;
OpenRAVE uses XML to store all robot and scene descriptions. The XML format is flexible enough to link one XML file from another like including already created objects/robots in an environment. It is also possible to specify vrml or iv formatted files within it to import models. &lt;br /&gt;
&lt;br /&gt;
All interface types can be created. Furthermore, an &amp;lt;environment&amp;gt; tag can optionally be specified to put all bodies/interfaces in.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Environment&amp;#039;&amp;#039;&amp;#039; - specify multiple objects and robots. Can also define some GUI properties like camera start location and background color. The environment allows the creation of &amp;#039;&amp;#039;&amp;#039;any&amp;#039;&amp;#039;&amp;#039; OpenRAVE interfaces. Each interface can take the &amp;#039;&amp;#039;&amp;#039;type&amp;#039;&amp;#039;&amp;#039; attribute specifying the interface type and can define custom XML readers.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039; - The basic object that all other objects derive from. A kinematic body consists of a collection of rigid bodies and joints that connect these bodies.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; - The basic robot that derives from &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039;. Usually every Robot has at least one KinBody declaration inside it. A robot can also hold a list of &amp;#039;&amp;#039;&amp;#039;Manipulator&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;AttachedSensor&amp;#039;&amp;#039;&amp;#039; objects describing the manipulation/sensing capabilities of the robot. Since plugin authors can create different robots, it is also possible to define custom fields in &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; to hold other information like balance control parameters for humanoids.&lt;br /&gt;
&lt;br /&gt;
== KinBody ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody name=&amp;quot;TestKinBody&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Create a rigid body named Body1 and declare it as &amp;#039;dynamic&amp;#039;.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;#039;dynamic&amp;#039; bodies are subject to physics laws, &amp;#039;static&amp;#039; bodies will never move--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- due to physical forces. It is recommended EVERYTHING is declared as &amp;#039;dynamic&amp;#039; --&amp;gt;&lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that the body transforms affects all geometry objects attached. --&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- translation of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;!--rotation of the body specified as a rotation axis. First three numbers are the axis.--&amp;gt;&lt;br /&gt;
    &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- defines mass properties for the entire kinbody. possible mass types are--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- mimicgeom - &amp;lt;density&amp;gt;. Adds a mass equivalent to all the geometry--&amp;gt;&lt;br /&gt;
    &amp;lt;!--    objects. trimesh and plane are not supported.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- box - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;extents&amp;gt; Adds a simple box--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- sphere - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;radius&amp;gt;--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;density&amp;gt;1000&amp;lt;/density&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Define a geometry object attached to the body. The functionality of --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- geometry objects is to define the collision and render geometries of the body. --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- All geometry types have Rotation(Mat/Quat), Translation, and Render components.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Possible geom types are box, sphere, trimesh, plane.--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *box - extents--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *sphere - radius--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *cylinder - radius, height (axis is along y)--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *trimesh - data--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- extents of the box - half width, height, length--&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;1 1 1&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;!-- set the translation and rotation of the box. Note that the transforamtions--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- are all relative to the parent body.--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;0 1 0 45&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Can create multiple geometries per body--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;2 1 2&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 1 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;!-- RotationMat is a 3x3 rotation matrix specified as rows first--&amp;gt;&lt;br /&gt;
      &amp;lt;RotationMat&amp;gt;1 0 0 0 1 0 0 0 1&amp;lt;/RotationMat&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Set the transparency of the geometry, 0 is opaque--&amp;gt;&lt;br /&gt;
      &amp;lt;transparency&amp;gt;0.4&amp;lt;/transparency&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- change the mass properties of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the total mass--&amp;gt;&lt;br /&gt;
      &amp;lt;total&amp;gt;0.40605&amp;lt;/total&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the 3x3 inertia matrix--&amp;gt;&lt;br /&gt;
      &amp;lt;inertia&amp;gt;2 0 0 0 3 0 0 0 5&amp;lt;/inertia&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the center of mass (if using ODE physics engine, should be 0)--&amp;gt;&lt;br /&gt;
      &amp;lt;com&amp;gt;0.008842 -0.000018 0.07367&amp;lt;/com&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a sphere--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;sphere&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- although the underlying collision geometry will be a sphere,--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- render it as a coffee pot--&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/coffeepot.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 -1.5 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Radius&amp;gt;1.5&amp;lt;/Radius&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a triangle mesh--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/cup.iv 0.01&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;!-- use the cup triangles for collision detection.--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The last number is the scale, in case the iv files are scaled improperly.--&amp;gt;&lt;br /&gt;
      &amp;lt;collision&amp;gt;models/objects/cup.iv 0.01&amp;lt;/collision&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1.5 -2 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Create a joint between the two bodies.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Possible joint types are: hinge, slider, universal, hinge2, and spherical.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Hinges are the most common joint type used in robots.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- For amotors, can specify mode, axis1, axis2, axis3. For each axis, first 3 values are the axis and the last value is the relative coord system (see ODE documentation).--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Every joint can have certain properties:--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxforce&amp;gt; are in number of degrees of freedom.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxvel&amp;gt;, &amp;lt;resolution&amp;gt; are scalar and apply to all DOFs.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;limits&amp;gt;, &amp;lt;limitsdeg&amp;gt;, &amp;lt;limitsrad&amp;gt; specify the joint limits --&amp;gt;&lt;br /&gt;
  &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Specify the names of the bodies, names are not case sensitive.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body1&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body2&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- anchor and axis of the hinge--&amp;gt;&lt;br /&gt;
    &amp;lt;Anchor&amp;gt;0 0 0&amp;lt;/Anchor&amp;gt;&lt;br /&gt;
    &amp;lt;Axis&amp;gt;0 1 0&amp;lt;/Axis&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Weight for configuration distance, mostly used in planners.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- for joints with &amp;gt; 1 DOF, specify 2+ values--&amp;gt;&lt;br /&gt;
    &amp;lt;Weight&amp;gt;1.0&amp;lt;/Weight&amp;gt;&lt;br /&gt;
  &amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Models Directory ===&lt;br /&gt;
&lt;br /&gt;
By default, the root directory for all models files is the folder openrave is launched at. To change this, &amp;#039;&amp;#039;&amp;#039;&amp;lt;modelsdir&amp;gt;&amp;#039;&amp;#039;&amp;#039; can be used to specify model files relative to where the current xml file is. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;modelsdir&amp;gt;../mymodels&amp;lt;/modelsdir&amp;gt;&lt;br /&gt;
  &amp;lt;Body&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;render&amp;gt;kitchen/myfile.wrl&amp;lt;/render&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Circular Joints ===&lt;br /&gt;
&lt;br /&gt;
Sometimes joints will have the upper and lower limits identified, meaning that as soon as the joint gets past one limit it will wrap around to the other. Infinitely revolving hinge joints are the most common example of &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; joints where the &amp;lt;math&amp;gt;-\pi&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; limits are identified. In openrave, it is possible to set a joint as &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; like this:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint circular=&amp;quot;true&amp;quot; ...&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Adjacent Links ===&lt;br /&gt;
&lt;br /&gt;
Robot self-collision usually checks all pairs of non-adjacent links for collision; links are adjacent if they are connected to a joint. In order to reduce self-collision computation time and spurious collisions of small links, it is possible to force pairs of links to be treated as adjacent by specifying an &amp;#039;&amp;#039;&amp;#039;&amp;lt;adjacent&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag.&lt;br /&gt;
&lt;br /&gt;
=== Scale ===&lt;br /&gt;
&lt;br /&gt;
The first thing when importing a new model is to check that all the units are in meters (it is very common for robots to be in millimeters), otherwise the visualization model and the collision model will be in a different scale. to check this, open the robot and go to View-&amp;gt;Geometry-&amp;gt;Collision, this will show the collision model. If it is not the same scale, you need to go inside your model files and change the units. You can also enter a scale factor after model filenames like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;collision&amp;gt;mydata.iv 0.001&amp;lt;/collision&amp;gt;&lt;br /&gt;
&amp;lt;render&amp;gt;mydata.iv 0.001&amp;lt;/render&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this will scale the models by 0.001.&lt;br /&gt;
&lt;br /&gt;
== Robot ==&lt;br /&gt;
&lt;br /&gt;
=== A simple 3DOF planar arm in XZ ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;3DOFRobot&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Create the base body, it should never move--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that all translations and rotations are with respect to this base--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- For example, the robot at the identity transformation is equivalent to the identity transformation of the first body.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Base&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.0  0.0  0.0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;radius&amp;gt;0.03&amp;lt;/radius&amp;gt;&lt;br /&gt;
        &amp;lt;height&amp;gt;0.02&amp;lt;/height&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;0.05 0.05 0.05&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the first movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm0&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Offset from is a fast way of specifying that the translation and rotation of this--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- body should be relative to another link--&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Base&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Translation relative to Base--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.01 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm0&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Base&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;4&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;3&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the second movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0.0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.0075 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the third movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.04 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.04 0.005 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;2&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;2&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Create the gripper joints:--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;RClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/RClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/RClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;RClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;RClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!--left gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;LClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0.005 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/LClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/LClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;LClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;LClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 -1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the transparency of every geometry in the KinBody--&amp;gt;&lt;br /&gt;
    &amp;lt;transparency&amp;gt;0.1&amp;lt;/transparency&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specifying the manipulator structure--&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;Arm2&amp;lt;/effector&amp;gt;   &amp;lt;!-- last link where end effector is attached--&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;Base&amp;lt;/base&amp;gt;           &amp;lt;!-- base link--&amp;gt;&lt;br /&gt;
    &amp;lt;joints&amp;gt;j1 j2&amp;lt;/joints&amp;gt;      &amp;lt;!-- the gripper joints used for contact--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- the id of the inverse kinematics solver, it is not necessary to--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify an ik solver for every robot. But if there is one,--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- use iksolver field to identity it.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;lt;iksolver&amp;gt;MyTriDOFSolver&amp;lt;/iksolver&amp;gt; --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- joint values of the closed and opened positions--&amp;gt;&lt;br /&gt;
    &amp;lt;closingdirection&amp;gt;1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
    &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
    &amp;lt;!-- grasp goal with respect to the effector--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0.125 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DOFRobot Robot:  [[image:tridof.jpg|200px]] &lt;br /&gt;
&lt;br /&gt;
=== Defining Manipulators ===&lt;br /&gt;
&lt;br /&gt;
A robot manipulator defines a kinematic chain of the robot joint hierarchy along with optional gripper joint values that are not used in the inverse kinematics computation but are needed for grasping purposes (chains for heads, legs do not need the joint values). A manipulator defines a new frame of reference with respect to the end effector link; all inverse kinematics computations are computed using it. Furthermore, a manipulator can have a &amp;#039;&amp;#039;&amp;#039;&amp;lt;direction&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying an axis for approaching objects or line-of-sight. For example the &amp;#039;&amp;#039;&amp;#039;robots/barrettwam.robot.xml&amp;#039;&amp;#039;&amp;#039; gripper is defined by&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;base&amp;gt;wam0&amp;lt;/base&amp;gt;&lt;br /&gt;
  &amp;lt;effector&amp;gt;wam7&amp;lt;/effector&amp;gt;&lt;br /&gt;
  &amp;lt;Translation&amp;gt;0 0 0.22&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;joints&amp;gt;JF1 JF2 JF3 JF4&amp;lt;/joints&amp;gt;&lt;br /&gt;
  &amp;lt;closingdirection&amp;gt;1 1 1 0&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
  &amp;lt;direction&amp;gt;0 0 1&amp;lt;/direction&amp;gt;&lt;br /&gt;
  &amp;lt;iksolver&amp;gt;WAM7ikfast 0.05&amp;lt;/iksolver&amp;gt;&lt;br /&gt;
&amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The manipulator can optionally define a &amp;#039;&amp;#039;&amp;#039;&amp;lt;iksolver&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying the iksolver interface that is used for getting IK solutions, or a shared object (DLL) to load an [[Component:Ikfast|ikfast]] solver from.&lt;br /&gt;
&lt;br /&gt;
=== Closed-chains and Mimic Joints ===&lt;br /&gt;
&lt;br /&gt;
OpenRAVE allows closed-chains and complex kinematics to be simulated using mimic joints. A mimic joint&amp;#039;s position, velocity, and acceleration values are computed from user-specified formulas using the values of other joints. OpenRAVE uses the Function Parser library to allow any formula to be specified. Refer to the documentation for more information [http://openrave.programmingvision.com/en/coreapihtml/classOpenRAVE_1_1KinBody_1_1Joint.html#a0e31c5be31c4145afa786e0c0d6a46ae here].&lt;br /&gt;
&lt;br /&gt;
A mimic joint requires at least the position equation and its partial derivatives (for velocity) to be manually entered. &lt;br /&gt;
&lt;br /&gt;
For example, the Barrett Hand mimic joints are defined as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;JF1&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;JF1mimic&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot; mimic_pos=&amp;quot;JF1/3+0.8727&amp;quot; mimic_vel=&amp;quot;|JF1 0.33333&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Of course, it is possible to have a mimic joint depend on more than one other joint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;b&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;c&amp;quot; type=&amp;quot;hinge&amp;quot; mimic_pos=&amp;quot;a+b+atan(a)&amp;quot; mimic_vel=&amp;quot;|a 1 + 1/(1+a*a) |b 1&amp;quot; mimic_accel=&amp;quot;|a -2*a/((1+a*a)*(1+a*a)) |b 0&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using mimic joints, it is important to still make all the correct joint connections so that loops are discovered and forces can be computed correctly.&lt;br /&gt;
&lt;br /&gt;
If a joint has more than one degree of freedom, attach the axis index at the end. For example: &amp;quot;mimic_pos0&amp;quot;, &amp;quot;mimic_pos1&amp;quot;, &amp;quot;mimic_vel0&amp;quot;, &amp;quot;mimic_vel1&amp;quot;, &amp;quot;mimic_accel0&amp;quot;, and &amp;quot;mimic_accel1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Attaching Robot Sensors ===&lt;br /&gt;
&lt;br /&gt;
Every robot can be attached a number of sensors onto it. The way to specify this in XML is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specify an attached sensor--&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyFirstLaser&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;link&amp;gt;wam1&amp;lt;/link&amp;gt; &amp;lt;!-- the robot link that the sensor is attached to. As the robot moves, the sensor will move with it--&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 0.2 0.4&amp;lt;/translation&amp;gt; &amp;lt;!-- the local translation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt; &amp;lt;!-- the local rotation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify the real sensor attached--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;#039;type&amp;#039; is the sensor interface identifier--&amp;gt;&lt;br /&gt;
    &amp;lt;sensor type=&amp;quot;BaseLaser2D&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The rest are specific fields to BaseLaser2D, these change as the type changes--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The best way to find out what fields are supported is to look for the documentation--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- for the type of sensor using--&amp;gt;&lt;br /&gt;
      &amp;lt;minangle&amp;gt;-135&amp;lt;/minangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;maxangle&amp;gt;135&amp;lt;/maxangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;0.35&amp;lt;/resolution&amp;gt; &amp;lt;!-- degrees between laser points--&amp;gt;&lt;br /&gt;
      &amp;lt;maxrange&amp;gt;5&amp;lt;/maxrange&amp;gt; &amp;lt;!-- max range of robot--&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting joint values for initial state ===&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot&amp;#039;s initial state is not when all the joints are at 0. Instead of transforming each of the geometry to the zero pose, it is possible to set the initial angle to use using the &amp;lt;initial&amp;gt; tag inside the &amp;lt;joint&amp;gt;. The definition for setting the initial angle to pi/2 radius is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link0&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link1&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;initial&amp;gt;1.570796326794&amp;lt;/initial&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Changing the Body Coordinate System ===&lt;br /&gt;
&lt;br /&gt;
[[image:Barrettwam_coordchange.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot origin and rotation should be defined in a different coordinate system. It is possible to create a new robot file that references the old one and changes its origin. This requires adding a new root link before the robot is defined. For example, consider the robots/barrettwam.robot.xml file whre the first link&amp;#039;s name is &amp;#039;wam0&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- add new first link --&amp;gt;&lt;br /&gt;
  &amp;lt;kinbody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;root&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;robot file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;!-- change the coordinate system of the original first link and attach a dummy joint --&amp;gt;&lt;br /&gt;
    &amp;lt;kinbody&amp;gt;&lt;br /&gt;
      &amp;lt;body name=&amp;quot;wam0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0.3 0.4 0.3&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;root&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;wam0&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;limitsdeg&amp;gt;0 0&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
== Environment Example ==&lt;br /&gt;
&lt;br /&gt;
This example is part of the &amp;#039;&amp;#039;&amp;#039;bin/data/intel/lab1.env.xml&amp;#039;&amp;#039;&amp;#039; file. The most important thing to note about this example is the use of the &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; attribute to import other XML files. The filename specified with &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; has to be &amp;#039;&amp;#039;&amp;#039;relative&amp;#039;&amp;#039;&amp;#039; to the current directory where the file calling it resides. Note the differences between segway.kinbody.xml and barrettwam.robot.xml.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the background color of the environment--&amp;gt;&lt;br /&gt;
  &amp;lt;bkgndcolor&amp;gt;0.3 0.7 0.8&amp;lt;/bkgndcolor&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera translation--&amp;gt;&lt;br /&gt;
  &amp;lt;camtrans&amp;gt;1.418 -1.234 2.963&amp;lt;/camtrans&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera rotation specified by rotation-axis--&amp;gt;&lt;br /&gt;
  &amp;lt;camrotaxis&amp;gt;0.724 0.302 0.619 68&amp;lt;/camrotaxis&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import the segway model and place it somewhere--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;data/segway.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;-0.0671   -0.0819    0.7550&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import a robot file and add an additional body for a cylindrical base--&amp;gt;&lt;br /&gt;
  &amp;lt;Robot file=&amp;quot;../../robots/barrettwam.robot.xml&amp;quot; name=&amp;quot;BarrettWAM&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;-.22 -.14 -.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Body type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
          &amp;lt;radius&amp;gt;0.08&amp;lt;/radius&amp;gt;&lt;br /&gt;
          &amp;lt;height&amp;gt;0.6&amp;lt;/height&amp;gt;&lt;br /&gt;
          &amp;lt;diffusecolor&amp;gt;0.3 0.3 0.3&amp;lt;/diffusecolor&amp;gt;&lt;br /&gt;
          &amp;lt;Translation&amp;gt; 0.2286 0.1397 -0.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;/Geom&amp;gt;&lt;br /&gt;
      &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;-0.754 0.3265 1.036&amp;lt;/translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Robot&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- add the floor as a box--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody name=&amp;quot;floor&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- floor should never move, so make it static--&amp;gt;&lt;br /&gt;
    &amp;lt;Body type=&amp;quot;static&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;2 2 0.005&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;.6 .6 .6&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      	&amp;lt;ambientColor&amp;gt;0.6 0.6 0.6&amp;lt;/ambientColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot Composition ==&lt;br /&gt;
&lt;br /&gt;
The way we recommend managing robots composed of several sub-robots (like a humanoid composed of arms, legs, hands, etc) is to first create separate .kinbody files for just the kinematics and geometry of each separate&lt;br /&gt;
part (ie a hand.kinbody.xml and a arm.kinbody.xml). Then create a robot file that includes both the kinematics and defines the manipulators, sensors, and controllers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;attachedsensor&amp;gt;&lt;br /&gt;
     ....&lt;br /&gt;
 &amp;lt;/attachedsensor&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sometimes for grasp planning, the hand needs to be treated as a robot, so we create a hand.robot.xml file as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. A robot can reference other robots through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;a.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;b.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both a&amp;#039;s and b&amp;#039;s &amp;#039;&amp;#039;&amp;#039;&amp;lt;Manipulator&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;AttachedSensor&amp;gt;&amp;#039;&amp;#039;&amp;#039; tags will be used&lt;br /&gt;
in the parent robot, so you don&amp;#039; t have to copy their definitions.&lt;br /&gt;
&lt;br /&gt;
2. It is possible to prefix the links and joints of a child robot by using the&lt;br /&gt;
&amp;#039;prefix&amp;#039; attribute:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;left_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;right_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now all links and joints will either start with &amp;#039;&amp;#039;&amp;#039;left_&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;right_&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
3. When the xml parser sees a body with the same name as another body,&lt;br /&gt;
it &amp;#039;appends&amp;#039; the specified geometries to the original body. This allows the same link to be referenced/defined in multiple robot files (Note that it is not possible to change the original body coordinate system).&lt;br /&gt;
&lt;br /&gt;
=== Attaching Separate Links ===&lt;br /&gt;
&lt;br /&gt;
When a robot is composed of multiple parts defined in different files, it is necessary to attach links from the different files together so that the robot hierarchy can be complete. This is done by defining &amp;#039;&amp;#039;&amp;#039;disabled&amp;#039;&amp;#039;&amp;#039; dummy joints that attach two links together. These disabled joints do not show up in the robot&amp;#039;s description and are only present to maintain the relative transformation between two links. For example, the robot &amp;#039;&amp;#039;&amp;#039;robots/pa10schunk.robot.xml&amp;#039;&amp;#039;&amp;#039; is composed of &amp;#039;&amp;#039;&amp;#039;robots/pa10.kinbody.xml&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;robots/schunk_manip.kinbody.xml&amp;#039;&amp;#039;&amp;#039;, in order to join the two, the robot  is defined in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;pa10.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody file=&amp;quot;schunk_manip.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;False&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;link7&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;gripper_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;#039;&amp;#039;&amp;#039;link7&amp;#039;&amp;#039;&amp;#039; is a link of the pa10 arm and &amp;#039;&amp;#039;&amp;#039;gripper_base&amp;#039;&amp;#039;&amp;#039; is a link of the gripper. The lower and upper joint limits are all 0, which OpenRAVE recognizes as a dummy joint.&lt;br /&gt;
&lt;br /&gt;
=== Joining A Robot Arm and Hand ===&lt;br /&gt;
&lt;br /&gt;
It is possible to load robots and bodies from COLLADA files by specifying the collada filename through the &amp;#039;&amp;#039;&amp;#039;file&amp;#039;&amp;#039;&amp;#039; attribute. For example, the following robot is a combination of an arm defined in OpenRAVE XML and a hand defined in COLLADA (download schunkSDHHand from [http://opengrasp.sourceforge.net/Downloads.html OpenGrasp]). The dummy joint is used to join the arm end effector with the hand base.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot file=&amp;quot;robots/kuka-kr5-r650.robot.xml&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot prefix=&amp;quot;hand_&amp;quot; file=&amp;quot;schunkSDHhand.dae&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody&amp;gt;&lt;br /&gt;
   &amp;lt;body name=&amp;quot;hand_root&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;offsetfrom&amp;gt;link6&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
     &amp;lt;translation&amp;gt;0.03 0 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
     &amp;lt;rotationaxis&amp;gt;0 1 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;joint type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;link6&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;hand_root&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
   &amp;lt;/joint&amp;gt;&lt;br /&gt;
 &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;base&amp;gt;base&amp;lt;/base&amp;gt;&lt;br /&gt;
   &amp;lt;effector&amp;gt;link6&amp;lt;/effector&amp;gt;&lt;br /&gt;
   &amp;lt;joints&amp;gt;hand_Bone_B1_Joint hand_Bone_B2_Joint hand_Bone_B3_Joint hand_Bone_A1_Joint hand_Bone_A2_Joint hand_Bone_A3_Joint hand_Bone_C1_Joint hand_Bone_C2_Joint hand_Bone_C3_Joint&amp;lt;/joints&amp;gt;&lt;br /&gt;
   &amp;lt;closingdirection&amp;gt;0 1 1 0 1 1 0 1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
   &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Final robot: [[image:collada_sdh_kuka.jpg|150px]]&lt;br /&gt;
&lt;br /&gt;
=== Dual-arm example ===&lt;br /&gt;
&lt;br /&gt;
Here is an example file of having a robot composed of two arms attached to a common link named &amp;#039;&amp;#039;&amp;#039;chest&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;schunk-dualarm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;chest&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;0.1 0.1 0.4&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0 0 0.4&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/geom&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- left arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody prefix=&amp;quot;l_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 -0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody&amp;gt;prefix=&amp;quot;r_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- connect the two arms with dummy joints --&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;leftdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;l_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;rightdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;r_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;!-- define the manipulators --&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;leftarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;l_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;l_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
    &amp;lt;armjoints&amp;gt;l_j0 l_j1 l_j2 l_j3 l_j4 l_j5 l_j6&amp;lt;/armjoints&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;rightarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;r_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;r_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
    &amp;lt;armjoints&amp;gt;r_j0 r_j1 r_j2 r_j3 r_j4 r_j5 r_j6&amp;lt;/armjoints&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Single arm: [[image:schunk-lwa3.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
Dual arm: [[image:schunk-lwa3-dual.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
== Custom XML ==&lt;br /&gt;
&lt;br /&gt;
Openrave provides much more flexibility in creating and defining custom XML readers for interfaces. First the &amp;lt;environment&amp;gt; XML tag supports creating any interface type and supports loading plugins. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;plugin&amp;gt;libcustomreader&amp;lt;/plugin&amp;gt;&lt;br /&gt;
  &amp;lt;robot name=&amp;quot;wam&amp;quot; file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;controller type=&amp;quot;CustomController&amp;quot; robot=&amp;quot;wam&amp;quot; args=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    ..custom data....&lt;br /&gt;
  &amp;lt;/controller&amp;gt;&lt;br /&gt;
  &amp;lt;module type=&amp;quot;basemanipulation&amp;quot; args=&amp;quot;wam&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example, openrave will first load the plugin, then will create a robot, and then will create a controller that is attached to the robot, then will create the basemanipulation module giving it the robot name as the argument.&lt;br /&gt;
&lt;br /&gt;
Furthermore, using EnvironmentBase::RegisterXMLReader, it is possible to set a parser for custom XML tags for each interface type.  For those curious on how to take advantage of custom readers, please refer to examples/plugincpp/customreader.cpp on how to attach a custom XML reader to a controller.&lt;br /&gt;
&lt;br /&gt;
These changes will allow people to setup all their specific environment settings in the XML files without having to rely on external scripts or other programs to do it. Note that OpenRAVE processes tags in depth first order.&lt;br /&gt;
&lt;br /&gt;
== Sensor ==&lt;br /&gt;
&lt;br /&gt;
It is possible to have XML files that declare a sensor and its internal parameters. For example, &amp;#039;&amp;#039;&amp;#039;data/camera.sensor.xml&amp;#039;&amp;#039;&amp;#039; can look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;sensor type=&amp;quot;BaseCamera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KK&amp;gt;640 640 320 240&amp;lt;/KK&amp;gt;&lt;br /&gt;
  &amp;lt;width&amp;gt;640&amp;lt;/width&amp;gt;&lt;br /&gt;
  &amp;lt;height&amp;gt;480&amp;lt;/height&amp;gt;&lt;br /&gt;
  &amp;lt;framerate&amp;gt;5&amp;lt;/framerate&amp;gt;&lt;br /&gt;
  &amp;lt;color&amp;gt;0.5 0.5 1&amp;lt;/color&amp;gt;&lt;br /&gt;
&amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to attach a sensor defined by a file to a robot link do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyCamera&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is also possible to put a sensor directly in the environment without a robot. Such a sensor will not have any geometry associated with it, and will only act as a sensing source.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... environment definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;sensor name=&amp;quot;mysensor&amp;quot; file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the sensor transform --&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 1 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
  &amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== XML Reference ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; All XML handling is done in &amp;#039;&amp;#039;&amp;#039;src/libopenrave-core/xmlreaders.cpp&amp;#039;&amp;#039;&amp;#039;. If there&amp;#039;s any parameters that are not explained well, make sure to check out that source file for further reference.&lt;br /&gt;
&lt;br /&gt;
Here&amp;#039;s a list of all possible fields the XML supports in a hierarchical structure.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;environment&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;bkgndcolor&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camrotaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camtrans&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;planner&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensorsystem&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file, robot, args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;inversekinematicssolver&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;physicsengine&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;collisionchecker&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;trajectory&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;viewer&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;server&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type, makejoinedlinksadjacent&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;adjacent&amp;#039;&amp;#039;&amp;#039; - 2 body names&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (dynamic, static)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;geom&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (box, sphere, trimesh, cylinder), render (true,false), modifiable (true,false)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;ambientcolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;collision&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;diffusecolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;extents&amp;#039;&amp;#039;&amp;#039; - 3 float [box]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;height&amp;#039;&amp;#039;&amp;#039; - float [cylinder]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float [cylinder, sphere]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;render&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;vertices&amp;#039;&amp;#039;&amp;#039; - 9*N floats where each 9 values defines 1 triangle with 3 vertices&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;com&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;inertia&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - body/link name&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;joint&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; enable (true, false), type (hinge, slider, universal, hinge2, spherical), circular(true, false), mimic_pos (math equation), mimic_vel (math equation), mimic_accel (math equation)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;anchor&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, hinge2, universal, spherical]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, slider]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis1&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis2&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limits&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsdeg&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in degrees if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsrad&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxvel&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxveldeg&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxaccel&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxacceldeg&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mode&amp;#039;&amp;#039;&amp;#039; - int [amotor]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - body/link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;resolution&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;weight&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;modelsdir&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - bodyname&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type (robot plugin type)&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;attachedsensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;link&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;...&amp;#039;&amp;#039;&amp;#039; - fields defined by SensorBase class instantiated by type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - type args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - name&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;manipulator&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;armjoints&amp;#039;&amp;#039;&amp;#039; - n joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;base&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closed&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;effector&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;iksolver&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;gripperjoints&amp;#039;&amp;#039;&amp;#039; - k joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closingdirection&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;palmdirection&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - name, file, type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
&amp;lt;math&amp;gt;Insert formula here&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=189</id>
		<title>Format:XML</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=189"/>
				<updated>2011-09-29T16:09:05Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
= OpenRAVE Custom XML Format =&lt;br /&gt;
&lt;br /&gt;
[[image:Openrave_robots.jpg|600px]] &lt;br /&gt;
&lt;br /&gt;
TODO: Decide on the versioning scheme&lt;br /&gt;
&lt;br /&gt;
OpenRAVE uses XML to store all robot and scene descriptions. The XML format is flexible enough to link one XML file from another like including already created objects/robots in an environment. It is also possible to specify vrml or iv formatted files within it to import models. &lt;br /&gt;
&lt;br /&gt;
All interface types can be created. Furthermore, an &amp;lt;environment&amp;gt; tag can optionally be specified to put all bodies/interfaces in.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Environment&amp;#039;&amp;#039;&amp;#039; - specify multiple objects and robots. Can also define some GUI properties like camera start location and background color. The environment allows the creation of &amp;#039;&amp;#039;&amp;#039;any&amp;#039;&amp;#039;&amp;#039; OpenRAVE interfaces. Each interface can take the &amp;#039;&amp;#039;&amp;#039;type&amp;#039;&amp;#039;&amp;#039; attribute specifying the interface type and can define custom XML readers.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039; - The basic object that all other objects derive from. A kinematic body consists of a collection of rigid bodies and joints that connect these bodies.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; - The basic robot that derives from &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039;. Usually every Robot has at least one KinBody declaration inside it. A robot can also hold a list of &amp;#039;&amp;#039;&amp;#039;Manipulator&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;AttachedSensor&amp;#039;&amp;#039;&amp;#039; objects describing the manipulation/sensing capabilities of the robot. Since plugin authors can create different robots, it is also possible to define custom fields in &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; to hold other information like balance control parameters for humanoids.&lt;br /&gt;
&lt;br /&gt;
== KinBody ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody name=&amp;quot;TestKinBody&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Create a rigid body named Body1 and declare it as &amp;#039;dynamic&amp;#039;.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;#039;dynamic&amp;#039; bodies are subject to physics laws, &amp;#039;static&amp;#039; bodies will never move--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- due to physical forces. It is recommended EVERYTHING is declared as &amp;#039;dynamic&amp;#039; --&amp;gt;&lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that the body transforms affects all geometry objects attached. --&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- translation of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;!--rotation of the body specified as a rotation axis. First three numbers are the axis.--&amp;gt;&lt;br /&gt;
    &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- defines mass properties for the entire kinbody. possible mass types are--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- mimicgeom - &amp;lt;density&amp;gt;. Adds a mass equivalent to all the geometry--&amp;gt;&lt;br /&gt;
    &amp;lt;!--    objects. trimesh and plane are not supported.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- box - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;extents&amp;gt; Adds a simple box--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- sphere - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;radius&amp;gt;--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;density&amp;gt;1000&amp;lt;/density&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Define a geometry object attached to the body. The functionality of --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- geometry objects is to define the collision and render geometries of the body. --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- All geometry types have Rotation(Mat/Quat), Translation, and Render components.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Possible geom types are box, sphere, trimesh, plane.--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *box - extents--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *sphere - radius--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *cylinder - radius, height (axis is along y)--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *trimesh - data--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- extents of the box - half width, height, length--&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;1 1 1&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;!-- set the translation and rotation of the box. Note that the transforamtions--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- are all relative to the parent body.--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;0 1 0 45&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Can create multiple geometries per body--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;2 1 2&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 1 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;!-- RotationMat is a 3x3 rotation matrix specified as rows first--&amp;gt;&lt;br /&gt;
      &amp;lt;RotationMat&amp;gt;1 0 0 0 1 0 0 0 1&amp;lt;/RotationMat&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Set the transparency of the geometry, 0 is opaque--&amp;gt;&lt;br /&gt;
      &amp;lt;transparency&amp;gt;0.4&amp;lt;/transparency&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- change the mass properties of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the total mass--&amp;gt;&lt;br /&gt;
      &amp;lt;total&amp;gt;0.40605&amp;lt;/total&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the 3x3 inertia matrix--&amp;gt;&lt;br /&gt;
      &amp;lt;inertia&amp;gt;2 0 0 0 3 0 0 0 5&amp;lt;/inertia&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the center of mass (if using ODE physics engine, should be 0)--&amp;gt;&lt;br /&gt;
      &amp;lt;com&amp;gt;0.008842 -0.000018 0.07367&amp;lt;/com&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a sphere--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;sphere&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- although the underlying collision geometry will be a sphere,--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- render it as a coffee pot--&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/coffeepot.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 -1.5 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Radius&amp;gt;1.5&amp;lt;/Radius&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a triangle mesh--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/cup.iv 0.01&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;!-- use the cup triangles for collision detection.--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The last number is the scale, in case the iv files are scaled improperly.--&amp;gt;&lt;br /&gt;
      &amp;lt;collision&amp;gt;models/objects/cup.iv 0.01&amp;lt;/collision&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1.5 -2 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Create a joint between the two bodies.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Possible joint types are: hinge, slider, universal, hinge2, and spherical.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Hinges are the most common joint type used in robots.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- For amotors, can specify mode, axis1, axis2, axis3. For each axis, first 3 values are the axis and the last value is the relative coord system (see ODE documentation).--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Every joint can have certain properties:--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxforce&amp;gt; are in number of degrees of freedom.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxvel&amp;gt;, &amp;lt;resolution&amp;gt; are scalar and apply to all DOFs.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;limits&amp;gt;, &amp;lt;limitsdeg&amp;gt;, &amp;lt;limitsrad&amp;gt; specify the joint limits --&amp;gt;&lt;br /&gt;
  &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Specify the names of the bodies, names are not case sensitive.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body1&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body2&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- anchor and axis of the hinge--&amp;gt;&lt;br /&gt;
    &amp;lt;Anchor&amp;gt;0 0 0&amp;lt;/Anchor&amp;gt;&lt;br /&gt;
    &amp;lt;Axis&amp;gt;0 1 0&amp;lt;/Axis&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Weight for configuration distance, mostly used in planners.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- for joints with &amp;gt; 1 DOF, specify 2+ values--&amp;gt;&lt;br /&gt;
    &amp;lt;Weight&amp;gt;1.0&amp;lt;/Weight&amp;gt;&lt;br /&gt;
  &amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Models Directory ===&lt;br /&gt;
&lt;br /&gt;
By default, the root directory for all models files is the folder openrave is launched at. To change this, &amp;#039;&amp;#039;&amp;#039;&amp;lt;modelsdir&amp;gt;&amp;#039;&amp;#039;&amp;#039; can be used to specify model files relative to where the current xml file is. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;modelsdir&amp;gt;../mymodels&amp;lt;/modelsdir&amp;gt;&lt;br /&gt;
  &amp;lt;Body&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;render&amp;gt;kitchen/myfile.wrl&amp;lt;/render&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Circular Joints ===&lt;br /&gt;
&lt;br /&gt;
Sometimes joints will have the upper and lower limits identified, meaning that as soon as the joint gets past one limit it will wrap around to the other. Infinitely revolving hinge joints are the most common example of &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; joints where the &amp;lt;math&amp;gt;-\pi&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; limits are identified. In openrave, it is possible to set a joint as &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; like this:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint circular=&amp;quot;true&amp;quot; ...&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Adjacent Links ===&lt;br /&gt;
&lt;br /&gt;
Robot self-collision usually checks all pairs of non-adjacent links for collision; links are adjacent if they are connected to a joint. In order to reduce self-collision computation time and spurious collisions of small links, it is possible to force pairs of links to be treated as adjacent by specifying an &amp;#039;&amp;#039;&amp;#039;&amp;lt;adjacent&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag.&lt;br /&gt;
&lt;br /&gt;
=== Scale ===&lt;br /&gt;
&lt;br /&gt;
The first thing when importing a new model is to check that all the units are in meters (it is very common for robots to be in millimeters), otherwise the visualization model and the collision model will be in a different scale. to check this, open the robot and go to View-&amp;gt;Geometry-&amp;gt;Collision, this will show the collision model. If it is not the same scale, you need to go inside your model files and change the units. You can also enter a scale factor after model filenames like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;collision&amp;gt;mydata.iv 0.001&amp;lt;/collision&amp;gt;&lt;br /&gt;
&amp;lt;render&amp;gt;mydata.iv 0.001&amp;lt;/render&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this will scale the models by 0.001.&lt;br /&gt;
&lt;br /&gt;
== Robot ==&lt;br /&gt;
&lt;br /&gt;
=== A simple 3DOF planar arm in XZ ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;3DOFRobot&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Create the base body, it should never move--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that all translations and rotations are with respect to this base--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- For example, the robot at the identity transformation is equivalent to the identity transformation of the first body.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Base&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.0  0.0  0.0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;radius&amp;gt;0.03&amp;lt;/radius&amp;gt;&lt;br /&gt;
        &amp;lt;height&amp;gt;0.02&amp;lt;/height&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;0.05 0.05 0.05&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the first movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm0&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Offset from is a fast way of specifying that the translation and rotation of this--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- body should be relative to another link--&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Base&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Translation relative to Base--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.01 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm0&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Base&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;4&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;3&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the second movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0.0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.0075 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the third movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.04 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.04 0.005 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;2&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;2&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Create the gripper joints:--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;RClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/RClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/RClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;RClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;RClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!--left gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;LClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0.005 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/LClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/LClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;LClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;LClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 -1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the transparency of every geometry in the KinBody--&amp;gt;&lt;br /&gt;
    &amp;lt;transparency&amp;gt;0.1&amp;lt;/transparency&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specifying the manipulator structure--&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;Arm2&amp;lt;/effector&amp;gt;   &amp;lt;!-- last link where end effector is attached--&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;Base&amp;lt;/base&amp;gt;           &amp;lt;!-- base link--&amp;gt;&lt;br /&gt;
    &amp;lt;joints&amp;gt;j1 j2&amp;lt;/joints&amp;gt;      &amp;lt;!-- the gripper joints used for contact--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- the id of the inverse kinematics solver, it is not necessary to--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify an ik solver for every robot. But if there is one,--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- use iksolver field to identity it.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;lt;iksolver&amp;gt;MyTriDOFSolver&amp;lt;/iksolver&amp;gt; --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- joint values of the closed and opened positions--&amp;gt;&lt;br /&gt;
    &amp;lt;closingdirection&amp;gt;1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
    &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
    &amp;lt;!-- grasp goal with respect to the effector--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0.125 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DOFRobot Robot:  [[image:tridof.jpg|200px]] &lt;br /&gt;
&lt;br /&gt;
=== Defining Manipulators ===&lt;br /&gt;
&lt;br /&gt;
A robot manipulator defines a kinematic chain of the robot joint hierarchy along with optional gripper joint values that are not used in the inverse kinematics computation but are needed for grasping purposes (chains for heads, legs do not need the joint values). A manipulator defines a new frame of reference with respect to the end effector link; all inverse kinematics computations are computed using it. Furthermore, a manipulator can have a &amp;#039;&amp;#039;&amp;#039;&amp;lt;direction&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying an axis for approaching objects or line-of-sight. For example the &amp;#039;&amp;#039;&amp;#039;robots/barrettwam.robot.xml&amp;#039;&amp;#039;&amp;#039; gripper is defined by&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;base&amp;gt;wam0&amp;lt;/base&amp;gt;&lt;br /&gt;
  &amp;lt;effector&amp;gt;wam7&amp;lt;/effector&amp;gt;&lt;br /&gt;
  &amp;lt;Translation&amp;gt;0 0 0.22&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;joints&amp;gt;JF1 JF2 JF3 JF4&amp;lt;/joints&amp;gt;&lt;br /&gt;
  &amp;lt;closingdirection&amp;gt;1 1 1 0&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
  &amp;lt;direction&amp;gt;0 0 1&amp;lt;/direction&amp;gt;&lt;br /&gt;
  &amp;lt;iksolver&amp;gt;WAM7ikfast 0.05&amp;lt;/iksolver&amp;gt;&lt;br /&gt;
&amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The manipulator can optionally define a &amp;#039;&amp;#039;&amp;#039;&amp;lt;iksolver&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying the iksolver interface that is used for getting IK solutions, or a shared object (DLL) to load an [[Component:Ikfast|ikfast]] solver from.&lt;br /&gt;
&lt;br /&gt;
=== Closed-chains and Mimic Joints ===&lt;br /&gt;
&lt;br /&gt;
OpenRAVE allows closed-chains and complex kinematics to be simulated using mimic joints. A mimic joint&amp;#039;s position, velocity, and acceleration values are computed from user-specified formulas using the values of other joints. OpenRAVE uses the Function Parser library to allow any formula to be specified. Refer to the documentation for more information [http://openrave.programmingvision.com/en/coreapihtml/classOpenRAVE_1_1KinBody_1_1Joint.html#a0e31c5be31c4145afa786e0c0d6a46ae here].&lt;br /&gt;
&lt;br /&gt;
A mimic joint requires at least the position equation and its partial derivatives (for velocity) to be manually entered. &lt;br /&gt;
&lt;br /&gt;
For example, the Barrett Hand mimic joints are defined as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;JF1&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;JF1mimic&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot; mimic_pos=&amp;quot;JF1/3+0.8727&amp;quot; mimic_vel=&amp;quot;|JF1 0.33333&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Of course, it is possible to have a mimic joint depend on more than one other joint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;b&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;c&amp;quot; type=&amp;quot;hinge&amp;quot; mimic_pos=&amp;quot;a+b+atan(a)&amp;quot; mimic_vel=&amp;quot;|a 1 + 1/(1+a*a) |b 1&amp;quot; mimic_accel=&amp;quot;|a -2*a/((1+a*a)*(1+a*a)) |b 0&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using mimic joints, it is important to still make all the correct joint connections so that loops are discovered and forces can be computed correctly.&lt;br /&gt;
&lt;br /&gt;
If a joint has more than one degree of freedom, attach the axis index at the end. For example: &amp;quot;mimic_pos0&amp;quot;, &amp;quot;mimic_pos1&amp;quot;, &amp;quot;mimic_vel0&amp;quot;, &amp;quot;mimic_vel1&amp;quot;, &amp;quot;mimic_accel0&amp;quot;, and &amp;quot;mimic_accel1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Attaching Robot Sensors ===&lt;br /&gt;
&lt;br /&gt;
Every robot can be attached a number of sensors onto it. The way to specify this in XML is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specify an attached sensor--&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyFirstLaser&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;link&amp;gt;wam1&amp;lt;/link&amp;gt; &amp;lt;!-- the robot link that the sensor is attached to. As the robot moves, the sensor will move with it--&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 0.2 0.4&amp;lt;/translation&amp;gt; &amp;lt;!-- the local translation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt; &amp;lt;!-- the local rotation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify the real sensor attached--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;#039;type&amp;#039; is the sensor interface identifier--&amp;gt;&lt;br /&gt;
    &amp;lt;sensor type=&amp;quot;BaseLaser2D&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The rest are specific fields to BaseLaser2D, these change as the type changes--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The best way to find out what fields are supported is to look for the documentation--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- for the type of sensor using--&amp;gt;&lt;br /&gt;
      &amp;lt;minangle&amp;gt;-135&amp;lt;/minangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;maxangle&amp;gt;135&amp;lt;/maxangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;0.35&amp;lt;/resolution&amp;gt; &amp;lt;!-- degrees between laser points--&amp;gt;&lt;br /&gt;
      &amp;lt;maxrange&amp;gt;5&amp;lt;/maxrange&amp;gt; &amp;lt;!-- max range of robot--&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting joint values for initial state ===&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot&amp;#039;s initial state is not when all the joints are at 0. Instead of transforming each of the geometry to the zero pose, it is possible to set the initial angle to use using the &amp;lt;initial&amp;gt; tag inside the &amp;lt;joint&amp;gt;. The definition for setting the initial angle to pi/2 radius is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link0&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link1&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;initial&amp;gt;1.570796326794&amp;lt;/initial&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Changing the Body Coordinate System ===&lt;br /&gt;
&lt;br /&gt;
[[image:Barrettwam_coordchange.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot origin and rotation should be defined in a different coordinate system. It is possible to create a new robot file that references the old one and changes its origin. This requires adding a new root link before the robot is defined. For example, consider the robots/barrettwam.robot.xml file whre the first link&amp;#039;s name is &amp;#039;wam0&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- add new first link --&amp;gt;&lt;br /&gt;
  &amp;lt;kinbody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;root&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;robot file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;!-- change the coordinate system of the original first link and attach a dummy joint --&amp;gt;&lt;br /&gt;
    &amp;lt;kinbody&amp;gt;&lt;br /&gt;
      &amp;lt;body name=&amp;quot;wam0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0.3 0.4 0.3&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;root&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;wam0&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;limitsdeg&amp;gt;0 0&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
== Environment Example ==&lt;br /&gt;
&lt;br /&gt;
This example is part of the &amp;#039;&amp;#039;&amp;#039;bin/data/intel/lab1.env.xml&amp;#039;&amp;#039;&amp;#039; file. The most important thing to note about this example is the use of the &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; attribute to import other XML files. The filename specified with &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; has to be &amp;#039;&amp;#039;&amp;#039;relative&amp;#039;&amp;#039;&amp;#039; to the current directory where the file calling it resides. Note the differences between segway.kinbody.xml and barrettwam.robot.xml.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the background color of the environment--&amp;gt;&lt;br /&gt;
  &amp;lt;bkgndcolor&amp;gt;0.3 0.7 0.8&amp;lt;/bkgndcolor&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera translation--&amp;gt;&lt;br /&gt;
  &amp;lt;camtrans&amp;gt;1.418 -1.234 2.963&amp;lt;/camtrans&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera rotation specified by rotation-axis--&amp;gt;&lt;br /&gt;
  &amp;lt;camrotaxis&amp;gt;0.724 0.302 0.619 68&amp;lt;/camrotaxis&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import the segway model and place it somewhere--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;data/segway.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;-0.0671   -0.0819    0.7550&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import a robot file and add an additional body for a cylindrical base--&amp;gt;&lt;br /&gt;
  &amp;lt;Robot file=&amp;quot;../../robots/barrettwam.robot.xml&amp;quot; name=&amp;quot;BarrettWAM&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;-.22 -.14 -.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Body type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
          &amp;lt;radius&amp;gt;0.08&amp;lt;/radius&amp;gt;&lt;br /&gt;
          &amp;lt;height&amp;gt;0.6&amp;lt;/height&amp;gt;&lt;br /&gt;
          &amp;lt;diffusecolor&amp;gt;0.3 0.3 0.3&amp;lt;/diffusecolor&amp;gt;&lt;br /&gt;
          &amp;lt;Translation&amp;gt; 0.2286 0.1397 -0.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;/Geom&amp;gt;&lt;br /&gt;
      &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;-0.754 0.3265 1.036&amp;lt;/translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Robot&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- add the floor as a box--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody name=&amp;quot;floor&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- floor should never move, so make it static--&amp;gt;&lt;br /&gt;
    &amp;lt;Body type=&amp;quot;static&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;2 2 0.005&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;.6 .6 .6&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      	&amp;lt;ambientColor&amp;gt;0.6 0.6 0.6&amp;lt;/ambientColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot Composition ==&lt;br /&gt;
&lt;br /&gt;
The way we recommend managing robots composed of several sub-robots (like a humanoid composed of arms, legs, hands, etc) is to first create separate .kinbody files for just the kinematics and geometry of each separate&lt;br /&gt;
part (ie a hand.kinbody.xml and a arm.kinbody.xml). Then create a robot file that includes both the kinematics and defines the manipulators, sensors, and controllers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;attachedsensor&amp;gt;&lt;br /&gt;
     ....&lt;br /&gt;
 &amp;lt;/attachedsensor&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sometimes for grasp planning, the hand needs to be treated as a robot, so we create a hand.robot.xml file as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. A robot can reference other robots through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;a.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;b.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both a&amp;#039;s and b&amp;#039;s &amp;#039;&amp;#039;&amp;#039;&amp;lt;Manipulator&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;AttachedSensor&amp;gt;&amp;#039;&amp;#039;&amp;#039; tags will be used&lt;br /&gt;
in the parent robot, so you don&amp;#039; t have to copy their definitions.&lt;br /&gt;
&lt;br /&gt;
2. It is possible to prefix the links and joints of a child robot by using the&lt;br /&gt;
&amp;#039;prefix&amp;#039; attribute:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;left_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;right_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now all links and joints will either start with &amp;#039;&amp;#039;&amp;#039;left_&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;right_&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
3. When the xml parser sees a body with the same name as another body,&lt;br /&gt;
it &amp;#039;appends&amp;#039; the specified geometries to the original body. This allows the same link to be referenced/defined in multiple robot files (Note that it is not possible to change the original body coordinate system).&lt;br /&gt;
&lt;br /&gt;
=== Attaching Separate Links ===&lt;br /&gt;
&lt;br /&gt;
When a robot is composed of multiple parts defined in different files, it is necessary to attach links from the different files together so that the robot hierarchy can be complete. This is done by defining &amp;#039;&amp;#039;&amp;#039;disabled&amp;#039;&amp;#039;&amp;#039; dummy joints that attach two links together. These disabled joints do not show up in the robot&amp;#039;s description and are only present to maintain the relative transformation between two links. For example, the robot &amp;#039;&amp;#039;&amp;#039;robots/pa10schunk.robot.xml&amp;#039;&amp;#039;&amp;#039; is composed of &amp;#039;&amp;#039;&amp;#039;robots/pa10.kinbody.xml&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;robots/schunk_manip.kinbody.xml&amp;#039;&amp;#039;&amp;#039;, in order to join the two, the robot  is defined in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;pa10.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody file=&amp;quot;schunk_manip.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;False&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;link7&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;gripper_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;#039;&amp;#039;&amp;#039;link7&amp;#039;&amp;#039;&amp;#039; is a link of the pa10 arm and &amp;#039;&amp;#039;&amp;#039;gripper_base&amp;#039;&amp;#039;&amp;#039; is a link of the gripper. The lower and upper joint limits are all 0, which OpenRAVE recognizes as a dummy joint.&lt;br /&gt;
&lt;br /&gt;
=== Joining A Robot Arm and Hand ===&lt;br /&gt;
&lt;br /&gt;
It is possible to load robots and bodies from COLLADA files by specifying the collada filename through the &amp;#039;&amp;#039;&amp;#039;file&amp;#039;&amp;#039;&amp;#039; attribute. For example, the following robot is a combination of an arm defined in OpenRAVE XML and a hand defined in COLLADA (download schunkSDHHand from [http://opengrasp.sourceforge.net/Downloads.html OpenGrasp]). The dummy joint is used to join the arm end effector with the hand base.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot file=&amp;quot;robots/kuka-kr5-r650.robot.xml&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot prefix=&amp;quot;hand_&amp;quot; file=&amp;quot;schunkSDHhand.dae&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody&amp;gt;&lt;br /&gt;
   &amp;lt;body name=&amp;quot;hand_root&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;offsetfrom&amp;gt;link6&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
     &amp;lt;translation&amp;gt;0.03 0 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
     &amp;lt;rotationaxis&amp;gt;0 1 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;joint type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;link6&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;hand_root&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
   &amp;lt;/joint&amp;gt;&lt;br /&gt;
 &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;base&amp;gt;base&amp;lt;/base&amp;gt;&lt;br /&gt;
   &amp;lt;effector&amp;gt;link6&amp;lt;/effector&amp;gt;&lt;br /&gt;
   &amp;lt;joints&amp;gt;hand_Bone_B1_Joint hand_Bone_B2_Joint hand_Bone_B3_Joint hand_Bone_A1_Joint hand_Bone_A2_Joint hand_Bone_A3_Joint hand_Bone_C1_Joint hand_Bone_C2_Joint hand_Bone_C3_Joint&amp;lt;/joints&amp;gt;&lt;br /&gt;
   &amp;lt;closingdirection&amp;gt;0 1 1 0 1 1 0 1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
   &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Final robot: [[image:collada_sdh_kuka.jpg|150px]]&lt;br /&gt;
&lt;br /&gt;
=== Dual-arm example ===&lt;br /&gt;
&lt;br /&gt;
Here is an example file of having a robot composed of two arms attached to a common link named &amp;#039;&amp;#039;&amp;#039;chest&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;schunk-dualarm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;chest&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;0.1 0.1 0.4&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0 0 0.4&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/geom&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- left arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody prefix=&amp;quot;l_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 -0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody&amp;gt;prefix=&amp;quot;r_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- connect the two arms with dummy joints --&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;leftdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;l_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;rightdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;r_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;!-- define the manipulators --&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;leftarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;l_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;l_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
    &amp;lt;armjoints&amp;gt;l_j0 l_j1 l_j2 l_j3 l_j4 l_j5 l_j6&amp;lt;/armjoints&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;rightarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;r_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;r_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
    &amp;lt;armjoints&amp;gt;r_j0 r_j1 r_j2 r_j3 r_j4 r_j5 r_j6&amp;lt;/armjoints&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Single arm: [[image:schunk-lwa3.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
Dual arm: [[image:schunk-lwa3-dual.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
== Custom XML ==&lt;br /&gt;
&lt;br /&gt;
Openrave provides much more flexibility in creating and defining custom XML readers for interfaces. First the &amp;lt;environment&amp;gt; XML tag supports creating any interface type and supports loading plugins. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;plugin&amp;gt;libcustomreader&amp;lt;/plugin&amp;gt;&lt;br /&gt;
  &amp;lt;robot name=&amp;quot;wam&amp;quot; file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;controller type=&amp;quot;CustomController&amp;quot; robot=&amp;quot;wam&amp;quot; args=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    ..custom data....&lt;br /&gt;
  &amp;lt;/controller&amp;gt;&lt;br /&gt;
  &amp;lt;module type=&amp;quot;basemanipulation&amp;quot; args=&amp;quot;wam&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example, openrave will first load the plugin, then will create a robot, and then will create a controller that is attached to the robot, then will create the basemanipulation module giving it the robot name as the argument.&lt;br /&gt;
&lt;br /&gt;
Furthermore, using EnvironmentBase::RegisterXMLReader, it is possible to set a parser for custom XML tags for each interface type.  For those curious on how to take advantage of custom readers, please refer to examples/plugincpp/customreader.cpp on how to attach a custom XML reader to a controller.&lt;br /&gt;
&lt;br /&gt;
These changes will allow people to setup all their specific environment settings in the XML files without having to rely on external scripts or other programs to do it. Note that OpenRAVE processes tags in depth first order.&lt;br /&gt;
&lt;br /&gt;
== Sensor ==&lt;br /&gt;
&lt;br /&gt;
It is possible to have XML files that declare a sensor and its internal parameters. For example, &amp;#039;&amp;#039;&amp;#039;data/camera.sensor.xml&amp;#039;&amp;#039;&amp;#039; can look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;sensor type=&amp;quot;BaseCamera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KK&amp;gt;640 640 320 240&amp;lt;/KK&amp;gt;&lt;br /&gt;
  &amp;lt;width&amp;gt;640&amp;lt;/width&amp;gt;&lt;br /&gt;
  &amp;lt;height&amp;gt;480&amp;lt;/height&amp;gt;&lt;br /&gt;
  &amp;lt;framerate&amp;gt;5&amp;lt;/framerate&amp;gt;&lt;br /&gt;
  &amp;lt;color&amp;gt;0.5 0.5 1&amp;lt;/color&amp;gt;&lt;br /&gt;
&amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to attach a sensor defined by a file to a robot link do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyCamera&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is also possible to put a sensor directly in the environment without a robot. Such a sensor will not have any geometry associated with it, and will only act as a sensing source.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... environment definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;sensor name=&amp;quot;mysensor&amp;quot; file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the sensor transform --&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 1 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
  &amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== XML Reference ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; All XML handling is done in &amp;#039;&amp;#039;&amp;#039;src/libopenrave-core/xmlreaders.cpp&amp;#039;&amp;#039;&amp;#039;. If there&amp;#039;s any parameters that are not explained well, make sure to check out that source file for further reference.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; You can find details on joints on : [http://opende.sourceforge.net/wiki/index.php/Manual_%28Joint_Types_and_Functions%29 ODE Manual page (joints)].&lt;br /&gt;
&lt;br /&gt;
Here&amp;#039;s a list of all possible fields the XML supports in a hierarchical structure.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;environment&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;bkgndcolor&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camrotaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camtrans&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;planner&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensorsystem&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file, robot, args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;inversekinematicssolver&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;physicsengine&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;collisionchecker&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;trajectory&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;viewer&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;server&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type, makejoinedlinksadjacent&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;adjacent&amp;#039;&amp;#039;&amp;#039; - 2 body names&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (dynamic, static)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;geom&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (box, sphere, trimesh, cylinder), render (true,false), modifiable (true,false)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;ambientcolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;collision&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;diffusecolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;extents&amp;#039;&amp;#039;&amp;#039; - 3 float [box]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;height&amp;#039;&amp;#039;&amp;#039; - float [cylinder]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float [cylinder, sphere]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;render&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;vertices&amp;#039;&amp;#039;&amp;#039; - 9*N floats where each 9 values defines 1 triangle with 3 vertices&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;com&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;inertia&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - body/link name&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;joint&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; enable (true, false), type (hinge, slider, universal, hinge2, spherical), circular(true, false), mimic_pos (math equation), mimic_vel (math equation), mimic_accel (math equation)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;anchor&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, hinge2, universal, spherical]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, slider]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis1&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis2&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limits&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsdeg&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in degrees if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsrad&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxvel&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxveldeg&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxaccel&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxacceldeg&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mode&amp;#039;&amp;#039;&amp;#039; - int [amotor]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - body/link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;resolution&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;weight&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;modelsdir&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - bodyname&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type (robot plugin type)&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;attachedsensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;link&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;...&amp;#039;&amp;#039;&amp;#039; - fields defined by SensorBase class instantiated by type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - type args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - name&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;manipulator&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;armjoints&amp;#039;&amp;#039;&amp;#039; - n joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;base&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closed&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;effector&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;iksolver&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;gripperjoints&amp;#039;&amp;#039;&amp;#039; - k joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closingdirection&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;palmdirection&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - name, file, type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
&amp;lt;math&amp;gt;Insert formula here&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=188</id>
		<title>Format:XML</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=188"/>
				<updated>2011-09-24T06:45:46Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
= OpenRAVE Custom XML Format =&lt;br /&gt;
&lt;br /&gt;
[[image:Openrave_robots.jpg|600px]] &lt;br /&gt;
&lt;br /&gt;
TODO: Decide on the versioning scheme&lt;br /&gt;
&lt;br /&gt;
OpenRAVE uses XML to store all robot and scene descriptions. The XML format is flexible enough to link one XML file from another like including already created objects/robots in an environment. It is also possible to specify vrml or iv formatted files within it to import models. &lt;br /&gt;
&lt;br /&gt;
All interface types can be created. Furthermore, an &amp;lt;environment&amp;gt; tag can optionally be specified to put all bodies/interfaces in.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Environment&amp;#039;&amp;#039;&amp;#039; - specify multiple objects and robots. Can also define some GUI properties like camera start location and background color. The environment allows the creation of &amp;#039;&amp;#039;&amp;#039;any&amp;#039;&amp;#039;&amp;#039; OpenRAVE interfaces. Each interface can take the &amp;#039;&amp;#039;&amp;#039;type&amp;#039;&amp;#039;&amp;#039; attribute specifying the interface type and can define custom XML readers.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039; - The basic object that all other objects derive from. A kinematic body consists of a collection of rigid bodies and joints that connect these bodies.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; - The basic robot that derives from &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039;. Usually every Robot has at least one KinBody declaration inside it. A robot can also hold a list of &amp;#039;&amp;#039;&amp;#039;Manipulator&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;AttachedSensor&amp;#039;&amp;#039;&amp;#039; objects describing the manipulation/sensing capabilities of the robot. Since plugin authors can create different robots, it is also possible to define custom fields in &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; to hold other information like balance control parameters for humanoids.&lt;br /&gt;
&lt;br /&gt;
== KinBody ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody name=&amp;quot;TestKinBody&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Create a rigid body named Body1 and declare it as &amp;#039;dynamic&amp;#039;.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;#039;dynamic&amp;#039; bodies are subject to physics laws, &amp;#039;static&amp;#039; bodies will never move--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- due to physical forces. It is recommended EVERYTHING is declared as &amp;#039;dynamic&amp;#039; --&amp;gt;&lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that the body transforms affects all geometry objects attached. --&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- translation of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;!--rotation of the body specified as a rotation axis. First three numbers are the axis.--&amp;gt;&lt;br /&gt;
    &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- defines mass properties for the entire kinbody. possible mass types are--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- mimicgeom - &amp;lt;density&amp;gt;. Adds a mass equivalent to all the geometry--&amp;gt;&lt;br /&gt;
    &amp;lt;!--    objects. trimesh and plane are not supported.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- box - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;extents&amp;gt; Adds a simple box--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- sphere - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;radius&amp;gt;--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;density&amp;gt;1000&amp;lt;/density&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Define a geometry object attached to the body. The functionality of --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- geometry objects is to define the collision and render geometries of the body. --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- All geometry types have Rotation(Mat/Quat), Translation, and Render components.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Possible geom types are box, sphere, trimesh, plane.--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *box - extents--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *sphere - radius--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *cylinder - radius, height (axis is along y)--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *trimesh - data--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- extents of the box - half width, height, length--&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;1 1 1&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;!-- set the translation and rotation of the box. Note that the transforamtions--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- are all relative to the parent body.--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;0 1 0 45&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Can create multiple geometries per body--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;2 1 2&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 1 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;!-- RotationMat is a 3x3 rotation matrix specified as rows first--&amp;gt;&lt;br /&gt;
      &amp;lt;RotationMat&amp;gt;1 0 0 0 1 0 0 0 1&amp;lt;/RotationMat&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Set the transparency of the geometry, 0 is opaque--&amp;gt;&lt;br /&gt;
      &amp;lt;transparency&amp;gt;0.4&amp;lt;/transparency&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- change the mass properties of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the total mass--&amp;gt;&lt;br /&gt;
      &amp;lt;total&amp;gt;0.40605&amp;lt;/total&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the 3x3 inertia matrix--&amp;gt;&lt;br /&gt;
      &amp;lt;inertia&amp;gt;2 0 0 0 3 0 0 0 5&amp;lt;/inertia&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the center of mass (if using ODE physics engine, should be 0)--&amp;gt;&lt;br /&gt;
      &amp;lt;com&amp;gt;0.008842 -0.000018 0.07367&amp;lt;/com&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a sphere--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;sphere&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- although the underlying collision geometry will be a sphere,--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- render it as a coffee pot--&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/coffeepot.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 -1.5 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Radius&amp;gt;1.5&amp;lt;/Radius&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a triangle mesh--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/cup.iv 0.01&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;!-- use the cup triangles for collision detection.--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The last number is the scale, in case the iv files are scaled improperly.--&amp;gt;&lt;br /&gt;
      &amp;lt;collision&amp;gt;models/objects/cup.iv 0.01&amp;lt;/collision&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1.5 -2 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Create a joint between the two bodies.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Possible joint types are: hinge, slider, universal, hinge2, and spherical.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Hinges are the most common joint type used in robots.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- For amotors, can specify mode, axis1, axis2, axis3. For each axis, first 3 values are the axis and the last value is the relative coord system (see ODE documentation).--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Every joint can have certain properties:--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxforce&amp;gt; are in number of degrees of freedom.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxvel&amp;gt;, &amp;lt;resolution&amp;gt; are scalar and apply to all DOFs.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;limits&amp;gt;, &amp;lt;limitsdeg&amp;gt;, &amp;lt;limitsrad&amp;gt; specify the joint limits --&amp;gt;&lt;br /&gt;
  &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Specify the names of the bodies, names are not case sensitive.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body1&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body2&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- anchor and axis of the hinge--&amp;gt;&lt;br /&gt;
    &amp;lt;Anchor&amp;gt;0 0 0&amp;lt;/Anchor&amp;gt;&lt;br /&gt;
    &amp;lt;Axis&amp;gt;0 1 0&amp;lt;/Axis&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Weight for configuration distance, mostly used in planners.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- for joints with &amp;gt; 1 DOF, specify 2+ values--&amp;gt;&lt;br /&gt;
    &amp;lt;Weight&amp;gt;1.0&amp;lt;/Weight&amp;gt;&lt;br /&gt;
  &amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Models Directory ===&lt;br /&gt;
&lt;br /&gt;
By default, the root directory for all models files is the folder openrave is launched at. To change this, &amp;#039;&amp;#039;&amp;#039;&amp;lt;modelsdir&amp;gt;&amp;#039;&amp;#039;&amp;#039; can be used to specify model files relative to where the current xml file is. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;modelsdir&amp;gt;../mymodels&amp;lt;/modelsdir&amp;gt;&lt;br /&gt;
  &amp;lt;Body&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;render&amp;gt;kitchen/myfile.wrl&amp;lt;/render&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Circular Joints ===&lt;br /&gt;
&lt;br /&gt;
Sometimes joints will have the upper and lower limits identified, meaning that as soon as the joint gets past one limit it will wrap around to the other. Infinitely revolving hinge joints are the most common example of &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; joints where the &amp;lt;math&amp;gt;-\pi&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; limits are identified. In openrave, it is possible to set a joint as &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; like this:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint circular=&amp;quot;true&amp;quot; ...&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Adjacent Links ===&lt;br /&gt;
&lt;br /&gt;
Robot self-collision usually checks all pairs of non-adjacent links for collision; links are adjacent if they are connected to a joint. In order to reduce self-collision computation time and spurious collisions of small links, it is possible to force pairs of links to be treated as adjacent by specifying an &amp;#039;&amp;#039;&amp;#039;&amp;lt;adjacent&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag.&lt;br /&gt;
&lt;br /&gt;
=== Scale ===&lt;br /&gt;
&lt;br /&gt;
The first thing when importing a new model is to check that all the units are in meters (it is very common for robots to be in millimeters), otherwise the visualization model and the collision model will be in a different scale. to check this, open the robot and go to View-&amp;gt;Geometry-&amp;gt;Collision, this will show the collision model. If it is not the same scale, you need to go inside your model files and change the units. You can also enter a scale factor after model filenames like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;collision&amp;gt;mydata.iv 0.001&amp;lt;/collision&amp;gt;&lt;br /&gt;
&amp;lt;render&amp;gt;mydata.iv 0.001&amp;lt;/render&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this will scale the models by 0.001.&lt;br /&gt;
&lt;br /&gt;
== Robot ==&lt;br /&gt;
&lt;br /&gt;
=== A simple 3DOF planar arm in XZ ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;3DOFRobot&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Create the base body, it should never move--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that all translations and rotations are with respect to this base--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- For example, the robot at the identity transformation is equivalent to the identity transformation of the first body.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Base&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.0  0.0  0.0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;radius&amp;gt;0.03&amp;lt;/radius&amp;gt;&lt;br /&gt;
        &amp;lt;height&amp;gt;0.02&amp;lt;/height&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;0.05 0.05 0.05&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the first movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm0&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Offset from is a fast way of specifying that the translation and rotation of this--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- body should be relative to another link--&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Base&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Translation relative to Base--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.01 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm0&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Base&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;4&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;3&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the second movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0.0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.0075 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the third movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.04 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.04 0.005 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;2&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;2&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Create the gripper joints:--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;RClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/RClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/RClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;RClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;RClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!--left gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;LClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0.005 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/LClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/LClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;LClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;LClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 -1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the transparency of every geometry in the KinBody--&amp;gt;&lt;br /&gt;
    &amp;lt;transparency&amp;gt;0.1&amp;lt;/transparency&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specifying the manipulator structure--&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;Arm2&amp;lt;/effector&amp;gt;   &amp;lt;!-- last link where end effector is attached--&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;Base&amp;lt;/base&amp;gt;           &amp;lt;!-- base link--&amp;gt;&lt;br /&gt;
    &amp;lt;joints&amp;gt;j1 j2&amp;lt;/joints&amp;gt;      &amp;lt;!-- the gripper joints used for contact--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- the id of the inverse kinematics solver, it is not necessary to--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify an ik solver for every robot. But if there is one,--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- use iksolver field to identity it.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;lt;iksolver&amp;gt;MyTriDOFSolver&amp;lt;/iksolver&amp;gt; --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- joint values of the closed and opened positions--&amp;gt;&lt;br /&gt;
    &amp;lt;closingdirection&amp;gt;1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
    &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
    &amp;lt;!-- grasp goal with respect to the effector--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0.125 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DOFRobot Robot:  [[image:tridof.jpg|200px]] &lt;br /&gt;
&lt;br /&gt;
=== Defining Manipulators ===&lt;br /&gt;
&lt;br /&gt;
A robot manipulator defines a kinematic chain of the robot joint hierarchy along with optional gripper joint values that are not used in the inverse kinematics computation but are needed for grasping purposes (chains for heads, legs do not need the joint values). A manipulator defines a new frame of reference with respect to the end effector link; all inverse kinematics computations are computed using it. Furthermore, a manipulator can have a &amp;#039;&amp;#039;&amp;#039;&amp;lt;direction&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying an axis for approaching objects or line-of-sight. For example the &amp;#039;&amp;#039;&amp;#039;robots/barrettwam.robot.xml&amp;#039;&amp;#039;&amp;#039; gripper is defined by&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;base&amp;gt;wam0&amp;lt;/base&amp;gt;&lt;br /&gt;
  &amp;lt;effector&amp;gt;wam7&amp;lt;/effector&amp;gt;&lt;br /&gt;
  &amp;lt;Translation&amp;gt;0 0 0.22&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;joints&amp;gt;JF1 JF2 JF3 JF4&amp;lt;/joints&amp;gt;&lt;br /&gt;
  &amp;lt;closingdirection&amp;gt;1 1 1 0&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
  &amp;lt;direction&amp;gt;0 0 1&amp;lt;/direction&amp;gt;&lt;br /&gt;
  &amp;lt;iksolver&amp;gt;WAM7ikfast 0.05&amp;lt;/iksolver&amp;gt;&lt;br /&gt;
&amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The manipulator can optionally define a &amp;#039;&amp;#039;&amp;#039;&amp;lt;iksolver&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying the iksolver interface that is used for getting IK solutions, or a shared object (DLL) to load an [[Component:Ikfast|ikfast]] solver from.&lt;br /&gt;
&lt;br /&gt;
=== Closed-chains and Mimic Joints ===&lt;br /&gt;
&lt;br /&gt;
OpenRAVE allows closed-chains and complex kinematics to be simulated using mimic joints. A mimic joint&amp;#039;s position, velocity, and acceleration values are computed from user-specified formulas using the values of other joints. OpenRAVE uses the Function Parser library to allow any formula to be specified. Refer to the documentation for more information [http://openrave.programmingvision.com/en/coreapihtml/classOpenRAVE_1_1KinBody_1_1Joint.html#a0e31c5be31c4145afa786e0c0d6a46ae here].&lt;br /&gt;
&lt;br /&gt;
A mimic joint requires at least the position equation and its partial derivatives (for velocity) to be manually entered. &lt;br /&gt;
&lt;br /&gt;
For example, the Barrett Hand mimic joints are defined as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;JF1&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;JF1mimic&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot; mimic_pos=&amp;quot;JF1/3+0.8727&amp;quot; mimic_vel=&amp;quot;|JF1 0.33333&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Of course, it is possible to have a mimic joint depend on more than one other joint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;b&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;c&amp;quot; type=&amp;quot;hinge&amp;quot; mimic_pos=&amp;quot;a+b+atan(a)&amp;quot; mimic_vel=&amp;quot;|a 1 + 1/(1+a*a) |b 1&amp;quot; mimic_accel=&amp;quot;|a -2*a/((1+a*a)*(1+a*a)) |b 0&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using mimic joints, it is important to still make all the correct joint connections so that loops are discovered and forces can be computed correctly.&lt;br /&gt;
&lt;br /&gt;
If a joint has more than one degree of freedom, attach the axis index at the end. For example: &amp;quot;mimic_pos0&amp;quot;, &amp;quot;mimic_pos1&amp;quot;, &amp;quot;mimic_vel0&amp;quot;, &amp;quot;mimic_vel1&amp;quot;, &amp;quot;mimic_accel0&amp;quot;, and &amp;quot;mimic_accel1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Attaching Robot Sensors ===&lt;br /&gt;
&lt;br /&gt;
Every robot can be attached a number of sensors onto it. The way to specify this in XML is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specify an attached sensor--&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyFirstLaser&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;link&amp;gt;wam1&amp;lt;/link&amp;gt; &amp;lt;!-- the robot link that the sensor is attached to. As the robot moves, the sensor will move with it--&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 0.2 0.4&amp;lt;/translation&amp;gt; &amp;lt;!-- the local translation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt; &amp;lt;!-- the local rotation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify the real sensor attached--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;#039;type&amp;#039; is the sensor interface identifier--&amp;gt;&lt;br /&gt;
    &amp;lt;sensor type=&amp;quot;BaseLaser2D&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The rest are specific fields to BaseLaser2D, these change as the type changes--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The best way to find out what fields are supported is to look for the documentation--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- for the type of sensor using--&amp;gt;&lt;br /&gt;
      &amp;lt;minangle&amp;gt;-135&amp;lt;/minangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;maxangle&amp;gt;135&amp;lt;/maxangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;0.35&amp;lt;/resolution&amp;gt; &amp;lt;!-- degrees between laser points--&amp;gt;&lt;br /&gt;
      &amp;lt;maxrange&amp;gt;5&amp;lt;/maxrange&amp;gt; &amp;lt;!-- max range of robot--&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting joint values for initial state ===&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot&amp;#039;s initial state is not when all the joints are at 0. Instead of transforming each of the geometry to the zero pose, it is possible to set the initial angle to use using the &amp;lt;initial&amp;gt; tag inside the &amp;lt;joint&amp;gt;. The definition for setting the initial angle to pi/2 radius is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link0&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link1&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;initial&amp;gt;1.570796326794&amp;lt;/initial&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Changing the Body Coordinate System ===&lt;br /&gt;
&lt;br /&gt;
[[image:Barrettwam_coordchange.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot origin and rotation should be defined in a different coordinate system. It is possible to create a new robot file that references the old one and changes its origin. This requires adding a new root link before the robot is defined. For example, consider the robots/barrettwam.robot.xml file whre the first link&amp;#039;s name is &amp;#039;wam0&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- add new first link --&amp;gt;&lt;br /&gt;
  &amp;lt;kinbody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;root&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;robot file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;!-- change the coordinate system of the original first link and attach a dummy joint --&amp;gt;&lt;br /&gt;
    &amp;lt;kinbody&amp;gt;&lt;br /&gt;
      &amp;lt;body name=&amp;quot;wam0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0.3 0.4 0.3&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;root&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;wam0&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;limitsdeg&amp;gt;0 0&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
== Environment Example ==&lt;br /&gt;
&lt;br /&gt;
This example is part of the &amp;#039;&amp;#039;&amp;#039;bin/data/intel/lab1.env.xml&amp;#039;&amp;#039;&amp;#039; file. The most important thing to note about this example is the use of the &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; attribute to import other XML files. The filename specified with &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; has to be &amp;#039;&amp;#039;&amp;#039;relative&amp;#039;&amp;#039;&amp;#039; to the current directory where the file calling it resides. Note the differences between segway.kinbody.xml and barrettwam.robot.xml.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the background color of the environment--&amp;gt;&lt;br /&gt;
  &amp;lt;bkgndcolor&amp;gt;0.3 0.7 0.8&amp;lt;/bkgndcolor&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera translation--&amp;gt;&lt;br /&gt;
  &amp;lt;camtrans&amp;gt;1.418 -1.234 2.963&amp;lt;/camtrans&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera rotation specified by rotation-axis--&amp;gt;&lt;br /&gt;
  &amp;lt;camrotaxis&amp;gt;0.724 0.302 0.619 68&amp;lt;/camrotaxis&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import the segway model and place it somewhere--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;data/segway.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;-0.0671   -0.0819    0.7550&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import a robot file and add an additional body for a cylindrical base--&amp;gt;&lt;br /&gt;
  &amp;lt;Robot file=&amp;quot;../../robots/barrettwam.robot.xml&amp;quot; name=&amp;quot;BarrettWAM&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;-.22 -.14 -.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Body type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
          &amp;lt;radius&amp;gt;0.08&amp;lt;/radius&amp;gt;&lt;br /&gt;
          &amp;lt;height&amp;gt;0.6&amp;lt;/height&amp;gt;&lt;br /&gt;
          &amp;lt;diffusecolor&amp;gt;0.3 0.3 0.3&amp;lt;/diffusecolor&amp;gt;&lt;br /&gt;
          &amp;lt;Translation&amp;gt; 0.2286 0.1397 -0.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;/Geom&amp;gt;&lt;br /&gt;
      &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;-0.754 0.3265 1.036&amp;lt;/translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Robot&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- add the floor as a box--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody name=&amp;quot;floor&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- floor should never move, so make it static--&amp;gt;&lt;br /&gt;
    &amp;lt;Body type=&amp;quot;static&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;2 2 0.005&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;.6 .6 .6&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      	&amp;lt;ambientColor&amp;gt;0.6 0.6 0.6&amp;lt;/ambientColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot Composition ==&lt;br /&gt;
&lt;br /&gt;
The way we recommend managing robots composed of several sub-robots (like a humanoid composed of arms, legs, hands, etc) is to first create separate .kinbody files for just the kinematics and geometry of each separate&lt;br /&gt;
part (ie a hand.kinbody.xml and a arm.kinbody.xml). Then create a robot file that includes both the kinematics and defines the manipulators, sensors, and controllers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;attachedsensor&amp;gt;&lt;br /&gt;
     ....&lt;br /&gt;
 &amp;lt;/attachedsensor&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sometimes for grasp planning, the hand needs to be treated as a robot, so we create a hand.robot.xml file as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. A robot can reference other robots through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;a.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;b.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both a&amp;#039;s and b&amp;#039;s &amp;#039;&amp;#039;&amp;#039;&amp;lt;Manipulator&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;AttachedSensor&amp;gt;&amp;#039;&amp;#039;&amp;#039; tags will be used&lt;br /&gt;
in the parent robot, so you don&amp;#039; t have to copy their definitions.&lt;br /&gt;
&lt;br /&gt;
2. It is possible to prefix the links and joints of a child robot by using the&lt;br /&gt;
&amp;#039;prefix&amp;#039; attribute:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;left_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;right_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now all links and joints will either start with &amp;#039;&amp;#039;&amp;#039;left_&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;right_&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
3. When the xml parser sees a body with the same name as another body,&lt;br /&gt;
it &amp;#039;appends&amp;#039; the specified geometries to the original body. This allows the same link to be referenced/defined in multiple robot files (Note that it is not possible to change the original body coordinate system).&lt;br /&gt;
&lt;br /&gt;
=== Attaching Separate Links ===&lt;br /&gt;
&lt;br /&gt;
When a robot is composed of multiple parts defined in different files, it is necessary to attach links from the different files together so that the robot hierarchy can be complete. This is done by defining &amp;#039;&amp;#039;&amp;#039;disabled&amp;#039;&amp;#039;&amp;#039; dummy joints that attach two links together. These disabled joints do not show up in the robot&amp;#039;s description and are only present to maintain the relative transformation between two links. For example, the robot &amp;#039;&amp;#039;&amp;#039;robots/pa10schunk.robot.xml&amp;#039;&amp;#039;&amp;#039; is composed of &amp;#039;&amp;#039;&amp;#039;robots/pa10.kinbody.xml&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;robots/schunk_manip.kinbody.xml&amp;#039;&amp;#039;&amp;#039;, in order to join the two, the robot  is defined in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;pa10.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody file=&amp;quot;schunk_manip.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;False&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;link7&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;gripper_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;#039;&amp;#039;&amp;#039;link7&amp;#039;&amp;#039;&amp;#039; is a link of the pa10 arm and &amp;#039;&amp;#039;&amp;#039;gripper_base&amp;#039;&amp;#039;&amp;#039; is a link of the gripper. The lower and upper joint limits are all 0, which OpenRAVE recognizes as a dummy joint.&lt;br /&gt;
&lt;br /&gt;
=== Joining A Robot Arm and Hand ===&lt;br /&gt;
&lt;br /&gt;
It is possible to load robots and bodies from COLLADA files by specifying the collada filename through the &amp;#039;&amp;#039;&amp;#039;file&amp;#039;&amp;#039;&amp;#039; attribute. For example, the following robot is a combination of an arm defined in OpenRAVE XML and a hand defined in COLLADA (download schunkSDHHand from [http://opengrasp.sourceforge.net/Downloads.html OpenGrasp]). The dummy joint is used to join the arm end effector with the hand base.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot file=&amp;quot;robots/kuka-kr5-r650.robot.xml&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot prefix=&amp;quot;hand_&amp;quot; file=&amp;quot;schunkSDHhand.dae&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody&amp;gt;&lt;br /&gt;
   &amp;lt;body name=&amp;quot;hand_root&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;offsetfrom&amp;gt;link6&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
     &amp;lt;translation&amp;gt;0.03 0 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
     &amp;lt;rotationaxis&amp;gt;0 1 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;joint type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;link6&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;hand_root&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
   &amp;lt;/joint&amp;gt;&lt;br /&gt;
 &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;base&amp;gt;base&amp;lt;/base&amp;gt;&lt;br /&gt;
   &amp;lt;effector&amp;gt;link6&amp;lt;/effector&amp;gt;&lt;br /&gt;
   &amp;lt;joints&amp;gt;hand_Bone_B1_Joint hand_Bone_B2_Joint hand_Bone_B3_Joint hand_Bone_A1_Joint hand_Bone_A2_Joint hand_Bone_A3_Joint hand_Bone_C1_Joint hand_Bone_C2_Joint hand_Bone_C3_Joint&amp;lt;/joints&amp;gt;&lt;br /&gt;
   &amp;lt;closingdirection&amp;gt;0 1 1 0 1 1 0 1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
   &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Final robot: [[image:collada_sdh_kuka.jpg|150px]]&lt;br /&gt;
&lt;br /&gt;
=== Dual-arm example ===&lt;br /&gt;
&lt;br /&gt;
Here is an example file of having a robot composed of two arms attached to a common link named &amp;#039;&amp;#039;&amp;#039;chest&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;schunk-dualarm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;chest&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;0.1 0.1 0.4&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0 0 0.4&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/geom&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- left arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody prefix=&amp;quot;l_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 -0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody&amp;gt;prefix=&amp;quot;r_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- connect the two arms with dummy joints --&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;leftdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;l_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;rightdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;r_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;!-- define the manipulators --&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;leftarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;l_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;l_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
    &amp;lt;armjoints&amp;gt;l_j0 l_j1 l_j2 l_j3 l_j4 l_j5 l_j6&amp;lt;/armjoints&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;rightarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;r_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;r_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
    &amp;lt;armjoints&amp;gt;r_j0 r_j1 r_j2 r_j3 r_j4 r_j5 r_j6&amp;lt;/armjoints&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Single arm: [[image:schunk-lwa3.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
Dual arm: [[image:schunk-lwa3-dual.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
== Custom XML ==&lt;br /&gt;
&lt;br /&gt;
Openrave provides much more flexibility in creating and defining custom XML readers for interfaces. First the &amp;lt;environment&amp;gt; XML tag supports creating any interface type and supports loading plugins. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;plugin&amp;gt;libcustomreader&amp;lt;/plugin&amp;gt;&lt;br /&gt;
  &amp;lt;robot name=&amp;quot;wam&amp;quot; file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;controller type=&amp;quot;CustomController&amp;quot; robot=&amp;quot;wam&amp;quot; args=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    ..custom data....&lt;br /&gt;
  &amp;lt;/controller&amp;gt;&lt;br /&gt;
  &amp;lt;module type=&amp;quot;basemanipulation&amp;quot; args=&amp;quot;wam&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example, openrave will first load the plugin, then will create a robot, and then will create a controller that is attached to the robot, then will create the basemanipulation module giving it the robot name as the argument.&lt;br /&gt;
&lt;br /&gt;
Furthermore, using EnvironmentBase::RegisterXMLReader, it is possible to set a parser for custom XML tags for each interface type.  For those curious on how to take advantage of custom readers, please refer to examples/plugincpp/customreader.cpp on how to attach a custom XML reader to a controller.&lt;br /&gt;
&lt;br /&gt;
These changes will allow people to setup all their specific environment settings in the XML files without having to rely on external scripts or other programs to do it. Note that OpenRAVE processes tags in depth first order.&lt;br /&gt;
&lt;br /&gt;
== Sensor ==&lt;br /&gt;
&lt;br /&gt;
It is possible to have XML files that declare a sensor and its internal parameters. For example, &amp;#039;&amp;#039;&amp;#039;data/camera.sensor.xml&amp;#039;&amp;#039;&amp;#039; can look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;sensor type=&amp;quot;BaseCamera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KK&amp;gt;640 640 320 240&amp;lt;/KK&amp;gt;&lt;br /&gt;
  &amp;lt;width&amp;gt;640&amp;lt;/width&amp;gt;&lt;br /&gt;
  &amp;lt;height&amp;gt;480&amp;lt;/height&amp;gt;&lt;br /&gt;
  &amp;lt;framerate&amp;gt;5&amp;lt;/framerate&amp;gt;&lt;br /&gt;
  &amp;lt;color&amp;gt;0.5 0.5 1&amp;lt;/color&amp;gt;&lt;br /&gt;
&amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to attach a sensor defined by a file to a robot link do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyCamera&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is also possible to put a sensor directly in the environment without a robot. Such a sensor will not have any geometry associated with it, and will only act as a sensing source.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... environment definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;sensor name=&amp;quot;mysensor&amp;quot; file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the sensor transform --&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 1 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
  &amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== XML Reference ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; All XML handling is done in &amp;#039;&amp;#039;&amp;#039;src/libopenrave-core/xmlreaders.cpp&amp;#039;&amp;#039;&amp;#039;. If there&amp;#039;s any parameters that are not explained well, make sure to check out that source file for further reference.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; You can find details on joints on : [http://opende.sourceforge.net/wiki/index.php/Manual_%28Joint_Types_and_Functions%29 ODE Manual page (joints)].&lt;br /&gt;
&lt;br /&gt;
Here&amp;#039;s a list of all possible fields the XML supports in a hierarchical structure.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;environment&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;bkgndcolor&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camrotaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camtrans&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;planner&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensorsystem&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file, robot, args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;inversekinematicssolver&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;physicsengine&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;collisionchecker&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;trajectory&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;viewer&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;server&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type, makejoinedlinksadjacent&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;adjacent&amp;#039;&amp;#039;&amp;#039; - 2 body names&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (dynamic, static)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;geom&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (box, sphere, trimesh, cylinder), render (true,false), modifiable (true,false)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;ambientcolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;collision&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;diffusecolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;extents&amp;#039;&amp;#039;&amp;#039; - 3 float [box]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;height&amp;#039;&amp;#039;&amp;#039; - float [cylinder]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float [cylinder, sphere]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;render&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;vertices&amp;#039;&amp;#039;&amp;#039; - 9*N floats where each 9 values defines 1 triangle with 3 vertices&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;com&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;inertia&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;joint&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; enable (true, false), type (hinge, slider, universal, hinge2, spherical), circular(true, false), mimic_pos (math equation), mimic_vel (math equation), mimic_accel (math equation)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;anchor&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, hinge2, universal, spherical]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, slider]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis1&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis2&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limits&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsdeg&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in degrees if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsrad&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxvel&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxveldeg&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxaccel&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxacceldeg&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mode&amp;#039;&amp;#039;&amp;#039; - int [amotor]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;resolution&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;weight&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;modelsdir&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - bodyname&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type (robot plugin type)&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;attachedsensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;link&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;...&amp;#039;&amp;#039;&amp;#039; - fields defined by SensorBase class instantiated by type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - type args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - name&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;manipulator&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;armjoints&amp;#039;&amp;#039;&amp;#039; - n joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;base&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closed&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;effector&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;iksolver&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;gripperjoints&amp;#039;&amp;#039;&amp;#039; - k joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closingdirection&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;palmdirection&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - name, file, type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
&amp;lt;math&amp;gt;Insert formula here&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Main_Page&amp;diff=187</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Main_Page&amp;diff=187"/>
				<updated>2011-09-17T08:37:51Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
= Welcome to the OpenRAVE Wiki =&lt;br /&gt;
&lt;br /&gt;
* [http://openrave.programmingvision.com Official OpenRAVE Documentation]&lt;br /&gt;
* [[Projects|Robotics Projects using OpenRAVE]]&lt;br /&gt;
&lt;br /&gt;
== Formats ==&lt;br /&gt;
&lt;br /&gt;
* [[Format:COLLADA|Collada Robot Extensions]]&lt;br /&gt;
* [[Format:XML|OpenRAVE XML Robot Format]]&lt;br /&gt;
&lt;br /&gt;
== Tutorials ==&lt;br /&gt;
&lt;br /&gt;
* [[OctaveMATLAB|Octave/MATLAB Scripting]]&lt;br /&gt;
* [[GUI:QtCoin|Working with the QtCoin GUI]]&lt;br /&gt;
* [[ROS:Index|Working With ROS]]&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=ROS:ControllingRobots&amp;diff=186</id>
		<title>ROS:ControllingRobots</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=ROS:ControllingRobots&amp;diff=186"/>
				<updated>2011-09-17T08:32:27Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Controlling Robots with ROS/OpenRAVE =&lt;br /&gt;
&lt;br /&gt;
This tutorial explains how to control robots via the [http://www.ros.org/browse/details.php?name=openrave_robot_control openrave_robot_control] package.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
By using this framework, a controller gains:&lt;br /&gt;
&lt;br /&gt;
* All robot-specific settings (like masses, max velocities, limits) come from openrave xml files to allow for consistent integration with planners.&lt;br /&gt;
* Forward/Inverse kinematics, jacobian computation, and dynamics computation.&lt;br /&gt;
* Automatically published TF Frames of all the links of the robot.&lt;br /&gt;
* Integration for openrave to send trajectory, velocity, and torque commands.&lt;br /&gt;
* Controller-level self-collision checking.&lt;br /&gt;
* Advertisement of services through ROS along with concept of &amp;#039;&amp;#039;&amp;#039;sessions&amp;#039;&amp;#039;&amp;#039; managing exclusive access to robot control.&lt;br /&gt;
* Trajectory re-timing and smoothing by OpenRAVE.&lt;br /&gt;
&lt;br /&gt;
= Setting up a Robot Example =&lt;br /&gt;
these instructions assume you have installed the required packages for ros and openrave.  See [[Installation]].&lt;br /&gt;
&lt;br /&gt;
==Starting a ROS robot controller==&lt;br /&gt;
&lt;br /&gt;
The first thing you need to do is startup up a robot controller, that advertises services that OpenRAVE can talk to.  There are several options available:&lt;br /&gt;
&lt;br /&gt;
#&amp;#039;&amp;#039;&amp;#039;Simulated Controller&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
#*The simplest thing is to start a simulated controller, that will let you see if your messages are getting through. Such a simulation exists in the openrave_robot_control package&lt;br /&gt;
#*It can be started by running: &amp;lt;br /&amp;gt; &amp;lt;pre&amp;gt;rosrun openrave_robot_control simulationserver --robotfile robots/schunk-lwa3.robot.xml --jointname j0 --jointname j1 --jointname j2 --jointname j3 --jointname j4 --jointname j5 --jointname j6&amp;lt;/pre&amp;gt;&lt;br /&gt;
#*Or the same command through a launchfile:&amp;lt;br /&amp;gt;&amp;lt;pre&amp;gt;  roslaunch openrave_robot_control schunkarm_sim.launch.xml&amp;lt;/pre&amp;gt;&lt;br /&gt;
#**The robot file, just like in normal OpenRAVE, found by searching the paths defined by the environmental variable OPENRAVE_DATA&lt;br /&gt;
#**the joints you wish to control must all be stated explicitly with the joint name given in the kinbody XML file&lt;br /&gt;
#*If the physics engine on openrave is set, the robot could be torque controlled and exhibit similar behaviors as the real robot. It is also possible to load in an environment in which the robot resides for getting environment contact forces.&lt;br /&gt;
#&amp;#039;&amp;#039;&amp;#039;Actual Controller&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
#*Obviously, this is going to depend on your particular robot. Here are some available controllers:&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;10&amp;quot;&lt;br /&gt;
!Hardware !! Package !! Executable !! Repository !! Interface !! Usage&lt;br /&gt;
|-&lt;br /&gt;
|Schunk LWA3 &lt;br /&gt;
| [http://www.ros.org/browse/details.php?name=schunk_motion_controllers schunk_motion_controllers] &lt;br /&gt;
| shunk_server &lt;br /&gt;
| [http://sourceforge.net/projects/cmu-ros-pkg/ cmu-ros-pkg] &lt;br /&gt;
| Serial and CAN(ntcan lib needed) || schunk_server [--device &amp;#039;&amp;#039;can or serial&amp;#039;&amp;#039;] [--moduleid id] [--robotfile openravefile] [--maxvelmult multiplier] [--serial serialport] [--can canport]&lt;br /&gt;
|-&lt;br /&gt;
|Mitsubishi PA10        &lt;br /&gt;
| [http://www.ros.org/browse/details.php?name=pa10controller pa10controller]            &lt;br /&gt;
| pa10server   &lt;br /&gt;
| [http://sourceforge.net/projects/cmu-ros-pkg/ cmu-ros-pkg] &lt;br /&gt;
| ??             &lt;br /&gt;
| pa10server [--robotfile openravefile] [--manipname manipulator name] [--maxvelmult multiplier]&lt;br /&gt;
|-&lt;br /&gt;
|maxon motors&lt;br /&gt;
| [http://www.ros.org/browse/details.php?name=maxondrivers maxondrivers]&lt;br /&gt;
| eposserver&lt;br /&gt;
| [http://sourceforge.net/projects/cmu-ros-pkg/ cmu-ros-pkg] &lt;br /&gt;
| CAN (ntcan library)&lt;br /&gt;
| eposserver [--can port] [--robotfile openravefile] [--manipname name] [--maxvelmult multiplier]&lt;br /&gt;
|-&lt;br /&gt;
|maxon motors + pid&lt;br /&gt;
| [http://www.ros.org/browse/details.php?name=doorarmcontroller doorarmcontroller]&lt;br /&gt;
| doorarmcontroller&lt;br /&gt;
| [http://sourceforge.net/projects/cmu-ros-pkg/ cmu-ros-pkg] &lt;br /&gt;
| openrave_robot_control&lt;br /&gt;
| doorarmcontroller [--can port] [--robotfile openravefile] [--manipname name] [--maxvelmult multiplier]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Verify the controller is running ===&lt;br /&gt;
You will notice the above ROS nodes advertise ROS services (They are actually sessions, which are collections of services)&lt;br /&gt;
You can check that they are advertising by running:&lt;br /&gt;
  rosservice list&lt;br /&gt;
  rostopic list &lt;br /&gt;
For the simulated controller, you will see the additional services:&lt;br /&gt;
  /Brake&lt;br /&gt;
  /Cancel&lt;br /&gt;
  /Query&lt;br /&gt;
  /StartTorque&lt;br /&gt;
  /StartTrajectory&lt;br /&gt;
  /StartVelocity&lt;br /&gt;
  /Wait&lt;br /&gt;
  /controller_session&lt;br /&gt;
  /schunk_simulation/get_loggers&lt;br /&gt;
  /schunk_simulation/set_logger_level&lt;br /&gt;
and the additional topics:&lt;br /&gt;
  /mechanism_state&lt;br /&gt;
  /tf&lt;br /&gt;
Especially important is the &amp;#039;/controller_session&amp;#039; service.  This is how OpenRAVE will talk with the ROS node.&lt;br /&gt;
&lt;br /&gt;
=== OpenRAVE Simulated Controller Example ===&lt;br /&gt;
&lt;br /&gt;
Here is an example of openrave connecting to a robot simulated using &amp;#039;&amp;#039;&amp;#039;simulationserver&amp;#039;&amp;#039;&amp;#039; and setting random values. To start the example do:&lt;br /&gt;
&lt;br /&gt;
 roslaunch openrave_robot_control wam_sim.launch.xml&lt;br /&gt;
&lt;br /&gt;
The ROS launch file is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- shows how to start a simple simulation controller on the WAM--&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;machine name=&amp;quot;wam&amp;quot; address=&amp;quot;localhost&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;node machine=&amp;quot;wam&amp;quot; name=&amp;quot;wam&amp;quot; pkg=&amp;quot;openrave_robot_control&amp;quot; type=&amp;quot;simulationserver&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; args=&amp;quot;--robotfile robots/barrettsegway.robot.xml --manipname arm --maxvelmult 1.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node machine=&amp;quot;wam&amp;quot; name=&amp;quot;openrave&amp;quot; pkg=&amp;quot;openrave_robot_control&amp;quot; type=&amp;quot;testopenravecontrol.py&amp;quot; respawn=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;env name=&amp;quot;OPENRAVE_PLUGINS&amp;quot; value=&amp;quot;$(optenv OPENRAVE_PLUGINS):$(find openrave_robot_control)/lib&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The simple openravepy file to set the commands is:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
from openravepy import *&lt;br /&gt;
from numpy import *&lt;br /&gt;
import time&lt;br /&gt;
env = Environment() # create openrave environment&lt;br /&gt;
env.SetViewer(&amp;#039;qtcoin&amp;#039;)&lt;br /&gt;
env.Load(&amp;#039;robots/barrettwam.robot.xml&amp;#039;)&lt;br /&gt;
robot = env.GetRobots()[0] # get the first robot&lt;br /&gt;
manip = robot.GetManipulators()[0]&lt;br /&gt;
jointnames = &amp;#039; &amp;#039;.join(robot.GetJoints()[j].GetName() for j in manip.GetArmJoints())&lt;br /&gt;
robot.SetController(env.CreateController(&amp;#039;ROSOpenRAVE + trajectoryservice /controller_session &amp;#039;+jointnames))&lt;br /&gt;
&lt;br /&gt;
lower,upper = robot.GetJointLimits()&lt;br /&gt;
&lt;br /&gt;
# sending velocity command?&lt;br /&gt;
#robot.GetController().SendCommand(&amp;quot;setvelocity 4 .01&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
    with robot: # save the robot state and get random joint values that are collision free&lt;br /&gt;
        while True:&lt;br /&gt;
            values = lower + random.rand(len(lower))*(upper-lower)&lt;br /&gt;
            robot.SetJointValues(values)&lt;br /&gt;
            if not robot.CheckSelfCollision() and not env.CheckCollision(robot):&lt;br /&gt;
                break&lt;br /&gt;
    print &amp;#039;setting: &amp;#039;,values&lt;br /&gt;
    robot.GetController().SetDesired(values)&lt;br /&gt;
    robot.WaitForController(0)&lt;br /&gt;
    time.sleep(1.0)&lt;br /&gt;
&lt;br /&gt;
env.Destroy()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Loading the Robot into the OpenRAVE Master ==&lt;br /&gt;
==== Add ROSOpenRAVE Controller to the Path ====&lt;br /&gt;
You need to add the directory holding the &amp;#039;&amp;#039;&amp;#039;librobot_control.so&amp;#039;&amp;#039;&amp;#039; openrave plugin to the OPENRAVE_PLUGINS environment variables. This is possible by putting the following path inside the bashrc file:&lt;br /&gt;
&lt;br /&gt;
 export OPENRAVE_PLUGINS=$OPENRAVE_PLUGINS:`rospack find openrave`/share/openrave/plugins:`rospack find openrave_robot_control`/lib &lt;br /&gt;
&lt;br /&gt;
Executing &amp;#039;openrave --listplugins&amp;#039; should show the &amp;#039;&amp;#039;&amp;#039;ROSOpenRAVE&amp;#039;&amp;#039;&amp;#039; controller interface.&lt;br /&gt;
&lt;br /&gt;
==== Load the ROSOpenRAVE controller interface into OpenRAVE ====&lt;br /&gt;
&lt;br /&gt;
Load the ROSOpenRAVE controller interface into openrave coming from the librobot_control.so and tell it to read the correct schunk service. The shared object contains a &amp;#039;&amp;#039;&amp;#039;Controller&amp;#039;&amp;#039;&amp;#039; interface, which has to be set on the robot in order to take effect. See [[Started:SettingControllers|Setting Controllers]] for how to do this.&lt;br /&gt;
&lt;br /&gt;
Another cool thing with the ROSOpenRAVE interface is that any number of separate pieces of hardware can be trated as the same robot (for example two schunk arms + gripper). All you have to do is specify multiple &amp;#039;&amp;#039;&amp;#039;trajectoryservice&amp;#039;&amp;#039;&amp;#039; tags for each root service your controllers publish. For example, these are the luanch scripts for setting up a PA10 arm and a Schunk serial manipulator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;machine name=&amp;quot;pa10&amp;quot; address=&amp;quot;localhost&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;machine name=&amp;quot;schunk&amp;quot; address=&amp;quot;localhost&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;group ns=&amp;quot;pa10&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;node machine=&amp;quot;pa10&amp;quot; name=&amp;quot;pa10&amp;quot; pkg=&amp;quot;pa10controller&amp;quot; type=&amp;quot;pa10server&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; args=&amp;quot;--robotfile robots/pa10schunk.robot.xml --maxvelmult 0.1&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;env name=&amp;quot;OPENRAVE_DATA&amp;quot; value=&amp;quot;$(optenv OPENRAVE_DATA):$(find openrave)/share/openrave&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/node&amp;gt;&lt;br /&gt;
 &amp;lt;/group&amp;gt;&lt;br /&gt;
 &amp;lt;group ns=&amp;quot;schunk&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;node machine=&amp;quot;schunk&amp;quot; name=&amp;quot;schunk&amp;quot; pkg=&amp;quot;schunk_motion_controllers&amp;quot; type=&amp;quot;schunk_serial_server&amp;quot; respawn=&amp;quot;true&amp;quot; output=&amp;quot;screen&amp;quot; args=&amp;quot; --robotfile robots/pa10schunk.robot.xml --serial /dev/ttyUSB1&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;env name=&amp;quot;OPENRAVE_DATA&amp;quot; value=&amp;quot;$(optenv OPENRAVE_DATA):$(find openrave)/share/openrave&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/node&amp;gt;&lt;br /&gt;
 &amp;lt;/group&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(OPENRAVE_DATA tells the system where to look for the openrave robot files. )&lt;br /&gt;
&lt;br /&gt;
This will setup two namespaces with these root services&lt;br /&gt;
 /pa10/controller_session&lt;br /&gt;
 /schunk/controller_session&lt;br /&gt;
&lt;br /&gt;
Then in openrave, load the ROSOpenRAVE controller interface with the following arguments&lt;br /&gt;
&lt;br /&gt;
 trajectoryservice /pa10/controller_session trajectoryservice /schunk/controller_session joints S1 S2 S3 E1 E2 W1 W2 jfinger_L&lt;br /&gt;
&lt;br /&gt;
This tells the controller that the joints it should control are &amp;quot;S1 S2 S3 E1 E2 W1 W2 jfinger_L&amp;quot;, which come from the ROS services.&lt;br /&gt;
&lt;br /&gt;
==== Using Python for Testing Controller Communication ====&lt;br /&gt;
When running a ROS robot controller, the &amp;#039;&amp;#039;&amp;#039;openrave_robot_control/scripts/controlclient.py&amp;#039;&amp;#039;&amp;#039; script allows users to  send commands to the robot controller without starting a master openrave instance.&lt;br /&gt;
&lt;br /&gt;
= Creating a Controller Driver =&lt;br /&gt;
&lt;br /&gt;
New robot controllers taking advantage of this framework need to depend on the &amp;#039;&amp;#039;&amp;#039;openrave_robot_control&amp;#039;&amp;#039;&amp;#039; package and derive from the &amp;#039;&amp;#039;&amp;#039;openrave_robot_control::OpenRAVEController&amp;#039;&amp;#039;&amp;#039; class. New implementations need a thread that constantly calls OpenRAVEController::_publishTF, fills and publishes OpenRAVEController::_mstate, and processes OpenRAVEController::_listCommands.&lt;br /&gt;
&lt;br /&gt;
The controller offers several modes of operation, each mode has a &amp;#039;&amp;#039;&amp;#039;start&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;run&amp;#039;&amp;#039;&amp;#039;, and &amp;#039;&amp;#039;&amp;#039;finish&amp;#039;&amp;#039;&amp;#039; functions. To hook into trajectory control, implementations of these member functions are needed:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
virtual void _startTrajectoryCommand(TrajectoryBasePtr ptraj);&lt;br /&gt;
virtual CommandStatus _runTrajectoryCommand(TrajectoryBasePtr ptraj, float fCommandTime);&lt;br /&gt;
virtual void _finishTrajectoryCommand(TrajectoryBasePtr ptraj);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Simulating a Controller over ROS ==&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;openrave_robot_control&amp;#039;&amp;#039;&amp;#039; package has a simulation controller which will run the server inside openrave. Basically it is a replacement for the hardware equivalents, which can be used to test planning and programs without running the robot. For example, to simulate joints j0 through j6 on a schunk LWA3 robot do:&lt;br /&gt;
&lt;br /&gt;
 rosrun openrave_robot_control simulationserver --robotfile robots/schunk-lwa3.robot.xml --jointname j0 --jointname j1 --jointname j2 --jointname j3 --jointname j4 --jointname j5 --jointname j6&lt;br /&gt;
&lt;br /&gt;
If this physics engine on openrave is set, the robot could be torque controlled and exhibit similar behaviors as the real robot. It is also possible to load in an environment in which the robot resides for getting environment contact forces.&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=ROS:ControllingRobots&amp;diff=185</id>
		<title>ROS:ControllingRobots</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=ROS:ControllingRobots&amp;diff=185"/>
				<updated>2011-09-17T08:31:20Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Controlling Robots with ROS/OpenRAVE =&lt;br /&gt;
&lt;br /&gt;
This tutorial explains how to control robots via the [http://www.ros.org/browse/details.php?name=openrave_robot_control openrave_robot_control] package.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
By using this framework, a controller gains:&lt;br /&gt;
&lt;br /&gt;
* All robot-specific settings (like masses, max velocities, limits) come from openrave xml files to allow for consistent integration with planners.&lt;br /&gt;
* Forward/Inverse kinematics, jacobian computation, and dynamics computation.&lt;br /&gt;
* Automatically published TF Frames of all the links of the robot.&lt;br /&gt;
* Integration for openrave to send trajectory, velocity, and torque commands.&lt;br /&gt;
* Controller-level self-collision checking.&lt;br /&gt;
* Advertisement of services through ROS along with concept of &amp;#039;&amp;#039;&amp;#039;sessions&amp;#039;&amp;#039;&amp;#039; managing exclusive access to robot control.&lt;br /&gt;
* Trajectory re-timing and smoothing by OpenRAVE.&lt;br /&gt;
&lt;br /&gt;
= Setting up a Robot Example =&lt;br /&gt;
these instructions assume you have installed the required packages for ros and openrave.  See [[Installation]].&lt;br /&gt;
&lt;br /&gt;
==Starting a ROS robot controller==&lt;br /&gt;
&lt;br /&gt;
The first thing you need to do is startup up a robot controller, that advertises services that OpenRAVE can talk to.  There are several options available:&lt;br /&gt;
&lt;br /&gt;
#&amp;#039;&amp;#039;&amp;#039;Simulated Controller&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
#*The simplest thing is to start a simulated controller, that will let you see if your messages are getting through. Such a simulation exists in the openrave_robot_control package&lt;br /&gt;
#*It can be started by running: &amp;lt;br /&amp;gt; &amp;lt;pre&amp;gt;rosrun openrave_robot_control simulationserver --robotfile robots/schunk-lwa3.robot.xml --jointname j0 --jointname j1 --jointname j2 --jointname j3 --jointname j4 --jointname j5 --jointname j6&amp;lt;/pre&amp;gt;&lt;br /&gt;
#*Or the same command through a launchfile:&amp;lt;br /&amp;gt;&amp;lt;pre&amp;gt;  roslaunch openrave_robot_control schunkarm_sim.launch.xml&amp;lt;/pre&amp;gt;&lt;br /&gt;
#**The robot file, just like in normal OpenRAVE, found by searching the paths defined by the environmental variable OPENRAVE_DATA&lt;br /&gt;
#**the joints you wish to control must all be stated explicitly with the joint name given in the kinbody XML file&lt;br /&gt;
#*If the physics engine on openrave is set, the robot could be torque controlled and exhibit similar behaviors as the real robot. It is also possible to load in an environment in which the robot resides for getting environment contact forces.&lt;br /&gt;
#&amp;#039;&amp;#039;&amp;#039;Actual Controller&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
#*Obviously, this is going to depend on your particular robot. Here are some available controllers:&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;10&amp;quot;&lt;br /&gt;
!Hardware !! Package !! Executable !! Repository !! Interface !! Usage&lt;br /&gt;
|-&lt;br /&gt;
|Schunk LWA3 &lt;br /&gt;
| [http://www.ros.org/browse/details.php?name=schunk_motion_controllers schunk_motion_controllers] &lt;br /&gt;
| shunk_server &lt;br /&gt;
| [http://sourceforge.net/projects/cmu-ros-pkg/ cmu-ros-pkg] &lt;br /&gt;
| Serial and CAN(ntcan lib needed) || schunk_server [--device &amp;#039;&amp;#039;can or serial&amp;#039;&amp;#039;] [--moduleid id] [--robotfile openravefile] [--maxvelmult multiplier] [--serial serialport] [--can canport]&lt;br /&gt;
|-&lt;br /&gt;
|Mitsubishi PA10        &lt;br /&gt;
| [http://www.ros.org/browse/details.php?name=pa10controller pa10controller]            &lt;br /&gt;
| pa10server   &lt;br /&gt;
| [http://sourceforge.net/projects/cmu-ros-pkg/ cmu-ros-pkg] &lt;br /&gt;
| ??             &lt;br /&gt;
| pa10server [--robotfile openravefile] [--manipname manipulator name] [--maxvelmult multiplier]&lt;br /&gt;
|-&lt;br /&gt;
|maxon motors&lt;br /&gt;
| [http://www.ros.org/browse/details.php?name=maxondrivers maxondrivers]&lt;br /&gt;
| eposserver&lt;br /&gt;
| [http://sourceforge.net/projects/cmu-ros-pkg/ cmu-ros-pkg] &lt;br /&gt;
| CAN (ntcan library)&lt;br /&gt;
| eposserver [--can port] [--robotfile openravefile] [--manipname name] [--maxvelmult multiplier]&lt;br /&gt;
|-&lt;br /&gt;
|maxon motors + pid&lt;br /&gt;
| [http://www.ros.org/browse/details.php?name=doorarmcontroller doorarmcontroller]&lt;br /&gt;
| doorarmcontroller&lt;br /&gt;
| [http://sourceforge.net/projects/cmu-ros-pkg/ cmu-ros-pkg] &lt;br /&gt;
| openrave_robot_control&lt;br /&gt;
| doorarmcontroller [--can port] [--robotfile openravefile] [--manipname name] [--maxvelmult multiplier]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Verify the controller is running ===&lt;br /&gt;
You will notice the above ROS nodes advertise ROS services (They are actually sessions, which are collections of services)&lt;br /&gt;
You can check that they are advertising by running:&lt;br /&gt;
  rosservice list&lt;br /&gt;
  rostopic list &lt;br /&gt;
For the simulated controller, you will see the additional services:&lt;br /&gt;
  /Brake&lt;br /&gt;
  /Cancel&lt;br /&gt;
  /Query&lt;br /&gt;
  /StartTorque&lt;br /&gt;
  /StartTrajectory&lt;br /&gt;
  /StartVelocity&lt;br /&gt;
  /Wait&lt;br /&gt;
  /controller_session&lt;br /&gt;
  /schunk_simulation/get_loggers&lt;br /&gt;
  /schunk_simulation/set_logger_level&lt;br /&gt;
and the additional topics:&lt;br /&gt;
  /mechanism_state&lt;br /&gt;
  /tf&lt;br /&gt;
Especially important is the &amp;#039;/controller_session&amp;#039; service.  This is how OpenRAVE will talk with the ROS node.&lt;br /&gt;
&lt;br /&gt;
=== OpenRAVE Simulated Controller Example ===&lt;br /&gt;
&lt;br /&gt;
Here is an example of openrave connecting to a robot simulated using &amp;#039;&amp;#039;&amp;#039;simulationserver&amp;#039;&amp;#039;&amp;#039; and setting random values. To start the example do:&lt;br /&gt;
&lt;br /&gt;
 roslaunch openrave_robot_control wam_sim.launch.xml&lt;br /&gt;
&lt;br /&gt;
The ROS launch file is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- shows how to start a simple simulation controller on the WAM--&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;machine name=&amp;quot;wam&amp;quot; address=&amp;quot;localhost&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;node machine=&amp;quot;wam&amp;quot; name=&amp;quot;wam&amp;quot; pkg=&amp;quot;openrave_robot_control&amp;quot; type=&amp;quot;simulationserver&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; args=&amp;quot;--robotfile robots/barrettsegway.robot.xml --manipname arm --maxvelmult 1.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node machine=&amp;quot;wam&amp;quot; name=&amp;quot;openrave&amp;quot; pkg=&amp;quot;openrave_robot_control&amp;quot; type=&amp;quot;testopenravecontrol.py&amp;quot; respawn=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;env name=&amp;quot;PYTHONPATH&amp;quot; value=&amp;quot;$(optenv PYTHONPATH):$(find openrave)/share/openrave&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;env name=&amp;quot;OPENRAVE_PLUGINS&amp;quot; value=&amp;quot;$(optenv OPENRAVE_PLUGINS):$(find openrave)/share/openrave/plugins:$(find openrave_robot_control)/lib&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The simple openravepy file to set the commands is:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
from openravepy import *&lt;br /&gt;
from numpy import *&lt;br /&gt;
import time&lt;br /&gt;
env = Environment() # create openrave environment&lt;br /&gt;
env.SetViewer(&amp;#039;qtcoin&amp;#039;)&lt;br /&gt;
env.Load(&amp;#039;robots/barrettwam.robot.xml&amp;#039;)&lt;br /&gt;
robot = env.GetRobots()[0] # get the first robot&lt;br /&gt;
manip = robot.GetManipulators()[0]&lt;br /&gt;
jointnames = &amp;#039; &amp;#039;.join(robot.GetJoints()[j].GetName() for j in manip.GetArmJoints())&lt;br /&gt;
robot.SetController(env.CreateController(&amp;#039;ROSOpenRAVE + trajectoryservice /controller_session &amp;#039;+jointnames))&lt;br /&gt;
&lt;br /&gt;
lower,upper = robot.GetJointLimits()&lt;br /&gt;
&lt;br /&gt;
# sending velocity command?&lt;br /&gt;
#robot.GetController().SendCommand(&amp;quot;setvelocity 4 .01&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
    with robot: # save the robot state and get random joint values that are collision free&lt;br /&gt;
        while True:&lt;br /&gt;
            values = lower + random.rand(len(lower))*(upper-lower)&lt;br /&gt;
            robot.SetJointValues(values)&lt;br /&gt;
            if not robot.CheckSelfCollision() and not env.CheckCollision(robot):&lt;br /&gt;
                break&lt;br /&gt;
    print &amp;#039;setting: &amp;#039;,values&lt;br /&gt;
    robot.GetController().SetDesired(values)&lt;br /&gt;
    robot.WaitForController(0)&lt;br /&gt;
    time.sleep(1.0)&lt;br /&gt;
&lt;br /&gt;
env.Destroy()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Loading the Robot into the OpenRAVE Master ==&lt;br /&gt;
==== Add ROSOpenRAVE Controller to the Path ====&lt;br /&gt;
You need to add the directory holding the &amp;#039;&amp;#039;&amp;#039;librobot_control.so&amp;#039;&amp;#039;&amp;#039; openrave plugin to the OPENRAVE_PLUGINS environment variables. This is possible by putting the following path inside the bashrc file:&lt;br /&gt;
&lt;br /&gt;
 export OPENRAVE_PLUGINS=$OPENRAVE_PLUGINS:`rospack find openrave`/share/openrave/plugins:`rospack find openrave_robot_control`/lib &lt;br /&gt;
&lt;br /&gt;
Executing &amp;#039;openrave --listplugins&amp;#039; should show the &amp;#039;&amp;#039;&amp;#039;ROSOpenRAVE&amp;#039;&amp;#039;&amp;#039; controller interface.&lt;br /&gt;
&lt;br /&gt;
==== Load the ROSOpenRAVE controller interface into OpenRAVE ====&lt;br /&gt;
&lt;br /&gt;
Load the ROSOpenRAVE controller interface into openrave coming from the librobot_control.so and tell it to read the correct schunk service. The shared object contains a &amp;#039;&amp;#039;&amp;#039;Controller&amp;#039;&amp;#039;&amp;#039; interface, which has to be set on the robot in order to take effect. See [[Started:SettingControllers|Setting Controllers]] for how to do this.&lt;br /&gt;
&lt;br /&gt;
Another cool thing with the ROSOpenRAVE interface is that any number of separate pieces of hardware can be trated as the same robot (for example two schunk arms + gripper). All you have to do is specify multiple &amp;#039;&amp;#039;&amp;#039;trajectoryservice&amp;#039;&amp;#039;&amp;#039; tags for each root service your controllers publish. For example, these are the luanch scripts for setting up a PA10 arm and a Schunk serial manipulator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;machine name=&amp;quot;pa10&amp;quot; address=&amp;quot;localhost&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;machine name=&amp;quot;schunk&amp;quot; address=&amp;quot;localhost&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;group ns=&amp;quot;pa10&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;node machine=&amp;quot;pa10&amp;quot; name=&amp;quot;pa10&amp;quot; pkg=&amp;quot;pa10controller&amp;quot; type=&amp;quot;pa10server&amp;quot; respawn=&amp;quot;false&amp;quot; output=&amp;quot;screen&amp;quot; args=&amp;quot;--robotfile robots/pa10schunk.robot.xml --maxvelmult 0.1&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;env name=&amp;quot;OPENRAVE_DATA&amp;quot; value=&amp;quot;$(optenv OPENRAVE_DATA):$(find openrave)/share/openrave&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/node&amp;gt;&lt;br /&gt;
 &amp;lt;/group&amp;gt;&lt;br /&gt;
 &amp;lt;group ns=&amp;quot;schunk&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;node machine=&amp;quot;schunk&amp;quot; name=&amp;quot;schunk&amp;quot; pkg=&amp;quot;schunk_motion_controllers&amp;quot; type=&amp;quot;schunk_serial_server&amp;quot; respawn=&amp;quot;true&amp;quot; output=&amp;quot;screen&amp;quot; args=&amp;quot; --robotfile robots/pa10schunk.robot.xml --serial /dev/ttyUSB1&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;env name=&amp;quot;OPENRAVE_DATA&amp;quot; value=&amp;quot;$(optenv OPENRAVE_DATA):$(find openrave)/share/openrave&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/node&amp;gt;&lt;br /&gt;
 &amp;lt;/group&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(OPENRAVE_DATA tells the system where to look for the openrave robot files. )&lt;br /&gt;
&lt;br /&gt;
This will setup two namespaces with these root services&lt;br /&gt;
 /pa10/controller_session&lt;br /&gt;
 /schunk/controller_session&lt;br /&gt;
&lt;br /&gt;
Then in openrave, load the ROSOpenRAVE controller interface with the following arguments&lt;br /&gt;
&lt;br /&gt;
 trajectoryservice /pa10/controller_session trajectoryservice /schunk/controller_session joints S1 S2 S3 E1 E2 W1 W2 jfinger_L&lt;br /&gt;
&lt;br /&gt;
This tells the controller that the joints it should control are &amp;quot;S1 S2 S3 E1 E2 W1 W2 jfinger_L&amp;quot;, which come from the ROS services.&lt;br /&gt;
&lt;br /&gt;
==== Using Python for Testing Controller Communication ====&lt;br /&gt;
When running a ROS robot controller, the &amp;#039;&amp;#039;&amp;#039;openrave_robot_control/scripts/controlclient.py&amp;#039;&amp;#039;&amp;#039; script allows users to  send commands to the robot controller without starting a master openrave instance.&lt;br /&gt;
&lt;br /&gt;
= Creating a Controller Driver =&lt;br /&gt;
&lt;br /&gt;
New robot controllers taking advantage of this framework need to depend on the &amp;#039;&amp;#039;&amp;#039;openrave_robot_control&amp;#039;&amp;#039;&amp;#039; package and derive from the &amp;#039;&amp;#039;&amp;#039;openrave_robot_control::OpenRAVEController&amp;#039;&amp;#039;&amp;#039; class. New implementations need a thread that constantly calls OpenRAVEController::_publishTF, fills and publishes OpenRAVEController::_mstate, and processes OpenRAVEController::_listCommands.&lt;br /&gt;
&lt;br /&gt;
The controller offers several modes of operation, each mode has a &amp;#039;&amp;#039;&amp;#039;start&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;run&amp;#039;&amp;#039;&amp;#039;, and &amp;#039;&amp;#039;&amp;#039;finish&amp;#039;&amp;#039;&amp;#039; functions. To hook into trajectory control, implementations of these member functions are needed:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
virtual void _startTrajectoryCommand(TrajectoryBasePtr ptraj);&lt;br /&gt;
virtual CommandStatus _runTrajectoryCommand(TrajectoryBasePtr ptraj, float fCommandTime);&lt;br /&gt;
virtual void _finishTrajectoryCommand(TrajectoryBasePtr ptraj);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Simulating a Controller over ROS ==&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;openrave_robot_control&amp;#039;&amp;#039;&amp;#039; package has a simulation controller which will run the server inside openrave. Basically it is a replacement for the hardware equivalents, which can be used to test planning and programs without running the robot. For example, to simulate joints j0 through j6 on a schunk LWA3 robot do:&lt;br /&gt;
&lt;br /&gt;
 rosrun openrave_robot_control simulationserver --robotfile robots/schunk-lwa3.robot.xml --jointname j0 --jointname j1 --jointname j2 --jointname j3 --jointname j4 --jointname j5 --jointname j6&lt;br /&gt;
&lt;br /&gt;
If this physics engine on openrave is set, the robot could be torque controlled and exhibit similar behaviors as the real robot. It is also possible to load in an environment in which the robot resides for getting environment contact forces.&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=128</id>
		<title>Format:XML</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=128"/>
				<updated>2011-07-26T09:46:30Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
= OpenRAVE Custom XML Format =&lt;br /&gt;
&lt;br /&gt;
[[image:Openrave_robots.jpg|600px]] &lt;br /&gt;
&lt;br /&gt;
TODO: Decide on the versioning scheme&lt;br /&gt;
&lt;br /&gt;
OpenRAVE uses XML to store all robot and scene descriptions. The XML format is flexible enough to link one XML file from another like including already created objects/robots in an environment. It is also possible to specify vrml or iv formatted files within it to import models. &lt;br /&gt;
&lt;br /&gt;
All interface types can be created. Furthermore, an &amp;lt;environment&amp;gt; tag can optionally be specified to put all bodies/interfaces in.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Environment&amp;#039;&amp;#039;&amp;#039; - specify multiple objects and robots. Can also define some GUI properties like camera start location and background color. The environment allows the creation of &amp;#039;&amp;#039;&amp;#039;any&amp;#039;&amp;#039;&amp;#039; OpenRAVE interfaces. Each interface can take the &amp;#039;&amp;#039;&amp;#039;type&amp;#039;&amp;#039;&amp;#039; attribute specifying the interface type and can define custom XML readers.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039; - The basic object that all other objects derive from. A kinematic body consists of a collection of rigid bodies and joints that connect these bodies.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; - The basic robot that derives from &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039;. Usually every Robot has at least one KinBody declaration inside it. A robot can also hold a list of &amp;#039;&amp;#039;&amp;#039;Manipulator&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;AttachedSensor&amp;#039;&amp;#039;&amp;#039; objects describing the manipulation/sensing capabilities of the robot. Since plugin authors can create different robots, it is also possible to define custom fields in &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; to hold other information like balance control parameters for humanoids.&lt;br /&gt;
&lt;br /&gt;
== KinBody ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody name=&amp;quot;TestKinBody&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Create a rigid body named Body1 and declare it as &amp;#039;dynamic&amp;#039;.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;#039;dynamic&amp;#039; bodies are subject to physics laws, &amp;#039;static&amp;#039; bodies will never move--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- due to physical forces. It is recommended EVERYTHING is declared as &amp;#039;dynamic&amp;#039; --&amp;gt;&lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that the body transforms affects all geometry objects attached. --&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- translation of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;!--rotation of the body specified as a rotation axis. First three numbers are the axis.--&amp;gt;&lt;br /&gt;
    &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- defines mass properties for the entire kinbody. possible mass types are--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- mimicgeom - &amp;lt;density&amp;gt;. Adds a mass equivalent to all the geometry--&amp;gt;&lt;br /&gt;
    &amp;lt;!--    objects. trimesh and plane are not supported.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- box - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;extents&amp;gt; Adds a simple box--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- sphere - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;radius&amp;gt;--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;density&amp;gt;1000&amp;lt;/density&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Define a geometry object attached to the body. The functionality of --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- geometry objects is to define the collision and render geometries of the body. --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- All geometry types have Rotation(Mat/Quat), Translation, and Render components.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Possible geom types are box, sphere, trimesh, plane.--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *box - extents--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *sphere - radius--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *cylinder - radius, height (axis is along y)--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *trimesh - data--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- extents of the box - half width, height, length--&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;1 1 1&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;!-- set the translation and rotation of the box. Note that the transforamtions--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- are all relative to the parent body.--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;0 1 0 45&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Can create multiple geometries per body--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;2 1 2&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 1 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;!-- RotationMat is a 3x3 rotation matrix specified as rows first--&amp;gt;&lt;br /&gt;
      &amp;lt;RotationMat&amp;gt;1 0 0 0 1 0 0 0 1&amp;lt;/RotationMat&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Set the transparency of the geometry, 0 is opaque--&amp;gt;&lt;br /&gt;
      &amp;lt;transparency&amp;gt;0.4&amp;lt;/transparency&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- change the mass properties of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the total mass--&amp;gt;&lt;br /&gt;
      &amp;lt;total&amp;gt;0.40605&amp;lt;/total&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the 3x3 inertia matrix--&amp;gt;&lt;br /&gt;
      &amp;lt;inertia&amp;gt;2 0 0 0 3 0 0 0 5&amp;lt;/inertia&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the center of mass (if using ODE physics engine, should be 0)--&amp;gt;&lt;br /&gt;
      &amp;lt;com&amp;gt;0.008842 -0.000018 0.07367&amp;lt;/com&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a sphere--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;sphere&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- although the underlying collision geometry will be a sphere,--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- render it as a coffee pot--&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/coffeepot.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 -1.5 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Radius&amp;gt;1.5&amp;lt;/Radius&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a triangle mesh--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/cup.iv 0.01&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;!-- use the cup triangles for collision detection.--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The last number is the scale, in case the iv files are scaled improperly.--&amp;gt;&lt;br /&gt;
      &amp;lt;collision&amp;gt;models/objects/cup.iv 0.01&amp;lt;/collision&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1.5 -2 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Create a joint between the two bodies.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Possible joint types are: hinge, slider, universal, hinge2, and spherical.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Hinges are the most common joint type used in robots.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- For amotors, can specify mode, axis1, axis2, axis3. For each axis, first 3 values are the axis and the last value is the relative coord system (see ODE documentation).--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Every joint can have certain properties:--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxforce&amp;gt; are in number of degrees of freedom.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxvel&amp;gt;, &amp;lt;resolution&amp;gt; are scalar and apply to all DOFs.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;limits&amp;gt;, &amp;lt;limitsdeg&amp;gt;, &amp;lt;limitsrad&amp;gt; specify the joint limits --&amp;gt;&lt;br /&gt;
  &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Specify the names of the bodies, names are not case sensitive.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body1&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body2&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- anchor and axis of the hinge--&amp;gt;&lt;br /&gt;
    &amp;lt;Anchor&amp;gt;0 0 0&amp;lt;/Anchor&amp;gt;&lt;br /&gt;
    &amp;lt;Axis&amp;gt;0 1 0&amp;lt;/Axis&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Weight for configuration distance, mostly used in planners.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- for joints with &amp;gt; 1 DOF, specify 2+ values--&amp;gt;&lt;br /&gt;
    &amp;lt;Weight&amp;gt;1.0&amp;lt;/Weight&amp;gt;&lt;br /&gt;
  &amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Models Directory ===&lt;br /&gt;
&lt;br /&gt;
By default, the root directory for all models files is the folder openrave is launched at. To change this, &amp;#039;&amp;#039;&amp;#039;&amp;lt;modelsdir&amp;gt;&amp;#039;&amp;#039;&amp;#039; can be used to specify model files relative to where the current xml file is. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;modelsdir&amp;gt;../mymodels&amp;lt;/modelsdir&amp;gt;&lt;br /&gt;
  &amp;lt;Body&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;render&amp;gt;kitchen/myfile.wrl&amp;lt;/render&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Circular Joints ===&lt;br /&gt;
&lt;br /&gt;
Sometimes joints will have the upper and lower limits identified, meaning that as soon as the joint gets past one limit it will wrap around to the other. Infinitely revolving hinge joints are the most common example of &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; joints where the &amp;lt;math&amp;gt;-\pi&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; limits are identified. In openrave, it is possible to set a joint as &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; like this:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint circular=&amp;quot;true&amp;quot; ...&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Adjacent Links ===&lt;br /&gt;
&lt;br /&gt;
Robot self-collision usually checks all pairs of non-adjacent links for collision; links are adjacent if they are connected to a joint. In order to reduce self-collision computation time and spurious collisions of small links, it is possible to force pairs of links to be treated as adjacent by specifying an &amp;#039;&amp;#039;&amp;#039;&amp;lt;adjacent&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag.&lt;br /&gt;
&lt;br /&gt;
=== Scale ===&lt;br /&gt;
&lt;br /&gt;
The first thing when importing a new model is to check that all the units are in meters (it is very common for robots to be in millimeters), otherwise the visualization model and the collision model will be in a different scale. to check this, open the robot and go to View-&amp;gt;Geometry-&amp;gt;Collision, this will show the collision model. If it is not the same scale, you need to go inside your model files and change the units. You can also enter a scale factor after model filenames like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;collision&amp;gt;mydata.iv 0.001&amp;lt;/collision&amp;gt;&lt;br /&gt;
&amp;lt;render&amp;gt;mydata.iv 0.001&amp;lt;/render&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this will scale the models by 0.001.&lt;br /&gt;
&lt;br /&gt;
== Robot ==&lt;br /&gt;
&lt;br /&gt;
=== A simple 3DOF planar arm in XZ ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;3DOFRobot&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Create the base body, it should never move--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that all translations and rotations are with respect to this base--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- For example, the robot at the identity transformation is equivalent to the identity transformation of the first body.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Base&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.0  0.0  0.0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;radius&amp;gt;0.03&amp;lt;/radius&amp;gt;&lt;br /&gt;
        &amp;lt;height&amp;gt;0.02&amp;lt;/height&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;0.05 0.05 0.05&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the first movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm0&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Offset from is a fast way of specifying that the translation and rotation of this--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- body should be relative to another link--&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Base&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Translation relative to Base--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.01 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm0&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Base&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;4&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;3&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the second movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0.0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.0075 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the third movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.04 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.04 0.005 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;2&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;2&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Create the gripper joints:--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;RClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/RClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/RClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;RClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;RClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!--left gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;LClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0.005 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/LClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/LClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;LClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;LClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 -1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the transparency of every geometry in the KinBody--&amp;gt;&lt;br /&gt;
    &amp;lt;transparency&amp;gt;0.1&amp;lt;/transparency&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specifying the manipulator structure--&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;Arm2&amp;lt;/effector&amp;gt;   &amp;lt;!-- last link where end effector is attached--&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;Base&amp;lt;/base&amp;gt;           &amp;lt;!-- base link--&amp;gt;&lt;br /&gt;
    &amp;lt;joints&amp;gt;j1 j2&amp;lt;/joints&amp;gt;      &amp;lt;!-- the gripper joints used for contact--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- the id of the inverse kinematics solver, it is not necessary to--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify an ik solver for every robot. But if there is one,--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- use iksolver field to identity it.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;lt;iksolver&amp;gt;MyTriDOFSolver&amp;lt;/iksolver&amp;gt; --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- joint values of the closed and opened positions--&amp;gt;&lt;br /&gt;
    &amp;lt;closingdirection&amp;gt;1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
    &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
    &amp;lt;!-- grasp goal with respect to the effector--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0.125 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DOFRobot Robot:  [[image:tridof.jpg|200px]] &lt;br /&gt;
&lt;br /&gt;
=== Defining Manipulators ===&lt;br /&gt;
&lt;br /&gt;
A robot manipulator defines a kinematic chain of the robot joint hierarchy along with optional gripper joint values that are not used in the inverse kinematics computation but are needed for grasping purposes (chains for heads, legs do not need the joint values). A manipulator defines a new frame of reference with respect to the end effector link; all inverse kinematics computations are computed using it. Furthermore, a manipulator can have a &amp;#039;&amp;#039;&amp;#039;&amp;lt;direction&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying an axis for approaching objects or line-of-sight. For example the &amp;#039;&amp;#039;&amp;#039;robots/barrettwam.robot.xml&amp;#039;&amp;#039;&amp;#039; gripper is defined by&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;base&amp;gt;wam0&amp;lt;/base&amp;gt;&lt;br /&gt;
  &amp;lt;effector&amp;gt;wam7&amp;lt;/effector&amp;gt;&lt;br /&gt;
  &amp;lt;Translation&amp;gt;0 0 0.22&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;joints&amp;gt;JF1 JF2 JF3 JF4&amp;lt;/joints&amp;gt;&lt;br /&gt;
  &amp;lt;closingdirection&amp;gt;1 1 1 0&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
  &amp;lt;direction&amp;gt;0 0 1&amp;lt;/direction&amp;gt;&lt;br /&gt;
  &amp;lt;iksolver&amp;gt;WAM7ikfast 0.05&amp;lt;/iksolver&amp;gt;&lt;br /&gt;
&amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The manipulator can optionally define a &amp;#039;&amp;#039;&amp;#039;&amp;lt;iksolver&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying the iksolver interface that is used for getting IK solutions, or a shared object (DLL) to load an [[Component:Ikfast|ikfast]] solver from.&lt;br /&gt;
&lt;br /&gt;
=== Closed-chains and Mimic Joints ===&lt;br /&gt;
&lt;br /&gt;
OpenRAVE allows closed-chains and complex kinematics to be simulated using mimic joints. A mimic joint&amp;#039;s position, velocity, and acceleration values are computed from user-specified formulas using the values of other joints. OpenRAVE uses the Function Parser library to allow any formula to be specified. Refer to the documentation for more information [http://openrave.programmingvision.com/en/coreapihtml/classOpenRAVE_1_1KinBody_1_1Joint.html#a0e31c5be31c4145afa786e0c0d6a46ae here].&lt;br /&gt;
&lt;br /&gt;
A mimic joint requires at least the position equation and its partial derivatives (for velocity) to be manually entered. &lt;br /&gt;
&lt;br /&gt;
For example, the Barrett Hand mimic joints are defined as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;JF1&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;JF1mimic&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot; mimic_pos=&amp;quot;JF1/3+0.8727&amp;quot; mimic_vel=&amp;quot;|JF1 0.33333&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Of course, it is possible to have a mimic joint depend on more than one other joint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;b&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;c&amp;quot; type=&amp;quot;hinge&amp;quot; mimic_pos=&amp;quot;a+b+atan(a)&amp;quot; mimic_vel=&amp;quot;|a 1 + 1/(1+a*a) |b 1&amp;quot; mimic_accel=&amp;quot;|a -2*a/((1+a*a)*(1+a*a)) |b 0&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using mimic joints, it is important to still make all the correct joint connections so that loops are discovered and forces can be computed correctly.&lt;br /&gt;
&lt;br /&gt;
If a joint has more than one degree of freedom, attach the axis index at the end. For example: &amp;quot;mimic_pos0&amp;quot;, &amp;quot;mimic_pos1&amp;quot;, &amp;quot;mimic_vel0&amp;quot;, &amp;quot;mimic_vel1&amp;quot;, &amp;quot;mimic_accel0&amp;quot;, and &amp;quot;mimic_accel1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Attaching Robot Sensors ===&lt;br /&gt;
&lt;br /&gt;
Every robot can be attached a number of sensors onto it. The way to specify this in XML is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specify an attached sensor--&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyFirstLaser&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;link&amp;gt;wam1&amp;lt;/link&amp;gt; &amp;lt;!-- the robot link that the sensor is attached to. As the robot moves, the sensor will move with it--&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 0.2 0.4&amp;lt;/translation&amp;gt; &amp;lt;!-- the local translation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt; &amp;lt;!-- the local rotation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify the real sensor attached--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;#039;type&amp;#039; is the sensor interface identifier--&amp;gt;&lt;br /&gt;
    &amp;lt;sensor type=&amp;quot;BaseLaser2D&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The rest are specific fields to BaseLaser2D, these change as the type changes--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The best way to find out what fields are supported is to look for the documentation--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- for the type of sensor using--&amp;gt;&lt;br /&gt;
      &amp;lt;minangle&amp;gt;-135&amp;lt;/minangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;maxangle&amp;gt;135&amp;lt;/maxangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;0.35&amp;lt;/resolution&amp;gt; &amp;lt;!-- degrees between laser points--&amp;gt;&lt;br /&gt;
      &amp;lt;maxrange&amp;gt;5&amp;lt;/maxrange&amp;gt; &amp;lt;!-- max range of robot--&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting joint values for initial state ===&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot&amp;#039;s initial state is not when all the joints are at 0. Instead of transforming each of the geometry to the zero pose, it is possible to set the initial angle to use using the &amp;lt;initial&amp;gt; tag inside the &amp;lt;joint&amp;gt;. The definition for setting the initial angle to pi/2 radius is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link0&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link1&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;initial&amp;gt;1.570796326794&amp;lt;/initial&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Changing the Body Coordinate System ===&lt;br /&gt;
&lt;br /&gt;
[[image:Barrettwam_coordchange.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot origin and rotation should be defined in a different coordinate system. It is possible to create a new robot file that references the old one and changes its origin. This requires adding a new root link before the robot is defined. For example, consider the robots/barrettwam.robot.xml file whre the first link&amp;#039;s name is &amp;#039;wam0&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- add new first link --&amp;gt;&lt;br /&gt;
  &amp;lt;kinbody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;root&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;robot file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;!-- change the coordinate system of the original first link and attach a dummy joint --&amp;gt;&lt;br /&gt;
    &amp;lt;kinbody&amp;gt;&lt;br /&gt;
      &amp;lt;body name=&amp;quot;wam0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0.3 0.4 0.3&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;root&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;wam0&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;limitsdeg&amp;gt;0 0&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
== Environment Example ==&lt;br /&gt;
&lt;br /&gt;
This example is part of the &amp;#039;&amp;#039;&amp;#039;bin/data/intel/lab1.env.xml&amp;#039;&amp;#039;&amp;#039; file. The most important thing to note about this example is the use of the &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; attribute to import other XML files. The filename specified with &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; has to be &amp;#039;&amp;#039;&amp;#039;relative&amp;#039;&amp;#039;&amp;#039; to the current directory where the file calling it resides. Note the differences between segway.kinbody.xml and barrettwam.robot.xml.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the background color of the environment--&amp;gt;&lt;br /&gt;
  &amp;lt;bkgndcolor&amp;gt;0.3 0.7 0.8&amp;lt;/bkgndcolor&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera translation--&amp;gt;&lt;br /&gt;
  &amp;lt;camtrans&amp;gt;1.418 -1.234 2.963&amp;lt;/camtrans&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera rotation specified by rotation-axis--&amp;gt;&lt;br /&gt;
  &amp;lt;camrotaxis&amp;gt;0.724 0.302 0.619 68&amp;lt;/camrotaxis&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import the segway model and place it somewhere--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;data/segway.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;-0.0671   -0.0819    0.7550&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import a robot file and add an additional body for a cylindrical base--&amp;gt;&lt;br /&gt;
  &amp;lt;Robot file=&amp;quot;../../robots/barrettwam.robot.xml&amp;quot; name=&amp;quot;BarrettWAM&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;-.22 -.14 -.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Body type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
          &amp;lt;radius&amp;gt;0.08&amp;lt;/radius&amp;gt;&lt;br /&gt;
          &amp;lt;height&amp;gt;0.6&amp;lt;/height&amp;gt;&lt;br /&gt;
          &amp;lt;diffusecolor&amp;gt;0.3 0.3 0.3&amp;lt;/diffusecolor&amp;gt;&lt;br /&gt;
          &amp;lt;Translation&amp;gt; 0.2286 0.1397 -0.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;/Geom&amp;gt;&lt;br /&gt;
      &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;-0.754 0.3265 1.036&amp;lt;/translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Robot&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- add the floor as a box--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody name=&amp;quot;floor&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- floor should never move, so make it static--&amp;gt;&lt;br /&gt;
    &amp;lt;Body type=&amp;quot;static&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;2 2 0.005&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;.6 .6 .6&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      	&amp;lt;ambientColor&amp;gt;0.6 0.6 0.6&amp;lt;/ambientColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot Composition ==&lt;br /&gt;
&lt;br /&gt;
The way we recommend managing robots composed of several sub-robots (like a humanoid composed of arms, legs, hands, etc) is to first create separate .kinbody files for just the kinematics and geometry of each separate&lt;br /&gt;
part (ie a hand.kinbody.xml and a arm.kinbody.xml). Then create a robot file that includes both the kinematics and defines the manipulators, sensors, and controllers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;attachedsensor&amp;gt;&lt;br /&gt;
     ....&lt;br /&gt;
 &amp;lt;/attachedsensor&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sometimes for grasp planning, the hand needs to be treated as a robot, so we create a hand.robot.xml file as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. A robot can reference other robots through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;a.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;b.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both a&amp;#039;s and b&amp;#039;s &amp;#039;&amp;#039;&amp;#039;&amp;lt;Manipulator&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;AttachedSensor&amp;gt;&amp;#039;&amp;#039;&amp;#039; tags will be used&lt;br /&gt;
in the parent robot, so you don&amp;#039; t have to copy their definitions.&lt;br /&gt;
&lt;br /&gt;
2. It is possible to prefix the links and joints of a child robot by using the&lt;br /&gt;
&amp;#039;prefix&amp;#039; attribute:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;left_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;right_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now all links and joints will either start with &amp;#039;&amp;#039;&amp;#039;left_&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;right_&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
3. When the xml parser sees a body with the same name as another body,&lt;br /&gt;
it &amp;#039;appends&amp;#039; the specified geometries to the original body. This allows the same link to be referenced/defined in multiple robot files (Note that it is not possible to change the original body coordinate system).&lt;br /&gt;
&lt;br /&gt;
=== Attaching Separate Links ===&lt;br /&gt;
&lt;br /&gt;
When a robot is composed of multiple parts defined in different files, it is necessary to attach links from the different files together so that the robot hierarchy can be complete. This is done by defining &amp;#039;&amp;#039;&amp;#039;disabled&amp;#039;&amp;#039;&amp;#039; dummy joints that attach two links together. These disabled joints do not show up in the robot&amp;#039;s description and are only present to maintain the relative transformation between two links. For example, the robot &amp;#039;&amp;#039;&amp;#039;robots/pa10schunk.robot.xml&amp;#039;&amp;#039;&amp;#039; is composed of &amp;#039;&amp;#039;&amp;#039;robots/pa10.kinbody.xml&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;robots/schunk_manip.kinbody.xml&amp;#039;&amp;#039;&amp;#039;, in order to join the two, the robot  is defined in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;pa10.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody file=&amp;quot;schunk_manip.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;False&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;link7&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;gripper_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;#039;&amp;#039;&amp;#039;link7&amp;#039;&amp;#039;&amp;#039; is a link of the pa10 arm and &amp;#039;&amp;#039;&amp;#039;gripper_base&amp;#039;&amp;#039;&amp;#039; is a link of the gripper. The lower and upper joint limits are all 0, which OpenRAVE recognizes as a dummy joint.&lt;br /&gt;
&lt;br /&gt;
=== Joining A Robot Arm and Hand ===&lt;br /&gt;
&lt;br /&gt;
It is possible to load robots and bodies from COLLADA files by specifying the collada filename through the &amp;#039;&amp;#039;&amp;#039;file&amp;#039;&amp;#039;&amp;#039; attribute. For example, the following robot is a combination of an arm defined in OpenRAVE XML and a hand defined in COLLADA (download schunkSDHHand from [http://opengrasp.sourceforge.net/Downloads.html OpenGrasp]). The dummy joint is used to join the arm end effector with the hand base.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot file=&amp;quot;robots/kuka-kr5-r650.robot.xml&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot prefix=&amp;quot;hand_&amp;quot; file=&amp;quot;schunkSDHhand.dae&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody&amp;gt;&lt;br /&gt;
   &amp;lt;body name=&amp;quot;hand_root&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;offsetfrom&amp;gt;link6&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
     &amp;lt;translation&amp;gt;0.03 0 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
     &amp;lt;rotationaxis&amp;gt;0 1 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;joint type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;link6&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;hand_root&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
   &amp;lt;/joint&amp;gt;&lt;br /&gt;
 &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;base&amp;gt;base&amp;lt;/base&amp;gt;&lt;br /&gt;
   &amp;lt;effector&amp;gt;link6&amp;lt;/effector&amp;gt;&lt;br /&gt;
   &amp;lt;joints&amp;gt;hand_Bone_B1_Joint hand_Bone_B2_Joint hand_Bone_B3_Joint hand_Bone_A1_Joint hand_Bone_A2_Joint hand_Bone_A3_Joint hand_Bone_C1_Joint hand_Bone_C2_Joint hand_Bone_C3_Joint&amp;lt;/joints&amp;gt;&lt;br /&gt;
   &amp;lt;closingdirection&amp;gt;0 1 1 0 1 1 0 1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
   &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Final robot: [[image:collada_sdh_kuka.jpg|150px]]&lt;br /&gt;
&lt;br /&gt;
=== Dual-arm example ===&lt;br /&gt;
&lt;br /&gt;
Here is an example file of having a robot composed of two arms attached to a common link named &amp;#039;&amp;#039;&amp;#039;chest&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;schunk-dualarm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;chest&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;0.1 0.1 0.4&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0 0 0.4&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/geom&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- left arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody prefix=&amp;quot;l_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 -0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody&amp;gt;prefix=&amp;quot;r_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- connect the two arms with dummy joints --&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;leftdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;l_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;rightdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;r_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;!-- define the manipulators --&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;leftarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;l_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;l_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
    &amp;lt;armjoints&amp;gt;l_j0 l_j1 l_j2 l_j3 l_j4 l_j5 l_j6&amp;lt;/armjoints&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;rightarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;r_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;r_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
    &amp;lt;armjoints&amp;gt;r_j0 r_j1 r_j2 r_j3 r_j4 r_j5 r_j6&amp;lt;/armjoints&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Single arm: [[image:schunk-lwa3.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
Dual arm: [[image:schunk-lwa3-dual.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
== Custom XML ==&lt;br /&gt;
&lt;br /&gt;
Openrave provides much more flexibility in creating and defining custom XML readers for interfaces. First the &amp;lt;environment&amp;gt; XML tag supports creating any interface type and supports loading plugins. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;plugin&amp;gt;libcustomreader&amp;lt;/plugin&amp;gt;&lt;br /&gt;
  &amp;lt;robot name=&amp;quot;wam&amp;quot; file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;controller type=&amp;quot;CustomController&amp;quot; robot=&amp;quot;wam&amp;quot; args=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    ..custom data....&lt;br /&gt;
  &amp;lt;/controller&amp;gt;&lt;br /&gt;
  &amp;lt;module type=&amp;quot;basemanipulation&amp;quot; args=&amp;quot;wam&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example, openrave will first load the plugin, then will create a robot, and then will create a controller that is attached to the robot, then will create the basemanipulation module giving it the robot name as the argument.&lt;br /&gt;
&lt;br /&gt;
Furthermore, using EnvironmentBase::RegisterXMLReader, it is possible to set a parser for custom XML tags for each interface type.  For those curious on how to take advantage of custom readers, please refer to examples/plugincpp/customreader.cpp on how to attach a custom XML reader to a controller.&lt;br /&gt;
&lt;br /&gt;
These changes will allow people to setup all their specific environment settings in the XML files without having to rely on external scripts or other programs to do it. Note that OpenRAVE processes tags in depth first order.&lt;br /&gt;
&lt;br /&gt;
== Sensor ==&lt;br /&gt;
&lt;br /&gt;
It is possible to have XML files that declare a sensor and its internal parameters. For example, &amp;#039;&amp;#039;&amp;#039;data/camera.sensor.xml&amp;#039;&amp;#039;&amp;#039; can look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;sensor type=&amp;quot;BaseCamera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KK&amp;gt;640 640 320 240&amp;lt;/KK&amp;gt;&lt;br /&gt;
  &amp;lt;width&amp;gt;640&amp;lt;/width&amp;gt;&lt;br /&gt;
  &amp;lt;height&amp;gt;480&amp;lt;/height&amp;gt;&lt;br /&gt;
  &amp;lt;framerate&amp;gt;5&amp;lt;/framerate&amp;gt;&lt;br /&gt;
  &amp;lt;color&amp;gt;0.5 0.5 1&amp;lt;/color&amp;gt;&lt;br /&gt;
&amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to attach a sensor defined by a file to a robot link do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyCamera&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is also possible to put a sensor directly in the environment without a robot. Such a sensor will not have any geometry associated with it, and will only act as a sensing source.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... environment definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;sensor name=&amp;quot;mysensor&amp;quot; file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the sensor transform --&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 1 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
  &amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== XML Reference ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; All XML handling is done in &amp;#039;&amp;#039;&amp;#039;src/libopenrave-core/xmlreaders.cpp&amp;#039;&amp;#039;&amp;#039;. If there&amp;#039;s any parameters that are not explained well, make sure to check out that source file for further reference.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; You can find details on joints on : [http://opende.sourceforge.net/wiki/index.php/Manual_%28Joint_Types_and_Functions%29 ODE Manual page (joints)].&lt;br /&gt;
&lt;br /&gt;
Here&amp;#039;s a list of all possible fields the XML supports in a hierarchical structure.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;environment&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;bkgndcolor&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camrotaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camtrans&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;planner&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensorsystem&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file, robot, args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;inversekinematicssolver&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;physicsengine&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;collisionchecker&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;trajectory&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;viewer&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;server&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type, makejoinedlinksadjacent&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;adjacent&amp;#039;&amp;#039;&amp;#039; - 2 body names&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (dynamic, static)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;geom&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (box, sphere, trimesh, cylinder), render (true,false), modifiable (true,false)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;ambientcolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;collision&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;diffusecolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;extents&amp;#039;&amp;#039;&amp;#039; - 3 float [box]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;height&amp;#039;&amp;#039;&amp;#039; - float [cylinder]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float [cylinder, sphere]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;render&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;vertices&amp;#039;&amp;#039;&amp;#039; - 9*N floats where each 9 values defines 1 triangle with 3 vertices&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;com&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;inertia&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;joint&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; enable (true, false), type (hinge, slider, universal, hinge2, spherical), circular(true, false), mimic_pos (math equation), mimic_vel (math equation), mimic_accel (math equation)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;anchor&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, hinge2, universal, spherical]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, slider]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis1&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis2&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limits&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsdeg&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in degrees if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsrad&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxvel&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mode&amp;#039;&amp;#039;&amp;#039; - int [amotor]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;resolution&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;weight&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;modelsdir&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - bodyname&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type (robot plugin type)&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;attachedsensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;link&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;...&amp;#039;&amp;#039;&amp;#039; - fields defined by SensorBase class instantiated by type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - type args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - name&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;manipulator&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;armjoints&amp;#039;&amp;#039;&amp;#039; - n joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;base&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closed&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;effector&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;iksolver&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;gripperjoints&amp;#039;&amp;#039;&amp;#039; - k joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closingdirection&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;palmdirection&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - name, file, type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
&amp;lt;math&amp;gt;Insert formula here&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Projects&amp;diff=127</id>
		<title>Projects</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Projects&amp;diff=127"/>
				<updated>2011-07-21T00:05:31Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;OpenRAVE Users:&amp;#039;&amp;#039;&amp;#039; feel free to edit these pages.&lt;br /&gt;
&lt;br /&gt;
[http://scholar.google.com/scholar?q=%22openrave%22&amp;amp;hl=en&amp;amp;btnG=Search&amp;amp;as_sdt=1%2C5&amp;amp;as_sdtp=on Research Papers Referencing OpenRAVE]&lt;br /&gt;
&lt;br /&gt;
= Projects using OpenRAVE =&lt;br /&gt;
&lt;br /&gt;
* ROS&lt;br /&gt;
** [[ROS:Index|Official OpenRAVE Bindings]]&lt;br /&gt;
** [http://code.google.com/p/rtm-ros-robotics/ RTM-ROS Agent System Project]&lt;br /&gt;
&lt;br /&gt;
* [http://personalrobotics.intel-research.net/ Personal Robotics] at Intel Research Pittsburgh&lt;br /&gt;
&lt;br /&gt;
[[image:cmuherb.jpg|left|230px]] &amp;lt;videoflash&amp;gt;Nhx9KZwl_5A&amp;lt;/videoflash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [http://opengrasp.sourceforge.net/ OpenGRASP] - OpenGRASP is an open source simulation toolkit for grasping and dexterous manipulation. It supports the creation and addition of new functionality and the integration of existing and widely used technologies and standards.&lt;br /&gt;
[[image:Opengrasp.png|500px]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.iearobotics.com/wiki/index.php?title=OpenMR:_Modular_Robots_plug-in_for_Openrave Modular Robots] - OpenMR is an OpenRave Modular Robots plug-in for simulating the locomotion of modular robots.&lt;br /&gt;
[[image:OpenMR.jpg|300px|link=http://www.iearobotics.com/wiki/index.php?title=OpenMR:_Modular_Robots_plug-in_for_Openrave]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.cs.cmu.edu/~dberenso/software.html Constrained Manipulation Planning Suite (CoMPS)] - by Dmitry Berenson. The algorithms in CoMPS allow robots to perform motion with a variety of simultaneous constraints including constraints on balance, closed-chain kinematics, and task-space constraints defined as Task Space Region (TSRs) and TSR Chains. Contains:&lt;br /&gt;
** The Constrained Bi-directional RRT (CBiRRT)&lt;br /&gt;
** An iterative IK solver&lt;br /&gt;
** A set of useful openrave functions for manipulation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;videoflash&amp;gt;xIBRMNrutQc&amp;lt;/videoflash&amp;gt; &amp;lt;videoflash&amp;gt;APAhs7GC090&amp;lt;/videoflash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [http://correll.cs.colorado.edu/pmwiki/index.php/Main/PlanningSystemArm Planning Arm System]&lt;br /&gt;
&lt;br /&gt;
* [http://www.openrtm.org/openrtm/ja/content/rtc-openrave%E3%81%8C%E6%9A%AB%E5%AE%9A%E5%85%AC%E9%96%8B RTC-OpenRAVE]&lt;br /&gt;
&lt;br /&gt;
* [http://openprm.sourceforge.net/ Open Probabilistic Roadmap Planning]&lt;br /&gt;
&lt;br /&gt;
* [http://smart-robotics.sourceforge.net/corbaSmartSoft/components.php?cmp=SmartOpenRave SmartSoft Toolchain]&lt;br /&gt;
&lt;br /&gt;
* [http://trac.fawkesrobotics.org/wiki/Plugins/katana Fawkes Robotics]&lt;br /&gt;
&lt;br /&gt;
* [http://personalrobotics.intel-research.net/intel-pkg/armmbhp/html/index.html Arm Model-Based Hierarchical Planner]&lt;br /&gt;
&lt;br /&gt;
= Other =&lt;br /&gt;
&lt;br /&gt;
* [http://www.robotic.dlr.de/Franziska.Zacharias/ Mobile Manipulation with DLR robot Justin] - Project headed by Franziska Zacharias to model and analyze the reachability spaces of robot arms and use these knowledge representations in planning manipulation tasks.&lt;br /&gt;
[[image:DLRJustin_Zacharias.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [http://pr.cs.cornell.edu/articulated3d/ Box Packing Robot]&lt;br /&gt;
&lt;br /&gt;
* [http://dasl.mem.drexel.edu/~seanMason/?page_id=252 Lego Project]&lt;br /&gt;
&lt;br /&gt;
* [http://dasl.mem.drexel.edu/~christopherKorpela/?page_id=271 MiniHubo]&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Projects&amp;diff=126</id>
		<title>Projects</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Projects&amp;diff=126"/>
				<updated>2011-07-20T03:43:37Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;OpenRAVE Users:&amp;#039;&amp;#039;&amp;#039; feel free to edit these pages.&lt;br /&gt;
&lt;br /&gt;
[http://scholar.google.com/scholar?q=%22openrave%22&amp;amp;hl=en&amp;amp;btnG=Search&amp;amp;as_sdt=1%2C5&amp;amp;as_sdtp=on Research Papers Referencing OpenRAVE]&lt;br /&gt;
&lt;br /&gt;
= Projects =&lt;br /&gt;
&lt;br /&gt;
* ROS&lt;br /&gt;
** [[ROS:Index|Official OpenRAVE Bindings]]&lt;br /&gt;
** [http://code.google.com/p/rtm-ros-robotics/ RTM-ROS Agent System Project]&lt;br /&gt;
&lt;br /&gt;
* [http://personalrobotics.intel-research.net/ Personal Robotics] at Intel Research Pittsburgh&lt;br /&gt;
&lt;br /&gt;
[[image:cmuherb.jpg|left|230px]] &amp;lt;videoflash&amp;gt;Nhx9KZwl_5A&amp;lt;/videoflash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [http://opengrasp.sourceforge.net/ OpenGRASP] - OpenGRASP is an open source simulation toolkit for grasping and dexterous manipulation. It supports the creation and addition of new functionality and the integration of existing and widely used technologies and standards.&lt;br /&gt;
[[image:Opengrasp.png|500px]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.iearobotics.com/wiki/index.php?title=OpenMR:_Modular_Robots_plug-in_for_Openrave Modular Robots] - OpenMR is an OpenRave Modular Robots plug-in for simulating the locomotion of modular robots.&lt;br /&gt;
[[image:OpenMR.jpg|300px|link=http://www.iearobotics.com/wiki/index.php?title=OpenMR:_Modular_Robots_plug-in_for_Openrave]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.cs.cmu.edu/~dberenso/software.html Constrained Manipulation Planning Suite (CoMPS)] - by Dmitry Berenson. The algorithms in CoMPS allow robots to perform motion with a variety of simultaneous constraints including constraints on balance, closed-chain kinematics, and task-space constraints defined as Task Space Region (TSRs) and TSR Chains. Contains:&lt;br /&gt;
** The Constrained Bi-directional RRT (CBiRRT)&lt;br /&gt;
** An iterative IK solver&lt;br /&gt;
** A set of useful openrave functions for manipulation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;videoflash&amp;gt;xIBRMNrutQc&amp;lt;/videoflash&amp;gt; &amp;lt;videoflash&amp;gt;APAhs7GC090&amp;lt;/videoflash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [http://correll.cs.colorado.edu/pmwiki/index.php/Main/PlanningSystemArm Planning Arm System]&lt;br /&gt;
&lt;br /&gt;
* [http://www.openrtm.org/openrtm/ja/content/rtc-openrave%E3%81%8C%E6%9A%AB%E5%AE%9A%E5%85%AC%E9%96%8B RTC-OpenRAVE]&lt;br /&gt;
&lt;br /&gt;
* [http://openprm.sourceforge.net/ Open Probabilistic Roadmap Planning]&lt;br /&gt;
&lt;br /&gt;
* [http://smart-robotics.sourceforge.net/corbaSmartSoft/components.php?cmp=SmartOpenRave SmartSoft Toolchain]&lt;br /&gt;
&lt;br /&gt;
* [http://trac.fawkesrobotics.org/wiki/Plugins/katana Fawkes Robotics]&lt;br /&gt;
&lt;br /&gt;
* [http://personalrobotics.intel-research.net/intel-pkg/armmbhp/html/index.html Arm Model-Based Hierarchical Planner]&lt;br /&gt;
&lt;br /&gt;
= Other =&lt;br /&gt;
&lt;br /&gt;
* [http://www.robotic.dlr.de/Franziska.Zacharias/ Mobile Manipulation with DLR robot Justin] - Project headed by Franziska Zacharias to model and analyze the reachability spaces of robot arms and use these knowledge representations in planning manipulation tasks.&lt;br /&gt;
[[image:DLRJustin_Zacharias.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [http://pr.cs.cornell.edu/articulated3d/ Box Packing Robot]&lt;br /&gt;
&lt;br /&gt;
* [http://dasl.mem.drexel.edu/~seanMason/?page_id=252 Lego Project]&lt;br /&gt;
&lt;br /&gt;
* [http://dasl.mem.drexel.edu/~christopherKorpela/?page_id=271 MiniHubo]&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Projects&amp;diff=125</id>
		<title>Projects</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Projects&amp;diff=125"/>
				<updated>2011-07-20T03:43:03Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;OpenRAVE Users:&amp;#039;&amp;#039;&amp;#039; feel free to edit these pages.&lt;br /&gt;
&lt;br /&gt;
[http://scholar.google.com/scholar?q=%22openrave%22&amp;amp;hl=en&amp;amp;btnG=Search&amp;amp;as_sdt=1%2C5&amp;amp;as_sdtp=on Research Paper References for OpenRAVE]&lt;br /&gt;
&lt;br /&gt;
= Projects =&lt;br /&gt;
&lt;br /&gt;
* ROS&lt;br /&gt;
** [[ROS:Index|Official OpenRAVE Bindings]]&lt;br /&gt;
** [http://code.google.com/p/rtm-ros-robotics/ RTM-ROS Agent System Project]&lt;br /&gt;
&lt;br /&gt;
* [http://personalrobotics.intel-research.net/ Personal Robotics] at Intel Research Pittsburgh&lt;br /&gt;
&lt;br /&gt;
[[image:cmuherb.jpg|left|230px]] &amp;lt;videoflash&amp;gt;Nhx9KZwl_5A&amp;lt;/videoflash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [http://opengrasp.sourceforge.net/ OpenGRASP] - OpenGRASP is an open source simulation toolkit for grasping and dexterous manipulation. It supports the creation and addition of new functionality and the integration of existing and widely used technologies and standards.&lt;br /&gt;
[[image:Opengrasp.png|500px]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.iearobotics.com/wiki/index.php?title=OpenMR:_Modular_Robots_plug-in_for_Openrave Modular Robots] - OpenMR is an OpenRave Modular Robots plug-in for simulating the locomotion of modular robots.&lt;br /&gt;
[[image:OpenMR.jpg|300px|link=http://www.iearobotics.com/wiki/index.php?title=OpenMR:_Modular_Robots_plug-in_for_Openrave]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.cs.cmu.edu/~dberenso/software.html Constrained Manipulation Planning Suite (CoMPS)] - by Dmitry Berenson. The algorithms in CoMPS allow robots to perform motion with a variety of simultaneous constraints including constraints on balance, closed-chain kinematics, and task-space constraints defined as Task Space Region (TSRs) and TSR Chains. Contains:&lt;br /&gt;
** The Constrained Bi-directional RRT (CBiRRT)&lt;br /&gt;
** An iterative IK solver&lt;br /&gt;
** A set of useful openrave functions for manipulation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;videoflash&amp;gt;xIBRMNrutQc&amp;lt;/videoflash&amp;gt; &amp;lt;videoflash&amp;gt;APAhs7GC090&amp;lt;/videoflash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [http://correll.cs.colorado.edu/pmwiki/index.php/Main/PlanningSystemArm Planning Arm System]&lt;br /&gt;
&lt;br /&gt;
* [http://www.openrtm.org/openrtm/ja/content/rtc-openrave%E3%81%8C%E6%9A%AB%E5%AE%9A%E5%85%AC%E9%96%8B RTC-OpenRAVE]&lt;br /&gt;
&lt;br /&gt;
* [http://openprm.sourceforge.net/ Open Probabilistic Roadmap Planning]&lt;br /&gt;
&lt;br /&gt;
* [http://smart-robotics.sourceforge.net/corbaSmartSoft/components.php?cmp=SmartOpenRave SmartSoft Toolchain]&lt;br /&gt;
&lt;br /&gt;
* [http://trac.fawkesrobotics.org/wiki/Plugins/katana Fawkes Robotics]&lt;br /&gt;
&lt;br /&gt;
* [http://personalrobotics.intel-research.net/intel-pkg/armmbhp/html/index.html Arm Model-Based Hierarchical Planner]&lt;br /&gt;
&lt;br /&gt;
= Other =&lt;br /&gt;
&lt;br /&gt;
* [http://www.robotic.dlr.de/Franziska.Zacharias/ Mobile Manipulation with DLR robot Justin] - Project headed by Franziska Zacharias to model and analyze the reachability spaces of robot arms and use these knowledge representations in planning manipulation tasks.&lt;br /&gt;
[[image:DLRJustin_Zacharias.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [http://pr.cs.cornell.edu/articulated3d/ Box Packing Robot]&lt;br /&gt;
&lt;br /&gt;
* [http://dasl.mem.drexel.edu/~seanMason/?page_id=252 Lego Project]&lt;br /&gt;
&lt;br /&gt;
* [http://dasl.mem.drexel.edu/~christopherKorpela/?page_id=271 MiniHubo]&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Projects&amp;diff=124</id>
		<title>Projects</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Projects&amp;diff=124"/>
				<updated>2011-07-20T03:40:47Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;OpenRAVE Users:&amp;#039;&amp;#039;&amp;#039; feel free to edit these pages.&lt;br /&gt;
&lt;br /&gt;
[http://scholar.google.com/scholar?q=%22openrave%22&amp;amp;hl=en&amp;amp;btnG=Search&amp;amp;as_sdt=1%2C5&amp;amp;as_sdtp=on Research Paper References for OpenRAVE]&lt;br /&gt;
&lt;br /&gt;
= Projects =&lt;br /&gt;
&lt;br /&gt;
* ROS&lt;br /&gt;
** [http://www.ros.org/wiki/openrave Bindings]&lt;br /&gt;
** [http://www.ros.org/wiki/orrosplanning Planning]&lt;br /&gt;
** [http://code.google.com/p/rtm-ros-robotics/ Agent System Integration]&lt;br /&gt;
&lt;br /&gt;
* [http://personalrobotics.intel-research.net/ Personal Robotics] at Intel Research Pittsburgh&lt;br /&gt;
&lt;br /&gt;
[[image:cmuherb.jpg|left|230px]] &amp;lt;videoflash&amp;gt;Nhx9KZwl_5A&amp;lt;/videoflash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [http://opengrasp.sourceforge.net/ OpenGRASP] - OpenGRASP is an open source simulation toolkit for grasping and dexterous manipulation. It supports the creation and addition of new functionality and the integration of existing and widely used technologies and standards.&lt;br /&gt;
[[image:Opengrasp.png|500px]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.iearobotics.com/wiki/index.php?title=OpenMR:_Modular_Robots_plug-in_for_Openrave Modular Robots] - OpenMR is an OpenRave Modular Robots plug-in for simulating the locomotion of modular robots.&lt;br /&gt;
[[image:OpenMR.jpg|300px|link=http://www.iearobotics.com/wiki/index.php?title=OpenMR:_Modular_Robots_plug-in_for_Openrave]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.cs.cmu.edu/~dberenso/software.html Constrained Manipulation Planning Suite (CoMPS)] - by Dmitry Berenson. The algorithms in CoMPS allow robots to perform motion with a variety of simultaneous constraints including constraints on balance, closed-chain kinematics, and task-space constraints defined as Task Space Region (TSRs) and TSR Chains. Contains:&lt;br /&gt;
** The Constrained Bi-directional RRT (CBiRRT)&lt;br /&gt;
** An iterative IK solver&lt;br /&gt;
** A set of useful openrave functions for manipulation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;videoflash&amp;gt;xIBRMNrutQc&amp;lt;/videoflash&amp;gt; &amp;lt;videoflash&amp;gt;APAhs7GC090&amp;lt;/videoflash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [http://correll.cs.colorado.edu/pmwiki/index.php/Main/PlanningSystemArm Planning Arm System]&lt;br /&gt;
&lt;br /&gt;
* [http://www.openrtm.org/openrtm/ja/content/rtc-openrave%E3%81%8C%E6%9A%AB%E5%AE%9A%E5%85%AC%E9%96%8B RTC-OpenRAVE]&lt;br /&gt;
&lt;br /&gt;
* [http://openprm.sourceforge.net/ Open Probabilistic Roadmap Planning]&lt;br /&gt;
&lt;br /&gt;
* [http://smart-robotics.sourceforge.net/corbaSmartSoft/components.php?cmp=SmartOpenRave SmartSoft Toolchain]&lt;br /&gt;
&lt;br /&gt;
* [http://trac.fawkesrobotics.org/wiki/Plugins/katana Fawkes Robotics]&lt;br /&gt;
&lt;br /&gt;
* [http://personalrobotics.intel-research.net/intel-pkg/armmbhp/html/index.html Arm Model-Based Hierarchical Planner]&lt;br /&gt;
&lt;br /&gt;
= Other =&lt;br /&gt;
&lt;br /&gt;
* [http://www.robotic.dlr.de/Franziska.Zacharias/ Mobile Manipulation with DLR robot Justin] - Project headed by Franziska Zacharias to model and analyze the reachability spaces of robot arms and use these knowledge representations in planning manipulation tasks.&lt;br /&gt;
[[image:DLRJustin_Zacharias.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [http://pr.cs.cornell.edu/articulated3d/ Box Packing Robot]&lt;br /&gt;
&lt;br /&gt;
* [http://dasl.mem.drexel.edu/~seanMason/?page_id=252 Lego Project]&lt;br /&gt;
&lt;br /&gt;
* [http://dasl.mem.drexel.edu/~christopherKorpela/?page_id=271 MiniHubo]&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Projects&amp;diff=123</id>
		<title>Projects</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Projects&amp;diff=123"/>
				<updated>2011-07-20T03:40:27Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;OpenRAVE Users:&amp;#039;&amp;#039;&amp;#039; feel free to edit these pages.&lt;br /&gt;
&lt;br /&gt;
[http://scholar.google.com/scholar?q=%22openrave%22&amp;amp;hl=en&amp;amp;btnG=Search&amp;amp;as_sdt=1%2C5&amp;amp;as_sdtp=on Research Paper References for OpenRAVE]&lt;br /&gt;
&lt;br /&gt;
= Projects =&lt;br /&gt;
&lt;br /&gt;
* ROS&lt;br /&gt;
** [http://www.ros.org/wiki/openrave Bindings]&lt;br /&gt;
** [http://www.ros.org/wiki/orrosplanning Planning]&lt;br /&gt;
** [http://code.google.com/p/rtm-ros-robotics/ Agent System Integration]&lt;br /&gt;
&lt;br /&gt;
* [http://personalrobotics.intel-research.net/ Personal Robotics] at Intel Research Pittsburgh&lt;br /&gt;
&lt;br /&gt;
[[image:cmuherb.jpg|left|230px]] &amp;lt;videoflash&amp;gt;Nhx9KZwl_5A&amp;lt;/videoflash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [http://opengrasp.sourceforge.net/ OpenGRASP] - OpenGRASP is an open source simulation toolkit for grasping and dexterous manipulation. It supports the creation and addition of new functionality and the integration of existing and widely used technologies and standards.&lt;br /&gt;
[[image:Opengrasp.png|500px]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.iearobotics.com/wiki/index.php?title=OpenMR:_Modular_Robots_plug-in_for_Openrave Modular Robots] - OpenMR is an OpenRave Modular Robots plug-in for simulating the locomotion of modular robots.&lt;br /&gt;
[[image:OpenMR.jpg|300px|link=http://www.iearobotics.com/wiki/index.php?title=OpenMR:_Modular_Robots_plug-in_for_Openrave]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.cs.cmu.edu/~dberenso/software.html Constrained Manipulation Planning Suite (CoMPS)] - by Dmitry Berenson. The algorithms in CoMPS allow robots to perform motion with a variety of simultaneous constraints including constraints on balance, closed-chain kinematics, and task-space constraints defined as Task Space Region (TSRs) and TSR Chains. Contains:&lt;br /&gt;
** The Constrained Bi-directional RRT (CBiRRT)&lt;br /&gt;
** An iterative IK solver&lt;br /&gt;
** A set of useful openrave functions for manipulation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;videoflash&amp;gt;xIBRMNrutQc&amp;lt;/videoflash&amp;gt; &amp;lt;videoflash&amp;gt;APAhs7GC090&amp;lt;/videoflash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [http://correll.cs.colorado.edu/pmwiki/index.php/Main/PlanningSystemArm Planning Arm System]&lt;br /&gt;
&lt;br /&gt;
* [http://www.openrtm.org/openrtm/ja/content/rtc-openrave%E3%81%8C%E6%9A%AB%E5%AE%9A%E5%85%AC%E9%96%8B RTC-OpenRAVE]&lt;br /&gt;
&lt;br /&gt;
* [http://openprm.sourceforge.net/ Open Probabilistic Roadmap Planning]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [http://smart-robotics.sourceforge.net/corbaSmartSoft/components.php?cmp=SmartOpenRave SmartSoft Toolchain]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [http://trac.fawkesrobotics.org/wiki/Plugins/katana Fawkes Robotics]&lt;br /&gt;
&lt;br /&gt;
* [http://personalrobotics.intel-research.net/intel-pkg/armmbhp/html/index.html Arm Model-Based Hierarchical Planner]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Other =&lt;br /&gt;
&lt;br /&gt;
* [http://www.robotic.dlr.de/Franziska.Zacharias/ Mobile Manipulation with DLR robot Justin] - Project headed by Franziska Zacharias to model and analyze the reachability spaces of robot arms and use these knowledge representations in planning manipulation tasks.&lt;br /&gt;
[[image:DLRJustin_Zacharias.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [http://pr.cs.cornell.edu/articulated3d/ Box Packing Robot]&lt;br /&gt;
&lt;br /&gt;
* [http://dasl.mem.drexel.edu/~seanMason/?page_id=252 Lego Project]&lt;br /&gt;
&lt;br /&gt;
* [http://dasl.mem.drexel.edu/~christopherKorpela/?page_id=271 MiniHubo]&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Projects&amp;diff=122</id>
		<title>Projects</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Projects&amp;diff=122"/>
				<updated>2011-07-20T03:40:04Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://scholar.google.com/scholar?q=%22openrave%22&amp;amp;hl=en&amp;amp;btnG=Search&amp;amp;as_sdt=1%2C5&amp;amp;as_sdtp=on Research Paper References for OpenRAVE]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;OpenRAVE Users:&amp;#039;&amp;#039;&amp;#039; feel free to edit these pages.&lt;br /&gt;
&lt;br /&gt;
= Projects =&lt;br /&gt;
&lt;br /&gt;
* ROS&lt;br /&gt;
** [http://www.ros.org/wiki/openrave Bindings]&lt;br /&gt;
** [http://www.ros.org/wiki/orrosplanning Planning]&lt;br /&gt;
** [http://code.google.com/p/rtm-ros-robotics/ Agent System Integration]&lt;br /&gt;
&lt;br /&gt;
* [http://personalrobotics.intel-research.net/ Personal Robotics] at Intel Research Pittsburgh&lt;br /&gt;
&lt;br /&gt;
[[image:cmuherb.jpg|left|230px]] &amp;lt;videoflash&amp;gt;Nhx9KZwl_5A&amp;lt;/videoflash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [http://opengrasp.sourceforge.net/ OpenGRASP] - OpenGRASP is an open source simulation toolkit for grasping and dexterous manipulation. It supports the creation and addition of new functionality and the integration of existing and widely used technologies and standards.&lt;br /&gt;
[[image:Opengrasp.png|500px]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.iearobotics.com/wiki/index.php?title=OpenMR:_Modular_Robots_plug-in_for_Openrave Modular Robots] - OpenMR is an OpenRave Modular Robots plug-in for simulating the locomotion of modular robots.&lt;br /&gt;
[[image:OpenMR.jpg|300px|link=http://www.iearobotics.com/wiki/index.php?title=OpenMR:_Modular_Robots_plug-in_for_Openrave]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.cs.cmu.edu/~dberenso/software.html Constrained Manipulation Planning Suite (CoMPS)] - by Dmitry Berenson. The algorithms in CoMPS allow robots to perform motion with a variety of simultaneous constraints including constraints on balance, closed-chain kinematics, and task-space constraints defined as Task Space Region (TSRs) and TSR Chains. Contains:&lt;br /&gt;
** The Constrained Bi-directional RRT (CBiRRT)&lt;br /&gt;
** An iterative IK solver&lt;br /&gt;
** A set of useful openrave functions for manipulation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;videoflash&amp;gt;xIBRMNrutQc&amp;lt;/videoflash&amp;gt; &amp;lt;videoflash&amp;gt;APAhs7GC090&amp;lt;/videoflash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [http://correll.cs.colorado.edu/pmwiki/index.php/Main/PlanningSystemArm Planning Arm System]&lt;br /&gt;
&lt;br /&gt;
* [http://www.openrtm.org/openrtm/ja/content/rtc-openrave%E3%81%8C%E6%9A%AB%E5%AE%9A%E5%85%AC%E9%96%8B RTC-OpenRAVE]&lt;br /&gt;
&lt;br /&gt;
* [http://openprm.sourceforge.net/ Open Probabilistic Roadmap Planning]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [http://smart-robotics.sourceforge.net/corbaSmartSoft/components.php?cmp=SmartOpenRave SmartSoft Toolchain]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [http://trac.fawkesrobotics.org/wiki/Plugins/katana Fawkes Robotics]&lt;br /&gt;
&lt;br /&gt;
* [http://personalrobotics.intel-research.net/intel-pkg/armmbhp/html/index.html Arm Model-Based Hierarchical Planner]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Other =&lt;br /&gt;
&lt;br /&gt;
* [http://www.robotic.dlr.de/Franziska.Zacharias/ Mobile Manipulation with DLR robot Justin] - Project headed by Franziska Zacharias to model and analyze the reachability spaces of robot arms and use these knowledge representations in planning manipulation tasks.&lt;br /&gt;
[[image:DLRJustin_Zacharias.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [http://pr.cs.cornell.edu/articulated3d/ Box Packing Robot]&lt;br /&gt;
&lt;br /&gt;
* [http://dasl.mem.drexel.edu/~seanMason/?page_id=252 Lego Project]&lt;br /&gt;
&lt;br /&gt;
* [http://dasl.mem.drexel.edu/~christopherKorpela/?page_id=271 MiniHubo]&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Projects&amp;diff=121</id>
		<title>Projects</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Projects&amp;diff=121"/>
				<updated>2011-07-20T03:39:30Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://scholar.google.com/scholar?q=%22openrave%22&amp;amp;hl=en&amp;amp;btnG=Search&amp;amp;as_sdt=1%2C5&amp;amp;as_sdtp=on Research Paper References for OpenRAVE]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;OpenRAVE Users:&amp;#039;&amp;#039;&amp;#039; feel free to edit these pages.&lt;br /&gt;
&lt;br /&gt;
= Projects =&lt;br /&gt;
&lt;br /&gt;
* ROS&lt;br /&gt;
&lt;br /&gt;
** [http://www.ros.org/wiki/openrave Bindings]&lt;br /&gt;
&lt;br /&gt;
** [http://www.ros.org/wiki/orrosplanning Planning]&lt;br /&gt;
&lt;br /&gt;
** [http://code.google.com/p/rtm-ros-robotics/ Agent System Integration]&lt;br /&gt;
&lt;br /&gt;
* [http://personalrobotics.intel-research.net/ Personal Robotics] at Intel Research Pittsburgh&lt;br /&gt;
&lt;br /&gt;
[[image:cmuherb.jpg|left|230px]] &amp;lt;videoflash&amp;gt;Nhx9KZwl_5A&amp;lt;/videoflash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [http://opengrasp.sourceforge.net/ OpenGRASP] - OpenGRASP is an open source simulation toolkit for grasping and dexterous manipulation. It supports the creation and addition of new functionality and the integration of existing and widely used technologies and standards.&lt;br /&gt;
[[image:Opengrasp.png|500px]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.iearobotics.com/wiki/index.php?title=OpenMR:_Modular_Robots_plug-in_for_Openrave Modular Robots] - OpenMR is an OpenRave Modular Robots plug-in for simulating the locomotion of modular robots.&lt;br /&gt;
[[image:OpenMR.jpg|300px|link=http://www.iearobotics.com/wiki/index.php?title=OpenMR:_Modular_Robots_plug-in_for_Openrave]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.cs.cmu.edu/~dberenso/software.html Constrained Manipulation Planning Suite (CoMPS)] - by Dmitry Berenson. The algorithms in CoMPS allow robots to perform motion with a variety of simultaneous constraints including constraints on balance, closed-chain kinematics, and task-space constraints defined as Task Space Region (TSRs) and TSR Chains. Contains:&lt;br /&gt;
** The Constrained Bi-directional RRT (CBiRRT)&lt;br /&gt;
** An iterative IK solver&lt;br /&gt;
** A set of useful openrave functions for manipulation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;videoflash&amp;gt;xIBRMNrutQc&amp;lt;/videoflash&amp;gt; &amp;lt;videoflash&amp;gt;APAhs7GC090&amp;lt;/videoflash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [http://correll.cs.colorado.edu/pmwiki/index.php/Main/PlanningSystemArm Planning Arm System]&lt;br /&gt;
&lt;br /&gt;
* [http://www.openrtm.org/openrtm/ja/content/rtc-openrave%E3%81%8C%E6%9A%AB%E5%AE%9A%E5%85%AC%E9%96%8B RTC-OpenRAVE]&lt;br /&gt;
&lt;br /&gt;
* [http://openprm.sourceforge.net/ Open Probabilistic Roadmap Planning]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [http://smart-robotics.sourceforge.net/corbaSmartSoft/components.php?cmp=SmartOpenRave SmartSoft Toolchain]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [http://trac.fawkesrobotics.org/wiki/Plugins/katana Fawkes Robotics]&lt;br /&gt;
&lt;br /&gt;
* [http://personalrobotics.intel-research.net/intel-pkg/armmbhp/html/index.html Arm Model-Based Hierarchical Planner]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Other =&lt;br /&gt;
&lt;br /&gt;
* [http://www.robotic.dlr.de/Franziska.Zacharias/ Mobile Manipulation with DLR robot Justin] - Project headed by Franziska Zacharias to model and analyze the reachability spaces of robot arms and use these knowledge representations in planning manipulation tasks.&lt;br /&gt;
[[image:DLRJustin_Zacharias.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [http://pr.cs.cornell.edu/articulated3d/ Box Packing Robot]&lt;br /&gt;
&lt;br /&gt;
* [http://dasl.mem.drexel.edu/~seanMason/?page_id=252 Lego Project]&lt;br /&gt;
&lt;br /&gt;
* [http://dasl.mem.drexel.edu/~christopherKorpela/?page_id=271 MiniHubo]&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Projects&amp;diff=120</id>
		<title>Projects</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Projects&amp;diff=120"/>
				<updated>2011-07-20T03:36:34Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://scholar.google.com/scholar?q=%22openrave%22&amp;amp;hl=en&amp;amp;btnG=Search&amp;amp;as_sdt=1%2C5&amp;amp;as_sdtp=on Research Paper References for OpenRAVE]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;OpenRAVE Users:&amp;#039;&amp;#039;&amp;#039; feel free to edit these pages.&lt;br /&gt;
&lt;br /&gt;
= Projects =&lt;br /&gt;
&lt;br /&gt;
* [http://personalrobotics.intel-research.net/ Personal Robotics] at Intel Research Pittsburgh&lt;br /&gt;
&lt;br /&gt;
[[image:cmuherb.jpg|left|230px]] &amp;lt;videoflash&amp;gt;Nhx9KZwl_5A&amp;lt;/videoflash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [http://opengrasp.sourceforge.net/ OpenGRASP] - OpenGRASP is an open source simulation toolkit for grasping and dexterous manipulation. It supports the creation and addition of new functionality and the integration of existing and widely used technologies and standards.&lt;br /&gt;
[[image:Opengrasp.png|500px]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.iearobotics.com/wiki/index.php?title=OpenMR:_Modular_Robots_plug-in_for_Openrave Modular Robots] - OpenMR is an OpenRave Modular Robots plug-in for simulating the locomotion of modular robots.&lt;br /&gt;
[[image:OpenMR.jpg|300px|link=http://www.iearobotics.com/wiki/index.php?title=OpenMR:_Modular_Robots_plug-in_for_Openrave]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.cs.cmu.edu/~dberenso/software.html Constrained Manipulation Planning Suite (CoMPS)] - by Dmitry Berenson. The algorithms in CoMPS allow robots to perform motion with a variety of simultaneous constraints including constraints on balance, closed-chain kinematics, and task-space constraints defined as Task Space Region (TSRs) and TSR Chains. Contains:&lt;br /&gt;
** The Constrained Bi-directional RRT (CBiRRT)&lt;br /&gt;
** An iterative IK solver&lt;br /&gt;
** A set of useful openrave functions for manipulation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;videoflash&amp;gt;xIBRMNrutQc&amp;lt;/videoflash&amp;gt; &amp;lt;videoflash&amp;gt;APAhs7GC090&amp;lt;/videoflash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [http://correll.cs.colorado.edu/pmwiki/index.php/Main/PlanningSystemArm Planning Arm System]&lt;br /&gt;
&lt;br /&gt;
* [http://www.openrtm.org/openrtm/ja/content/rtc-openrave%E3%81%8C%E6%9A%AB%E5%AE%9A%E5%85%AC%E9%96%8B RTC-OpenRAVE]&lt;br /&gt;
&lt;br /&gt;
* [http://openprm.sourceforge.net/ Open Probabilistic Roadmap Planning]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [http://smart-robotics.sourceforge.net/corbaSmartSoft/components.php?cmp=SmartOpenRave SmartSoft Toolchain]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [http://trac.fawkesrobotics.org/wiki/Plugins/katana Fawkes Robotics]&lt;br /&gt;
&lt;br /&gt;
* [http://personalrobotics.intel-research.net/intel-pkg/armmbhp/html/index.html Arm Model-Based Hierarchical Planner]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Other =&lt;br /&gt;
&lt;br /&gt;
* [http://www.robotic.dlr.de/Franziska.Zacharias/ Mobile Manipulation with DLR robot Justin] - Project headed by Franziska Zacharias to model and analyze the reachability spaces of robot arms and use these knowledge representations in planning manipulation tasks.&lt;br /&gt;
[[image:DLRJustin_Zacharias.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [http://pr.cs.cornell.edu/articulated3d/ Box Packing Robot]&lt;br /&gt;
&lt;br /&gt;
* [http://dasl.mem.drexel.edu/~seanMason/?page_id=252 Lego Project]&lt;br /&gt;
&lt;br /&gt;
* [http://dasl.mem.drexel.edu/~christopherKorpela/?page_id=271 MiniHubo]&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=119</id>
		<title>Format:XML</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=119"/>
				<updated>2011-07-20T02:30:11Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
= OpenRAVE Custom XML Format =&lt;br /&gt;
&lt;br /&gt;
[[image:Openrave_robots.jpg|600px]] &lt;br /&gt;
&lt;br /&gt;
OpenRAVE uses XML to store all robot and scene descriptions. The XML format is flexible enough to link one XML file from another like including already created objects/robots in an environment. It is also possible to specify vrml or iv formatted files within it to import models. &lt;br /&gt;
&lt;br /&gt;
All interface types can be created. Furthermore, an &amp;lt;environment&amp;gt; tag can optionally be specified to put all bodies/interfaces in.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Environment&amp;#039;&amp;#039;&amp;#039; - specify multiple objects and robots. Can also define some GUI properties like camera start location and background color. The environment allows the creation of &amp;#039;&amp;#039;&amp;#039;any&amp;#039;&amp;#039;&amp;#039; OpenRAVE interfaces. Each interface can take the &amp;#039;&amp;#039;&amp;#039;type&amp;#039;&amp;#039;&amp;#039; attribute specifying the interface type and can define custom XML readers.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039; - The basic object that all other objects derive from. A kinematic body consists of a collection of rigid bodies and joints that connect these bodies.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; - The basic robot that derives from &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039;. Usually every Robot has at least one KinBody declaration inside it. A robot can also hold a list of &amp;#039;&amp;#039;&amp;#039;Manipulator&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;AttachedSensor&amp;#039;&amp;#039;&amp;#039; objects describing the manipulation/sensing capabilities of the robot. Since plugin authors can create different robots, it is also possible to define custom fields in &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; to hold other information like balance control parameters for humanoids.&lt;br /&gt;
&lt;br /&gt;
== KinBody ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody name=&amp;quot;TestKinBody&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Create a rigid body named Body1 and declare it as &amp;#039;dynamic&amp;#039;.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;#039;dynamic&amp;#039; bodies are subject to physics laws, &amp;#039;static&amp;#039; bodies will never move--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- due to physical forces. It is recommended EVERYTHING is declared as &amp;#039;dynamic&amp;#039; --&amp;gt;&lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that the body transforms affects all geometry objects attached. --&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- translation of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;!--rotation of the body specified as a rotation axis. First three numbers are the axis.--&amp;gt;&lt;br /&gt;
    &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- defines mass properties for the entire kinbody. possible mass types are--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- mimicgeom - &amp;lt;density&amp;gt;. Adds a mass equivalent to all the geometry--&amp;gt;&lt;br /&gt;
    &amp;lt;!--    objects. trimesh and plane are not supported.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- box - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;extents&amp;gt; Adds a simple box--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- sphere - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;radius&amp;gt;--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;density&amp;gt;1000&amp;lt;/density&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Define a geometry object attached to the body. The functionality of --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- geometry objects is to define the collision and render geometries of the body. --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- All geometry types have Rotation(Mat/Quat), Translation, and Render components.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Possible geom types are box, sphere, trimesh, plane.--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *box - extents--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *sphere - radius--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *cylinder - radius, height (axis is along y)--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *trimesh - data--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- extents of the box - half width, height, length--&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;1 1 1&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;!-- set the translation and rotation of the box. Note that the transforamtions--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- are all relative to the parent body.--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;0 1 0 45&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Can create multiple geometries per body--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;2 1 2&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 1 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;!-- RotationMat is a 3x3 rotation matrix specified as rows first--&amp;gt;&lt;br /&gt;
      &amp;lt;RotationMat&amp;gt;1 0 0 0 1 0 0 0 1&amp;lt;/RotationMat&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Set the transparency of the geometry, 0 is opaque--&amp;gt;&lt;br /&gt;
      &amp;lt;transparency&amp;gt;0.4&amp;lt;/transparency&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- change the mass properties of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the total mass--&amp;gt;&lt;br /&gt;
      &amp;lt;total&amp;gt;0.40605&amp;lt;/total&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the 3x3 inertia matrix--&amp;gt;&lt;br /&gt;
      &amp;lt;inertia&amp;gt;2 0 0 0 3 0 0 0 5&amp;lt;/inertia&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the center of mass (if using ODE physics engine, should be 0)--&amp;gt;&lt;br /&gt;
      &amp;lt;com&amp;gt;0.008842 -0.000018 0.07367&amp;lt;/com&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a sphere--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;sphere&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- although the underlying collision geometry will be a sphere,--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- render it as a coffee pot--&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/coffeepot.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 -1.5 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Radius&amp;gt;1.5&amp;lt;/Radius&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a triangle mesh--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/cup.iv 0.01&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;!-- use the cup triangles for collision detection.--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The last number is the scale, in case the iv files are scaled improperly.--&amp;gt;&lt;br /&gt;
      &amp;lt;collision&amp;gt;models/objects/cup.iv 0.01&amp;lt;/collision&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1.5 -2 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Create a joint between the two bodies.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Possible joint types are: hinge, slider, universal, hinge2, and spherical.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Hinges are the most common joint type used in robots.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- For amotors, can specify mode, axis1, axis2, axis3. For each axis, first 3 values are the axis and the last value is the relative coord system (see ODE documentation).--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Every joint can have certain properties:--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxforce&amp;gt; are in number of degrees of freedom.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxvel&amp;gt;, &amp;lt;resolution&amp;gt; are scalar and apply to all DOFs.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;limits&amp;gt;, &amp;lt;limitsdeg&amp;gt;, &amp;lt;limitsrad&amp;gt; specify the joint limits --&amp;gt;&lt;br /&gt;
  &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Specify the names of the bodies, names are not case sensitive.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body1&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body2&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- anchor and axis of the hinge--&amp;gt;&lt;br /&gt;
    &amp;lt;Anchor&amp;gt;0 0 0&amp;lt;/Anchor&amp;gt;&lt;br /&gt;
    &amp;lt;Axis&amp;gt;0 1 0&amp;lt;/Axis&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Weight for configuration distance, mostly used in planners.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- for joints with &amp;gt; 1 DOF, specify 2+ values--&amp;gt;&lt;br /&gt;
    &amp;lt;Weight&amp;gt;1.0&amp;lt;/Weight&amp;gt;&lt;br /&gt;
  &amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Models Directory ===&lt;br /&gt;
&lt;br /&gt;
By default, the root directory for all models files is the folder openrave is launched at. To change this, &amp;#039;&amp;#039;&amp;#039;&amp;lt;modelsdir&amp;gt;&amp;#039;&amp;#039;&amp;#039; can be used to specify model files relative to where the current xml file is. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;modelsdir&amp;gt;../mymodels&amp;lt;/modelsdir&amp;gt;&lt;br /&gt;
  &amp;lt;Body&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;render&amp;gt;kitchen/myfile.wrl&amp;lt;/render&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Circular Joints ===&lt;br /&gt;
&lt;br /&gt;
Sometimes joints will have the upper and lower limits identified, meaning that as soon as the joint gets past one limit it will wrap around to the other. Infinitely revolving hinge joints are the most common example of &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; joints where the &amp;lt;math&amp;gt;-\pi&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; limits are identified. In openrave, it is possible to set a joint as &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; like this:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint circular=&amp;quot;true&amp;quot; ...&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Adjacent Links ===&lt;br /&gt;
&lt;br /&gt;
Robot self-collision usually checks all pairs of non-adjacent links for collision; links are adjacent if they are connected to a joint. In order to reduce self-collision computation time and spurious collisions of small links, it is possible to force pairs of links to be treated as adjacent by specifying an &amp;#039;&amp;#039;&amp;#039;&amp;lt;adjacent&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag.&lt;br /&gt;
&lt;br /&gt;
=== Scale ===&lt;br /&gt;
&lt;br /&gt;
The first thing when importing a new model is to check that all the units are in meters (it is very common for robots to be in millimeters), otherwise the visualization model and the collision model will be in a different scale. to check this, open the robot and go to View-&amp;gt;Geometry-&amp;gt;Collision, this will show the collision model. If it is not the same scale, you need to go inside your model files and change the units. You can also enter a scale factor after model filenames like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;collision&amp;gt;mydata.iv 0.001&amp;lt;/collision&amp;gt;&lt;br /&gt;
&amp;lt;render&amp;gt;mydata.iv 0.001&amp;lt;/render&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this will scale the models by 0.001.&lt;br /&gt;
&lt;br /&gt;
== Robot ==&lt;br /&gt;
&lt;br /&gt;
=== A simple 3DOF planar arm in XZ ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;3DOFRobot&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Create the base body, it should never move--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that all translations and rotations are with respect to this base--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- For example, the robot at the identity transformation is equivalent to the identity transformation of the first body.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Base&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.0  0.0  0.0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;radius&amp;gt;0.03&amp;lt;/radius&amp;gt;&lt;br /&gt;
        &amp;lt;height&amp;gt;0.02&amp;lt;/height&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;0.05 0.05 0.05&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the first movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm0&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Offset from is a fast way of specifying that the translation and rotation of this--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- body should be relative to another link--&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Base&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Translation relative to Base--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.01 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm0&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Base&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;4&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;3&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the second movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0.0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.0075 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the third movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.04 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.04 0.005 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;2&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;2&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Create the gripper joints:--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;RClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/RClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/RClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;RClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;RClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!--left gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;LClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0.005 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/LClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/LClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;LClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;LClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 -1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the transparency of every geometry in the KinBody--&amp;gt;&lt;br /&gt;
    &amp;lt;transparency&amp;gt;0.1&amp;lt;/transparency&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specifying the manipulator structure--&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;Arm2&amp;lt;/effector&amp;gt;   &amp;lt;!-- last link where end effector is attached--&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;Base&amp;lt;/base&amp;gt;           &amp;lt;!-- base link--&amp;gt;&lt;br /&gt;
    &amp;lt;joints&amp;gt;j1 j2&amp;lt;/joints&amp;gt;      &amp;lt;!-- the gripper joints used for contact--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- the id of the inverse kinematics solver, it is not necessary to--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify an ik solver for every robot. But if there is one,--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- use iksolver field to identity it.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;lt;iksolver&amp;gt;MyTriDOFSolver&amp;lt;/iksolver&amp;gt; --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- joint values of the closed and opened positions--&amp;gt;&lt;br /&gt;
    &amp;lt;closingdirection&amp;gt;1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
    &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
    &amp;lt;!-- grasp goal with respect to the effector--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0.125 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DOFRobot Robot:  [[image:tridof.jpg|200px]] &lt;br /&gt;
&lt;br /&gt;
=== Defining Manipulators ===&lt;br /&gt;
&lt;br /&gt;
A robot manipulator defines a kinematic chain of the robot joint hierarchy along with optional gripper joint values that are not used in the inverse kinematics computation but are needed for grasping purposes (chains for heads, legs do not need the joint values). A manipulator defines a new frame of reference with respect to the end effector link; all inverse kinematics computations are computed using it. Furthermore, a manipulator can have a &amp;#039;&amp;#039;&amp;#039;&amp;lt;direction&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying an axis for approaching objects or line-of-sight. For example the &amp;#039;&amp;#039;&amp;#039;robots/barrettwam.robot.xml&amp;#039;&amp;#039;&amp;#039; gripper is defined by&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;base&amp;gt;wam0&amp;lt;/base&amp;gt;&lt;br /&gt;
  &amp;lt;effector&amp;gt;wam7&amp;lt;/effector&amp;gt;&lt;br /&gt;
  &amp;lt;Translation&amp;gt;0 0 0.22&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;joints&amp;gt;JF1 JF2 JF3 JF4&amp;lt;/joints&amp;gt;&lt;br /&gt;
  &amp;lt;closingdirection&amp;gt;1 1 1 0&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
  &amp;lt;direction&amp;gt;0 0 1&amp;lt;/direction&amp;gt;&lt;br /&gt;
  &amp;lt;iksolver&amp;gt;WAM7ikfast 0.05&amp;lt;/iksolver&amp;gt;&lt;br /&gt;
&amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The manipulator can optionally define a &amp;#039;&amp;#039;&amp;#039;&amp;lt;iksolver&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying the iksolver interface that is used for getting IK solutions, or a shared object (DLL) to load an [[Component:Ikfast|ikfast]] solver from.&lt;br /&gt;
&lt;br /&gt;
=== Closed-chains and Mimic Joints ===&lt;br /&gt;
&lt;br /&gt;
OpenRAVE allows closed-chains and complex kinematics to be simulated using mimic joints. A mimic joint&amp;#039;s position, velocity, and acceleration values are computed from user-specified formulas using the values of other joints. OpenRAVE uses the Function Parser library to allow any formula to be specified. Refer to the documentation for more information [http://openrave.programmingvision.com/en/coreapihtml/classOpenRAVE_1_1KinBody_1_1Joint.html#a0e31c5be31c4145afa786e0c0d6a46ae here].&lt;br /&gt;
&lt;br /&gt;
A mimic joint requires at least the position equation and its partial derivatives (for velocity) to be manually entered. &lt;br /&gt;
&lt;br /&gt;
For example, the Barrett Hand mimic joints are defined as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;JF1&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;JF1mimic&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot; mimic_pos=&amp;quot;JF1/3+0.8727&amp;quot; mimic_vel=&amp;quot;|JF1 0.33333&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Of course, it is possible to have a mimic joint depend on more than one other joint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;b&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;c&amp;quot; type=&amp;quot;hinge&amp;quot; mimic_pos=&amp;quot;a+b+atan(a)&amp;quot; mimic_vel=&amp;quot;|a 1 + 1/(1+a*a) |b 1&amp;quot; mimic_accel=&amp;quot;|a -2*a/((1+a*a)*(1+a*a)) |b 0&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using mimic joints, it is important to still make all the correct joint connections so that loops are discovered and forces can be computed correctly.&lt;br /&gt;
&lt;br /&gt;
If a joint has more than one degree of freedom, attach the axis index at the end. For example: &amp;quot;mimic_pos0&amp;quot;, &amp;quot;mimic_pos1&amp;quot;, &amp;quot;mimic_vel0&amp;quot;, &amp;quot;mimic_vel1&amp;quot;, &amp;quot;mimic_accel0&amp;quot;, and &amp;quot;mimic_accel1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Attaching Robot Sensors ===&lt;br /&gt;
&lt;br /&gt;
Every robot can be attached a number of sensors onto it. The way to specify this in XML is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specify an attached sensor--&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyFirstLaser&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;link&amp;gt;wam1&amp;lt;/link&amp;gt; &amp;lt;!-- the robot link that the sensor is attached to. As the robot moves, the sensor will move with it--&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 0.2 0.4&amp;lt;/translation&amp;gt; &amp;lt;!-- the local translation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt; &amp;lt;!-- the local rotation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify the real sensor attached--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;#039;type&amp;#039; is the sensor interface identifier--&amp;gt;&lt;br /&gt;
    &amp;lt;sensor type=&amp;quot;BaseLaser2D&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The rest are specific fields to BaseLaser2D, these change as the type changes--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The best way to find out what fields are supported is to look for the documentation--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- for the type of sensor using--&amp;gt;&lt;br /&gt;
      &amp;lt;minangle&amp;gt;-135&amp;lt;/minangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;maxangle&amp;gt;135&amp;lt;/maxangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;0.35&amp;lt;/resolution&amp;gt; &amp;lt;!-- degrees between laser points--&amp;gt;&lt;br /&gt;
      &amp;lt;maxrange&amp;gt;5&amp;lt;/maxrange&amp;gt; &amp;lt;!-- max range of robot--&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting joint values for initial state ===&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot&amp;#039;s initial state is not when all the joints are at 0. Instead of transforming each of the geometry to the zero pose, it is possible to set the initial angle to use using the &amp;lt;initial&amp;gt; tag inside the &amp;lt;joint&amp;gt;. The definition for setting the initial angle to pi/2 radius is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link0&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link1&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;initial&amp;gt;1.570796326794&amp;lt;/initial&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Changing the Body Coordinate System ===&lt;br /&gt;
&lt;br /&gt;
[[image:Barrettwam_coordchange.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot origin and rotation should be defined in a different coordinate system. It is possible to create a new robot file that references the old one and changes its origin. This requires adding a new root link before the robot is defined. For example, consider the robots/barrettwam.robot.xml file whre the first link&amp;#039;s name is &amp;#039;wam0&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- add new first link --&amp;gt;&lt;br /&gt;
  &amp;lt;kinbody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;root&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;robot file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;!-- change the coordinate system of the original first link and attach a dummy joint --&amp;gt;&lt;br /&gt;
    &amp;lt;kinbody&amp;gt;&lt;br /&gt;
      &amp;lt;body name=&amp;quot;wam0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0.3 0.4 0.3&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;root&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;wam0&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;limitsdeg&amp;gt;0 0&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
== Environment Example ==&lt;br /&gt;
&lt;br /&gt;
This example is part of the &amp;#039;&amp;#039;&amp;#039;bin/data/intel/lab1.env.xml&amp;#039;&amp;#039;&amp;#039; file. The most important thing to note about this example is the use of the &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; attribute to import other XML files. The filename specified with &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; has to be &amp;#039;&amp;#039;&amp;#039;relative&amp;#039;&amp;#039;&amp;#039; to the current directory where the file calling it resides. Note the differences between segway.kinbody.xml and barrettwam.robot.xml.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the background color of the environment--&amp;gt;&lt;br /&gt;
  &amp;lt;bkgndcolor&amp;gt;0.3 0.7 0.8&amp;lt;/bkgndcolor&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera translation--&amp;gt;&lt;br /&gt;
  &amp;lt;camtrans&amp;gt;1.418 -1.234 2.963&amp;lt;/camtrans&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera rotation specified by rotation-axis--&amp;gt;&lt;br /&gt;
  &amp;lt;camrotaxis&amp;gt;0.724 0.302 0.619 68&amp;lt;/camrotaxis&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import the segway model and place it somewhere--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;data/segway.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;-0.0671   -0.0819    0.7550&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import a robot file and add an additional body for a cylindrical base--&amp;gt;&lt;br /&gt;
  &amp;lt;Robot file=&amp;quot;../../robots/barrettwam.robot.xml&amp;quot; name=&amp;quot;BarrettWAM&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;-.22 -.14 -.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Body type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
          &amp;lt;radius&amp;gt;0.08&amp;lt;/radius&amp;gt;&lt;br /&gt;
          &amp;lt;height&amp;gt;0.6&amp;lt;/height&amp;gt;&lt;br /&gt;
          &amp;lt;diffusecolor&amp;gt;0.3 0.3 0.3&amp;lt;/diffusecolor&amp;gt;&lt;br /&gt;
          &amp;lt;Translation&amp;gt; 0.2286 0.1397 -0.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;/Geom&amp;gt;&lt;br /&gt;
      &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;-0.754 0.3265 1.036&amp;lt;/translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Robot&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- add the floor as a box--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody name=&amp;quot;floor&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- floor should never move, so make it static--&amp;gt;&lt;br /&gt;
    &amp;lt;Body type=&amp;quot;static&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;2 2 0.005&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;.6 .6 .6&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      	&amp;lt;ambientColor&amp;gt;0.6 0.6 0.6&amp;lt;/ambientColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot Composition ==&lt;br /&gt;
&lt;br /&gt;
The way we recommend managing robots composed of several sub-robots (like a humanoid composed of arms, legs, hands, etc) is to first create separate .kinbody files for just the kinematics and geometry of each separate&lt;br /&gt;
part (ie a hand.kinbody.xml and a arm.kinbody.xml). Then create a robot file that includes both the kinematics and defines the manipulators, sensors, and controllers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;attachedsensor&amp;gt;&lt;br /&gt;
     ....&lt;br /&gt;
 &amp;lt;/attachedsensor&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sometimes for grasp planning, the hand needs to be treated as a robot, so we create a hand.robot.xml file as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. A robot can reference other robots through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;a.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;b.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both a&amp;#039;s and b&amp;#039;s &amp;#039;&amp;#039;&amp;#039;&amp;lt;Manipulator&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;AttachedSensor&amp;gt;&amp;#039;&amp;#039;&amp;#039; tags will be used&lt;br /&gt;
in the parent robot, so you don&amp;#039; t have to copy their definitions.&lt;br /&gt;
&lt;br /&gt;
2. It is possible to prefix the links and joints of a child robot by using the&lt;br /&gt;
&amp;#039;prefix&amp;#039; attribute:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;left_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;right_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now all links and joints will either start with &amp;#039;&amp;#039;&amp;#039;left_&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;right_&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
3. When the xml parser sees a body with the same name as another body,&lt;br /&gt;
it &amp;#039;appends&amp;#039; the specified geometries to the original body. This allows the same link to be referenced/defined in multiple robot files (Note that it is not possible to change the original body coordinate system).&lt;br /&gt;
&lt;br /&gt;
=== Attaching Separate Links ===&lt;br /&gt;
&lt;br /&gt;
When a robot is composed of multiple parts defined in different files, it is necessary to attach links from the different files together so that the robot hierarchy can be complete. This is done by defining &amp;#039;&amp;#039;&amp;#039;disabled&amp;#039;&amp;#039;&amp;#039; dummy joints that attach two links together. These disabled joints do not show up in the robot&amp;#039;s description and are only present to maintain the relative transformation between two links. For example, the robot &amp;#039;&amp;#039;&amp;#039;robots/pa10schunk.robot.xml&amp;#039;&amp;#039;&amp;#039; is composed of &amp;#039;&amp;#039;&amp;#039;robots/pa10.kinbody.xml&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;robots/schunk_manip.kinbody.xml&amp;#039;&amp;#039;&amp;#039;, in order to join the two, the robot  is defined in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;pa10.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody file=&amp;quot;schunk_manip.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;False&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;link7&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;gripper_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;#039;&amp;#039;&amp;#039;link7&amp;#039;&amp;#039;&amp;#039; is a link of the pa10 arm and &amp;#039;&amp;#039;&amp;#039;gripper_base&amp;#039;&amp;#039;&amp;#039; is a link of the gripper. The lower and upper joint limits are all 0, which OpenRAVE recognizes as a dummy joint.&lt;br /&gt;
&lt;br /&gt;
=== Joining A Robot Arm and Hand ===&lt;br /&gt;
&lt;br /&gt;
It is possible to load robots and bodies from COLLADA files by specifying the collada filename through the &amp;#039;&amp;#039;&amp;#039;file&amp;#039;&amp;#039;&amp;#039; attribute. For example, the following robot is a combination of an arm defined in OpenRAVE XML and a hand defined in COLLADA (download schunkSDHHand from [http://opengrasp.sourceforge.net/Downloads.html OpenGrasp]). The dummy joint is used to join the arm end effector with the hand base.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot file=&amp;quot;robots/kuka-kr5-r650.robot.xml&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot prefix=&amp;quot;hand_&amp;quot; file=&amp;quot;schunkSDHhand.dae&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody&amp;gt;&lt;br /&gt;
   &amp;lt;body name=&amp;quot;hand_root&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;offsetfrom&amp;gt;link6&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
     &amp;lt;translation&amp;gt;0.03 0 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
     &amp;lt;rotationaxis&amp;gt;0 1 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;joint type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;link6&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;hand_root&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
   &amp;lt;/joint&amp;gt;&lt;br /&gt;
 &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;base&amp;gt;base&amp;lt;/base&amp;gt;&lt;br /&gt;
   &amp;lt;effector&amp;gt;link6&amp;lt;/effector&amp;gt;&lt;br /&gt;
   &amp;lt;joints&amp;gt;hand_Bone_B1_Joint hand_Bone_B2_Joint hand_Bone_B3_Joint hand_Bone_A1_Joint hand_Bone_A2_Joint hand_Bone_A3_Joint hand_Bone_C1_Joint hand_Bone_C2_Joint hand_Bone_C3_Joint&amp;lt;/joints&amp;gt;&lt;br /&gt;
   &amp;lt;closingdirection&amp;gt;0 1 1 0 1 1 0 1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
   &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Final robot: [[image:collada_sdh_kuka.jpg|150px]]&lt;br /&gt;
&lt;br /&gt;
=== Dual-arm example ===&lt;br /&gt;
&lt;br /&gt;
Here is an example file of having a robot composed of two arms attached to a common link named &amp;#039;&amp;#039;&amp;#039;chest&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;schunk-dualarm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;chest&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;0.1 0.1 0.4&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0 0 0.4&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/geom&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- left arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody prefix=&amp;quot;l_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 -0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody&amp;gt;prefix=&amp;quot;r_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- connect the two arms with dummy joints --&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;leftdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;l_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;rightdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;r_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;!-- define the manipulators --&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;leftarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;l_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;l_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
    &amp;lt;armjoints&amp;gt;l_j0 l_j1 l_j2 l_j3 l_j4 l_j5 l_j6&amp;lt;/armjoints&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;rightarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;r_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;r_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
    &amp;lt;armjoints&amp;gt;r_j0 r_j1 r_j2 r_j3 r_j4 r_j5 r_j6&amp;lt;/armjoints&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Single arm: [[image:schunk-lwa3.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
Dual arm: [[image:schunk-lwa3-dual.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
== Custom XML ==&lt;br /&gt;
&lt;br /&gt;
Openrave provides much more flexibility in creating and defining custom XML readers for interfaces. First the &amp;lt;environment&amp;gt; XML tag supports creating any interface type and supports loading plugins. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;plugin&amp;gt;libcustomreader&amp;lt;/plugin&amp;gt;&lt;br /&gt;
  &amp;lt;robot name=&amp;quot;wam&amp;quot; file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;controller type=&amp;quot;CustomController&amp;quot; robot=&amp;quot;wam&amp;quot; args=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    ..custom data....&lt;br /&gt;
  &amp;lt;/controller&amp;gt;&lt;br /&gt;
  &amp;lt;module type=&amp;quot;basemanipulation&amp;quot; args=&amp;quot;wam&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example, openrave will first load the plugin, then will create a robot, and then will create a controller that is attached to the robot, then will create the basemanipulation module giving it the robot name as the argument.&lt;br /&gt;
&lt;br /&gt;
Furthermore, using EnvironmentBase::RegisterXMLReader, it is possible to set a parser for custom XML tags for each interface type.  For those curious on how to take advantage of custom readers, please refer to examples/plugincpp/customreader.cpp on how to attach a custom XML reader to a controller.&lt;br /&gt;
&lt;br /&gt;
These changes will allow people to setup all their specific environment settings in the XML files without having to rely on external scripts or other programs to do it. Note that OpenRAVE processes tags in depth first order.&lt;br /&gt;
&lt;br /&gt;
== Sensor ==&lt;br /&gt;
&lt;br /&gt;
It is possible to have XML files that declare a sensor and its internal parameters. For example, &amp;#039;&amp;#039;&amp;#039;data/camera.sensor.xml&amp;#039;&amp;#039;&amp;#039; can look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;sensor type=&amp;quot;BaseCamera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KK&amp;gt;640 640 320 240&amp;lt;/KK&amp;gt;&lt;br /&gt;
  &amp;lt;width&amp;gt;640&amp;lt;/width&amp;gt;&lt;br /&gt;
  &amp;lt;height&amp;gt;480&amp;lt;/height&amp;gt;&lt;br /&gt;
  &amp;lt;framerate&amp;gt;5&amp;lt;/framerate&amp;gt;&lt;br /&gt;
  &amp;lt;color&amp;gt;0.5 0.5 1&amp;lt;/color&amp;gt;&lt;br /&gt;
&amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to attach a sensor defined by a file to a robot link do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyCamera&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is also possible to put a sensor directly in the environment without a robot. Such a sensor will not have any geometry associated with it, and will only act as a sensing source.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... environment definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;sensor name=&amp;quot;mysensor&amp;quot; file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the sensor transform --&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 1 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
  &amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== XML Reference ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; All XML handling is done in &amp;#039;&amp;#039;&amp;#039;src/libopenrave-core/xmlreaders.cpp&amp;#039;&amp;#039;&amp;#039;. If there&amp;#039;s any parameters that are not explained well, make sure to check out that source file for further reference.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; You can find details on joints on : [http://opende.sourceforge.net/wiki/index.php/Manual_%28Joint_Types_and_Functions%29 ODE Manual page (joints)].&lt;br /&gt;
&lt;br /&gt;
Here&amp;#039;s a list of all possible fields the XML supports in a hierarchical structure.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;environment&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;bkgndcolor&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camrotaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camtrans&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;planner&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensorsystem&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file, robot, args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;inversekinematicssolver&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;physicsengine&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;collisionchecker&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;trajectory&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;viewer&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;server&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type, makejoinedlinksadjacent&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;adjacent&amp;#039;&amp;#039;&amp;#039; - 2 body names&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (dynamic, static)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;geom&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (box, sphere, trimesh, cylinder), render (true,false), modifiable (true,false)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;ambientcolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;collision&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;diffusecolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;extents&amp;#039;&amp;#039;&amp;#039; - 3 float [box]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;height&amp;#039;&amp;#039;&amp;#039; - float [cylinder]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float [cylinder, sphere]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;render&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;vertices&amp;#039;&amp;#039;&amp;#039; - 9*N floats where each 9 values defines 1 triangle with 3 vertices&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;com&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;inertia&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;joint&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; enable (true, false), type (hinge, slider, universal, hinge2, spherical), circular(true, false), mimic_pos (math equation), mimic_vel (math equation), mimic_accel (math equation)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;anchor&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, hinge2, universal, spherical]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, slider]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis1&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis2&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limits&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsdeg&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in degrees if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsrad&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxvel&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mode&amp;#039;&amp;#039;&amp;#039; - int [amotor]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;resolution&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;weight&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;modelsdir&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - bodyname&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type (robot plugin type)&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;attachedsensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;link&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;...&amp;#039;&amp;#039;&amp;#039; - fields defined by SensorBase class instantiated by type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - type args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - name&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;manipulator&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;armjoints&amp;#039;&amp;#039;&amp;#039; - n joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;base&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closed&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;effector&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;iksolver&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;gripperjoints&amp;#039;&amp;#039;&amp;#039; - k joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closingdirection&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;palmdirection&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - name, file, type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=File:Barrettwam_coordchange.png&amp;diff=118</id>
		<title>File:Barrettwam coordchange.png</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=File:Barrettwam_coordchange.png&amp;diff=118"/>
				<updated>2011-07-20T02:29:31Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=117</id>
		<title>Format:XML</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Format:XML&amp;diff=117"/>
				<updated>2011-07-20T02:10:20Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
= OpenRAVE Custom XML Format =&lt;br /&gt;
&lt;br /&gt;
[[image:Openrave_robots.jpg|600px]] &lt;br /&gt;
&lt;br /&gt;
OpenRAVE uses XML to store all robot and scene descriptions. The XML format is flexible enough to link one XML file from another like including already created objects/robots in an environment. It is also possible to specify vrml or iv formatted files within it to import models. &lt;br /&gt;
&lt;br /&gt;
All interface types can be created. Furthermore, an &amp;lt;environment&amp;gt; tag can optionally be specified to put all bodies/interfaces in.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Environment&amp;#039;&amp;#039;&amp;#039; - specify multiple objects and robots. Can also define some GUI properties like camera start location and background color. The environment allows the creation of &amp;#039;&amp;#039;&amp;#039;any&amp;#039;&amp;#039;&amp;#039; OpenRAVE interfaces. Each interface can take the &amp;#039;&amp;#039;&amp;#039;type&amp;#039;&amp;#039;&amp;#039; attribute specifying the interface type and can define custom XML readers.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039; - The basic object that all other objects derive from. A kinematic body consists of a collection of rigid bodies and joints that connect these bodies.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; - The basic robot that derives from &amp;#039;&amp;#039;&amp;#039;KinBody&amp;#039;&amp;#039;&amp;#039;. Usually every Robot has at least one KinBody declaration inside it. A robot can also hold a list of &amp;#039;&amp;#039;&amp;#039;Manipulator&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;AttachedSensor&amp;#039;&amp;#039;&amp;#039; objects describing the manipulation/sensing capabilities of the robot. Since plugin authors can create different robots, it is also possible to define custom fields in &amp;#039;&amp;#039;&amp;#039;Robot&amp;#039;&amp;#039;&amp;#039; to hold other information like balance control parameters for humanoids.&lt;br /&gt;
&lt;br /&gt;
== KinBody ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody name=&amp;quot;TestKinBody&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Create a rigid body named Body1 and declare it as &amp;#039;dynamic&amp;#039;.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;#039;dynamic&amp;#039; bodies are subject to physics laws, &amp;#039;static&amp;#039; bodies will never move--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- due to physical forces. It is recommended EVERYTHING is declared as &amp;#039;dynamic&amp;#039; --&amp;gt;&lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that the body transforms affects all geometry objects attached. --&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- translation of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;!--rotation of the body specified as a rotation axis. First three numbers are the axis.--&amp;gt;&lt;br /&gt;
    &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- defines mass properties for the entire kinbody. possible mass types are--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- mimicgeom - &amp;lt;density&amp;gt;. Adds a mass equivalent to all the geometry--&amp;gt;&lt;br /&gt;
    &amp;lt;!--    objects. trimesh and plane are not supported.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- box - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;extents&amp;gt; Adds a simple box--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- sphere - &amp;lt;density&amp;gt;(or &amp;lt;mass&amp;gt;), &amp;lt;radius&amp;gt;--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;density&amp;gt;1000&amp;lt;/density&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Define a geometry object attached to the body. The functionality of --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- geometry objects is to define the collision and render geometries of the body. --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- All geometry types have Rotation(Mat/Quat), Translation, and Render components.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Possible geom types are box, sphere, trimesh, plane.--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *box - extents--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *sphere - radius--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *cylinder - radius, height (axis is along y)--&amp;gt;&lt;br /&gt;
    &amp;lt;!--  *trimesh - data--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- extents of the box - half width, height, length--&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;1 1 1&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;!-- set the translation and rotation of the box. Note that the transforamtions--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- are all relative to the parent body.--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;0 1 0 45&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Can create multiple geometries per body--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Extents&amp;gt;2 1 2&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 1 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;!-- RotationMat is a 3x3 rotation matrix specified as rows first--&amp;gt;&lt;br /&gt;
      &amp;lt;RotationMat&amp;gt;1 0 0 0 1 0 0 0 1&amp;lt;/RotationMat&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Set the transparency of the geometry, 0 is opaque--&amp;gt;&lt;br /&gt;
      &amp;lt;transparency&amp;gt;0.4&amp;lt;/transparency&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;Body name=&amp;quot;Body2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- change the mass properties of the body--&amp;gt;&lt;br /&gt;
    &amp;lt;Mass type=&amp;quot;mimicgeom&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the total mass--&amp;gt;&lt;br /&gt;
      &amp;lt;total&amp;gt;0.40605&amp;lt;/total&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the 3x3 inertia matrix--&amp;gt;&lt;br /&gt;
      &amp;lt;inertia&amp;gt;2 0 0 0 3 0 0 0 5&amp;lt;/inertia&amp;gt;&lt;br /&gt;
      &amp;lt;!-- specify the center of mass (if using ODE physics engine, should be 0)--&amp;gt;&lt;br /&gt;
      &amp;lt;com&amp;gt;0.008842 -0.000018 0.07367&amp;lt;/com&amp;gt;&lt;br /&gt;
    &amp;lt;/Mass&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a sphere--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;sphere&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- although the underlying collision geometry will be a sphere,--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- render it as a coffee pot--&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/coffeepot.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 -1.5 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Radius&amp;gt;1.5&amp;lt;/Radius&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;!-- create a triangle mesh--&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Render&amp;gt;models/objects/cup.iv 0.01&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;!-- use the cup triangles for collision detection.--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The last number is the scale, in case the iv files are scaled improperly.--&amp;gt;&lt;br /&gt;
      &amp;lt;collision&amp;gt;models/objects/cup.iv 0.01&amp;lt;/collision&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;1.5 -2 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Create a joint between the two bodies.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Possible joint types are: hinge, slider, universal, hinge2, and spherical.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Hinges are the most common joint type used in robots.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- For amotors, can specify mode, axis1, axis2, axis3. For each axis, first 3 values are the axis and the last value is the relative coord system (see ODE documentation).--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Every joint can have certain properties:--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxforce&amp;gt; are in number of degrees of freedom.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;maxvel&amp;gt;, &amp;lt;resolution&amp;gt; are scalar and apply to all DOFs.--&amp;gt;&lt;br /&gt;
  &amp;lt;!-- &amp;lt;limits&amp;gt;, &amp;lt;limitsdeg&amp;gt;, &amp;lt;limitsrad&amp;gt; specify the joint limits --&amp;gt;&lt;br /&gt;
  &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Specify the names of the bodies, names are not case sensitive.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body1&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Body&amp;gt;Body2&amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- anchor and axis of the hinge--&amp;gt;&lt;br /&gt;
    &amp;lt;Anchor&amp;gt;0 0 0&amp;lt;/Anchor&amp;gt;&lt;br /&gt;
    &amp;lt;Axis&amp;gt;0 1 0&amp;lt;/Axis&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Weight for configuration distance, mostly used in planners.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- for joints with &amp;gt; 1 DOF, specify 2+ values--&amp;gt;&lt;br /&gt;
    &amp;lt;Weight&amp;gt;1.0&amp;lt;/Weight&amp;gt;&lt;br /&gt;
  &amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Models Directory ===&lt;br /&gt;
&lt;br /&gt;
By default, the root directory for all models files is the folder openrave is launched at. To change this, &amp;#039;&amp;#039;&amp;#039;&amp;lt;modelsdir&amp;gt;&amp;#039;&amp;#039;&amp;#039; can be used to specify model files relative to where the current xml file is. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;modelsdir&amp;gt;../mymodels&amp;lt;/modelsdir&amp;gt;&lt;br /&gt;
  &amp;lt;Body&amp;gt;&lt;br /&gt;
    &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;render&amp;gt;kitchen/myfile.wrl&amp;lt;/render&amp;gt;&lt;br /&gt;
    &amp;lt;/Geom&amp;gt;&lt;br /&gt;
  &amp;lt;/Body&amp;gt;&lt;br /&gt;
&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Circular Joints ===&lt;br /&gt;
&lt;br /&gt;
Sometimes joints will have the upper and lower limits identified, meaning that as soon as the joint gets past one limit it will wrap around to the other. Infinitely revolving hinge joints are the most common example of &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; joints where the &amp;lt;math&amp;gt;-\pi&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; limits are identified. In openrave, it is possible to set a joint as &amp;#039;&amp;#039;&amp;#039;circular&amp;#039;&amp;#039;&amp;#039; like this:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint circular=&amp;quot;true&amp;quot; ...&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Adjacent Links ===&lt;br /&gt;
&lt;br /&gt;
Robot self-collision usually checks all pairs of non-adjacent links for collision; links are adjacent if they are connected to a joint. In order to reduce self-collision computation time and spurious collisions of small links, it is possible to force pairs of links to be treated as adjacent by specifying an &amp;#039;&amp;#039;&amp;#039;&amp;lt;adjacent&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag.&lt;br /&gt;
&lt;br /&gt;
=== Scale ===&lt;br /&gt;
&lt;br /&gt;
The first thing when importing a new model is to check that all the units are in meters (it is very common for robots to be in millimeters), otherwise the visualization model and the collision model will be in a different scale. to check this, open the robot and go to View-&amp;gt;Geometry-&amp;gt;Collision, this will show the collision model. If it is not the same scale, you need to go inside your model files and change the units. You can also enter a scale factor after model filenames like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;collision&amp;gt;mydata.iv 0.001&amp;lt;/collision&amp;gt;&lt;br /&gt;
&amp;lt;render&amp;gt;mydata.iv 0.001&amp;lt;/render&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this will scale the models by 0.001.&lt;br /&gt;
&lt;br /&gt;
== Robot ==&lt;br /&gt;
&lt;br /&gt;
=== A simple 3DOF planar arm in XZ ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;3DOFRobot&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Create the base body, it should never move--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Note that all translations and rotations are with respect to this base--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- For example, the robot at the identity transformation is equivalent to the identity transformation of the first body.--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Base&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.0  0.0  0.0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;radius&amp;gt;0.03&amp;lt;/radius&amp;gt;&lt;br /&gt;
        &amp;lt;height&amp;gt;0.02&amp;lt;/height&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;0.05 0.05 0.05&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the first movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm0&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Offset from is a fast way of specifying that the translation and rotation of this--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- body should be relative to another link--&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Base&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Translation relative to Base--&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.01 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm0&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Base&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;4&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;3&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the second movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm1&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm0&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.08 0.0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.08 0.0075 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm0&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- the third movable link--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;Arm2&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm1&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.14 0 0.01&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Translation&amp;gt;0.04 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;Extents&amp;gt;0.04 0.005 0.005&amp;lt;/Extents&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- declare a circular hinge joint (circular joints have no limits) --&amp;gt;&lt;br /&gt;
    &amp;lt;Joint circular=&amp;quot;true&amp;quot; name=&amp;quot;Arm2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm1&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;3&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-180 180&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;2&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;2&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!-- Create the gripper joints:--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;RClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0 0.005&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/RClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/RClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j1&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;RClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;RClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;!--left gripper--&amp;gt;&lt;br /&gt;
    &amp;lt;Body name=&amp;quot;LClaw&amp;quot; type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;0.08 0.005 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;rotationaxis&amp;gt;0 0 1 -90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;Arm2&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;trimesh&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Data&amp;gt;models/puma/LClaw.iv&amp;lt;/Data&amp;gt;&lt;br /&gt;
        &amp;lt;Render&amp;gt;models/puma/LClaw.iv&amp;lt;/Render&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;j2&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;Arm2&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;Body&amp;gt;LClaw&amp;lt;/Body&amp;gt;&lt;br /&gt;
      &amp;lt;offsetfrom&amp;gt;LClaw&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
      &amp;lt;weight&amp;gt;0.2&amp;lt;/weight&amp;gt;&lt;br /&gt;
      &amp;lt;limitsdeg&amp;gt;-56 16&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;axis&amp;gt;0 0 -1&amp;lt;/axis&amp;gt;&lt;br /&gt;
      &amp;lt;maxvel&amp;gt;0.4&amp;lt;/maxvel&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;3&amp;lt;/resolution&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the transparency of every geometry in the KinBody--&amp;gt;&lt;br /&gt;
    &amp;lt;transparency&amp;gt;0.1&amp;lt;/transparency&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specifying the manipulator structure--&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;Arm2&amp;lt;/effector&amp;gt;   &amp;lt;!-- last link where end effector is attached--&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;Base&amp;lt;/base&amp;gt;           &amp;lt;!-- base link--&amp;gt;&lt;br /&gt;
    &amp;lt;joints&amp;gt;j1 j2&amp;lt;/joints&amp;gt;      &amp;lt;!-- the gripper joints used for contact--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- the id of the inverse kinematics solver, it is not necessary to--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify an ik solver for every robot. But if there is one,--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- use iksolver field to identity it.--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;lt;iksolver&amp;gt;MyTriDOFSolver&amp;lt;/iksolver&amp;gt; --&amp;gt;&lt;br /&gt;
    &amp;lt;!-- joint values of the closed and opened positions--&amp;gt;&lt;br /&gt;
    &amp;lt;closingdirection&amp;gt;1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
    &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
    &amp;lt;!-- grasp goal with respect to the effector--&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;0.125 0 0&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DOFRobot Robot:  [[image:tridof.jpg|200px]] &lt;br /&gt;
&lt;br /&gt;
=== Defining Manipulators ===&lt;br /&gt;
&lt;br /&gt;
A robot manipulator defines a kinematic chain of the robot joint hierarchy along with optional gripper joint values that are not used in the inverse kinematics computation but are needed for grasping purposes (chains for heads, legs do not need the joint values). A manipulator defines a new frame of reference with respect to the end effector link; all inverse kinematics computations are computed using it. Furthermore, a manipulator can have a &amp;#039;&amp;#039;&amp;#039;&amp;lt;direction&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying an axis for approaching objects or line-of-sight. For example the &amp;#039;&amp;#039;&amp;#039;robots/barrettwam.robot.xml&amp;#039;&amp;#039;&amp;#039; gripper is defined by&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;base&amp;gt;wam0&amp;lt;/base&amp;gt;&lt;br /&gt;
  &amp;lt;effector&amp;gt;wam7&amp;lt;/effector&amp;gt;&lt;br /&gt;
  &amp;lt;Translation&amp;gt;0 0 0.22&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;joints&amp;gt;JF1 JF2 JF3 JF4&amp;lt;/joints&amp;gt;&lt;br /&gt;
  &amp;lt;closingdirection&amp;gt;1 1 1 0&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
  &amp;lt;direction&amp;gt;0 0 1&amp;lt;/direction&amp;gt;&lt;br /&gt;
  &amp;lt;iksolver&amp;gt;WAM7ikfast 0.05&amp;lt;/iksolver&amp;gt;&lt;br /&gt;
&amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The manipulator can optionally define a &amp;#039;&amp;#039;&amp;#039;&amp;lt;iksolver&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag specifying the iksolver interface that is used for getting IK solutions, or a shared object (DLL) to load an [[Component:Ikfast|ikfast]] solver from.&lt;br /&gt;
&lt;br /&gt;
=== Closed-chains and Mimic Joints ===&lt;br /&gt;
&lt;br /&gt;
OpenRAVE allows closed-chains and complex kinematics to be simulated using mimic joints. A mimic joint&amp;#039;s position, velocity, and acceleration values are computed from user-specified formulas using the values of other joints. OpenRAVE uses the Function Parser library to allow any formula to be specified. Refer to the documentation for more information [http://openrave.programmingvision.com/en/coreapihtml/classOpenRAVE_1_1KinBody_1_1Joint.html#a0e31c5be31c4145afa786e0c0d6a46ae here].&lt;br /&gt;
&lt;br /&gt;
A mimic joint requires at least the position equation and its partial derivatives (for velocity) to be manually entered. &lt;br /&gt;
&lt;br /&gt;
For example, the Barrett Hand mimic joints are defined as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;JF1&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;JF1mimic&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot; mimic_pos=&amp;quot;JF1/3+0.8727&amp;quot; mimic_vel=&amp;quot;|JF1 0.33333&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Of course, it is possible to have a mimic joint depend on more than one other joint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint type=&amp;quot;hinge&amp;quot; name=&amp;quot;b&amp;quot;&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;Joint name=&amp;quot;c&amp;quot; type=&amp;quot;hinge&amp;quot; mimic_pos=&amp;quot;a+b+atan(a)&amp;quot; mimic_vel=&amp;quot;|a 1 + 1/(1+a*a) |b 1&amp;quot; mimic_accel=&amp;quot;|a -2*a/((1+a*a)*(1+a*a)) |b 0&amp;quot;&amp;gt;&lt;br /&gt;
  ....&lt;br /&gt;
&amp;lt;/Joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When using mimic joints, it is important to still make all the correct joint connections so that loops are discovered and forces can be computed correctly.&lt;br /&gt;
&lt;br /&gt;
If a joint has more than one degree of freedom, attach the axis index at the end. For example: &amp;quot;mimic_pos0&amp;quot;, &amp;quot;mimic_pos1&amp;quot;, &amp;quot;mimic_vel0&amp;quot;, &amp;quot;mimic_vel1&amp;quot;, &amp;quot;mimic_accel0&amp;quot;, and &amp;quot;mimic_accel1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Attaching Robot Sensors ===&lt;br /&gt;
&lt;br /&gt;
Every robot can be attached a number of sensors onto it. The way to specify this in XML is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- Specify an attached sensor--&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyFirstLaser&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;link&amp;gt;wam1&amp;lt;/link&amp;gt; &amp;lt;!-- the robot link that the sensor is attached to. As the robot moves, the sensor will move with it--&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 0.2 0.4&amp;lt;/translation&amp;gt; &amp;lt;!-- the local translation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt; &amp;lt;!-- the local rotation in the attached link&amp;#039;s frame--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- specify the real sensor attached--&amp;gt;&lt;br /&gt;
    &amp;lt;!-- &amp;#039;type&amp;#039; is the sensor interface identifier--&amp;gt;&lt;br /&gt;
    &amp;lt;sensor type=&amp;quot;BaseLaser2D&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The rest are specific fields to BaseLaser2D, these change as the type changes--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- The best way to find out what fields are supported is to look for the documentation--&amp;gt;&lt;br /&gt;
      &amp;lt;!-- for the type of sensor using--&amp;gt;&lt;br /&gt;
      &amp;lt;minangle&amp;gt;-135&amp;lt;/minangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;maxangle&amp;gt;135&amp;lt;/maxangle&amp;gt; &amp;lt;!-- degrees --&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;0.35&amp;lt;/resolution&amp;gt; &amp;lt;!-- degrees between laser points--&amp;gt;&lt;br /&gt;
      &amp;lt;maxrange&amp;gt;5&amp;lt;/maxrange&amp;gt; &amp;lt;!-- max range of robot--&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting joint values for initial state ===&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot&amp;#039;s initial state is not when all the joints are at 0. Instead of transforming each of the geometry to the zero pose, it is possible to set the initial angle to use using the &amp;lt;initial&amp;gt; tag inside the &amp;lt;joint&amp;gt;. The definition for setting the initial angle to pi/2 radius is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joint type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link0&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;link1&amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;initial&amp;gt;1.570796326794&amp;lt;/initial&amp;gt;&lt;br /&gt;
&amp;lt;/joint&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Changing the Body Coordinate System ===&lt;br /&gt;
&lt;br /&gt;
Sometimes the robot origin and rotation should be defined in a different coordinate system. It is possible to create a new robot file that references the old one and changes its origin. This requires adding a new root link before the robot is defined. For example, consider the robots/barrettwam.robot.xml file whre the first link&amp;#039;s name is &amp;#039;wam0&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- add new first link --&amp;gt;&lt;br /&gt;
  &amp;lt;kinbody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;root&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;robot file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;!-- change the coordinate system of the original first link and attach a dummy joint --&amp;gt;&lt;br /&gt;
    &amp;lt;kinbody&amp;gt;&lt;br /&gt;
      &amp;lt;body name=&amp;quot;wam0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;rotationaxis&amp;gt;1 0 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0.3 0.4 0.3&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;root&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;wam0&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;limitsdeg&amp;gt;0 0&amp;lt;/limitsdeg&amp;gt;&lt;br /&gt;
      &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
  &amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
== Environment Example ==&lt;br /&gt;
&lt;br /&gt;
This example is part of the &amp;#039;&amp;#039;&amp;#039;bin/data/intel/lab1.env.xml&amp;#039;&amp;#039;&amp;#039; file. The most important thing to note about this example is the use of the &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; attribute to import other XML files. The filename specified with &amp;#039;&amp;#039;&amp;#039;file=&amp;#039;&amp;#039;&amp;#039; has to be &amp;#039;&amp;#039;&amp;#039;relative&amp;#039;&amp;#039;&amp;#039; to the current directory where the file calling it resides. Note the differences between segway.kinbody.xml and barrettwam.robot.xml.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the background color of the environment--&amp;gt;&lt;br /&gt;
  &amp;lt;bkgndcolor&amp;gt;0.3 0.7 0.8&amp;lt;/bkgndcolor&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera translation--&amp;gt;&lt;br /&gt;
  &amp;lt;camtrans&amp;gt;1.418 -1.234 2.963&amp;lt;/camtrans&amp;gt;&lt;br /&gt;
  &amp;lt;!-- set the initial camera rotation specified by rotation-axis--&amp;gt;&lt;br /&gt;
  &amp;lt;camrotaxis&amp;gt;0.724 0.302 0.619 68&amp;lt;/camrotaxis&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import the segway model and place it somewhere--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;data/segway.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Translation&amp;gt;-0.0671   -0.0819    0.7550&amp;lt;/Translation&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- import a robot file and add an additional body for a cylindrical base--&amp;gt;&lt;br /&gt;
  &amp;lt;Robot file=&amp;quot;../../robots/barrettwam.robot.xml&amp;quot; name=&amp;quot;BarrettWAM&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;Translation&amp;gt;-.22 -.14 -.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
      &amp;lt;Body type=&amp;quot;dynamic&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Geom type=&amp;quot;cylinder&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
          &amp;lt;radius&amp;gt;0.08&amp;lt;/radius&amp;gt;&lt;br /&gt;
          &amp;lt;height&amp;gt;0.6&amp;lt;/height&amp;gt;&lt;br /&gt;
          &amp;lt;diffusecolor&amp;gt;0.3 0.3 0.3&amp;lt;/diffusecolor&amp;gt;&lt;br /&gt;
          &amp;lt;Translation&amp;gt; 0.2286 0.1397 -0.346&amp;lt;/Translation&amp;gt;&lt;br /&gt;
        &amp;lt;/Geom&amp;gt;&lt;br /&gt;
      &amp;lt;/Body&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;-0.754 0.3265 1.036&amp;lt;/translation&amp;gt;&lt;br /&gt;
  &amp;lt;/Robot&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;!-- add the floor as a box--&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody name=&amp;quot;floor&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- floor should never move, so make it static--&amp;gt;&lt;br /&gt;
    &amp;lt;Body type=&amp;quot;static&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;2 2 0.005&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;diffuseColor&amp;gt;.6 .6 .6&amp;lt;/diffuseColor&amp;gt;&lt;br /&gt;
      	&amp;lt;ambientColor&amp;gt;0.6 0.6 0.6&amp;lt;/ambientColor&amp;gt;&lt;br /&gt;
      &amp;lt;/Geom&amp;gt;&lt;br /&gt;
    &amp;lt;/Body&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot Composition ==&lt;br /&gt;
&lt;br /&gt;
The way we recommend managing robots composed of several sub-robots (like a humanoid composed of arms, legs, hands, etc) is to first create separate .kinbody files for just the kinematics and geometry of each separate&lt;br /&gt;
part (ie a hand.kinbody.xml and a arm.kinbody.xml). Then create a robot file that includes both the kinematics and defines the manipulators, sensors, and controllers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;attachedsensor&amp;gt;&lt;br /&gt;
     ....&lt;br /&gt;
 &amp;lt;/attachedsensor&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sometimes for grasp planning, the hand needs to be treated as a robot, so we create a hand.robot.xml file as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody file=&amp;quot;hand.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator&amp;gt;&lt;br /&gt;
   ....&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. A robot can reference other robots through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;a.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;Robot file=&amp;quot;b.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both a&amp;#039;s and b&amp;#039;s &amp;#039;&amp;#039;&amp;#039;&amp;lt;Manipulator&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;AttachedSensor&amp;gt;&amp;#039;&amp;#039;&amp;#039; tags will be used&lt;br /&gt;
in the parent robot, so you don&amp;#039; t have to copy their definitions.&lt;br /&gt;
&lt;br /&gt;
2. It is possible to prefix the links and joints of a child robot by using the&lt;br /&gt;
&amp;#039;prefix&amp;#039; attribute:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;left_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;KinBody prefix=&amp;quot;right_&amp;quot; file=&amp;quot;arm.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now all links and joints will either start with &amp;#039;&amp;#039;&amp;#039;left_&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;right_&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
3. When the xml parser sees a body with the same name as another body,&lt;br /&gt;
it &amp;#039;appends&amp;#039; the specified geometries to the original body. This allows the same link to be referenced/defined in multiple robot files (Note that it is not possible to change the original body coordinate system).&lt;br /&gt;
&lt;br /&gt;
=== Attaching Separate Links ===&lt;br /&gt;
&lt;br /&gt;
When a robot is composed of multiple parts defined in different files, it is necessary to attach links from the different files together so that the robot hierarchy can be complete. This is done by defining &amp;#039;&amp;#039;&amp;#039;disabled&amp;#039;&amp;#039;&amp;#039; dummy joints that attach two links together. These disabled joints do not show up in the robot&amp;#039;s description and are only present to maintain the relative transformation between two links. For example, the robot &amp;#039;&amp;#039;&amp;#039;robots/pa10schunk.robot.xml&amp;#039;&amp;#039;&amp;#039; is composed of &amp;#039;&amp;#039;&amp;#039;robots/pa10.kinbody.xml&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;robots/schunk_manip.kinbody.xml&amp;#039;&amp;#039;&amp;#039;, in order to join the two, the robot  is defined in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody file=&amp;quot;pa10.kinbody.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody file=&amp;quot;schunk_manip.kinbody.xml&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Joint name=&amp;quot;dummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;False&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;link7&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;gripper_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/Joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;#039;&amp;#039;&amp;#039;link7&amp;#039;&amp;#039;&amp;#039; is a link of the pa10 arm and &amp;#039;&amp;#039;&amp;#039;gripper_base&amp;#039;&amp;#039;&amp;#039; is a link of the gripper. The lower and upper joint limits are all 0, which OpenRAVE recognizes as a dummy joint.&lt;br /&gt;
&lt;br /&gt;
=== Joining A Robot Arm and Hand ===&lt;br /&gt;
&lt;br /&gt;
It is possible to load robots and bodies from COLLADA files by specifying the collada filename through the &amp;#039;&amp;#039;&amp;#039;file&amp;#039;&amp;#039;&amp;#039; attribute. For example, the following robot is a combination of an arm defined in OpenRAVE XML and a hand defined in COLLADA (download schunkSDHHand from [http://opengrasp.sourceforge.net/Downloads.html OpenGrasp]). The dummy joint is used to join the arm end effector with the hand base.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot file=&amp;quot;robots/kuka-kr5-r650.robot.xml&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;robot prefix=&amp;quot;hand_&amp;quot; file=&amp;quot;schunkSDHhand.dae&amp;quot;&amp;gt;&amp;lt;/robot&amp;gt;&lt;br /&gt;
 &amp;lt;kinbody&amp;gt;&lt;br /&gt;
   &amp;lt;body name=&amp;quot;hand_root&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;offsetfrom&amp;gt;link6&amp;lt;/offsetfrom&amp;gt;&lt;br /&gt;
     &amp;lt;translation&amp;gt;0.03 0 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
     &amp;lt;rotationaxis&amp;gt;0 1 0 90&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
   &amp;lt;joint type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;link6&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;body&amp;gt;hand_root&amp;lt;/body&amp;gt;&lt;br /&gt;
     &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
   &amp;lt;/joint&amp;gt;&lt;br /&gt;
 &amp;lt;/kinbody&amp;gt;&lt;br /&gt;
 &amp;lt;manipulator name=&amp;quot;arm&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;base&amp;gt;base&amp;lt;/base&amp;gt;&lt;br /&gt;
   &amp;lt;effector&amp;gt;link6&amp;lt;/effector&amp;gt;&lt;br /&gt;
   &amp;lt;joints&amp;gt;hand_Bone_B1_Joint hand_Bone_B2_Joint hand_Bone_B3_Joint hand_Bone_A1_Joint hand_Bone_A2_Joint hand_Bone_A3_Joint hand_Bone_C1_Joint hand_Bone_C2_Joint hand_Bone_C3_Joint&amp;lt;/joints&amp;gt;&lt;br /&gt;
   &amp;lt;closingdirection&amp;gt;0 1 1 0 1 1 0 1 1&amp;lt;/closingdirection&amp;gt;&lt;br /&gt;
   &amp;lt;direction&amp;gt;1 0 0&amp;lt;/direction&amp;gt;&lt;br /&gt;
 &amp;lt;/manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Final robot: [[image:collada_sdh_kuka.jpg|150px]]&lt;br /&gt;
&lt;br /&gt;
=== Dual-arm example ===&lt;br /&gt;
&lt;br /&gt;
Here is an example file of having a robot composed of two arms attached to a common link named &amp;#039;&amp;#039;&amp;#039;chest&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot name=&amp;quot;schunk-dualarm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;chest&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;geom type=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;extents&amp;gt;0.1 0.1 0.4&amp;lt;/extents&amp;gt;&lt;br /&gt;
        &amp;lt;translation&amp;gt;0 0 0.4&amp;lt;/translation&amp;gt;&lt;br /&gt;
      &amp;lt;/geom&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- left arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody prefix=&amp;quot;l_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 -0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- right arm --&amp;gt;&lt;br /&gt;
    &amp;lt;KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;KinBody&amp;gt;prefix=&amp;quot;r_&amp;quot; file=&amp;quot;schunk-lwa3.kinbody.xml&amp;quot;&amp;gt;&amp;lt;/KinBody&amp;gt;&lt;br /&gt;
      &amp;lt;RotationAxis&amp;gt;1 0 0 -90&amp;lt;/RotationAxis&amp;gt;&lt;br /&gt;
      &amp;lt;translation&amp;gt;0 0.1 0.7&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
    &amp;lt;!-- connect the two arms with dummy joints --&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;leftdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;l_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
    &amp;lt;joint name=&amp;quot;rightdummy&amp;quot; type=&amp;quot;hinge&amp;quot; enable=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;chest&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;body&amp;gt;r_base&amp;lt;/body&amp;gt;&lt;br /&gt;
      &amp;lt;limits&amp;gt;0 0&amp;lt;/limits&amp;gt;&lt;br /&gt;
    &amp;lt;/joint&amp;gt;&lt;br /&gt;
  &amp;lt;/KinBody&amp;gt;&lt;br /&gt;
  &amp;lt;!-- define the manipulators --&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;leftarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;l_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;l_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
    &amp;lt;armjoints&amp;gt;l_j0 l_j1 l_j2 l_j3 l_j4 l_j5 l_j6&amp;lt;/armjoints&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
  &amp;lt;Manipulator name=&amp;quot;rightarm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;base&amp;gt;r_base&amp;lt;/base&amp;gt;&lt;br /&gt;
    &amp;lt;effector&amp;gt;r_link7&amp;lt;/effector&amp;gt;&lt;br /&gt;
    &amp;lt;armjoints&amp;gt;r_j0 r_j1 r_j2 r_j3 r_j4 r_j5 r_j6&amp;lt;/armjoints&amp;gt;&lt;br /&gt;
  &amp;lt;/Manipulator&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Single arm: [[image:schunk-lwa3.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
Dual arm: [[image:schunk-lwa3-dual.jpg|300px]] &lt;br /&gt;
&lt;br /&gt;
== Custom XML ==&lt;br /&gt;
&lt;br /&gt;
Openrave provides much more flexibility in creating and defining custom XML readers for interfaces. First the &amp;lt;environment&amp;gt; XML tag supports creating any interface type and supports loading plugins. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;plugin&amp;gt;libcustomreader&amp;lt;/plugin&amp;gt;&lt;br /&gt;
  &amp;lt;robot name=&amp;quot;wam&amp;quot; file=&amp;quot;robots/barrettwam.robot.xml&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;controller type=&amp;quot;CustomController&amp;quot; robot=&amp;quot;wam&amp;quot; args=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    ..custom data....&lt;br /&gt;
  &amp;lt;/controller&amp;gt;&lt;br /&gt;
  &amp;lt;module type=&amp;quot;basemanipulation&amp;quot; args=&amp;quot;wam&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example, openrave will first load the plugin, then will create a robot, and then will create a controller that is attached to the robot, then will create the basemanipulation module giving it the robot name as the argument.&lt;br /&gt;
&lt;br /&gt;
Furthermore, using EnvironmentBase::RegisterXMLReader, it is possible to set a parser for custom XML tags for each interface type.  For those curious on how to take advantage of custom readers, please refer to examples/plugincpp/customreader.cpp on how to attach a custom XML reader to a controller.&lt;br /&gt;
&lt;br /&gt;
These changes will allow people to setup all their specific environment settings in the XML files without having to rely on external scripts or other programs to do it. Note that OpenRAVE processes tags in depth first order.&lt;br /&gt;
&lt;br /&gt;
== Sensor ==&lt;br /&gt;
&lt;br /&gt;
It is possible to have XML files that declare a sensor and its internal parameters. For example, &amp;#039;&amp;#039;&amp;#039;data/camera.sensor.xml&amp;#039;&amp;#039;&amp;#039; can look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;sensor type=&amp;quot;BaseCamera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;KK&amp;gt;640 640 320 240&amp;lt;/KK&amp;gt;&lt;br /&gt;
  &amp;lt;width&amp;gt;640&amp;lt;/width&amp;gt;&lt;br /&gt;
  &amp;lt;height&amp;gt;480&amp;lt;/height&amp;gt;&lt;br /&gt;
  &amp;lt;framerate&amp;gt;5&amp;lt;/framerate&amp;gt;&lt;br /&gt;
  &amp;lt;color&amp;gt;0.5 0.5 1&amp;lt;/color&amp;gt;&lt;br /&gt;
&amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to attach a sensor defined by a file to a robot link do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Robot&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... usual robot definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;AttachedSensor name=&amp;quot;MyCamera&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/AttachedSensor&amp;gt;&lt;br /&gt;
&amp;lt;/Robot&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is also possible to put a sensor directly in the environment without a robot. Such a sensor will not have any geometry associated with it, and will only act as a sensing source.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Environment&amp;gt;&lt;br /&gt;
  &amp;lt;!-- ... environment definitions ... --&amp;gt;&lt;br /&gt;
  &amp;lt;sensor name=&amp;quot;mysensor&amp;quot; file=&amp;quot;camera.sensor.xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- set the sensor transform --&amp;gt;&lt;br /&gt;
    &amp;lt;translation&amp;gt;0 1 0&amp;lt;/translation&amp;gt;&lt;br /&gt;
    &amp;lt;rotationaxis&amp;gt;1 0 0 45&amp;lt;/rotationaxis&amp;gt;&lt;br /&gt;
  &amp;lt;/sensor&amp;gt;&lt;br /&gt;
&amp;lt;/Environment&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== XML Reference ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; All XML handling is done in &amp;#039;&amp;#039;&amp;#039;src/libopenrave-core/xmlreaders.cpp&amp;#039;&amp;#039;&amp;#039;. If there&amp;#039;s any parameters that are not explained well, make sure to check out that source file for further reference.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; You can find details on joints on : [http://opende.sourceforge.net/wiki/index.php/Manual_%28Joint_Types_and_Functions%29 ODE Manual page (joints)].&lt;br /&gt;
&lt;br /&gt;
Here&amp;#039;s a list of all possible fields the XML supports in a hierarchical structure.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;environment&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;bkgndcolor&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camrotaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;camtrans&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;planner&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensorsystem&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file, robot, args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;inversekinematicssolver&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;physicsengine&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;collisionchecker&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;trajectory&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;viewer&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;server&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type, file&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type, makejoinedlinksadjacent&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;adjacent&amp;#039;&amp;#039;&amp;#039; - 2 body names&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (dynamic, static)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;geom&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, type (box, sphere, trimesh, cylinder), render (true,false), modifiable (true,false)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;ambientcolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;collision&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;diffusecolor&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;extents&amp;#039;&amp;#039;&amp;#039; - 3 float [box]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;height&amp;#039;&amp;#039;&amp;#039; - float [cylinder]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float [cylinder, sphere]&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;render&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; file, scale&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;vertices&amp;#039;&amp;#039;&amp;#039; - 9*N floats where each 9 values defines 1 triangle with 3 vertices&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;com&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;inertia&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;joint&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; enable (true, false), type (hinge, slider, universal, hinge2, spherical), circular(true, false), mimic_pos (math equation), mimic_vel (math equation), mimic_accel (math equation)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;anchor&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, hinge2, universal, spherical]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge, slider]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis1&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;axis2&amp;#039;&amp;#039;&amp;#039; - 3 floats [hinge2, universal]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limits&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsdeg&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in degrees if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;limitsrad&amp;#039;&amp;#039;&amp;#039; - 2*dof floats in radians if applicable (first two specify first joint limits, etc)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;maxvel&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;mode&amp;#039;&amp;#039;&amp;#039; - int [amotor]&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;resolution&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;weight&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; - dof floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;mass&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type (box, sphere, custom)&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;density&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;radius&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;total&amp;#039;&amp;#039;&amp;#039; - float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;modelsdir&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;offsetfrom&amp;#039;&amp;#039;&amp;#039; - bodyname&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;transparency&amp;#039;&amp;#039;&amp;#039; - 1 float&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name, file, prefix, type (robot plugin type)&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;attachedsensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;link&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;sensor&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; type&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;...&amp;#039;&amp;#039;&amp;#039; - fields defined by SensorBase class instantiated by type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;controller&amp;#039;&amp;#039;&amp;#039; - type args&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;jointvalues&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;kinbody&amp;#039;&amp;#039;&amp;#039; - name&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;manipulator&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;attributes:&amp;#039;&amp;#039;&amp;#039; name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;armjoints&amp;#039;&amp;#039;&amp;#039; - n joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;base&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closed&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;effector&amp;#039;&amp;#039;&amp;#039; - link name&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;iksolver&amp;#039;&amp;#039;&amp;#039; - string&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;gripperjoints&amp;#039;&amp;#039;&amp;#039; - k joint names&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;closingdirection&amp;#039;&amp;#039;&amp;#039; - k floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;palmdirection&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 floats&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 floats&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;quat&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;robot&amp;#039;&amp;#039;&amp;#039; - name, file, type&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationaxis&amp;#039;&amp;#039;&amp;#039; - 4 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;rotationmat&amp;#039;&amp;#039;&amp;#039; - 9 float&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;translation&amp;#039;&amp;#039;&amp;#039; - 3 float&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	<entry>
		<id>http://openrave.programmingvision.com/wiki/index.php?title=Format:COLLADA&amp;diff=116</id>
		<title>Format:COLLADA</title>
		<link rel="alternate" type="text/html" href="http://openrave.programmingvision.com/wiki/index.php?title=Format:COLLADA&amp;diff=116"/>
				<updated>2011-07-15T16:21:12Z</updated>
		
		<summary type="html">&lt;p&gt;Rdiankov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTITLE__&lt;br /&gt;
&lt;br /&gt;
= COLLADA Robot Specification Version 0.2 =&lt;br /&gt;
&lt;br /&gt;
The [https://collada.org/mediawiki/index.php/COLLADA_-_Digital_Asset_and_FX_Exchange_Schema COLLADA] format is used to specify all robot and scene related information. By default, COLLADA 1.5 handles geometry, visual effects, physical properties, and kinematics. This document describes how to extend the format to handle robot-specific information. An official example of a COLLADA extension can be found [http://www.collada.org/mediawiki/index.php/Morph_weights_EXT_extension here].&lt;br /&gt;
&lt;br /&gt;
COLLADA allows extensions of any of its tags using the &amp;#039;&amp;#039;&amp;#039;&amp;lt;extra&amp;gt;&amp;#039;&amp;#039;&amp;#039; tag. Each &amp;#039;&amp;#039;&amp;#039;&amp;lt;extra&amp;gt;&amp;#039;&amp;#039;&amp;#039; defines what type of information to provide (ie manipulator, sensor, collision), and a format for that information, also called &amp;#039;&amp;#039;&amp;#039;technique&amp;#039;&amp;#039;&amp;#039;. All custom data defined here uses the &amp;#039;&amp;#039;&amp;#039;OpenRAVE&amp;#039;&amp;#039;&amp;#039; technique. &lt;br /&gt;
&lt;br /&gt;
There are one-to-one correspondences between the OpenRAVE interface types and COLLADA tags:&lt;br /&gt;
&lt;br /&gt;
* Robot &amp;lt;-&amp;gt; articulated_system&lt;br /&gt;
* KinBody &amp;lt;-&amp;gt; kinematics_model&lt;br /&gt;
* Sensor &amp;lt;-&amp;gt; sensor (new)&lt;br /&gt;
&lt;br /&gt;
= interface_type =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Specifies the type of kinematics body/robot type to instantiate inside the code.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
All of the kinematics body methods can be overridden with new implementations. Because this requires loading user code, a user-provided instantiation has to be used. The interface type specifies what this type is and where to load it from.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;articulated_system&amp;gt;, &amp;lt;kinematics_model&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Child elements || See the following subsection.&lt;br /&gt;
|-&lt;br /&gt;
| Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;interface&amp;gt; || Contains the string id of the interface || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;plugin&amp;gt; || Optional. Contains the string of the location of the shared object object to load. Because plugin prefixes and suffixes depends on the OS, a prefix and suffix independent name can be specified. || 0 or 1&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;interface_type&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;interface&amp;gt;MyGenericRobot&amp;lt;/interface&amp;gt;&lt;br /&gt;
    &amp;lt;plugin&amp;gt;myplugin&amp;lt;/plugin&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= manipulator =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Defines a subset of the robot that acts as an &amp;#039;&amp;#039;&amp;#039;arm&amp;#039;&amp;#039;&amp;#039; and a &amp;#039;&amp;#039;&amp;#039;gripper&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
The arm is a chain of joints whose &amp;#039;&amp;#039;&amp;#039;end effector&amp;#039;&amp;#039;&amp;#039; is treated as a gripper. The arm is extracted from the &amp;#039;&amp;#039;&amp;#039;origin&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;tip&amp;#039;&amp;#039;&amp;#039; links. The &amp;#039;&amp;#039;&amp;#039;tip&amp;#039;&amp;#039;&amp;#039; contains the manipulator frame of reference. The gripper axes have to be specified manually. The direction is used as a hint for grasping and inverse kinematics.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;articulated_system&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;frame_origin&amp;gt; || The base frame that the arm starts at || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;frame_tip&amp;gt; || The end effector frame the arm ends at || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;gripper_joint&amp;gt; || Defines one joint of the gripper || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;iksolver&amp;gt; || Defines properties of inverse kinematics functions when used with the arm || 0 or more&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;frame_origin&amp;gt;/&amp;lt;frame_tip&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| link || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. References the SID of a &amp;lt;link&amp;gt; defined in &amp;lt;kinematics_model&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements for &amp;lt;frame_tip&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;translate&amp;gt; || Translation. See main entry in Core. || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;rotate&amp;gt; || Rotation axis. See main entry in Core. || 0 or more&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;gripper_joint&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| joint || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The reference of the joint in the instantiated kinematics model that is part of the gripper.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements for &amp;lt;gripper_joint&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;closing_direction&amp;gt; || &amp;#039;&amp;#039;&amp;#039;common_float_or_param_type&amp;#039;&amp;#039;&amp;#039; that contains the default closing direction of an axis on the joint. If a closing direction is not specified for an axis in the joint, it defaults to 0. || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;gripper_joint&amp;gt;/&amp;lt;closing_direction&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| axis || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The SID of the axis inside the referenced joint.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;iksolver&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| type || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The type of the inverse kinematics to set a property for. Possible types are: &amp;#039;&amp;#039;&amp;#039;Transform6D, Rotation3D, Translation3D, Direction3D, Ray4D, Lookat3D, TranslationDirection5D&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements for &amp;lt;iksolver&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;free_joint&amp;gt; || Specifies one free joint to use for ik. || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;interface_type&amp;gt; || Optional. Specifies the interface of the inverse kinematics solver. || 0 or 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;iksolver&amp;gt;/&amp;lt;free_joint&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| joint || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The reference of the joint in the instantiated kinematics model that is part of the manipulator chain.&lt;br /&gt;
|-&lt;br /&gt;
| stepsize || &amp;#039;&amp;#039;&amp;#039;xs:float&amp;#039;&amp;#039;&amp;#039; || The discretization value of this joint when searching for solutions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
The current IK types are:&lt;br /&gt;
&lt;br /&gt;
* Transform6D - end effector reaches desired 6D transformation&lt;br /&gt;
* Rotation3D - end effector reaches desired 3D rotation&lt;br /&gt;
* Translation3D - end effector origin reaches desired 3D translation&lt;br /&gt;
* Direction3D - direction on end effector coordinate system reaches desired direction&lt;br /&gt;
* Ray4D - ray on end effector coordinate system reaches desired global ray&lt;br /&gt;
* Lookat3D - direction on end effector coordinate system points to desired 3D position&lt;br /&gt;
* TranslationDirection5D - end effector origin and direction reaches desired 3D translation and direction. Can be thought of as Ray IK where the origin of the ray must coincide.&lt;br /&gt;
&lt;br /&gt;
The IK types are meant to be hints as to how a manipulator can be used. Multiple IK types can be set for one manipulator and differing free joint values. It is possible for a post-processing stage to determine what IK types are best suited for a particular manipulator structure, and then add those into the COLLADA file.&lt;br /&gt;
&lt;br /&gt;
* Why is a manipulator frame necessary?&lt;br /&gt;
** Answer: Manipulator frames allow the user to define a coordinate system where it makes target tasks easier to complete. In this regard, the manipulator frame can be freely chosen by the user without worrying about destroying the link coordinate systems. For example, link frames are usually aligned with joint axes and center of masses and robot state is defined by their 6D transform in space. Having them also represent task-specific information could destroy consistency when the task changes. Also, the z-axis of the manipulator frame can define the &amp;quot;direction&amp;quot; of the manipulator. Direction can be used in many places like sensor line of sight and grasping approach, which makes it possible to quickly use the robot for planning.&lt;br /&gt;
&lt;br /&gt;
* Question: For dual arm manipulation, would a leftright manipulator ever be used including all joints? In this case, will it might be necessary to define two frame tips (one for left arm and one for right arm)?&lt;br /&gt;
** Answer: Having a leftright manipulator destroys the one-to-one correspondence between gripper joints and ik solver, and not much is gained. So better to have only have one frame tip and origin and treat two arms as separate. The constraint between the end effectors of the two arms is not always rigid, it very task dependent. Therefore, the user should take care of the dual relation.&lt;br /&gt;
&lt;br /&gt;
* Question: What about closing gripper direction for complex hands? Fingers with many DOF might need special grasping strategies.&lt;br /&gt;
** Answer: The closing direction just provide a hint as to the usage. The real gripper movement depends on the grasp strategy, which is beyond the definition of this scope. &lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
The example defines an arm with an end effector at link wam7 with a local coordinate system. It also defines two gripper axes. For the &amp;#039;transform6d&amp;#039; inverse kinematics type, it specifies that the free joint should be &amp;#039;joint4&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;manipulator&amp;quot; name=&amp;quot;leftarm&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;frame_origin link=&amp;quot;wam0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;frame_tip link=&amp;quot;wam7&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;translate&amp;gt;0.0 0.0 0.22&amp;lt;/translate&amp;gt;&lt;br /&gt;
      &amp;lt;rotate&amp;gt;0.0 1.0 0.0 90.0&amp;lt;/rotate&amp;gt;&lt;br /&gt;
    &amp;lt;/frame_tip&amp;gt;&lt;br /&gt;
    &amp;lt;gripper_joint joint=&amp;quot;jointname&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;closing_direction axis=&amp;quot;axis0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;float&amp;gt;1&amp;lt;/float&amp;gt;&lt;br /&gt;
      &amp;lt;/closing_direction&amp;gt;&lt;br /&gt;
    &amp;lt;/gripper_joint&amp;gt;&lt;br /&gt;
    &amp;lt;gripper_joint joint=&amp;quot;jointname2&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;closing_direction axis=&amp;quot;axis0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;float&amp;gt;-1&amp;lt;/float&amp;gt;&lt;br /&gt;
      &amp;lt;/closing_direction&amp;gt;&lt;br /&gt;
    &amp;lt;/gripper_joint&amp;gt;&lt;br /&gt;
    &amp;lt;iksolver type=&amp;quot;Transform6D&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;free_joint joint=&amp;quot;jointname3&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;interface_type&amp;gt;&lt;br /&gt;
        &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;interface&amp;gt;WAM7ikfast&amp;lt;/interface&amp;gt;&lt;br /&gt;
          &amp;lt;plugin&amp;gt;WAM7ikfast&amp;lt;/plugin&amp;gt;&lt;br /&gt;
        &amp;lt;/technique&amp;gt;&lt;br /&gt;
      &amp;lt;/interface_type&amp;gt;&lt;br /&gt;
    &amp;lt;/iksolver&amp;gt;&lt;br /&gt;
    &amp;lt;iksolver type=&amp;quot;Translation3D&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;free_joint joint=&amp;quot;jointname4&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/iksolver&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= collision =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Links all possible collision meshes and properties for one kinematics body. The meshes depends on the usage.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
A link can have three different collision meshes:&lt;br /&gt;
* for visual rendering&lt;br /&gt;
* for self-collisions&lt;br /&gt;
* for environment collisions&lt;br /&gt;
&lt;br /&gt;
For each link, COLLADA will store three geometries in the &amp;#039;&amp;#039;&amp;#039;&amp;lt;library_geometries&amp;gt;&amp;#039;&amp;#039;&amp;#039;. The geometries will have an &amp;lt;extra&amp;gt; tag that specifies which usage they are meant to. The &amp;#039;&amp;#039;&amp;#039;self&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;env&amp;#039;&amp;#039;&amp;#039; will be referenced inside the visual geometry.&lt;br /&gt;
&lt;br /&gt;
The tag also stores information about what pairs of links can be completely ignored from self-collision detection. These links are either adjacent to each other, or so far from each other that no configuration of the robot can get them into possible collision.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;kinematics_model&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;bind_instance_geometry&amp;gt; || The geometry used for a particular link || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ignore_link_pair&amp;gt; || Specifies two links pairs whose self-collision should not be checked || 0 or more&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;bind_instance_geometry&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| type || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The usage type: &amp;#039;&amp;#039;&amp;#039;environment&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;self&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| link || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. References the SID of a &amp;lt;link&amp;gt; defined in &amp;lt;kinematics_model&amp;gt;. This link is where the geometries will be added.&lt;br /&gt;
|-&lt;br /&gt;
| url || &amp;#039;&amp;#039;&amp;#039;xs:anyURI&amp;#039;&amp;#039;&amp;#039; || Required. The URL of the location of the &amp;lt;geometry&amp;gt; element to instantiate. Can refer to a local instance or external reference.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;ignore_link_pair&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| link0 || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. References the SID of a &amp;lt;link&amp;gt; defined in &amp;lt;kinematics_model&amp;gt;. One of the links defining the pair to be ignored.&lt;br /&gt;
|-&lt;br /&gt;
| link1 || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. References the SID of a &amp;lt;link&amp;gt; defined in &amp;lt;kinematics_model&amp;gt;. One of the links defining the pair to be ignored.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
Convex decompositions can be defined by using one geometry per convex hull and attaching multiple geometries to the same link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ignore_link_pair&amp;gt; tags help self-collision detection to help prune possibilities. The adjacency information is not just the neighboring links. It is also meant to prune any collisions between two links that *cannot* possibly happen if the robot maintains its joint limits. This information depends not only on the kinematics of the robot, but also on the geometry of every link. Also for triplets of joints j1, j2, j3 that intersect at a common axis, you would want to add (j1,j2),(j2,j3),(j1,j3).&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;library_visual_scenes&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;mynode&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;instance_geometry url=&amp;quot;#linka_vis0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;instance_geometry url=&amp;quot;#linka_vis1&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&amp;lt;/library_visual_scenes&amp;gt;&lt;br /&gt;
&amp;lt;library_geometries&amp;gt;&lt;br /&gt;
  &amp;lt;geometry id=&amp;quot;linka_vis0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;geometry id=&amp;quot;linka_vis1&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;geometry id=&amp;quot;linka_env0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;geometry id=&amp;quot;linka_env1&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;geometry id=&amp;quot;linka_self&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;geometry id=&amp;quot;linkb_env0&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/library_geometries&amp;gt;&lt;br /&gt;
&amp;lt;library_kinematics_models&amp;gt;&lt;br /&gt;
  &amp;lt;kinematics_model&amp;gt;&lt;br /&gt;
    &amp;lt;extra type=&amp;quot;collision&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;bind_instance_geometry type=&amp;quot;environment&amp;quot; link=&amp;quot;linka&amp;quot; url=&amp;quot;#linka_env0&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;bind_instance_geometry type=&amp;quot;environment&amp;quot; link=&amp;quot;linka&amp;quot; url=&amp;quot;#linka_env1&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;bind_instance_geometry type=&amp;quot;self&amp;quot; link=&amp;quot;linka&amp;quot; url=&amp;quot;#linka_self&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;bind_instance_geometry type=&amp;quot;environment&amp;quot; link=&amp;quot;linkb&amp;quot; url=&amp;quot;#linkb_env0&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;ignore_link_pair link0=&amp;quot;linka&amp;quot; link1=&amp;quot;linkb&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/technique&amp;gt;&lt;br /&gt;
    &amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/library_kinematics_models&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= library_sensors =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Provides a library in which to place &amp;lt;sensor&amp;gt; elements.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
Allows sensors to be stored as modular resources in libraries. Can be easily referenced through files.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;COLLADA&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= sensor =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Defines a sensor&amp;#039;s type and the geometric and intrinsic parameters.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
Each sensor will be associated with a particular sensor type; depending on the sensor type, the parameters that need to be set will change. The parameters should contain everything necessary to simulate the sensor accurately. They *should not* contain parameters that define the format and transfer of the data.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;articulated_system&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| type || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The type of the sensor. Possible types are: &amp;#039;&amp;#039;&amp;#039;base_pinhole_camera, base_stereo_camera, base_laser2d, base_laser3d, base_flash_laser, base_encoder, base_force6d, base_imu, base_odometry&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;#039;&amp;#039;&amp;#039;xs:ID&amp;#039;&amp;#039;&amp;#039; || Required. A text string containing the unique identifier of the &amp;lt;sensor&amp;gt; element. This value must be unique within the instance document.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;common&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;interface_type&amp;gt; || Optional. Contains the interface type to load the sensor with. || 0 or 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_pinhole_camera&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
Simple pin hole camera defined by an intrinsic matrix. The camera can support multiple image dimensions with multiple channel formats. It is not clear whether all supported formats for one camera should be enumerated in one &amp;lt;sensor&amp;gt; tag, or there should be multiple sensor tags for each different type where the sensors are exclusively mutual.&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;image_dimensions&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;int3_type&amp;#039;&amp;#039;&amp;#039; that specifies the image width, height, and channels. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;format&amp;gt; || Contains a string that specifies the format of every value in the image. Possible types are &amp;#039;&amp;#039;&amp;#039;uint8, uint16, uint32, int8, int16, int32, float32, float64&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;measurement_time&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies time between images (ie exposure time). || 0 or 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;intrinsic&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float2x3_type&amp;#039;&amp;#039;&amp;#039; that specifies the intrinsic parameters defining the principal point, field of view, and skew. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;focal_length&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the physical focal length of the camera. || 0 or 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;distortion_model&amp;gt; || The distortion model to use. It has a &amp;#039;&amp;#039;&amp;#039;type&amp;#039;&amp;#039;&amp;#039; attribute specifying the actual model type, and contains a &amp;#039;&amp;#039;&amp;#039;list_of_floats_type&amp;#039;&amp;#039;&amp;#039; that specifies the distortion coefficients of the model. || 0 or 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_stereo_camera:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Uses two cameras together to extract a depth map. The stereo camera&amp;#039;s coordinate system is in the first instanced camera.&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;instance_sensor&amp;gt; || The camera sensors, the scan time should be equal || 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;instance_sensor&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| url || &amp;#039;&amp;#039;&amp;#039;xs:anyURI&amp;#039;&amp;#039;&amp;#039; || Required. The URL of the location of the &amp;lt;sensor&amp;gt; element to instantiate.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements for &amp;lt;instance_sensor&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;rectification&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float3x3_type&amp;#039;&amp;#039;&amp;#039; that specifies a homography which takes an image to the ideal stereo image plane so that epipolar lines in both stereo images are parallel. The homography transforms from the second image to the first image. || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_laser2d&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
Single scan from a planar laser range-finder along the xy plane.&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;angle_range&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float2_type&amp;#039;&amp;#039;&amp;#039; that specifies the minimum and maximum angles (degrees) of the laser range. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;distance_range&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float2_type&amp;#039;&amp;#039;&amp;#039; that specifies the minimum and maximum distance of the laser. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;angle_increment&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the angular distance between measurements (degrees). || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;time_increment&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the time between measurements (seconds). If your scanner is moving, this will be used in interpolating position of 3d points. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;measurement_time&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the time between scans (seconds) || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_laser3d:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_flash_laser:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_encoder:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_force6d:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_imu:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;measurement_time&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the time between scans (seconds). || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;rotation_covariance&amp;gt; || The uncertainty covariance matrix (3x3 row-major matrix) in x, y, and z axes. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;angular_velocity_covariance&amp;gt; || The uncertainty covariance matrix (3x3 row-major matrix) in x, y, and z axes. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;linear_acceleration_covariance&amp;gt; || The uncertainty covariance matrix (3x3 row-major matrix) in x, y, and z axes. || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type base_odometry:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;measurement_time&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the time between scans (seconds). || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;target&amp;gt; || The name of the target whose odometry is being measured || 0 or 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
Example using a default sensor with a custom interface&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;library_sensors&amp;quot; id=&amp;quot;libsensors&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor type=&amp;quot;base_laser2d&amp;quot; id=&amp;quot;ExampleLaser1&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;angle_min&amp;gt;-90&amp;lt;/angle_min&amp;gt;&lt;br /&gt;
      &amp;lt;angle_max&amp;gt;90&amp;lt;/angle_max&amp;gt;&lt;br /&gt;
      &amp;lt;range_min&amp;gt;0.01&amp;lt;/range_min&amp;gt;&lt;br /&gt;
      &amp;lt;range_max&amp;gt;4.0&amp;lt;/range_max&amp;gt;&lt;br /&gt;
      &amp;lt;angle_increment&amp;gt;1&amp;lt;/angle_increment&amp;gt;&lt;br /&gt;
      &amp;lt;time_increment&amp;gt;0.0005&amp;lt;/time_increment&amp;gt;&lt;br /&gt;
      &amp;lt;measurement_time&amp;gt;0.025&amp;lt;/measurement_time&amp;gt;&lt;br /&gt;
      &amp;lt;interface_type&amp;gt;&lt;br /&gt;
        &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;interface&amp;gt;BaseLaser2D&amp;lt;/interface&amp;gt;&lt;br /&gt;
        &amp;lt;/technique&amp;gt;&lt;br /&gt;
      &amp;lt;/interface_type&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using a non-default, custom sensor&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;library_sensors&amp;quot; id=&amp;quot;libsensors&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;sensor type=&amp;quot;BaseLaser2D&amp;quot; id=&amp;quot;ExampleLaser1&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;minangle&amp;gt;-135&amp;lt;/minangle&amp;gt;&lt;br /&gt;
      &amp;lt;maxangle&amp;gt;135&amp;lt;/maxangle&amp;gt;&lt;br /&gt;
      &amp;lt;resolution&amp;gt;0.35&amp;lt;/resolution&amp;gt;&lt;br /&gt;
      &amp;lt;maxrange&amp;gt;5&amp;lt;/maxrange&amp;gt;&lt;br /&gt;
      &amp;lt;scantime&amp;gt;0.1&amp;lt;/scantime&amp;gt;&lt;br /&gt;
      &amp;lt;color&amp;gt;0.5 0.5 1&amp;lt;/color&amp;gt;&lt;br /&gt;
    &amp;lt;/sensor&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Develop a formal sensor XML file format for different sensor types.&lt;br /&gt;
&lt;br /&gt;
= attach_sensor =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Attaches a sensor to a link of the robot.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
The sensor comes from the sensor library. It can be attached anywhere onto a link defined from the kinematics section. The sensor will maintain a constant transformation between the link.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;articulated_system&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;instance_sensor&amp;gt; || Instantiate a sensor. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;frame_origin&amp;gt; || The base link that the sensor is attached to. || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;frame_origin&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| link || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. References the SID of a &amp;lt;link&amp;gt; defined in &amp;lt;kinematics_model&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements for &amp;lt;frame_origin&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;translate&amp;gt; || Translation. See main entry in Core. || 0 or more&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;rotate&amp;gt; || Rotation axis. See main entry in Core. || 0 or more&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;attach_sensor&amp;quot; name=&amp;quot;left_head_camera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;instance_sensor url=&amp;quot;#pgr_camera&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;frame_origin link=&amp;quot;head&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;translate&amp;gt;0 1 0&amp;lt;/translate&amp;gt;&lt;br /&gt;
      &amp;lt;rotate&amp;gt;0 1 0 90&amp;lt;/rotate&amp;gt;&lt;br /&gt;
    &amp;lt;/frame_origin&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= formula/technique =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Full specifies a formula for a joint and annotates it with extra information necessary for robotics.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
The original &amp;lt;formula&amp;gt;/&amp;lt;technique_common&amp;gt; supports only one equation for the value of the joint. More complex kinematics systems have more than one degree of freedom per joint and use the partial derivatives of the equation to compute Jacobians and simulate physics. &lt;br /&gt;
&lt;br /&gt;
This &amp;quot;OpenRAVE&amp;quot; technique for &amp;lt;formula&amp;gt; can specify partial derivatives of the position &lt;br /&gt;
equation for computing velocity and accelerations.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;formula&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;equation&amp;gt; || Equation in MathML format. Used to specify the position and partial derivatives. || 0 or more&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;equation&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| type || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. can be one of &amp;quot;position&amp;quot;, &amp;quot;first_partial&amp;quot;, or &amp;quot;second_partial&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| target || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || If &amp;#039;type&amp;#039; is &amp;quot;first_partial&amp;quot; or &amp;quot;second_partial&amp;quot;, then fill this with the variable taking the partial derivative with respect to. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;equation type=&amp;quot;position&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;&lt;br /&gt;
      &amp;lt;apply&amp;gt;&lt;br /&gt;
        &amp;lt;plus/&amp;gt;&lt;br /&gt;
        &amp;lt;apply&amp;gt;&lt;br /&gt;
          &amp;lt;times/&amp;gt;&lt;br /&gt;
          &amp;lt;cn&amp;gt;0.333330&amp;lt;/cn&amp;gt;&lt;br /&gt;
          &amp;lt;csymbol encoding=&amp;quot;COLLADA&amp;quot;&amp;gt;kmodel1/joint0&amp;lt;/csymbol&amp;gt;&lt;br /&gt;
        &amp;lt;/apply&amp;gt;&lt;br /&gt;
        &amp;lt;cn&amp;gt;0.872700&amp;lt;/cn&amp;gt;&lt;br /&gt;
      &amp;lt;/apply&amp;gt;&lt;br /&gt;
    &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;/equation&amp;gt;&lt;br /&gt;
  &amp;lt;equation type=&amp;quot;first_partial&amp;quot; target=&amp;quot;kmodel1/joint0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;&lt;br /&gt;
      &amp;lt;cn&amp;gt;0.333330&amp;lt;/cn&amp;gt;&lt;br /&gt;
    &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= library_actuators =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Provides a library in which to place &amp;lt;actuator&amp;gt; elements.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
Allows actuators to be stored as modular resources in libraries. Can be easily referenced through files.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;COLLADA&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= actuator =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
An actuator provides force/momentum/action to kinematics joints.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
Defines a actuator&amp;#039;s physical properties necessary to simulate dynamics and control algorithms of a robot. They &amp;#039;&amp;#039;&amp;#039;should not&amp;#039;&amp;#039;&amp;#039; contain parameters that define the format and transfer of the data to and from actuators. &lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;articulated_system&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| type || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The type of the actuator. Possible types are: &amp;#039;&amp;#039;&amp;#039;motor&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| id || &amp;#039;&amp;#039;&amp;#039;xs:ID&amp;#039;&amp;#039;&amp;#039; || Required. A text string containing the unique identifier of the &amp;lt;actuator&amp;gt; element. This value must be unique within the instance document.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;common&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;interface_type&amp;gt; || Optional. Contains the interface type to load the actuator with. || 0 or 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;type electric_motor&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
Converts electrical energy into mechanical energy usually using magnetic fields and conductors. The &amp;#039;&amp;#039;&amp;#039;speed&amp;#039;&amp;#039;&amp;#039; of a motor is measured in revolutions/Time (Time is defined by the &amp;lt;asset&amp;gt; tag and usually measured in seconds). DC Motor Theory References:&lt;br /&gt;
&lt;br /&gt;
* http://hades.mech.northwestern.edu/index.php/Brushed_DC_Motor_Theory&lt;br /&gt;
&lt;br /&gt;
* http://en.wikipedia.org/wiki/Brushed_DC_electric_motor&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;assigned_power_rating&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the nominal power the electric motor can safely produce. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance² * Time-³&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;max_speed&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the maximum speed of the motor. Units are &amp;#039;&amp;#039;&amp;#039;Time-¹&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;no_load_speed&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the speed of the motor powered by the nominal voltage when the motor provides zero torque. Units are &amp;#039;&amp;#039;&amp;#039;Time-¹&amp;#039;&amp;#039;&amp;#039;. || 0 or 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nominal_torque&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the maximum torque the motor can provide continuously without overheating. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance * Time-²&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nominal_voltage&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the nominal voltage the electric motor can safely produce. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance² * Time-² * Charge&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;rotor_inertia&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the inertia of the rotating element about the axis of rotation. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance²&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;speed_constant&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the constant of proportionality relating speed to voltage. Units are &amp;#039;&amp;#039;&amp;#039;Mass-¹ * Distance-² * Time * Charge-¹&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;speed_torque_gradient&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the slope of the speed-torque curve, approximately equal to the no load speed divided by the stall torque. Units are &amp;#039;&amp;#039;&amp;#039; Mass-¹ * Distance-¹ * Time-¹&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;starting_current&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the current through the motor at zero velocity, equal to the nominal voltage divided by the terminal resistance. Also called the stall current.  Units are &amp;#039;&amp;#039;&amp;#039;Time-¹ * Charge&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;terminal_resistance&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the resistance of the motor windings. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance² * Time-¹ * Charge-²&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;torque_constant&amp;gt; || Contains a &amp;#039;&amp;#039;&amp;#039;float_type&amp;#039;&amp;#039;&amp;#039; that specifies the proportion relating current to torque. Units are &amp;#039;&amp;#039;&amp;#039;Mass * Distance * Time-¹ * Charge-¹&amp;#039;&amp;#039;&amp;#039;. || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Related variables, but not inserted in the electric_motor specification:&lt;br /&gt;
&lt;br /&gt;
* Stall torque - The time it takes the unloaded motor to reach 63% of its no load speed under a constant voltage, starting from rest. Proportional to the inertia of the rotor and inversely proportional to the square of the the torque constant. &lt;br /&gt;
* Max. efficiency - The maximum efficiency of the motor in converting electrical power to mechanical power. This maximum efficiency typically occurs at high speed and low torque; the efficiency is zero at zero speed and zero torque, since the mechanical power is τω. &lt;br /&gt;
* No load current - The current required to spin the motor at the no load condition (i.e., the current needed to provide the torque necessary to overcome friction).&lt;br /&gt;
* Nominal current (max. continuous current) - The current that yields the maximum continuous torque. This maximum is determined by thermal characteristics of the motor. The power dissipated by the motor as heat is i2R. Larger currents are acceptable intermittently, but large continuous currents may cause the motor to overheat. &lt;br /&gt;
* Mechanical time constant - The time it takes the unloaded motor to reach 63% of its no load speed under a constant voltage, starting from rest. Proportional to the inertia of the rotor and inversely proportional to the square of the the torque constant.&lt;br /&gt;
* Terminal inductance - The inductance of the motor windings. &lt;br /&gt;
* Thermal resistance housing-ambient &lt;br /&gt;
* Thermal resistance winding-housing&lt;br /&gt;
* Thermal time constant winding.&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;library_actuators&amp;quot; id=&amp;quot;libactuators&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;actuator type=&amp;quot;electric_motor&amp;quot; id=&amp;quot;ExampleMotor1&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;assigned_power_rating&amp;gt;1.0&amp;lt;/assigned_power_rating&amp;gt;&lt;br /&gt;
      &amp;lt;max_speed&amp;gt;3000&amp;lt;/max_speed&amp;gt;&lt;br /&gt;
      &amp;lt;no_load_speed&amp;gt;3990&amp;lt;/no_load_speed&amp;gt;&lt;br /&gt;
      &amp;lt;nominal_torque&amp;gt;0.012&amp;lt;/nominal_torque&amp;gt;&lt;br /&gt;
      &amp;lt;nominal_voltage&amp;gt;24.0&amp;lt;/nominal_voltage&amp;gt;&lt;br /&gt;
      &amp;lt;rotor_inertia&amp;gt;0.0000023&amp;lt;/rotor_inertia&amp;gt;&lt;br /&gt;
      &amp;lt;speed_constant&amp;gt;173.0&amp;lt;/speed_constant&amp;gt;&lt;br /&gt;
      &amp;lt;speed_torque_gradient&amp;gt;130000.0&amp;lt;/speed_torque_gradient&amp;gt;&lt;br /&gt;
      &amp;lt;starting_current&amp;gt;0.578&amp;lt;/starting_current&amp;gt;&lt;br /&gt;
      &amp;lt;terminal_resistance&amp;gt;41.5&amp;lt;/terminal_resistance&amp;gt;&lt;br /&gt;
      &amp;lt;torque_constant&amp;gt;0.0552&amp;lt;/torque_constant&amp;gt;&lt;br /&gt;
    &amp;lt;/actuator&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= attach_actuator =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Attaches an actuator to a joint.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
The actuator comes from the actuator library.&lt;br /&gt;
&lt;br /&gt;
== Related Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| Parent elements || &amp;lt;articulated_system&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Child Elements ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
!width=20%| Element !! Description !! Occurrences&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;instance_actuator&amp;gt; || Instantiate an actuator. || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;bind_actuator&amp;gt; || Binds the actuator to a joint. || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attributes for &amp;lt;bind_actuator&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=3&lt;br /&gt;
|-&lt;br /&gt;
| joint || &amp;#039;&amp;#039;&amp;#039;xs:token&amp;#039;&amp;#039;&amp;#039; || Required. The reference of the joint in the instantiated kinematics model that is part of the manipulator chain.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra type=&amp;quot;attach_actuator&amp;quot; name=&amp;quot;motor0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;technique profile=&amp;quot;OpenRAVE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;instance_actuator url=&amp;quot;#ExampleMotor1&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;bind_actuator joint=&amp;quot;kmodel0/myjoint&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/technique&amp;gt;&lt;br /&gt;
&amp;lt;/extra&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= COLLADA Usage =&lt;br /&gt;
&lt;br /&gt;
== COLLADA Format Notes ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;articulated_system&amp;#039;&amp;#039;&amp;#039; tag is equivalent to OpenRAVE robot&lt;br /&gt;
** if child is a &amp;#039;&amp;#039;&amp;#039;motion&amp;#039;&amp;#039;&amp;#039; tag, get accelerations and velocity limits from it&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;kinematics_model&amp;#039;&amp;#039;&amp;#039; tag is equivalent to KinBody&lt;br /&gt;
* If visual_scene tag present, but no kinematics, then add each node tree as a rigid link.&lt;br /&gt;
* In order to set a static link in physics, use the &amp;lt;instance_rigid_body&amp;gt;/&amp;lt;dynamic&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
== Hard and Soft Joint Limits ==&lt;br /&gt;
&lt;br /&gt;
In many scenarios, the controllers on the robots use joints limits which are smaller than the maximum limits. The controller limits are called &amp;#039;&amp;#039;&amp;#039;soft limits&amp;#039;&amp;#039;&amp;#039;, while the hardware limits are called &amp;#039;&amp;#039;&amp;#039;hard limits&amp;#039;&amp;#039;&amp;#039;. In COLLADA, the specification is:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;hard limits&amp;#039;&amp;#039;&amp;#039; - specified inside the &amp;lt;joint&amp;gt; tag using the &amp;lt;limits&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;soft limits&amp;#039;&amp;#039;&amp;#039; - specified inside the &amp;lt;articulated_system&amp;gt;/&amp;lt;kinematics&amp;gt;/&amp;lt;technique_common&amp;gt;/&amp;lt;axis_info&amp;gt; tag using the &amp;lt;limits&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Planning Weights ==&lt;br /&gt;
&lt;br /&gt;
For each joint, a measure of how much a joint&amp;#039;s movement impacts the robot (base joints have more impact than end effector joints). this information should be used by all planners to evaluate importance of joints. Calculating this accurately might require an offline process.&lt;br /&gt;
&lt;br /&gt;
== Composition ==&lt;br /&gt;
&lt;br /&gt;
Robots usually have grippers, robot arms, and robot bases in separate files, then we have one file that references all of them and specifies the links to merge together (ie, we do not complicate things by creating dummy joints). This can be done with articulated systems (&amp;lt;kinematics&amp;gt; tag supports multiple &amp;lt;instance_kinematics_model&amp;gt; tags).&lt;br /&gt;
&lt;br /&gt;
== Geometric Primitives ==&lt;br /&gt;
&lt;br /&gt;
Use COLLADA &amp;lt;brep&amp;gt; for spheres, cylinders, boxes, etc. &lt;br /&gt;
&lt;br /&gt;
== Storing Convex Decompositions ==&lt;br /&gt;
&lt;br /&gt;
Each link is composed of a set of convex hulls. Need to create one geometry per convex hull (&amp;lt;convex_mesh&amp;gt;?) and specify multiple geometries per &amp;lt;node&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Calibration vs Static Data ==&lt;br /&gt;
&lt;br /&gt;
One thing that separates a base description of the robot from the real&lt;br /&gt;
robot that will be used in labs is calibration:&lt;br /&gt;
* where each sensor is with respect to the robot (6D pose)&lt;br /&gt;
* intrinsic parameters for each sensor&lt;br /&gt;
* joint offsets for encoder calibration&lt;br /&gt;
* controller parameters like PID gains for dynamic properties of motors&lt;br /&gt;
* possibly even link lengths depending on how much you trust the manufacturer&lt;br /&gt;
&lt;br /&gt;
All these parameters will change per robot, and it won&amp;#039;t be a good&lt;br /&gt;
idea asking every person to go and modify their one robot file.&lt;br /&gt;
Instead we should have a different calibration file that the main&lt;br /&gt;
collada file always references. It should be setup in such a way that the calibration file becomes optional.&lt;br /&gt;
&lt;br /&gt;
== Controllers ==&lt;br /&gt;
&lt;br /&gt;
Specifying controller parameters in the collada file falls somewhere&lt;br /&gt;
in between calibration parameters and parameters that will never&lt;br /&gt;
change and should be in the main robot file. In my opinion it is very&lt;br /&gt;
hard to find static parameters especially when considering controllers&lt;br /&gt;
in simulation along with real world controllers. Also, there&amp;#039;s as many&lt;br /&gt;
control algorithms out there as planners, and I wouldn&amp;#039;t feel&lt;br /&gt;
comfortable specifying planning algorithms and parameters inside a&lt;br /&gt;
robot file.&lt;br /&gt;
&lt;br /&gt;
= COLLADA Samples Using OpenRAVE Extensions =&lt;br /&gt;
&lt;br /&gt;
[https://openrave.svn.sourceforge.net/svnroot/openrave/data/robots/ Robot Database]&lt;br /&gt;
&lt;br /&gt;
== Contributors ==&lt;br /&gt;
&lt;br /&gt;
* University of Tokyo - Rosen Diankov and Ryohei Ueda&lt;/div&gt;</summary>
		<author><name>Rdiankov</name></author>	</entry>

	</feed>