ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

如何测量livox_ros_driver2的点云延迟:从数据生成到ROS发布全链路测试

如何测量livox_ros_driver2的点云延迟:从数据生成到ROS发布全链路测试 如何测量livox_ros_driver2的点云延迟从数据生成到ROS发布全链路测试【免费下载链接】livox_ros_driver2Livox device driver under Ros(Compatible with ros and ros2), support Lidar HAP and Mid-360.项目地址: https://gitcode.com/GitHub_Trending/li/livox_ros_driver2livox_ros_driver2是 Livox 激光雷达HAP、Mid-360、Mid-360s在 ROS 与 ROS2 下的官方第二代驱动包负责把雷达的点云数据发布到livox/lidar话题。很多新手第一次接入时会疑惑rviz 里点云显示得挺流畅点云延迟到底有多少从哪里开始算、到哪里结束本文面向新手带你走一遍从激光打出去到 ROS 订阅端收到的完整链路并给出 3 种由易到难的点云延迟测量方法——不依赖 PTP 时间同步也能测10 分钟出结果 ⏱️ 官方提醒该驱动定位是调试工具量产场景建议基于源码自行优化见 README.md。一、先搞懂点云延迟由哪几段组成测量之前先看清楚数据在驱动内部流经的4 站。下面这张链路图可以直接对照源码┌─────────┐ UDP(端口57000) ┌──────────────────────┐ ┌───────────────────┐ ┌──────────┐ │ Livox │ ──────────────── │ ① SDK 回调收包 │──│ ② PubHandler 缓冲 │──│ ③ ROS 发布 │ │ 雷达设备 │ │ 打上时间戳、拆点 │ │ 攒够一帧才 publish │ │ (publisher)│ └─────────┘ └──────────────────────┘ └───────────────────┘ └────┬─────┘ │ 话题 livox/lidar ▼ ┌───────────────────┐ │ ④ 订阅端收到 │ │ (rviz / 你的算法) │ └───────────────────┘环节发生在哪典型耗时关键源码① 以太网传输 SDK 收包雷达 → 主机网卡 → SDK 回调0.5 ~ 2 mssrc/comm/pub_handler.cppOnLivoxLidarPointCloudCallback② 驱动内缓冲攒帧按publish_freq周期聚合点数0 ~ 1 个发布周期src/comm/pub_handler.cppCheckTimer③ 队列 ROS 发布环形队列 → 发布线程 → publish1 ~ 5 mssrc/lds.cpp、src/lddc.cpp④ 订阅端处理roscomm 传输 回调1 ~ 5 ms同机—新手最容易踩的认知误区默认参数下测出的延迟 ≈ 50~100 ms大头其实不是网络而是环节 ② 的发布周期缓冲——驱动默认publish_freq10.010 Hz意味着攒满 100 ms 的点才发一帧见 launch_ROS1/rviz_HAP.launch 的默认值。还有一个关键细节决定了延迟怎么定义未开 PTP/GPS 同步驱动给每个数据包打的时间戳是主机本地高分辨率时钟收包那一刻见 src/comm/pub_handler.cppGetEthPacketTimestamp。此时消息头header.stamp≈ 收包时刻测出来的是收包 → ROS 订阅端的后半程延迟。开启 PTP 同步时间戳来自雷达设备时钟header.stamp才是激光实际发射的时刻测出来的才是真正的全链路延迟。帧消息头的赋值逻辑在这里header.stamp取的是帧内第一个点的时间base_time见 src/lddc.cpp。二、测量前准备编译与启动驱动如果还没克隆仓库clone 到工作空间的src目录下目录位置不对会编译失败git clone https://gitcode.com/GitHub_Trending/li/livox_ros_driver2.git ws_livox/src/livox_ros_driver2 cd ws_livox/src/livox_ros_driver2按 README.md 第 2 章安装好 Livox-SDK2 后编译然后显式指定发布频率启动以 ROS2 Humble HAP 为例# ROS2把 publish_freq 提到 50Hzrviz 先关掉排除显示负载 ros2 launch livox_ros_driver2 rviz_HAP_launch.py publish_freq:50.0 rviz_enable:false 雷达的 IP、端口、数据格式等网络配置在 config/HAP_config.jsonMid-360 用 config/MID360_config.json其中point_data_port: 57000就是点云数据的 UDP 端口。三、方法一最快上手无 PTP 时测收包→订阅延迟适合场景不想折腾时间同步只想知道点云到 ROS 订阅端到底慢了多少。第 1 步确认发布频率正常# ROS1 rostopic hz /livox/lidar # ROS2 ros2 topic hz /livox/lidar显示值应接近你设置的publish_freq。如果频繁掉到一半以下说明 CPU 处理不过来或网络丢包需要先排查。第 2 步写一个 10 行的小订阅节点比较收到时刻 − header.stamp以 ROS2 Python 为例ROS1 同理用ros::Time::now() - msg-header.stampimport rclpy from rclpy.node import Node from sensor_msgs.msg import PointCloud2 class LatencyChecker(Node): def __init__(self): super().__init__(latency_checker) self.create_subscription(PointCloud2, /livox/lidar, self.cb, 10) def cb(self, msg): now self.get_clock().now() dt (now - msg.header.stamp).nanoseconds print(f延迟: {dt/1e6:8.1f} ms) rclpy.init() rclpy.spin(LatencyChecker())怎么读数你测到的延迟大致结论≈1000 / publish_freq / 2ms✅ 正常主要是攒帧缓冲见下节表格远高于上表且波动大驱动线程被抢占 / CPU 过载看驱动进程 CPU 占用周期性尖峰检查 ROS 队列满队列时新帧会被顶掉见 src/lds.cpp由于此时header.stamp打的是主机收包时钟同一台机器上的收包时刻→订阅回调闭环是可比较的不要拿它去和另一台未同步时钟的机器比。四、方法二更真实启用 PTP 后测全链路延迟适合场景想知道从激光发射到订阅端收到的端到端延迟自动驾驶、多雷达融合时必须有这个数。雷达侧通过雷达 Web 配置页开启 gPTP 时间同步HAP 需外接 PTP 主时钟源如 GPS 带 PTP 输出或交换机 PTP 网络。主机侧让网卡时钟跟随 PTP例如phc2sys -s eth0chronyd使系统时间与 PTP 对齐。验证开启后驱动会自动感知同步状态is_timestamp_sync_标志见 src/comm/pub_handler.cppheader.stamp从此变成设备时间而非主机收包时刻。测量还是方法一的订阅节点此时打出的延迟 设备内部处理 以太网 驱动缓冲 ROS 传输即全链路延迟。✅ 判据开 PTP 后header.stamp与主机date时间应只差几毫秒若差出几秒说明 phc2sys/时钟源没配对测量数据不可用。五、方法三录 bag 离线分析 每点时间戳实时测量只给你一个当前数字离线回放才能看出抖动和尖峰分布。第 1 步录一段 bag# ROS1 rosbag record -O lat_test /livox/lidar # ROS2 ros2 bag record -o lat_test /livox/lidar第 2 步利用每点时间戳分析帧内时序。这是 Livox 驱动的隐藏福利——xfer_format0默认的 PointXYZRTLT 格式下每个点都带绝对时间戳单位 ns结构定义见 src/comm/comm.h自定义消息格式则用timebase offset_time表达见 msg/CustomMsg.msg 与 msg/CustomPoint.msg。回放时只需统计每帧帧跨度 帧内最大点时间戳 −header.stamp即这一帧覆盖的真实采集中断时间帧间隔 本帧header.stamp− 上帧header.stamp应稳定在 1000/publish_freq ms 附近驱动还会预留 1 ms 的容差见 src/comm/comm.h 的kNsTolerantFrameTimeDeviation。⚠️ 注意xfer_format2标准 pcl::PointXYZI仅 ROS1不含每点时间戳做时序分析时请用xfer_format0。六、publish_freq 怎么选发布频率与延迟的关系驱动按固定周期攒点发帧判定逻辑在 src/comm/pub_handler.cppSetPointCloudConfig所以缓冲延迟 0 ~ 一个发布周期期望值约半个周期publish_freq帧周期最大缓冲延迟平均缓冲延迟点云率Mid-36010 Hz默认100 ms100 ms~50 ms每帧 ~1 万点20 Hz50 ms50 ms~25 ms每帧 ~0.5 万点50 Hz20 ms20 ms~10 ms每帧 ~2000 点100 Hz上限10 ms10 ms~5 ms每帧 ~1000 点选型建议只做建图、可视化 → 默认 10 Hz 足够带宽压力最小SLAM / 定位要求延迟 ≤ 30 ms → 提到50 Hz是甜点多数 x86 主机轻松扛住100 Hz 时单帧点很少下游滤波如移轴补偿要相应调整。多雷达场景再把multi_topic设为 1让每台雷达走独立话题和独立队列livox/lidar_192_168_1_100避免共享队列互相拖累逻辑见 src/lddc.cpp 与 src/lddc.cpp。七、常见误区排查清单 现象原因处理延迟忽大忽小尖峰到 100 ms 以上开着 rviz 一起测显示抢占 CPU测延迟时rviz_enable:false两帧header.stamp差出 2 倍周期驱动线程被抢占错过发布窗口数据在队列滞留降低频率或升 CPU 优先级chrt测出的延迟和另一台机器的时钟对不上未开 PTP主机 A/B 时钟不同源同机测量或按方法二开 PTP帧间隔正常但点云拖影车辆高速运动 帧跨度可达 100 ms内的运动畸变下游做去畸变或提高publish_freq减小帧跨度队列打满、帧率不稳订阅端处理慢LidarDataQueue溢出丢帧看 src/lds.cpp 的 full 分支加速下游八、总结3 步拿到你的延迟基线 定链路用第一节的 4 段链路图明确你关心的延迟是收包→订阅还是激光→订阅跑测量无 PTP 用方法一10 行订阅节点比较now − header.stamp追求真实值再上 PTP 方法二看分布录 bag 离线回放用每点时间戳统计帧跨度与帧间隔把平均延迟、P99 尖峰都记录下来再对照第六节调publish_freq。理解这条雷达 → SDK 收包 → 攒帧缓冲 → ROS 发布的数据链核心在 src/comm/pub_handler.cpp、src/lds.cpp、src/lddc.cpp 三个文件你不仅能测出延迟还能准确判断延迟该找谁算账——是网络、攒帧周期还是自己的下游处理 【免费下载链接】livox_ros_driver2Livox device driver under Ros(Compatible with ros and ros2), support Lidar HAP and Mid-360.项目地址: https://gitcode.com/GitHub_Trending/li/livox_ros_driver2创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表