Body Pose
Overview
Body pose is a skeleton in the world frame: each joint has position (x, y, z in meters) and orientation (quaternion w, x, y, z). One message per frame, time-aligned with head and hand pose.
EgoSuite publishes body pose on three topics: the 22-joint full body on /pose/body, plus two subsets extracted from it — the 14-joint upper body on /pose/upper_body and the 8-joint lower body on /pose/lower_body. Both subsets are reindexed compactly starting from 0.
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.
Topics & Message Types
| Topic | Message Type | Joints | Description |
|---|---|---|---|
/pose/body | pose.BodyFrame | 22 | Full-body skeleton |
/pose/upper_body | pose.UpperBodyFrame | 14 | Upper-body subset (reindexed 0–13) |
/pose/lower_body | pose.LowerBodyFrame | 8 | Lower-body subset (reindexed 0–7) |
- Encoding:
protobuf
All three use pose_common Transform (position + quaternion) per joint.
Message definitions:
syntax = "proto3";
package pose;
import "common/header.proto";
import "pose/pose_common.proto";
// Full 22-joint body. Topic: /pose/body
message BodyFrame {
.common.header.Header header = 1;
repeated pose.common.Transform transforms = 2;
}
// Upper-body subset, 14 joints. Topic: /pose/upper_body
message UpperBodyFrame {
.common.header.Header header = 1;
repeated pose.common.Transform transforms = 2;
}
// Lower-body subset, 8 joints. Topic: /pose/lower_body
message LowerBodyFrame {
.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 Position {
double x = 1;
double y = 2;
double z = 3;
}
message Transform {
Position pos = 1;
Quaternion quat = 2;
}
Joint Index and Conventions
/pose/body — 22-Joint Full Body
The full-body layout uses 22 joints (index 0–21). Joint indices and skeleton connectivity:

| Index | Name | Index | Name |
|---|---|---|---|
| 0 | Pelvis | 11 | R_Foot |
| 1 | L_Hip | 12 | Neck |
| 2 | R_Hip | 13 | L_Collar |
| 3 | Spine_01 | 14 | R_Collar |
| 4 | L_Knee | 15 | Head |
| 5 | R_Knee | 16 | L_Shoulder |
| 6 | Spine_02 | 17 | R_Shoulder |
| 7 | L_Ankle | 18 | L_Elbow |
| 8 | R_Ankle | 19 | R_Elbow |
| 9 | Spine_03 | 20 | L_Wrist |
| 10 | L_Foot | 21 | R_Wrist |
/pose/upper_body — 14-Joint Upper Body
The upper-body topic publishes 14 joints (index 0–13), extracted from the 22-joint full-body skeleton and reindexed compactly. It is not the first 14 entries of the 22-joint layout.
Joints extracted (by 22-joint index): 0, 3, 6, 9, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21.
| Index | Name | 22-index | Index | Name | 22-index |
|---|---|---|---|---|---|
| 0 | Pelvis | 0 | 7 | Head | 15 |
| 1 | Spine_01 | 3 | 8 | L_Shoulder | 16 |
| 2 | Spine_02 | 6 | 9 | R_Shoulder | 17 |
| 3 | Spine_03 | 9 | 10 | L_Elbow | 18 |
| 4 | Neck | 12 | 11 | R_Elbow | 19 |
| 5 | L_Collar | 13 | 12 | L_Wrist | 20 |
| 6 | R_Collar | 14 | 13 | R_Wrist | 21 |
/pose/lower_body — 8-Joint Lower Body
The lower-body topic publishes 8 joints (index 0–7), extracted from the 22-joint full-body skeleton and reindexed compactly.
Joints extracted (by 22-joint index): 1, 2, 4, 5, 7, 8, 10, 11.
| Index | Name | 22-index | Index | Name | 22-index |
|---|---|---|---|---|---|
| 0 | L_Hip | 1 | 4 | L_Ankle | 7 |
| 1 | R_Hip | 2 | 5 | R_Ankle | 8 |
| 2 | L_Knee | 4 | 6 | L_Foot | 10 |
| 3 | R_Knee | 5 | 7 | R_Foot | 11 |
The /pose/upper_body and /pose/lower_body topics together cover all 22 joints of /pose/body, so consumers can use whichever granularity fits their use case.