Hand Pose
Overview
Hand pose is a 21-joint skeleton per hand (wrist plus five fingers, four joints each) in the world frame. Each joint has position (x, y, z in meters) and orientation (quaternion w, x, y, z). Left and right use separate topics with the same joint layout.
Coordinate Frame
- Reference frame: World.
- Axes: X forward, Y left, Z up (right-handed).
- Units: Position in meters.
- Orientation: Quaternion in w, x, y, z order.
Topic & Message Type
- Topic:
/pose/left_hand,/pose/right_hand - Message type:
pose.LeftHandFrame,pose.RightHandFrame - Encoding:
protobuf
Left/right hand messages use pose_common: header plus 21 Transforms per hand. The i-th joint is transforms[i] (index 0–20). Same joint layout for both hands; the topic name indicates which hand.
Message definition (one message per frame per hand):
syntax = "proto3";
package pose;
import "common/header.proto";
import "pose/pose_common.proto";
message LeftHandFrame {
.common.header.Header header = 1;
repeated pose.common.Transform transforms = 2;
}
Transform type (from pose/pose_common.proto):
syntax = "proto3";
package pose.common;
message Quaternion {
double w = 1;
double x = 2;
double y = 3;
double z = 4;
}
message Transform {
Quaternion quat = 1;
double x = 2;
double y = 3;
double z = 4;
}
Joint Index and Conventions
21 joints per hand: wrist (0) plus five fingers with four joints each. Left-hand palm view below; right hand uses the same indices and connectivity.

Each joint is identified by index 0–20:
| Index | Joint name | |||
|---|---|---|---|---|
| 0 | Wrist | |||
| 1–4 | Thumb CMC | Thumb MCP | Thumb IP | Thumb tip |
| 5–8 | Index MCP | Index PIP | Index DIP | Index tip |
| 9–12 | Middle MCP | Middle PIP | Middle DIP | Middle tip |
| 13–16 | Ring MCP | Ring PIP | Ring DIP | Ring tip |
| 17–20 | Pinky MCP | Pinky PIP | Pinky DIP | Pinky tip |
Same joint layout for left and right; the topic name indicates which hand.