资讯详情

资讯详情

把三台相机的帧差压进 20μs:RealSense D455 硬件同步实战指南

把三台相机的帧差压进 20μsRealSense D455 硬件同步实战指南【免费下载链接】librealsenseRealSense SDK项目地址: https://gitcode.com/GitHub_Trending/li/librealsense产线上三台 D455 深度相机从三个方向拍同一个工件只要曝光起点相差几毫秒拼出来的点云边缘就会出现可见错位检测系统立刻误报。librealsenseRealSense SDK里的 D455 硬件同步功能就是为这个场景设计的一台主相机按帧率向从相机分发触发脉冲让多台深度相机的曝光对齐。本文按接线、软件配置、验证、下游使用四步走把多相机时间对齐完整跑通。 先把线缆、供电与主从拓扑接对D455 背部有一个 4 针连接器是深度相机同步唯一的物理通道四个引脚分工如下引脚信号同步接线用途PIN 1GPIO0从相机触发输入PIN 2GPIO1主相机触发输出PIN 3GND主从共地PIN 4VCC 3.3V外部供电限 50mA需要飞的只有一根信号线主相机GPIO1出触发从相机 GPIO0 收触发。拓扑三步完成主相机 PIN 2GPIO1接到每台从相机 PIN 1GPIO0所有相机 PIN 3GND拧到同一条地线相机与触发链路用同一组 5V 电源别混两路供电这里有个坑GPIO1 输出能力弱三台以上从机并联时建议加一个 3.3V 电平缓冲高电平保持 3.3V 才算合格。线缆接好之后要让软件知道哪台是主、哪台是从——这个区分完全由代码决定。用代码完成 D455 硬件同步的主从配置枚举设备认出三台 D455librealsense 里每台设备都能读到型号和序列号。枚举时只挑 D455把序列号存下来当索引rs2::context ctx; std::vectorstd::string d455_serials; for (auto dev : ctx.query_devices()) { if (std::string(dev.get_info(RS2_CAMERA_INFO_MODEL_ID)) 0B5D) // D455 型号 d455_serials.push_back(dev.get_info(RS2_CAMERA_INFO_SERIAL_NUMBER)); }按型号过滤再绑定序列号多台 D455 混插也不会串位。让主相机每帧发一个触发主相机的角色只有一条每出一帧深度图就从 GPIO1 吐一个脉冲。librealsense 把这件事收敛成深度传感器上的一个开关RS2_OPTION_OUTPUT_TRIGGER_ENABLED打开即可rs2::pipeline master_pipe(ctx); rs2::config master_cfg; master_cfg.enable_device(d455_serials[0]); master_cfg.enable_stream(RS2_STREAM_DEPTH, 1280, 720, RS2_FORMAT_Z16, 30); auto profile master_pipe.start(master_cfg); auto master_depth profile.get_device().firstrs2::depth_sensor(); master_depth.set_option(RS2_OPTION_OUTPUT_TRIGGER_ENABLED, 1.0f);先别急着改曝光参数触发只决定何时开始曝光曝光时长仍由深度曝光选项单独控制。从相机侧GPIO 触发配置落在哪从相机不需要在 C 里显式设触发模式外部脉冲从 GPIO0 进入后由固件触发深度曝光触发源、延迟等细项在设备的高级模式里调整doc/rs400/rs400_advanced_mode.md 里有 C 和 C 两套示例。viewer 里的高级模式面板长这样面板上百项参数与同步无关本文只动触发相关项其余保持默认。轮询取帧把时间戳读出来触发帧离开深度传感器后如何流到应用官方文档有一张生命周期图帧上的时间戳就是后面校验的原始依据。取帧循环里顺手把时间戳和 GPIO 输入元数据读出来rs2::frameset fs; if (master_pipe.poll_for_frames(fs)) { auto depth fs.get_depth_frame(); std::cout ts: depth.get_timestamp() gpio_in: depth.get_metadata(RS2_FRAME_METADATA_GPIO_INPUT_DATA) std::endl; }从相机管道用同样代码各读一份两组数字的差值就是同步证据。帧开始流动了但看起来在同步不算数需要两条独立证据确认 D455 硬件同步真的生效。用示波器与时间戳校验 D455 硬件同步效果硬件通道示波器表笔接主相机 GPIO1 和任一从相机 GPIO0。你看到什么、说明什么脉冲周期应约 33.3ms对应 30fps主从脉冲前沿偏移稳定在20μs以内周期漂移或前沿跳动问题在线材和接法不在代码。软件通道examples/sensor-control/ 里的示例展示了读帧元数据的完整写法。深度帧上的RS2_FRAME_METADATA_GPIO_INPUT_DATA字段记录该帧是否被外部脉冲触发。从机侧每帧该字段应为 1主从get_timestamp()之差应是稳定的小值通常 0.1ms 以内且逐帧不增长——一旦逐帧增大是晶振漂移先查共地。GPIO 输入状态同样能在 viewer 的 metadata 面板里看到对照面板确认 GPIO 输入数据项在你的设备上已注册如果这一项不存在先查固件版本再查接法。多相机时间对齐确认到位后同步帧才真正值钱——它们可以直接进下游融合流程。把同步帧送入点云与多视角融合流程深度相机同步做完只是第一步数据怎么用是另一件事。常见链路每台相机的深度帧先过rs2::align对齐到各自彩色坐标系再用rs2::pointcloud生成点云最后按外参把多台点云合并——时间戳已经对齐合并边缘不会出现重影。仓库里 examples/pointcloud/ 的示例可以直接改造成多机版本。跑起来之后偶尔也会翻车先查这张表再深挖你看到什么怎么处理从相机不出帧查 GPIO1→GPIO0 连线导通仅部分从机同步换信号线或加 3.3V 缓冲帧差逐帧增大重新共地检查供电纹波时间戳正常但点云错位核对各机外参标定跑通之后先做这一件事线缆、主从角色、触发开关、双通道校验四步走完三台相机的帧时间差就从毫秒级压到了 20μs 量级。下一步把 examples/multicam/ 的多相机示例先跑起来当基线接线或参数有疑义时直接到仓库 issue 区提问附上你的示波器波形截图会快很多。【免费下载链接】librealsenseRealSense SDK项目地址: https://gitcode.com/GitHub_Trending/li/librealsense创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →