OmniEgo 帧对齐完全指南:30Hz 主时间线如何同步5路摄像头、骨架与头显状态
发布时间:2026/10/20 21:45:10 锦皓数字建站

数据集具身智能计算机视觉人工智能【免费下载链接】OmniEgo项目地址https://ai.gitcode.com/OpenLET/OmniEgo点击查看免费下载OmniEgo(即 DOHC 头戴式多相机人体动作数据集)采用一条30Hz 主时间线,将 5 路摄像头、全身骨架与头显状态对齐到统一的主帧上。本文面向新手,用最少代码讲清 OmniEgo 帧对齐原理:为什么需要主时间线、master_frame_indices如何把不同帧率的图像挂到主帧、骨架与头显状态为什么天然对齐,以及新手最容易踩的帧同步坑。为什么 OmniEgo 需要一条 30Hz 主时间线OmniEgo 每条录制同时采集5 路相机 全身骨架 头显运动状态。关键在于:各路数据的采样率并不相同。数据流Topic类型标称帧率分辨率cam0/dohc/cam0/jpegRGB 主相机30 FPS3840 × 2160cam1/dohc/cam1/jpegRGB 左前广角15 FPS1280 × 720cam2/dohc/cam2/jpegRGB 右前广角15 FPS1280 × 720loca_left/dohc/loca_left/jpeg灰度鱼眼跟踪30 FPS848 × 800loca_right/dohc/loca_right/jpeg灰度鱼眼跟踪30 FPS848 × 800骨架/dohc/skeletonSMPL 24 关节主时间线 30 Hz—头显状态/dohc/state位姿/速度/角速度/加速度主时间线 30 Hz— 如果按序号直接配对各数据流:第 1 帧骨架配第 1 帧cam1图像——这是错的,因为cam1只有 15 FPS,它的第 1 帧其实对应主时间线上靠后的时刻。所以 OmniEgo 在导出时建立了一条30 Hz 主时间线(master timeline),所有数据围绕它组织。这套设计的细节可参考 README.md 的Frame Alignment小节。主时间线:frame_index 与归一化时间戳理解帧对齐,先记住两个核心字段:frame_index/frame_id(主帧序号)主时间线上的每一帧都有唯一序号。/dohc/state(头显状态)和/dohc/skeleton(骨架)消息都直接携带主帧序号——它们与主时间线一一对应。归一化时间戳(timestamps_ns)元数据/dohc/metadata声明timestamp_clock DELTA_NORMALIZED_TIMELINE,即所有时间戳都是归一化录制时间,不是真实墙钟时间。每个相机流都附带自己的timestamps_ns(本流时间戳)和master_frame_indices(本流每帧对应的主帧序号),这两组数组就是相机帧 ↔ 主帧的映射表。一句话总结对齐关系:master frame f: state[f] - skeleton[f] - Parquet row[f] - metadata.times.stream.master_frame_indices 把相机样本映射到 f - cam0 / cam1 / cam2 / loca_left / loca_right 在 f 处可用时才有图像 - 用各流自己的时间戳;等长数组下标不是合法关联方式⚠️ 录制会先按人工审核的保留区间裁剪再导出(crop_mode: retained_union)。不要用相邻帧序号推断跨剪切的连续性,剪接点两侧帧号虽连续但时刻不连续。5路摄像头如何锚定到主时间线每条录制的权威映射记录在 manifest.jsonl 中(约 7000 行,一行一条 MCAP/Parquet 配对记录)。挑出与帧对齐最相关的字段:字段含义frame_count主时间线总帧数image_counts各相机流实际图像数(注意不一定等于frame_count)duration_seconds保留区间总时长(秒)source_ranges源数据中保留的帧范围,用于追溯剪接parquet_path/output_path配对的 Parquet 与 MCAP 文件路径打开任意一条记录可以看到典型的image_counts,例如cam0: 510, cam1: 254, cam2: 254, loca_left: 510, loca_right: 510——30 FPS 的流图数约等于主帧数,15 FPS 的流恰好约为一半。这正是每 2 个主帧才有 1 张广角图的直接体现。两种文件格式中,映射信息的存放位置略有不同:MCAP:图像消息保留本流时间戳,并把主帧序号作为消息 sequence。某主帧若该流没有样本,就不写图像消息——所以图像 topic 上的消息数天然少于主帧数。Parquet:data/ 下每行对应一个主帧,图像列是带bytes与path字段的 struct(字节内嵌,path为 null)。主帧处若某流缺图,则图像为 null 且has_stream false。关联字段是available_images、has_stream、stream_frame_index与stream_timestamp_ns。 快速核对示例:一条 17 秒的 dish-washer 录制有 510 个主帧(510 ÷ 30 ≈ 17s),cam1恰好 254 张(254 ÷ 15 ≈ 16.9s),与标称帧率完全吻合。骨架与头显状态:天然对齐的一对这两路数据不需要映射,因为它们本身就按主时间线逐帧产生:/dohc/skeleton:SMPL 风格24 关节全身骨架,每条消息含smpl_joints等命名数组(shapedtypedata),单帧形状(24, 3),整段录制为(frame_num, 24, 3),按主帧序号与时间戳对齐。另有/dohc/skeleton/scene以 ProtobufSceneUpdate在 Foxglove 中按帧时间戳可视化 24 关节 23 骨。/dohc/state:头显状态,顶层含translation(3,)、rotation(4,)、velocity(3,)、angular_velocity(3,)、acceleration(3,),同样逐主帧输出。因此做视频 ↔ 骨架 ↔ 头显轨迹同步分析时,只需:读 Parquet 第f行(或主帧f的 state/skeleton 消息)拿到骨架与位姿;查/dohc/metadata中times.stream.master_frame_indices,确认各相机在该主帧是否有样本;有则取图,无则跳过该流(检查has_stream)。 注意:状态字段的坐标约定以消息内pose.position_reference、pose.orientation_representation为准(已检录制使用init_pose参考与[qx, qy, qz, qw]四元数),不能默认是绝对世界坐标。详见 README.md 的/dohc/state小节。帧对齐避坑清单(新手必读)不要用数组下标对齐跨流关联。只有master_frame_indices与timestamps_ns是合法的关联键;各路流长度不同,下标相等毫无时间意义。不要假设每个主帧都有 5 张图。cam1/cam2只有约一半主帧有图,缺图时 Parquet 中图像列为 null、has_stream false。不要把时间戳当真实日期。DELTA_NORMALIZED_TIMELINE是归一化时间线,只能用于相对时序比较。⚠️跨越剪接点要停一下。source_ranges记录了保留区间,剪接点两侧主帧号连续但时刻不连续,连续性分析必须用时间戳差值验证。✅逐录制读取标称帧率。times.stream.nominal_source_fps以每条录制自己的元数据为准,而非全局假设。如何验证对齐结果:Foxglove 可视化与校验文件OmniEgo 附带了一套完整的转换校验产物,方便你验证帧对齐的正确性:foxglove/VALIDATION.md:552 条早期转换录制的验证报告,含状态帧数、各 topic 图像消息数(如/dohc/cam1/jpeg66,477 条,约为cam0133,246 条的一半)与校验方法(chunk CRC、JPEG 全解码、24 关节 23 骨拓扑检查)。foxglove/SHA256SUMS:全部输出文件哈希,用于完整性核对。foxglove/foxglove-layout.json:现成的 Foxglove Studio 布局,加载后可在五个图像画布 骨架画布上直观检查同一时刻多路画面与骨架是否一致。manifest.jsonl:每条记录的foxglove_validation与validated字段,确认该录制已通过校验。总结:一张图理解 OmniEgo 帧对齐层次机制关键字段主时间线30 Hz,frame_index唯一标识frame_count、duration_seconds相机对齐每流独立时间戳 主帧映射表timestamps_ns、master_frame_indices、has_stream骨架/头显逐主帧 1:1 输出/dohc/state、/dohc/skeleton追溯与校验剪接记录 哈希 可视化布局source_ranges、file_sha256、foxglove/记住核心口诀:主时间线是脊椎,相机是挂在脊椎上的侧枝——用master_frame_indices找挂点,用timestamps_ns校时间,用has_stream防缺图。掌握这三点,OmniEgo 的 270 多万帧多模态数据就再也不会对不齐了。赞分享数据集具身智能计算机视觉人工智能【免费下载链接】OmniEgo项目地址https://ai.gitcode.com/OpenLET/OmniEgo点击查看免费下载相关推荐OpenCE高帧率原理图解30Hz逻辑tick 60/120/240Hz渲染插帧与直接摄像头是如何工作的OpenCE高帧率原理图解30Hz逻辑tick 60/120/240Hz渲染插帧与直接摄像头是如何工作的 OpenCE 是经典 Xbox 游戏《Halo:supervision 如何处理网络摄像头实时视频帧supervision 如何处理网络摄像头实时视频帧 如果你的任务是把一台摄像头接进 Python 应用对每一帧实时视频做目标检测、画框标注并显示出来sup计算机视觉图像处理视频处理人工智能多模态时空校准Rerun实现摄像头与激光雷达的微秒级时间对齐多模态时空校准Rerun实现摄像头与激光雷达的微秒级时间对齐 在自动驾驶和机器人感知系统中摄像头与激光雷达LiDAR的数据同步是构建精确环境认知的基础。数据可视化数据工程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。