Skip to main content

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

TopicMessage TypeJointsDescription
/pose/bodypose.BodyFrame22Full-body skeleton
/pose/upper_bodypose.UpperBodyFrame14Upper-body subset (reindexed 0–13)
/pose/lower_bodypose.LowerBodyFrame8Lower-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:

Body joint indices and skeleton
IndexNameIndexName
0Pelvis11R_Foot
1L_Hip12Neck
2R_Hip13L_Collar
3Spine_0114R_Collar
4L_Knee15Head
5R_Knee16L_Shoulder
6Spine_0217R_Shoulder
7L_Ankle18L_Elbow
8R_Ankle19R_Elbow
9Spine_0320L_Wrist
10L_Foot21R_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.

IndexName22-indexIndexName22-index
0Pelvis07Head15
1Spine_0138L_Shoulder16
2Spine_0269R_Shoulder17
3Spine_03910L_Elbow18
4Neck1211R_Elbow19
5L_Collar1312L_Wrist20
6R_Collar1413R_Wrist21

/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.

IndexName22-indexIndexName22-index
0L_Hip14L_Ankle7
1R_Hip25R_Ankle8
2L_Knee46L_Foot10
3R_Knee57R_Foot11

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.