Implementation:Google deepmind Dm control Jaco Arm Hand
| Metadata | |
|---|---|
| Knowledge Sources | dm_control |
| Domains | Reinforcement Learning, Robotics Simulation, Robot Modelling |
| Last Updated | 2026-02-15 00:00 GMT |
Overview
Concrete tool for configuring the Kinova Jaco 6-DOF arm and 3-finger hand as composer entities with velocity actuators, torque sensors, and manipulation-specific observation defaults.
Description
The dm_control manipulation suite uses the Kinova Jaco robot, modelled as two composer entities:
JacoArm (jaco_arm.py):
- Loads the
jaco_arm.xmlMJCF model. - Contains 6 revolute joints split into 3 large joints (
joint_1,joint_2,joint_3) and 3 small joints (joint_4,joint_5,joint_6). - Adds a velocity actuator to each joint with torque and velocity limits from the Kinova datasheet: large joints get a peak torque of 30.5 Nm and max velocity of 36 deg/s; small joints get 6.8 Nm and 48 deg/s.
- Adds a 3-axis torque sensor per joint.
- The
JacoArmObservablesclass returns joint positions as sin/cos pairs (bounded) and projects torque sensor readings onto the joint axis.
JacoHand (jaco_hand.py):
- Loads the
jaco_hand.xmlMJCF model. - Contains 3 finger joints, each with a velocity actuator (gain=10, force range +/-1 N, ctrl range +/-5).
- Exposes a
tool_center_pointproperty (either the grip site or the pinch site, configurable viause_pinch_site_as_tcp). - Provides a
set_grasp(physics, close_factors)method that positions fingers to a desired open/close fraction (0 = fully open, 1 = fully closed). - The
JacoHandObservablesclass provides pinch-site position and rotation matrix observables.
Factory functions (robots.py):
make_arm(obs_settings)-- constructs aJacoArmwith the observation options derived fromJACO_ARM_OBSERVABLES(proprio: joints_pos, joints_vel; ftt: joints_torque).make_hand(obs_settings)-- constructs aJacoHandwithuse_pinch_site_as_tcp=Trueand observation options derived fromJACO_HAND_OBSERVABLES(proprio: joints_pos, joints_vel, pinch_site_pos, pinch_site_rmat).
The default arm base offset in the arena is (0.0, 0.4, 0.0).
Usage
Task modules call robots.make_arm() and robots.make_hand(), then attach the hand to the arm and the arm to the arena. This is typically done inside the task's factory function (e.g. _reach(), _lift()).
Code Reference
| Attribute | Value |
|---|---|
| Source Locations | dm_control/entities/manipulators/kinova/jaco_arm.py, lines 50--154dm_control/entities/manipulators/kinova/jaco_hand.py, lines 33--170dm_control/manipulation/shared/robots.py, lines 25--53
|
| Signatures | JacoArm(name=None)JacoHand(name=None, use_pinch_site_as_tcp=False)make_arm(obs_settings) -> JacoArmmake_hand(obs_settings) -> JacoHand
|
| Import | from dm_control.entities.manipulators import kinovafrom dm_control.manipulation.shared import robots
|
I/O Contract
Inputs
| Function | Parameter | Type | Description |
|---|---|---|---|
JacoArm |
name |
str or None |
Optional prefix for MJCF model name attributes. |
JacoHand |
name |
str or None |
Optional prefix for MJCF model name attributes. |
JacoHand |
use_pinch_site_as_tcp |
bool |
If True, the pinch site is used as the tool center point instead of the grip site.
|
make_arm |
obs_settings |
ObservationSettings |
Configures which arm observables are enabled and their processing options. |
make_hand |
obs_settings |
ObservationSettings |
Configures which hand observables are enabled and their processing options. |
set_grasp |
physics |
mjcf.Physics |
The physics instance to modify. |
set_grasp |
close_factors |
float or Iterable[float] |
Desired finger positions: 0 = fully open, 1 = fully closed. |
Outputs
| Function | Return Type | Description |
|---|---|---|
JacoArm() |
JacoArm |
A composer entity with 6 joints, 6 velocity actuators, 6 torque sensors, and a wrist attachment site. |
JacoHand() |
JacoHand |
A composer entity with 3 finger joints, 3 velocity actuators, grip/pinch sites, and finger/hand geom lists. |
make_arm(obs_settings) |
JacoArm |
A JacoArm with manipulation-default observable options applied.
|
make_hand(obs_settings) |
JacoHand |
A JacoHand with use_pinch_site_as_tcp=True and manipulation-default observable options applied.
|
Usage Examples
from dm_control.manipulation.shared import robots
from dm_control.manipulation.shared import observations
# Create arm and hand with perfect-features observation settings.
obs_settings = observations.PERFECT_FEATURES
arm = robots.make_arm(obs_settings)
hand = robots.make_hand(obs_settings)
# Attach hand to arm at the wrist site.
arm.attach(hand)
# Inspect the arm's joints and actuators.
print('Arm joints:', [j.name for j in arm.joints])
# ['joint_1', 'joint_2', 'joint_3', 'joint_4', 'joint_5', 'joint_6']
print('Arm actuators:', [a.name for a in arm.actuators])
# ['joint_1', 'joint_2', 'joint_3', 'joint_4', 'joint_5', 'joint_6']
# Inspect the hand's finger actuators.
print('Hand actuators:', [a.name for a in hand.actuators])
from dm_control.entities.manipulators.kinova import jaco_hand
# Direct instantiation of JacoHand with pinch site as TCP.
hand = jaco_hand.JacoHand(use_pinch_site_as_tcp=True)
print('Tool center point:', hand.tool_center_point)
print('Number of finger joints:', len(hand.joints))
# 3