-
Notifications
You must be signed in to change notification settings - Fork 43
4. Egomotion and Motion Compensation
crunchyapple edited this page Oct 31, 2025
·
1 revision
Vehicle egomotion (pose trajectory) is provided in labels/egomotion/ in an anchor frame:
- The anchor frame is aligned with the vehicle's rig frame at the start of the clip (0 yaw at t=0)
- This provides a consistent reference frame for tracking vehicle motion throughout the clip
- Egomotion includes the vehicle's position, orientation, velocity, acceleration, and curvature over time
File Structure (HuggingFace):
labels/egomotion/egomotion.chunk_XXXX.zip
└── {clip_id}.egomotion.parquet (~2,224 poses per clip, ~100Hz)
Egomotion Schema:
{
# Timing
'timestamp': int64, # Absolute timestamp in microseconds
# Pose - Orientation (Quaternion)
'qx': float64, # Quaternion X component
'qy': float64, # Quaternion Y component
'qz': float64, # Quaternion Z component
'qw': float64, # Quaternion W (scalar)
# Pose - Position in Anchor Frame (meters)
'x': float64, # X position
'y': float64, # Y position
'z': float64, # Z position
# Velocity in Anchor Frame (m/s)
'vx': float64, # X velocity
'vy': float64, # Y velocity
'vz': float64, # Z velocity
# Acceleration in Anchor Frame (m/s²)
'ax': float64, # X acceleration
'ay': float64, # Y acceleration
'az': float64, # Z acceleration
# Vehicle Dynamics
'curvature': float64, # Path curvature (1/meters, inverse turning radius)
}While sensors scan the environment, the vehicle is moving. Without motion compensation:
- Points captured at different times are in different reference frames
- Moving objects appear smeared/distorted
- Static world appears distorted due to ego-motion
Sensor-Specific Considerations:
- LiDAR: 100ms spin time means first and last points are 100ms apart. Motion distortion worsens with higher vehicle speeds.
- Radar: Faster scan rates result in less motion distortion compared to LiDAR.
Since every point has a timestamp indicating when it was captured, we can correct for vehicle motion by interpolating the vehicle pose at that specific time:
for point in pointcloud:
vehicle_pose_at_point = interpolate_pose(point.timestamp)
point_in_world = vehicle_pose_at_point @ point_in_sensor