Skip to content

iCub Joints

Naming Convention

The iCub joints are organized into six sub-systems: the head, left arm, right arm, torso, left leg, and right leg.

The joints are numbered to give a natural open kinematic chain, with the base reference frame on the torso. 0 is the most proximal joint, N_max the most distal joint. The key reference point on the body is the base of the neck.

The joint numbers are used when calling methods of the motor control device interfaces. A mechanism will be available for mapping from joint identifiers to numbers. Joint identifiers are unique across the body, except for bilateral symmetry - left or right is specified separately.

Head 1.0

Joint number Can Address Identifier Description Notes
0 3 neck_pitch Neck pitch Assuming the standard definition of roll, pitch and yaw with respect to a gravity oriented reference frame aligned with the torso main dimensions
1 3 neck_roll Neck roll --
2 3 neck_yaw Neck yaw --
3 1 eyes_tilt Eyes tilt Common tilt of the eyes
4 1 eyes_version Eyes version Common version, the eyes move together, synchronized in the DSP controller (see also Vergence Version)
5 1 eyes_vergence Eyes vergence Vergence control, the eyes move together, synchronized in the DSP controller (see also Vergence Version)

Head 2.0

The head has 6 joints in the standard configuration (without the facial features).

Joint number Can Address Motors Identifier Description Notes
0 1 0M0-0M1 neck_pitch Neck pitch Assuming the standard definition of roll, pitch and yaw with respect to a gravity oriented reference frame aligned with the torso main dimensions
1 1 0M0-0M1 neck_roll Neck roll --
2 3 1M0 neck_yaw Neck yaw --
3 3 1M1 eyes_tilt Eyes tilt Common tilt of the eyes
4 4 1M2-1M3 eyes_version Eyes version Common version, the eyes move together, synchronized in the DSP controller (see also Vergence Version)
5 4 1M2-1M3 eyes_vergence Eyes vergence Vergence control, the eyes move together, synchronized in the DSP controller (see also Vergence Version)

Left Arm

The arm includes the hand for a total of 16 controlled degrees of freedom.

Joint Number Can Address Motor Identifier Description Notes
0 x 1B0M0 l_shoulder_pitch Shoulder pitch Front-back movement when the arm is aligned with gravity (post decoupling in firmware)
1 x 1B0M1 l_shoulder_roll Shoulder roll Adduction-abduction movement of the arm (post decoupling in firmware)
2 x 1B1M0 l_shoulder_yaw Shoulder yaw Yaw movement when the arm principal axis is aligned with gravity (post decoupling in firmware)
3 x 1B1M1 l_elbow Elbow --
4 x 1B2M0 l_wrist_prosup Wrist pronosupination Forearm rotation along the arm principal axis
5 x 1B2M1-1B2M2 l_wrist_pitch Wrist pitch when hand-wrist aligned with the arm principal axis: i.e. this is relative to the forearm (not necessarily to gravity). Decoupling made in firmware
6 x 1B2M1-1B2M2 l_wrist_yaw Wrist yaw Decoupling made in firmware
7 x 1B2M3 l_hand_finger Hand finger adduction/abduction --
8 x 1B3M0 l_thumb_oppose Thumb opposition --
9 x 1B3M1 l_thumb_proximal Thumb proximal flexion/extension Single tendon looped
10 x 1B3M2 l_thumb_distal Thumb distal flexion Single tendon + return spring for extension spanning two physical joints
11 x 1B3M3 l_index_proximal Index proximal flexion/extension Single tendon looped
12 x 1B4M0 l_index_distal Index distal flexion Single tendon + return spring for extension spanning two physical joints
13 x 1B4M1 l_middle_proximal Middle proximal flexion/extension Single tendon looped
14 x 1B4M2 l_middle_distal Middle distal flexion Single tendon + return spring for extension spanning two physical joints
15 x 1B4M3 l_pinky Ring and little finger flexion Single tendon + return spring spanning six joints on two fingers

Right arm

The arm includes the hand for a total of 16 controlled degrees of freedom.

to Markdown (GitHub-flavored)

Joint Number Can Address Motor Identifier Description Notes
0 x 2B0M0 r_shoulder_pitch Shoulder pitch Front-back movement when the arm is aligned with gravity (post decoupling in firmware)
1 x 2B0M1 r_shoulder_roll Shoulder roll Adduction-abduction movement of the arm (post decoupling in firmware)
2 x 2B1M0 r_shoulder_yaw Shoulder yaw Yaw movement when the arm principal axis is aligned with gravity (post decoupling in firmware)
3 x 2B1M1 r_elbow Elbow --
4 x 2B2M0 r_wrist_prosup Wrist pronosupination Forearm rotation along the arm principal axis
5 x 2B2M1-2B2M2 r_wrist_pitch Wrist pitch when hand-wrist aligned with the arm principal axis: i.e. this is relative to the forearm (not necessarily to gravity). Decoupling made in firmware
6 x 2B2M1-2B2M2 r_wrist_yaw Wrist yaw Decoupling made in firmware
7 x 2B2M3 r_hand_finger Hand finger adduction/abduction --
8 x 2B3M0 r_thumb_oppose Thumb opposition --
9 x 2B3M1 r_thumb_proximal Thumb proximal flexion/extension Single tendon looped
10 x 2B3M2 r_thumb_distal Thumb distal flexion Single tendon + return spring for extension spanning two physical joints
11 x 2B3M3 r_index_proximal Index proximal flexion/extension Single tendon looped
12 x 2B4M0 r_index_distal Index distal flexion Single tendon + return spring for extension spanning two physical joints
13 x 2B4M1 r_middle_proximal Middle proximal flexion/extension Single tendon looped
14 x 2B4M2 r_middle_distal Middle distal flexion Single tendon + return spring for extension spanning two physical joints
15 x 2B4M3 r_pinky Ring and little finger flexion Single tendon + return spring spanning six joints on two fingers

Torso

Joint number Motors Identifier Description Notes
0 0B4M0 torso_yaw Torso yaw With respect to gravity
1 0B3M0-0B3M1 torso_roll Torso roll Lateral movement (after decoupling in firmware - differential joint)
2 0B3M0-0B3M1 torso_pitch Torso pitch Front-back movement (after decoupling in firmware - differential joint)

Left leg

Joint number Motors Identifier Description Notes
0 3B6M0 l_hip_pitch Hip pitch When the leg principal axis is aligned with gravity (front-back movement)
1 3B6M1 l_hip_roll Hip roll Lateral movement (when leg aligned with gravity)
2 3B5M0 l_hip_yaw Hip yaw Rotation along the leg/tight principal axis
3 3B5M1 l_knee Knee --
4 3B7M0 l_ankle_pitch Ankle pitch When the calf is aligned with gravity
5 3B7M1 l_ankle_roll Ankle roll When the calf is aligned with gravity

Right leg

Joint number Motors Identifier Description Notes
0 3B9M0 r_hip_pitch Hip pitch When the leg principal axis is aligned with gravity (front-back movement)
1 3B9M1 r_hip_roll Hip roll Lateral movement (when leg aligned with gravity)
2 3B8M0 r_hip_yaw Hip yaw Rotation along the leg/tight principal axis
3 3B8M1 r_knee Knee --
4 3B10M0 r_ankle_pitch Ankle pitch When the calf is aligned with gravity
5 3B10M1 r_ankle_roll Ankle roll When the calf is aligned with gravity

Device and Port view

The iCub user will be able to control all joints as they wish, if they wish. For each sub-system, the programmer will be able to retrieve the control interfaces they need.

We expect that these control interfaces will normally be accessed remotely, for all but the tightest control loops. There will be three ports per control group. For example, the head group will have three ports named as follows:

port name purpose
/icub/head/rpc:i commands that require replies
/icub/head/command:i streaming commands
/icub/head/state:o motor state information

A user can see the commands that the rpc:i port supports by using yarp rpc to send it the message help, or browsing to it via the address reported by yarp where and clicking help. For example, typing:

yarp rpc /icub/head/rpc:i
followed by:
[set] [pos] 0 45
will command axis 0 of the head (neck_pitch) to 45 degrees. If no motion is seen, it may be necessary to enable the axis:
 [set] [aen] 0
where aen means axis enable. The braces are optional. Of course, there are APIs for all such operations.

Here are the identifiers used in port names for the different control groups:

Part Side Identifier
head -- head
arm left left_arm
arm right right_arm
torso -- torso
leg left left_leg
leg right right_leg

Units

All angles are given in DEGREES.