[Documentation] [TitleIndex] [WordIndex

Only released in EOL distros:  

wpi_jaco: jaco_description | jaco_interaction | jaco_moveit_config | jaco_sdk | jaco_teleop | mico_description | mico_moveit_config | wpi_jaco_msgs | wpi_jaco_wrapper

Package Summary

ROS Wrapper for the JACO Arm Developed at WPI


The wpi_jaco_wrapper package contains nodes to interface ROS with the JACO API. It includes publishing angular and Cartesian commands to the arm, generating and following trajectories from input such as MoveIt!, rotational representation conversions between ROS and the JACO API, and forward kinematics.



'jaco_arm_trajectory_node' sends trajectory points to the JACO, JACO2, and MICO arms, and handles smooth trajectory following for complex trajectories.

Action Goal

jaco_arm/arm_controller/trajectory/goal (control_msgs/FollowJointTrajectoryGoal) jaco_arm/smooth_arm_controller/trajectory/goal (control_msgs/FollowJointTrajectoryGoal) jaco_arm/joint_velocity_controller/trajectory/goal (control_msgs/FollowJointTrajectoryGoal) jaco_arm/fingers_controller/gripper/goal (control_msgs/GripperCommandGoal) jaco_arm/fingers_controller_radian/gripper/goal (control_msgs/GripperCommandGoal) jaco_arm/home_arm/goal (wpi_jaco_msgs/HomeArmGoal)

Action Result

jaco_arm/arm_controller/trajectory/result (control_msgs/FollowJointTrajectoryResult) jaco_arm/smooth_arm_controller/trajectory/result (control_msgs/FollowJointTrajectoryResult) jaco_arm/joint_velocity_controller/trajectory/result (control_msgs/FollowJointTrajectoryResult) jaco_arm/fingers_controller/gripper/result (control_msgs/GripperCommandResult) jaco_arm/fingers_controller_radian/gripper/result (control_msgs/GripperCommandResult) jaco_arm/home_arm/result (wpi_jaco_msgs/HomeArmResult)

Subscribed Topics

jaco_arm/angular_cmd (wpi_jaco_msgs/AngularCommand) jaco_arm/cartesian_cmd (wpi_jaco_msgs/CartesianCommand)

Published Topics

jaco_arm/joint_states (sensor_msgs/JointState) jaco_arm/angular_cmd (wpi_jaco_msgs/AngularCommand) jaco_arm/cartesian_cmd (wpi_jaco_msgs/CartesianCommand) jaco_arm/arm_homed (std_msgs/Bool)


jaco_arm/get_angular_position (wpi_jaco_msgs/GetAngularPosition) jaco_arm/get_cartesian_position (wpi_jaco_msgs/GetCartesianPosition) jaco_arm/software_estop (wpi_jaco_msgs/EStop) jaco_arm/erase_trajectories (std_srvs/Empty)

Services Called

jaco_arm/kinematics/fk (wpi_jaco_msgs/JacoFK) jaco_conversions/quaternion_to_euler (wpi_jaco_msgs/QuaternionToEuler) jaco_arm/erase_trajectories (std_srvs/Empty)


wpi_jaco/arm_name (string, default: "jaco") wpi_jaco/finger_scale (float, default: 1.0) wpi_jaco/finger_error_threshold (float, default: 1.0) wpi_jaco/gripper_open (float, default: 0.0) wpi_jaco/gripper_closed (float, default: 65.0) wpi_jaco/max_curvature (double, default: 10.0) wpi_jaco/max_speed_finger (float, default: 30.0) wpi_jaco/num_fingers (int, default: 3) home_arm_on_init (bool, default: true) kinova_gripper (bool, default: true)


'jaco_manipulation' handles object manipulation actions including grasping and lifting actions.

Action Goal

jaco_arm/manipulation/gripper/goal (rail_manipulation_msgs/GripperGoal) jaco_arm/manipulation/lift/goal (rail_manipulation_msgs/LiftGoal)

Action Result

jaco_arm/manipulation/gripper/result (rail_manipulation_msgs/GripperResult) jaco_arm/manipulation/pickup/result (rail_manipulation_msgs/LiftResult)

Subscribed Topics

jaco_arm/joint_states (sensor_msgs/JointState)

Published Topics

jaco_arm/angular_cmd (wpi_jaco_msgs/AngularCommand) jaco_arm/cartesian_cmd (wpi_jaco_msgs/CartesianCommand)

Services Called

jaco_arm/get_cartesian_position (wpi_jaco_msgs/GetCartesianPosition)


wpi_jaco/arm_name (string, default: "jaco") wpi_jaco/gripper_open (float, default: 0.0) wpi_jaco/gripper_closed (float, default: 65.0) wpi_jaco/num_fingers (int, default: 3) kinova_gripper (bool, default: true)


'jaco_conversions' provides conversion services between the JACO, JACO2, and MICO arms' internal 3D rotation representation and common 3D rotation representations used in ROS.


jaco_conversions/euler_to_quaternion (wpi_jaco_msgs/EulerToQuaternion) jaco_conversions/quaternion_to_euler (wpi_jaco_msgs/QuaternionToEuler)


wpi_jaco/arm_name (string, default: "jaco")


'jaco_kinematics' provides kinematics services for the JACO and JACO2 arms.


jaco_arm/kinematics/fk (wpi_jaco_msgs/JacoFK)


wpi_jaco/arm_name (string, default: "jaco")

Arm Parameters

The wpi_jaco_wrapper package uses a configuration file to set most of the parameters for its nodes. This allows for support of different types of arms, such as the Jaco, Jaco2, or the Mico. The configuration files are located within the config directory, which includes a jaco.yaml file, jaco2.yaml file, and mico.yaml file that define default parameter values for the Jaco, Jaco2, and Mico arms respectively. The parameters include:

Trajectory Execution Options

The jaco_arm_trajectory_node provides three different options for trajectory execution, each of which has its own action server and its own set of advantages and disadvantages. The specifics of each trajectory follower, how they compare to eachother, and situations where each one may be applicable are detailed below.


The jaco_arm/arm_controller action server provides the simplest trajectory execution method. This method sends each point to the JACO arm using the Kinova API, which will then execute the trajectory using its PID controller to move the arm from point to point. This is the most accurate and precise trajectory follower for point-to-point motion, but for complex trajectories with many points, the point-to-point motion causes the arm to stop at each point resulting in a jerky, uneven overally motion. As such, this trajectory follower is recommended only for simple trajectories that are comprised of a small number of points spaced far apart, such as pre-defined trajectories for basic motions.

Smoothed Point-to-Point

The jaco_arm/smooth_arm_controller action server works similarly to the point-to-point trajectory follower provided by jaco_arm/arm_controller, with the addition of the Kinova API's trajectory smoothing. This is accomplished through first converting the trajectory points from joint position points to Cartesian end effector points. The Kinova API then smooths the trajectory of the end effector. This has the disadvantage of requiring the full trajectory to avoid the singularity protection zones defined internally, so this trajectory follower should only be used for trajectories generated from planners that are aware of these protection zones, or for pre-defined trajectories.

Velocity Control

The jaco_arm/joint_velocity_controller action server provides an alternative to the previous two methods (which rely on trajectory execution through the Kinova API) by using its own trajectory controller and trajectory follower based on velocity control. The trajectory points are used to generate a linear interpolated trajectory with smoothed corners using the ecl_geometry package. The trajectory is then followed using a velocity controller, defined in the jaco_arm_trajectory_node.cpp file, that sends its control inputs as joint velocity commands through the Kinova API. This controller is the recommended trajectory follower for execution of complex trajectories with many points, such as those generated by MoveIt!'s motion planners, as it uses joint control and is therefore not subject to the singularity constraints of the smoothed point-to-point trajectory follower.

Alternative End-Effectors

This package is designed to work with the 2- or 3-fingered gripper included with the JACO, JACO2, and MICO. With it's default behavior, the wrapper node will publish joint states for the fingers, and includes gripper control action servers. If you are using an alternative end-effector for your arm, setting the kinova_gripper argument in the arm.launch file will disable the finger joint state publishing and the gripper action servers.

Notes about the JACO2

This package has been updated to work with the new JACO2. There is one important difference to note when using this package with the JACO2 instead of the JACO or the MICO. For the JACO and MICO, the joint state names are published as [arm_name]_joint_[joint_number]. The JACO2 publishes joint state names under a different set of names for compatibility with a new arm urdf. The joint names, in order from the base to the end-effector, are: [jaco_shoulder_pan_joint, jaco_shoulder_lift_joint, jaco_elbow_joint, jaco_wrist_1_joint, jaco_wrist_2_joint, jaco_wrist_3_joint]

See the metapackage, wpi_jaco, for any other limitations of using this package with the JACO2.


To install the wpi_jaco package, you can install from source with the following commands:


The wpi_jaco_wrapper package contains the launch file arm.launch which will launch all of the nodes required to send trajectories and manipulation commands to the JACO arm. Note that the launch file will remap some of the topic names for the trajectory execution actions (this is done for easier MoveIt! integration), but these can be changed if desired by editing the launch file. This can be launched with the following command:

2020-03-28 13:20