Skip to main content

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.

Hand joint indices (left hand, palm view)

Each joint is identified by index 0–20:

IndexJoint name
0Wrist
1–4Thumb CMCThumb MCPThumb IPThumb tip
5–8Index MCPIndex PIPIndex DIPIndex tip
9–12Middle MCPMiddle PIPMiddle DIPMiddle tip
13–16Ring MCPRing PIPRing DIPRing tip
17–20Pinky MCPPinky PIPPinky DIPPinky tip

Same joint layout for left and right; the topic name indicates which hand.