<!-- Joint -->
<element name="joint" required="*">
  <description>A joint connects two links with kinematic and dynamic properties. By default, the pose of a joint is expressed in the child link frame.</description>

  <attribute name="name" type="string" default="__default__" required="1">
    <description>A unique name for the joint within the scope of the model.</description>
  </attribute>

  <attribute name="type" type="string" default="__default__" required="1">
    <description>The type of joint, which must be one of the following:
      (continuous) a hinge joint that rotates on a single axis with a continuous range of motion,
      (revolute) a hinge joint that rotates on a single axis with a fixed range of motion,
      (gearbox) geared revolute joints,
      (revolute2) same as two revolute joints connected in series,
      (prismatic) a sliding joint that slides along an axis with a limited range specified by upper and lower limits,
      (ball) a ball and socket joint,
      (screw) a single degree of freedom joint with coupled sliding and rotational motion,
      (universal) like a ball joint, but constrains one degree of freedom,
      (fixed) a joint with zero degrees of freedom that rigidly connects two links.
    </description>
  </attribute>

  <element name="parent" type="string" default="__default__" required="1">
    <description>Name of the parent link or "world".</description>
  </element> <!-- End Parent -->

  <element name="child" type="string" default="__default__" required="1">
    <description>Name of the child link. The value "world" may not be specified.</description>
  </element> <!-- End Child -->

  <element name="gearbox_ratio" type="double" default="1.0" required="0">
    <description>Parameter for gearbox joints.  Given theta_1 and theta_2 defined in description for gearbox_reference_body, theta_2 = -gearbox_ratio * theta_1.</description>
  </element>

  <element name="gearbox_reference_body" type="string" default="__default__" required="0">
    <description>Parameter for gearbox joints.  Gearbox ratio is enforced over two joint angles.  First joint angle (theta_1) is the angle from the gearbox_reference_body to the parent link in the direction of the axis element and the second joint angle (theta_2) is the angle from the gearbox_reference_body to the child link in the direction of the axis2 element.</description>
  </element>

  <element name="thread_pitch" type="double" default="1.0" required="0">
    <description>Parameter for screw joints.</description>
  </element>

  <element name="axis" required="0">
    <description>
      Parameters related to the axis of rotation for revolute joints,
      the axis of translation for prismatic joints.
    </description>
    <element name="initial_position" type="double" default="0" required="0">
      <description>
        Default joint position for this joint axis.
      </description>
    </element>
    <element name="xyz" type="vector3" default="0 0 1" required="1">
      <description>
        Represents the x,y,z components of the axis unit vector. The axis is
        expressed in the joint frame unless a different frame is expressed in
        the expressed_in attribute. The vector should be normalized.
      </description>
      <attribute name="expressed_in" type="string" default="" required="0">
        <description>
          Name of frame in whose coordinates the xyz unit vector is expressed.
        </description>
      </attribute>
    </element>
    <element name="dynamics" required="0">
      <description>An element specifying physical properties of the joint. These values are used to specify modeling properties of the joint, particularly useful for simulation.</description>
      <element name="damping" type="double" default="0" required="0">
        <description>The physical velocity dependent viscous damping coefficient of the joint.</description>
      </element>
      <element name="friction" type="double" default="0" required="0">
        <description>The physical static friction value of the joint.</description>
      </element>
      <element name="spring_reference" type="double" default="0" required="1">
        <description>The spring reference position for this joint axis.</description>
      </element>
      <element name="spring_stiffness" type="double" default="0" required="1">
        <description>The spring stiffness for this joint axis.</description>
      </element>
    </element> <!-- End Dynamics -->
    <element name="limit" required="1">
      <description>specifies the limits of this joint</description>
      <element name="lower" type="double" default="-1e16" required="1">
        <description>Specifies the lower joint limit (radians for revolute joints, meters for prismatic joints). Omit if joint is continuous.</description>
      </element>
      <element name="upper" type="double" default="1e16" required="1">
        <description>Specifies the upper joint limit (radians for revolute joints, meters for prismatic joints). Omit if joint is continuous.</description>
      </element>
      <element name="effort" type="double" default="-1" required="0">
        <description>A value for enforcing the maximum joint effort applied. Limit is not enforced if value is negative.</description>
      </element>
      <element name="velocity" type="double" default="-1" required="0">
        <description>A value for enforcing the maximum joint velocity.</description>
      </element>

      <element name="stiffness" type="double" default="1e8" required="0">
        <description>Joint stop stiffness.</description>
      </element>

      <element name="dissipation" type="double" default="1.0" required="0">
        <description>Joint stop dissipation.</description>
      </element>

    </element> <!-- End Limit -->
  </element> <!-- End Axis -->

  <element name="axis2" required="0">
    <description>
      Parameters related to the second axis of rotation for revolute2 joints and universal joints.
    </description>
    <element name="initial_position" type="double" default="0" required="0">
      <description>
        Default joint position for this joint axis.
      </description>
    </element>
    <element name="xyz" type="vector3" default="0 0 1" required="1">
      <description>
        Represents the x,y,z components of the axis unit vector. The axis is
        expressed in the joint frame unless a different frame is expressed in
        the expressed_in attribute. The vector should be normalized.
      </description>
      <attribute name="expressed_in" type="string" default="" required="0">
        <description>
          Name of frame in whose coordinates the xyz unit vector is expressed.
        </description>
      </attribute>
    </element>
    <element name="dynamics" required="0">
      <description>An element specifying physical properties of the joint. These values are used to specify modeling properties of the joint, particularly useful for simulation.</description>
      <element name="damping" type="double" default="0" required="0">
        <description>The physical velocity dependent viscous damping coefficient of the joint.  EXPERIMENTAL: if damping coefficient is negative and implicit_spring_damper is true, adaptive damping is used.</description>
      </element>
      <element name="friction" type="double" default="0" required="0">
        <description>The physical static friction value of the joint.</description>
      </element>
      <element name="spring_reference" type="double" default="0" required="1">
        <description>The spring reference position for this joint axis.</description>
      </element>
      <element name="spring_stiffness" type="double" default="0" required="1">
        <description>The spring stiffness for this joint axis.</description>
      </element>
    </element> <!-- End Dynamics -->

    <element name="limit" required="1">
      <description></description>
      <element name="lower" type="double" default="-1e16" required="0">
        <description>An attribute specifying the lower joint limit (radians for revolute joints, meters for prismatic joints). Omit if joint is continuous.</description>
      </element>
      <element name="upper" type="double" default="1e16" required="0">
        <description>An attribute specifying the upper joint limit (radians for revolute joints, meters for prismatic joints). Omit if joint is continuous.</description>
      </element>
      <element name="effort" type="double" default="-1" required="0">
        <description>An attribute for enforcing the maximum joint effort applied by Joint::SetForce.  Limit is not enforced if value is negative.</description>
      </element>
      <element name="velocity" type="double" default="-1" required="0">
        <description>(not implemented) An attribute for enforcing the maximum joint velocity.</description>
      </element>

      <element name="stiffness" type="double" default="1e8" required="0">
        <description>Joint stop stiffness. Supported physics engines: SimBody.</description>
      </element>

      <element name="dissipation" type="double" default="1.0" required="0">
        <description>Joint stop dissipation. Supported physics engines: SimBody.</description>
      </element>

    </element> <!-- End Limit -->
  </element> <!-- End Axis2 -->

  <element name="physics" required="0">
    <description>Parameters that are specific to a certain physics engine.</description>
    <element name="simbody" required="0">
      <description>Simbody specific parameters</description>
      <element name="must_be_loop_joint" type="bool" default="0" required="0">
        <description>Force cut in the multibody graph at this joint.</description>
      </element>
    </element>
    <element name="ode" required="0">
      <description>ODE specific parameters</description>
      <element name="cfm_damping" type="bool" default="false" required="0">
        <description>If cfm damping is set to true, ODE will use CFM to simulate damping, allows for infinite damping, and one additional constraint row (previously used for joint limit) is always active.</description>
      </element>

      <element name="implicit_spring_damper" type="bool" default="false" required="0">
        <description>If implicit_spring_damper is set to true, ODE will use CFM, ERP to simulate stiffness and damping, allows for infinite damping, and one additional constraint row (previously used for joint limit) is always active.  This replaces cfm_damping parameter in SDFormat 1.4.</description>
      </element>

      <element name="fudge_factor" type="double" default="0" required="0">
        <description>Scale the excess for in a joint motor at joint limits. Should be between zero and one.</description>
      </element>
      <element name="cfm" type="double" default="0" required="0">
        <description>Constraint force mixing for constrained directions</description>
      </element>
      <element name="erp" type="double" default="0.2" required="0">
        <description>Error reduction parameter for constrained directions</description>
      </element>
      <element name="bounce" type="double" default="0" required="0">
        <description>Bounciness of the limits</description>
      </element>
      <element name="max_force" type="double" default="0" required="0">
        <description>Maximum force or torque used to reach the desired velocity.</description>
      </element>
      <element name="velocity" type="double" default="0" required="0">
        <description>The desired velocity of the joint. Should only be set if you want the joint to move on load.</description>
      </element>

      <element name="limit" required="0">
        <description></description>
        <element name="cfm" type="double" default="0.0" required="1">
          <description>Constraint force mixing parameter used by the joint stop</description>
        </element>
        <element name="erp" type="double" default="0.2" required="1">
          <description>Error reduction parameter used by the joint stop</description>
        </element>
      </element>

      <element name="suspension" required="0">
        <description></description>
        <element name="cfm" type="double" default="0.0" required="1">
          <description>Suspension constraint force mixing parameter</description>
        </element>
        <element name="erp" type="double" default="0.2" required="1">
          <description>Suspension error reduction parameter</description>
        </element>
      </element>
    </element>

    <element name="provide_feedback" type="bool" default="false" required="0">
      <description>If provide feedback is set to true, physics engine will compute the constraint forces at this joint.</description>
    </element>
  </element> <!-- End Physics -->

  <include filename="pose.sdf" required="0"/>
  <include filename="sensor.sdf" required="*"/>
</element> <!-- End Joint -->
