ARTICLE DETAIL

资讯详情

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

Livox-Mid-360与ROS2集成:从驱动配置到3D点云地图构建实战

Livox-Mid-360与ROS2集成:从驱动配置到3D点云地图构建实战 1. 为什么我要折腾Livox-Mid-360加ROS2这套组合先说结论如果你手头有一台Livox-Mid-360又刚好在ROS2环境下做机器人开发想建一张能直接拿去做导航的3D点云地图那这套流程我踩过的坑你大概率也会踩一遍。我把整个从零到出图的完整过程整理出来包括驱动编译、时间同步、坐标系配置、点云拼接、降采样和保存每一步都附上我实际遇到的报错和解决思路。Livox-Mid-360这台激光雷达在圈子里口碑比较特殊。它的非重复扫描模式让点云覆盖率随时间累积提升近距离细节丰富价格也比同级别的多线机械式雷达友好不少。但它对时间同步和驱动版本比较敏感尤其在ROS2环境下官方驱动的分支管理和ROS1时代差别很大很多人卡在编译这一步就放弃了。ROS2这边Humble版本是目前LTS里最稳的搭配Ubuntu 22.04是主流选择。我用的就是这套组合。这篇文章适合谁看如果你刚接触ROS2跟着官方教程跑过小乌龟、发过话题、写过简单的发布订阅节点那就可以直接上手。如果你连ROS2都没装建议先花半天把基础环境搭好再回来。整篇内容我会尽量用大白话解释每个操作背后的原因不只是告诉你敲什么命令还要说清楚为什么这么敲、不这么敲会出什么问题。提示全文基于Ubuntu 22.04 ROS2 Humble Livox-Mid-360实测其他版本组合在关键步骤上会有差异我会在涉及的地方标注出来。2. 环境准备与驱动选型的关键决策2.1 系统版本和ROS2发行版怎么选Ubuntu 22.04加ROS2 Humble是目前最省心的组合。为什么这么说Livox官方驱动在GitHub上的ROS2分支对Humble的支持最完整社区里遇到问题也最容易搜到答案。如果你用的是Ubuntu 20.04加Foxy驱动也能跑但部分依赖包的版本会对不上需要手动降级一些库比较折腾。Ubuntu 24.04加Jazzy理论上可行但Livox驱动更新没那么快我实测编译时会报一些C标准相关的错误需要改CMakeLists里的编译选项。ROS2的安装方式我推荐用apt方式也就是官方文档里那套流程。有人喜欢用一键安装脚本确实省事但脚本帮你做的事情你不清楚后面出问题排查起来很被动。apt安装虽然步骤多一点但每一步你都清楚装了什么、装到哪里去了。安装完ROS2之后确认几个基础工具都在# 检查ROS2环境 printenv | grep ROS # 应该能看到ROS_DISTROhumble、ROS_VERSION2等 # 确认colcon构建工具 colcon version-check # 确认rosdep sudo rosdep init rosdep updaterosdep这一步很多人会卡住报网络相关的错误。我的经验是换个时间段多试几次或者检查/etc/hosts里有没有异常的域名映射。这个问题没有特别好的技术解法就是网络环境的事。2.2 Livox SDK和ROS2驱动的安装顺序这是第一个大坑。Livox的ROS2驱动依赖Livox SDK2而SDK2和SDK1的API完全不兼容。网上很多教程还在讲SDK1的安装方法你照着做编译驱动的时候就会报一堆找不到头文件的错误。正确的顺序是先装Livox SDK2再装livox_ros_driver2。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装完之后确认一下库文件位置ls /usr/local/lib/liblivox* # 应该能看到liblivox_sdk2.a或.so然后是驱动。注意分支选择livox_ros_driver2的master分支是给ROS2用的但你要确认它支持Humble。我用的版本是驱动仓库里标注支持Humble的那个tag。克隆下来之后不要急着编译先改一个地方git clone https://github.com/Livox-SDK/livox_ros_driver2.git cd livox_ros_driver2打开package.xml确认里面的依赖项和你的ROS2版本匹配。然后打开CMakeLists.txt找到find_package(rosidl_default_generators REQUIRED)这一行附近确认消息生成的部分没有问题。我第一次编译时报错说找不到livox_ros_driver2/msg/CustomMsg原因就是消息生成没有正确配置。编译命令source /opt/ros/humble/setup.bash colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPERelease--symlink-install这个参数建议加上后面你改配置文件的时候不用重新编译。-DCMAKE_BUILD_TYPERelease也很重要Debug模式下点云处理的性能会差很多实时性跟不上。注意如果你之前装过ROS1版本的Livox驱动一定要确认环境变量里没有残留的ROS1路径。printenv | grep ROS检查一下如果有ROS_DISTROnoetic之类的先清理掉再编译。2.3 网络配置和雷达连接Livox-Mid-360通过网线连接出厂默认IP是192.168.1.1XX网段。你的电脑网口需要配一个同网段的静态IP。我用的是192.168.1.50子网掩码255.255.255.0。在Ubuntu的网络设置里配置静态IP或者用命令行# 查看网口名称通常是enp3s0或eth0 ip link show # 配置静态IP临时生效重启后丢失 sudo ip addr add 192.168.1.50/24 dev enp3s0 sudo ip link set enp3s0 up配好之后ping一下雷达ping 192.168.1.1XX能ping通说明物理连接没问题。ping不通的话检查网线、网口指示灯、防火墙设置。Ubuntu默认的ufw如果开着可能会拦截先关掉测试sudo ufw disable3. 驱动配置与点云数据获取的实操细节3.1 配置文件里那几个必须改的参数livox_ros_driver2的配置文件在config/目录下有MID360_config.json。这个文件决定了雷达怎么工作、数据怎么发布。我逐项说一下关键参数。lidar_configs下面的ip字段要填雷达的实际IP。data_src填1表示从雷达实时获取数据填0表示从文件回放。publish_freq是点云发布频率Mid-360支持最高10Hz但实际用的时候要看你的计算平台能不能处理过来。我在一台i7-10700的机器上跑10Hz没问题但在Jetson Orin Nano上跑10Hz就有点吃力降到5Hz才稳定。frame_id这个参数很重要它决定了点云在ROS2里的坐标系名称。我习惯用livox_frame和URDF里的link名称保持一致。如果你后面要做多传感器融合这个frame_id要和TF树里的对应上。xfer_format决定点云的消息类型。填0是PointCloud2格式这是ROS2的标准格式RViz2可以直接显示也是我推荐的。填1是Livox自定义的CustomMsg格式数据更紧凑但需要额外的转换才能给其他包用。新手直接用0。{ lidar_configs: [ { ip: 192.168.1.1XX, publish_freq: 10.0, frame_id: livox_frame, xfer_format: 0 } ] }改完配置文件后如果你编译时加了--symlink-install直接重新source一下就行。否则要重新colcon build。3.2 启动驱动并验证点云数据启动命令source install/setup.bash ros2 launch livox_ros_driver2 rviz_MID360_launch.py这个launch文件会同时启动驱动和RViz2。如果一切正常RViz2里应该能看到点云。但第一次大概率不会这么顺利。常见的情况是RViz2里Fixed Frame显示红色点云不显示。原因通常是frame_id不匹配。在RViz2左侧的Displays面板里把Fixed Frame改成livox_frame点云就出来了。如果点云出来了但很稀疏检查publish_freq是不是设得太低或者雷达镜头前面有遮挡物。Mid-360的视场角是360度水平、59度垂直但安装位置如果太靠近车身会有盲区。用命令行验证话题ros2 topic list # 应该能看到/livox/lidar和/livox/imu ros2 topic hz /livox/lidar # 应该显示接近10Hz的频率 ros2 topic echo /livox/lidar --once # 查看一帧数据的字段结构IMU数据也很重要后面做点云去畸变会用到。Mid-360内置IMU数据通过/livox/imu话题发布。确认一下频率应该是200Hz。3.3 时间同步一个容易被忽略但影响很大的问题Livox-Mid-360支持多种时间同步方式。默认情况下它使用自己的内部时钟。如果你的系统里只有一个雷达问题不大。但如果你要做多雷达拼接或者和相机做融合时间不同步会导致点云错位。我推荐用PTP或者GPS同步。PTP需要你的网络交换机支持配置起来稍微复杂。GPS同步需要额外的硬件模块。对于单雷达建图的场景用雷达内部时钟就够了但要在驱动配置里把timestamp_type设对。在MID360_config.json里timestamp_type填0表示用雷达内部时钟填1表示用主机时间。我实测下来单雷达建图用0就行点云内部的时间一致性有保证。提示如果你发现建出来的地图有明显的重影或者拖尾时间同步是第一个要排查的方向。4. 点云拼接与地图构建的完整流程4.1 坐标系配置与TF树搭建点云拼接的核心是把不同时刻的雷达坐标系变换到同一个世界坐标系下。这需要两样东西雷达的位姿估计以及TF变换。位姿估计我用的是LIO-SAM或者FAST-LIO2。这两个都是激光惯性里程计方案输入是点云和IMU输出是雷达的实时位姿。FAST-LIO2的计算量更小适合嵌入式平台LIO-SAM的建图精度更高适合离线建图。以FAST-LIO2为例安装和配置git clone https://github.com/hku-mars/FAST_LIO.git cd FAST_LIO git checkout ROS2 colcon build --symlink-installFAST-LIO2的配置文件在config/目录下需要改几个地方。lid_topic改成/livox/lidarimu_topic改成/livox/imu。extrinsic_T和extrinsic_R是雷达和IMU之间的外参Mid-360的IMU和雷达是集成的外参可以设为零向量和单位矩阵。启动FAST-LIO2ros2 launch fast_lio mapping.launch.py如果配置正确RViz2里会看到点云随着雷达移动而拼接形成地图。4.2 点云降采样与滤波处理原始点云数据量很大Mid-360每秒产生约20万个点。直接拿去做建图内存和CPU都吃不消。必须做降采样。我常用的降采样方法是体素栅格滤波用PCL库实现。体素大小设0.1米到0.2米之间根据你的场景尺度调整。室内小场景用0.05米室外大场景用0.2米。import pcl # 读取点云 cloud pcl.load(raw_cloud.pcd) # 体素降采样 vg cloud.make_voxel_grid_filter() vg.set_leaf_size(0.1, 0.1, 0.1) cloud_filtered vg.filter() # 保存 pcl.save(cloud_filtered, downsampled_cloud.pcd)除了降采样还要做离群点去除。用统计滤波或者半径滤波去掉那些孤立的噪点。统计滤波的参数是邻居数量和标准差倍数我一般设50个邻居、1.0倍标准差。# 统计滤波 sor cloud_filtered.make_statistical_outlier_filter() sor.set_mean_k(50) sor.set_std_dev_mul_thresh(1.0) cloud_inliers sor.filter()4.3 地图保存与格式转换建图完成后需要把点云保存成文件。ROS2里用pcl_ros的pcd_to_pointcloud和pointcloud_to_pcd工具或者直接写一个保存节点。我习惯用命令行保存ros2 run pcl_ros pointcloud_to_pcd input:/cloud_registered这个命令会把每一帧点云保存成单独的pcd文件。如果要把所有帧合并成一个完整的pcd需要写一个简单的Python脚本import open3d as o3d import glob # 读取所有pcd文件 files sorted(glob.glob(*.pcd)) clouds [o3d.io.read_point_cloud(f) for f in files] # 合并 merged o3d.geometry.PointCloud() for c in clouds: merged c # 降采样 merged merged.voxel_down_sample(voxel_size0.1) # 保存 o3d.io.write_point_cloud(merged_map.pcd, merged)保存成pcd之后可以用CloudCompare或者Open3D查看。如果要给导航用还需要转成八叉树地图格式用octomap_server或者nav2_costmap_2d的插件。5. 常见报错与避坑经验实录5.1 编译驱动时的典型错误错误一找不到livox_sdk2的头文件fatal error: livox_sdk2/livox_sdk.h: No such file or directory原因Livox SDK2没有正确安装或者安装路径不在编译器的搜索路径里。解决方法是确认/usr/local/include/livox_sdk2/目录存在如果不存在重新编译安装SDK2。如果存在但还是报错在CMakeLists.txt里手动加include路径include_directories(/usr/local/include) link_directories(/usr/local/lib)错误二rosidl生成消息失败error: livox_ros_driver2/msg/custom_msg.hpp file not found原因消息生成没有正确配置。检查package.xml里有没有rosidl_default_generators和rosidl_default_runtime的依赖CMakeLists.txt里有没有rosidl_generate_interfaces的调用。如果都有尝试清理build目录重新编译rm -rf build install log colcon build --symlink-install错误三运行时找不到动态库error while loading shared libraries: liblivox_sdk2.so: cannot open shared object file原因动态库路径没有加到系统配置里。解决方法sudo sh -c echo /usr/local/lib /etc/ld.so.conf.d/livox.conf sudo ldconfig5.2 点云显示异常的排查思路现象一RViz2里点云闪烁或者跳动通常是时间戳问题。检查驱动配置里的timestamp_type确保和你的使用场景匹配。另外检查系统时间是否准确用date命令看一下如果偏差太大用sudo ntpdate同步一下。现象二点云颜色异常或者全是白色PointCloud2格式的点云默认没有颜色信息RViz2里显示为白色是正常的。如果你想要按高度着色在RViz2的PointCloud2显示设置里把Color Transformer改成AxisColor选Z轴。现象三点云密度不均匀Mid-360的非重复扫描模式导致近处点密、远处点疏这是正常现象。如果觉得远处点太少可以降低publish_freq让每帧累积更多点。或者用多帧叠加的方式增加密度。5.3 建图过程中的性能优化FAST-LIO2在建图时如果场景很大内存占用会持续增长。我遇到过跑了一个小时后内存爆掉的情况。解决方法是在配置文件里限制局部地图的大小# FAST_LIO config max_iteration: 3 cube_side_length: 200.0 # 局部地图边长单位米cube_side_length设小一点比如100米内存占用会明显下降。但太小的话回环检测会受影响。根据你的场景尺度调整。另一个优化点是降采样。在FAST-LIO2的配置里filter_size_surf和filter_size_map分别控制输入点云和地图点云的降采样体素大小。我一般设0.2和0.4平衡精度和性能。注意降采样体素设得太大地图细节会丢失导航的时候可能会撞到小障碍物。室内场景建议不超过0.2米。5.4 常见问题速查表问题现象可能原因解决方法驱动编译报错找不到SDKSDK2未安装或路径不对重新安装SDK2检查include路径RViz2不显示点云frame_id不匹配修改Fixed Frame为livox_frame点云频率低于预期publish_freq设置过低改为10Hz检查网络带宽建图重影时间同步问题检查timestamp_type同步系统时间内存持续增长局部地图无限制设置cube_side_length限制范围点云稀疏降采样过度减小体素大小或降低publish_freqIMU数据缺失驱动配置错误检查imu_topic和配置文件地图保存失败磁盘空间不足清理空间或分块保存6. 从建图到导航的延伸思考建好3D点云地图只是第一步。如果你要做自主导航还需要把点云地图转成导航用的格式。ROS2的Nav2栈支持多种地图格式最常用的是占据栅格地图和八叉树地图。占据栅格地图是2D的把3D点云投影到地面平面标记每个栅格的占据状态。优点是计算量小适合平面移动机器人。缺点是丢失了高度信息无法处理悬空障碍物。八叉树地图是3D的用递归的八叉树结构存储空间占据概率。优点是内存效率高能表示任意形状的障碍物。缺点是计算量比2D栅格大。我一般用八叉树地图做全局规划用局部代价地图做实时避障。octomap_server可以把点云转成八叉树地图ros2 run octomap_server octomap_server_node --ros-args -p resolution:0.1 -p frame_id:mapresolution是八叉树的分辨率0.1米适合室内场景。frame_id要和你的TF树里的map坐标系一致。导航参数调优是另一个大话题涉及代价地图的膨胀半径、规划器的选择、控制器的参数等等。这部分我后面会单独写一篇今天先把建图这条链路走通。最后分享一个我踩过的坑建图的时候一定要确保雷达安装牢固。我有一次雷达支架没拧紧建出来的地图全是波浪形的排查了半天才发现是机械振动导致的。这种问题从数据上很难看出来但地图质量会明显下降。所以硬件安装的可靠性永远是第一位的。
返回列表