JAUS Description

Derived from the SAE JAUS Manipulator Service Set (AS6057A) document.

The function of the Joint Position Sensor Service is to report the values of manipulator joint positions when queried.


Primitive Manipulator Service Messages:

Query Joint Position – This message requests the robotic platform to reply with a Report Joint Position message.


Report Joint Position - This message is used to provide the receiver with the current values of the joint positions. The values to respond with are typically provided by a low level hardware interface.


The JAUS specification allows a joint position to be represented in one of two ways: Revolute (in radians) or Prismatic (in meters).

  • Revolute joints: revolute joints have one DoF and are used to describe rotational movements (with 1 DoF) between objects. Their configuration is defined by one value that represents the amount of rotation about their first reference frame's z-axis. They can be used as passive joints, or as active joints (motors). The range of the position is between -8pi and +8pi radians.
  • Prismatic joints: prismatic joints have one DoF and are used to describe translational movements between objects. Their configuration is defined by one value that represents the amount of translation along their first reference frame's z-axis. They can be used as passive joints, or as active joints (motors). The range of the position is between -10 and +10 meters.


Basic Implementation

Upon receiving a Query Joint Position message the platform handing manipulator functionality should perform the following:

  • Create a Report Joint Position message object
  • Add to the message list each joint position value (obtained from a low level hardware interface), starting with the first joint and ending with the last joint
    • The Joint Position field of the message will need to provide an index value to indicate the value representation (Revolute or Prismatic)
  • Send the message


OpenJAUS Implementation

The OpenJAUS SDK provides the manipulator_v2_0::ManipulatorJointPositionSensor class.

This class has a virtual method related to the reporting of manipulator joint positions.

    virtual ReportJointPosition getReportJointPosition(QueryJointPosition *queryJointPosition)


Upon receiving a Query Joint Position message the OpenJAUS SDK will call the getReportJointPosition(QueryJointPosition *queryJointPosition) method.

The return value (ReportJointPosition) will be used by the SDK to configure and send the Report Joint Position message.

The getReportJointPosition method should be implemented to perform the following:

  • Create a Report Joint Position message object
  • Add to the message list each joint position value (obtained from a low level hardware interface), starting with the first joint and ending with the last joint
    • The Joint Position field of the message will need to provide an index value to indicate the value representation (Revolute or Prismatic)


Example Code (OpenJAUS specific)

For these examples a manipulator with four joints(actuators) will be used.

It is presumed that there will be some type of hardware interface method to retrieve the joint position values.

hardwareInterface.getJointPosition(uint8 jointPosition)



Example 1: Reporting Joint Positions - Revolute Joints


  const uint8 NUM_OF_JOINTS = 4;

openjaus::manipulator_v2_0::ReportJointPosition getReportJointPosition(
        openjaus::manipulator_v2_0::QueryJointPosition *queryJointPosition)
{
    openjaus::manipulator_v2_0::ReportJointPosition message;    
    openjaus::manipulator_v2_0::JointPositionList& list = message.getJointPositionList();
    
       // Create a joint position record for each joint and add the record to the ReportJointPosition list.
       // The Joint Position values will be retrieved from a hardware interface method.
       for (uint8 i = 0; i < NUM_OF_JOINTS; ++i)
       {
           openjaus::manipulator_v2_0::JointPositionRecord record;
           openjaus::manipulator_v2_0::JointPositionVariant& variant = record.getJointPosition();
           variant.setType(openjaus::manipulator_v2_0::JointPositionVariant::JOINTPOSITIONOPTION0);
           variant.setJointPositionOption0_rad(hardwareInterface.getJointPosition_rad(i));
           list.add(record);
       }

    return message;
}



Example 2: Reporting Joint Positions - Prismatic Joints


  const uint8 NUM_OF_JOINTS = 4;

openjaus::manipulator_v2_0::ReportJointPosition getReportJointPosition(
        openjaus::manipulator_v2_0::QueryJointPosition *queryJointPosition)
{
    openjaus::manipulator_v2_0::ReportJointPosition message;    
    openjaus::manipulator_v2_0::JointPositionList& list = message.getJointPositionList();
    
       // Create a joint position record for each joint and add the record to the ReportJointPosition list.
       // The Joint Position values will be retrieved from a hardware interface method.
       for (uint8 i = 0; i < NUM_OF_JOINTS; ++i)
       {
           openjaus::manipulator_v2_0::JointPositionRecord record;
           openjaus::manipulator_v2_0::JointPositionVariant& variant = record.getJointPosition();
           variant.setType(openjaus::manipulator_v2_0::JointPositionVariant::JOINTPOSITIONOPTION1);
           variant.setJointPositionOption1_m(hardwareInterface.getJointPosition_m(i));
           list.add(record);
       }

    return message;
}