ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Livox Mid-360与ROS2激光雷达相机联合标定实战指南

Livox Mid-360与ROS2激光雷达相机联合标定实战指南 1. 项目缘起与整体方案设计1.1 为什么选择 Mid-360 加 ROS2 这套组合做机器人感知层开发的人绕不开激光雷达和相机的融合。我手头这个项目是要给一台室内移动平台做建图与障碍物识别核心需求是拿到稠密的点云做定位同时用相机做语义补充。选 Livox Mid-360 的原因很直接它体积小、重量轻装在小型平台上不会明显改变重心而且非重复扫描的特性让它在近距离区域的点云密度比传统机械式雷达高出一截。价格也在可接受范围内对于不是做测绘级精度的项目来说性价比很合适。软件栈这边ROS2 是必然选择。ROS1 已经停止维护新项目没有理由再往上靠。ROS2 的节点生命周期管理、QoS 策略、以及原生支持多机通信的 DDS 底层对于后面要做分布式感知和长时间稳定运行来说都是实打实的优势。我用的系统是 Ubuntu 22.04对应 ROS2 Humble 版本这是目前 LTS 支持最稳的组合。整套方案要解决的核心问题有三个第一让 Mid-360 在 ROS2 环境下正常出点云和 IMU 数据第二把雷达坐标系和相机坐标系之间的外参标定出来第三验证标定结果在实际融合显示中是否可用。这三个问题环环相扣驱动配置是基础标定是桥梁验证是闭环。1.2 整体技术路线拆解我把整个流程拆成四个阶段每个阶段都有明确的输入和输出避免做到一半发现前面有坑还得回头返工。第一阶段是环境准备。包括 ROS2 Humble 的安装、Livox SDK2 的编译、以及 livox_ros_driver2 这个 ROS2 功能包的构建。这一步的关键是版本匹配SDK2 和驱动包的版本如果不一致编译能过但运行时会出各种奇怪的连接问题。第二阶段是雷达驱动配置与数据验证。要配置网络参数、修改 JSON 配置文件、启动驱动节点然后在 RViz2 里确认点云和 IMU 话题都有数据。这一步的难点在于网络配置Mid-360 默认走的是以太网通信IP 段和主机网卡必须匹配。第三阶段是相机联合标定。我用的是张正友标定法先做相机内参然后用标定板做雷达和相机的外参标定。这里需要把雷达点云和图像时间对齐手动选取对应点或者用自动标定工具辅助。第四阶段是验证与融合显示。把标定结果写成 TF 变换在 RViz2 里同时显示点云和图像投影看边缘对齐情况。如果偏差大还得回去检查标定板角点提取和点云对应点选取是否准确。注意整个流程中网络配置和标定板角点提取是最容易出问题的两个环节建议在这两处多留时间。2. 环境搭建与驱动编译的实操细节2.1 ROS2 Humble 安装与常见坑Ubuntu 22.04 上装 ROS2 Humble官方文档给的步骤是加源、装包、配环境。但实际做下来有几个地方容易卡住。首先是 locale 设置如果系统默认不是 UTF-8后面编译某些包会报编码错误。我习惯先跑一遍sudo apt update sudo apt install locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALLen_US.UTF-8 LANGen_US.UTF-8 export LANGen_US.UTF-8然后是加 ROS2 的 apt 源。这里注意Ubuntu 22.04 对应的源是 jammy别抄成 focal 的。加完源之后sudo apt update再装ros-humble-desktop。桌面版包含了 RViz2 和 demo 节点对于后面调试很有用。装完之后一定要记得 source 环境source /opt/ros/humble/setup.bash echo source /opt/ros/humble/setup.bash ~/.bashrc我见过有人装完不 source然后敲ros2命令提示 command not found以为是安装失败其实只是环境没配。这个坑很基础但新手确实容易踩。还有一个细节是 ROS2 和 DDS 的关系。ROS2 默认用 Fast DDS 做底层通信如果后面要做多机通信或者零拷贝传输可能需要换 Cyclone DDS。不过对于单机调试雷达和相机来说默认的 Fast DDS 够用了不用折腾。2.2 Livox SDK2 编译与驱动包构建Livox 官方给了 SDK2 和 ROS2 驱动包两个仓库。SDK2 是底层通信库驱动包是 ROS2 的封装。编译顺序不能反必须先装 SDK2。SDK2 的编译步骤git clone https://github.com/Livox-SDK/Livox-SDK2.git cd Livox-SDK2 mkdir build cd build cmake .. make -j$(nproc) sudo make install这里make -j$(nproc)用满所有核心编译快一些。装完之后 SDK2 的头文件和库会放到/usr/local下面。然后是驱动包。注意驱动包要放在 ROS2 的工作空间里编译mkdir -p ~/livox_ws/src cd ~/livox_ws/src git clone https://github.com/Livox-SDK/livox_ros_driver2.git cd .. colcon build --symlink-install--symlink-install这个参数建议加上后面改配置文件的时候不用重新编译直接改源文件里的就行。编译过程中如果报找不到 Livox SDK2 的错大概率是 SDK2 装完之后没有刷新动态库缓存。跑一下sudo ldconfig再重新编译。实操心得驱动包编译完之后先别急着启动。把livox_ros_driver2/config/下面的 JSON 配置文件看一遍后面网络配置和雷达参数都在这里面改。2.3 网络配置与雷达连接Mid-360 通过以太网和主机通信。雷达默认 IP 是192.168.1.1xx这个段具体最后一位和雷达序列号有关。主机的网卡要配成同一网段的静态 IP比如192.168.1.50子网掩码255.255.255.0。在 Ubuntu 里配静态 IP可以用图形界面也可以用命令行。我习惯用nmclinmcli con mod 有线连接 1 ipv4.addresses 192.168.1.50/24 nmcli con mod 有线连接 1 ipv4.method manual nmcli con up 有线连接 1配完之后ping 192.168.1.1xx确认能通。如果 ping 不通检查网线、网卡指示灯、以及防火墙有没有拦。网络通了之后改 JSON 配置文件。livox_ros_driver2/config/MID360_config.json里面有几个关键字段lidar_ip雷达的 IP要和实际一致host_ip主机的 IP就是刚才配的静态 IPdata_src数据源0 表示从雷达直接来publish_freq点云发布频率默认 10Hz改完之后启动驱动source ~/livox_ws/install/setup.bash ros2 launch livox_ros_driver2 rviz_MID360_launch.py这个 launch 文件会同时启动驱动节点和 RViz2RViz2 里已经配好了点云和 IMU 的显示。如果一切正常你能看到点云在 RViz2 里实时刷新。3. 相机联合标定的完整流程3.1 相机内参标定张正友标定法实操外参标定之前相机内参必须先标好。内参不准外参标出来也是歪的。我用的是张正友标定法工具选 ROS2 的camera_calibration包。先准备标定板。我用的是 8x6 的棋盘格方格边长 25mm。打印出来贴在硬纸板上确保平整。不平整的标定板会导致角点提取误差直接影响内参精度。启动相机节点确认图像话题有数据。然后跑标定节点ros2 run camera_calibration cameracalibrator \ --size 8x6 \ --square 0.025 \ image:/camera/image_raw \ camera:/camera--size是棋盘格内角点数注意是内角点不是方格数。8x6 的棋盘格内角点是 7x5。这个参数写错的话角点检测会一直失败。标定过程中要移动标定板覆盖图像的各个区域左、右、上、下、远、近、以及各种倾斜角度。RViz2 里会显示 X、Y、Size、Skew 四个进度条都满了之后 CALIBRATE 按钮才会亮。点 CALIBRATE 之后等一会儿然后点 SAVE。标定结果会保存到/tmp/calibrationdata.tar.gz解压后里面有ost.yaml就是内参文件。注意标定过程中标定板不要移动太快否则图像模糊角点提取不准。每移动到一个位置停一两秒再动。3.2 雷达相机外参标定标定板法与对应点选取外参标定要算出雷达坐标系到相机坐标系的旋转和平移。我用的是标定板法把棋盘格标定板放在雷达和相机都能看到的位置然后在点云里提取标定板平面在图像里提取棋盘格角点通过对应关系求解外参。具体操作上我先把标定板固定在雷达和相机前方约 2 米处确保标定板在图像里清晰可见同时在点云里也能看到明显的平面。然后同步采集一帧点云和一帧图像。点云这边用 PCL 或者直接写个 ROS2 节点把标定板平面的点提取出来拟合出平面方程再算出平面中心点在雷达坐标系下的坐标。图像这边用 OpenCV 的findChessboardCorners提取角点算出标定板中心在图像坐标系下的坐标。有了多组对应点之后用 SVD 或者非线性优化求解外参。我一般采集 10 到 15 组数据覆盖不同的标定板位置和角度这样求解出来的外参更稳。如果觉得手动提取太麻烦也可以用自动标定工具。不过自动工具对点云质量和标定板检测的鲁棒性要求高有时候还不如手动选点来得准。3.3 标定结果验证与 TF 变换配置标定完之后要把外参写成 TF 变换在 RViz2 里验证。TF 变换的配置有两种方式一种是在 launch 文件里写 static_transform_publisher另一种是写 URDF。我用 static_transform_publisher简单直接ros2 run tf2_ros static_transform_publisher \ x y z qx qy qz qw \ camera_link lidar_link这里的 x y z 是平移qx qy qz qw 是旋转四元数。旋转矩阵转四元数可以用 Python 的scipy.spatial.transform或者 ROS2 自带的tf_transformations。配好之后在 RViz2 里同时显示点云和图像。如果标定准确点云投影到图像上应该和实际物体边缘对齐。我一般会拿一个明显的物体比如墙角或者桌角看点云边缘和图像边缘是否重合。如果偏差大先检查时间同步。雷达和相机的时间戳如果差太多运动中的物体会出现错位。可以用message_filters做时间同步或者硬件触发同步。4. 常见问题排查与避坑经验4.1 驱动启动失败与点云无数据驱动启动失败最常见的原因是网络不通。先 ping 雷达 IP如果不通检查网卡配置和网线。如果 ping 通但驱动还是连不上检查 JSON 配置文件里的lidar_ip和host_ip是否写对。还有一种情况是驱动启动了但点云话题没有数据。用ros2 topic list看有没有/livox/lidar和/livox/imu这两个话题。如果有话题但没数据用ros2 topic hz /livox/lidar看发布频率。如果频率是 0说明雷达没出数据可能是雷达没启动完成或者固件有问题。我遇到过一次雷达上电后要等十几秒才开始出数据驱动启动太快反而连不上。后来在 launch 文件里加了个延时等雷达就绪后再启动驱动问题就解决了。4.2 标定精度不够的排查思路标定精度不够表现是点云投影到图像上边缘对不齐。排查顺序如下第一检查相机内参。内参不准外参肯定不准。可以拿一个已知尺寸的物体用内参算它的像素尺寸和实际像素尺寸对比看误差大不大。第二检查标定板角点提取。如果角点提取有偏差外参求解就会偏。可以在图像上把提取到的角点画出来看是否准确落在棋盘格角点上。第三检查点云平面拟合。如果点云噪声大平面拟合的中心点会偏。可以对点云做滤波去掉离群点再拟合。第四检查对应点数量。对应点太少求解不稳定。建议至少 10 组且分布在不同位置和角度。4.3 时间同步与运动畸变处理雷达和相机的时间戳如果不同步运动中的物体会出现错位。Mid-360 支持 PTP 时间同步但配置起来比较麻烦。对于一般精度要求的项目用 ROS2 的message_filters做软同步就够了。运动畸变是另一个问题。雷达在扫描过程中如果平台在运动点云会有畸变。Mid-360 内置 IMU可以用 IMU 数据做运动补偿。驱动包里有个enable_imu参数打开之后点云会做去畸变处理。实操心得如果平台运动速度不快运动畸变可以忽略。但如果要做高精度建图去畸变是必须的。4.4 常见问题速查表问题现象可能原因排查方法解决方案驱动启动报连接失败网络不通或 IP 配置错ping 雷达 IP检查网卡配置和 JSON 文件点云话题无数据雷达未就绪或固件问题ros2 topic hz加延时或检查雷达状态标定后投影偏差大内参不准或角点提取偏检查内参和角点重新标定内参或手动选点运动物体错位时间不同步检查时间戳用 message_filters 同步点云有畸变平台运动观察静止时是否正常打开 IMU 去畸变编译报找不到 SDK动态库缓存未刷新ldconfig -p跑sudo ldconfig5. 标定结果的工程化应用与扩展5.1 把标定参数写进 launch 文件标定完之后参数不能只存在终端里要写进 launch 文件方便后续启动。我一般建一个calibration.launch.py里面包含 static_transform_publisher 和相机、雷达的驱动节点。from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( packagetf2_ros, executablestatic_transform_publisher, arguments[0.1, 0.0, 0.05, 0, 0, 0, 1, camera_link, lidar_link] ), # 相机和雷达驱动节点 ])这样每次启动只需要跑一个 launch 文件不用手动敲一堆命令。5.2 点云与图像融合显示的实现标定验证通过之后可以做点云和图像的融合显示。基本思路是把点云投影到图像平面然后根据深度给点云上色叠加到图像上。用 OpenCV 和 PCL 写个节点订阅点云和图像话题用标定得到的外参和内参做投影。投影公式是[u, v, 1]^T K * [R | t] * [X, Y, Z, 1]^T其中 K 是内参矩阵[R | t] 是外参。投影之后把点云的深度值映射成颜色画到图像上。这个融合显示对于验证标定结果很直观也能用于后续的障碍物检测和语义分割。5.3 后续扩展方向标定只是感知层的基础后面还有很多可以做的。比如用点云做 Octomap 建图结合相机做语义地图或者用标定结果做雷达和相机的紧耦合里程计提高定位精度。如果平台上有机械臂还可以做手眼标定把雷达、相机、机械臂的坐标系统一起来。不过那是另一个话题了涉及的手眼标定方法和雷达相机标定不太一样需要单独处理。我在实际项目中的体会是标定这件事没有一劳永逸的平台震动、温度变化、甚至重新拆装雷达都可能让外参发生变化。所以标定流程要能快速复现参数要能方便地更新。我一般会把标定脚本和配置文件都放到 git 里管理每次重新标定后更新参数并提交这样出了问题可以回溯。最后分享一个小技巧标定的时候多采几组数据用不同的子集分别求解外参看结果的一致性。如果不同子集解出来的外参差异很大说明数据质量有问题得重新采。这个方法帮我省了很多返工的时间。
返回列表