Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
285 changes: 285 additions & 0 deletions egomimic/rldb/mcap/SPEC.md

Large diffs are not rendered by default.

Empty file added egomimic/rldb/mcap/__init__.py
Empty file.
137 changes: 137 additions & 0 deletions egomimic/rldb/mcap/proto/egoverse.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
// Generated by `python -m egomimic.rldb.mcap.schemas`; do not edit by hand.
// EgoVerse vendor spec 0.1: message types not covered by foxglove schemas.

syntax = "proto3";

package egoverse;

// A 3D vector.
message Vector3 {
double x = 1;
double y = 2;
double z = 3;
}

// A rotation; must be unit length.
message Quaternion {
double x = 1;
double y = 2;
double z = 3;
double w = 4;
}

// A child frame's pose in its parent (T_parent_child): m and a unit quaternion.
message Pose {
Vector3 position = 1;
Quaternion orientation = 2;
}

// Optional per-camera facts foxglove.CameraCalibration has no field for, on the
// camera's <topic>-info-extra, published once next to <topic>-info.
message CameraInfoExtra {
string frame_id = 1; // the camera's frame, as in its -info
double valid_radius = 2; // px from the principal point where the lens model holds (fisheye); 0 = the whole image
int32 upright_rotation_cw_deg = 3; // clockwise turn (0, 90, 180, 270) that makes a frame upright, for sensors mounted sideways
}

// One raw IMU sample, straight off the device: no gravity removal, no fusion.
message Imu {
string frame_id = 1; // IMU frame; must be linked in /tf_static
Vector3 linear_acceleration = 2; // m/s^2, gravity included
Vector3 angular_velocity = 3; // rad/s
}

// IMU noise model, as SLAM/VIO tools expect it. Published once. Datasheet values
// are fine when the device does not calibrate them.
message ImuInfo {
string frame_id = 1;
double accel_noise_density = 2; // m/s^2/sqrt(Hz)
double accel_random_walk = 3; // m/s^3/sqrt(Hz)
double gyro_noise_density = 4; // rad/s/sqrt(Hz)
double gyro_random_walk = 5; // rad/s^2/sqrt(Hz)
}

// State of the vendor's SLAM at this time, one per head pose.
message TrackingQuality {
enum State {
UNKNOWN = 0;
OK = 1;
LOST = 2;
RELOCALIZED = 3;
}
State state = 1;
}

// One hand at one time: its joints and/or the wrist pose. Joints are in the order
// the episode's hand-joints key lists them (names from spec.HAND_JOINTS). Set
// valid = false when the hand is not tracked; never write zeros in its place.
// A device without keypoints leaves positions empty and sets wrist_pose.
message HandKeypoints {
string frame_id = 1; // frame positions and wrist_pose are in
repeated double positions = 2; // (x, y, z) in m per hand-joints entry, flattened; or empty
float confidence = 3; // whole-hand tracking confidence in [0, 1]
bool valid = 4; // hand tracked and its values usable
repeated float joint_confidence = 5; // optional: per-joint confidences in [0, 1], one per joint
Pose wrist_pose = 6; // optional: T_frame_wrist
}

// Where the wearer looks, as in Aria MPS eye gaze. frame_id is centered between
// the eyes with +x to the wearer's left, +y up, +z forward; the gaze point is
// depth * normalize(tan(yaw), tan(pitch), 1). Set valid = false when gaze is not
// tracked; never write zeros in its place.
message EyeGaze {
string frame_id = 1; // gaze frame; linked in /tf_static
double yaw = 2; // rad, positive = looking left
double pitch = 3; // rad, positive = looking up
double depth = 4; // m, distance to the gaze point
bool valid = 5; // gaze tracked and values usable
}

// Measured state of one arm. Joint arrays follow joint_names. ee_pose is
// T_base_ee: the end effector in the arm-base frame (frame_id), row-major 4x4.
message ArmState {
string frame_id = 1; // arm-base frame, e.g. "left_arm_base"
repeated string joint_names = 2;
repeated double position = 3; // rad (or m, prismatic)
repeated double velocity = 4; // rad/s (or m/s)
repeated double torque = 5; // N*m (or N)
repeated double ee_pose = 6; // 16 values, row-major
}

// Command sent to one arm at this time (the target it was told to reach),
// same conventions as ArmState.
message ArmAction {
string frame_id = 1; // arm-base frame
repeated string joint_names = 2;
repeated double position = 3; // rad (or m, prismatic)
repeated double ee_pose = 4; // 16 values, row-major
}

// Gripper opening, measured (ee-state) or commanded (ee-action).
message GripperState {
double position = 1; // 0 = closed, 1 = fully open
}

// One task performed in the recording; a recording may hold several
// (e.g. iron, then fold, then pack). Starts at the message's log time.
message Task {
string name = 1; // task slug, e.g. "fold_clothes"
string description = 2; // free text for this instance
repeated string objects = 3; // object slugs involved
int64 end_time_unix_ns = 4; // task end, absolute Unix ns
}

// A label over [start, end), start being the message's log time; it must lie
// inside one /task (or the recording, without /task). Field `data` matches
// ABC-130k's /subtask-annotation.
message Annotation {
string data = 1; // English text
int64 end_time_unix_ns = 2; // end, absolute Unix ns; 0 = point event (one frame wide)
string annotation_type = 3; // default "language"
string annotation_vendor = 4; // who wrote it; default the episode's vendor
}

// Task text for the episode, e.g. "fold the shirt and put it in the basket".
message Instruction {
string data = 1;
}
Loading
Loading