ARTICLE DETAIL

资讯详情

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

Mid360激光雷达在ROS2中的配置与Nav2导航链路打通实录

Mid360激光雷达在ROS2中的配置与Nav2导航链路打通实录 1. 从一台Mid360说起为什么值得单独写一篇配置实录Mid360这台激光雷达在机器人圈子里火起来核心原因就一个它把原本要花大几万才能拿到的360度三维感知能力压到了普通开发者能承受的价位。我最早接触它是在一个室内巡检机器人项目上当时团队预算有限又需要一台能同时兼顾近距离盲区和远距离建图的雷达翻来覆去对比之后选了Mid360。结果拿到手第一天就卡住了——官方给的Livox Viewer 2在Ubuntu 20.04上跑不起来ROS2的驱动编译报了一堆错折腾了整整两天才把数据流打通。这段经历让我意识到Mid360的硬件本身没问题真正劝退新手的是软件链路Livox Viewer 2的安装、ROS2驱动的编译、坐标系配置、和Nav2的对接每一步都有坑。网上能找到的资料要么是ROS1时代的要么是零散的片段拼不起来一条完整的路。所以我把整个流程重新梳理了一遍从Livox Viewer 2的安装配置讲到ROS2导航链路打通把踩过的坑和验证过的参数都写下来。这篇内容适合三类人刚拿到Mid360不知道怎么下手的硬件玩家、正在用ROS2做机器人导航但雷达数据接不进来的开发者、以及想从ROS1迁移到ROS2但被驱动问题卡住的老手。不管你是哪一类只要跟着走一遍应该能少走我当初那两天的弯路。下面从整体设计思路开始拆。2. 整体方案设计与选型考量2.1 为什么是Mid360加ROS2这套组合先说雷达选型。Mid360的官方参数里最吸引人的是它的视场角水平360度垂直-7度到52度。这个垂直视场角很关键它意味着雷达不仅能扫到地面附近的障碍物还能覆盖到一定高度的空间对于导航来说低矮障碍和悬空障碍都能兼顾。测距范围在80米左右反射率80%条件下近距离盲区做到0.1米这个指标在室内外过渡场景里非常实用。再说ROS2。很多人会问ROS1用得好好的为什么要换ROS2。我的判断是如果你现在开始做一个新项目ROS2是更稳妥的选择。原因不在于ROS2本身有多完美而在于生态的迁移趋势已经很明显了Nav2的成熟度在快速提升DDS的通信机制在多机协作场景下比ROS1的TCPROS更灵活而且ROS2对实时性和生命周期的管理更规范。Mid360的官方驱动也同时提供了ROS1和ROS2版本但ROS2版本的维护频率明显更高。Ubuntu 20.04这个选择其实没太多可说的它是ROS2 Foxy的官方支持版本而Foxy是ROS2第一个长期支持版本社区资料最全。虽然现在Humble更流行但如果你手头的硬件平台或者依赖库锁死在20.04上Foxy依然是可靠的选择。2.2 软件链路的整体架构整个链路可以分成四层最底层是Mid360硬件通过网口输出点云数据第二层是Livox SDK负责和硬件通信把原始数据解析出来第三层是ROS2驱动把SDK的数据封装成ROS2的PointCloud2消息最上层是Nav2和RViz2做建图、定位和路径规划。Livox Viewer 2在这个架构里的位置比较特殊它不参与实际的导航链路而是一个独立的调试工具。它的作用是让你在不写一行代码的情况下快速验证雷达是否正常工作、点云质量如何、视场角覆盖是否符合预期。很多新手跳过这一步直接上ROS2驱动结果雷达没配好就开始调代码最后分不清是硬件问题还是软件问题。我的建议是先用Livox Viewer 2把雷达跑通确认硬件没问题再进入ROS2环节。2.3 网络配置这个容易被忽略的前置条件Mid360通过网口和主机通信默认IP是192.168.1.1XXXX是雷达序列号后两位。这意味着你的主机需要有一个同网段的IP地址比如192.168.1.50。这个配置看起来简单但实际操作的坑不少。第一个坑是网卡选择。如果你的主机有多个网口要确认雷达插在哪个网口上然后只配置那个网口。我见过有人把有线网卡和无线网卡都配成同一网段结果路由表混乱雷达数据时断时续。第二个坑是防火墙。Ubuntu默认的ufw防火墙可能会拦截雷达的UDP数据包建议在调试阶段先关闭防火墙确认链路通了再按需开放端口。注意Mid360的数据端口是UDP 56000到57000这个范围配置防火墙规则时要覆盖这个区间不要只开一个端口。3. Livox Viewer 2安装与配置实操3.1 下载与依赖安装Livox Viewer 2的官方下载页面提供了Linux版本的压缩包但直接解压运行大概率会报错因为它的运行依赖几个系统库。在Ubuntu 20.04上需要先安装这些依赖sudo apt update sudo apt install -y libusb-1.0-0-dev libgl1-mesa-glx libglu1-mesa libxi6 libxrandr2 libxinerama1 libxcursor1 libfontconfig1这些库里面libusb是雷达USB通信需要的虽然Mid360主要走网口但SDK里有些初始化流程会用到后面几个是Qt图形界面运行的基础库。我试过在纯净的Ubuntu 20.04上直接运行Viewer报错信息就是缺libGL和libXi装完这几个包就能起来了。下载Livox Viewer 2的压缩包之后解压到一个你习惯的目录比如~/livox。解压出来的文件夹里有一个LivoxViewer2.sh启动脚本但先别急着运行还需要给可执行文件加权限cd ~/livox/Livox_Viewer_2_Linux_v2.3.0 chmod x LivoxViewer2.sh chmod x LivoxViewer23.2 首次运行与雷达连接运行启动脚本./LivoxViewer2.sh如果一切正常你会看到Viewer的界面弹出来。这时候雷达还没连上界面是空的。点击左上角的“设备管理器”或者直接按快捷键Viewer会自动扫描同网段的雷达设备。如果扫描不到先检查三件事雷达是否上电Mid360的电源指示灯应该是常亮或者呼吸状态、网线是否插好、主机IP是否配在同网段。我遇到过一次扫描不到的情况排查了半天发现是网线的问题——用的是一根劣质网线能通但丢包严重Viewer的广播包发出去雷达收不到。换了一根屏蔽网线之后立刻就好了。所以如果你确认IP配置没问题但还是扫不到换根网线试试。连接成功后Viewer会开始显示点云。这时候你可以做几件事来验证雷达状态看点云密度是否均匀、转动雷达看视场角覆盖、观察远处物体的点云是否清晰。Mid360在10米距离上的点云密度大概能到每平方米几百个点如果明显稀疏可能是雷达的扫描模式设置有问题。3.3 关键参数配置与保存Livox Viewer 2里有一个“参数设置”面板里面几个参数对后续ROS2使用影响很大。第一个是“扫描模式”Mid360支持非重复扫描和重复扫描两种模式。非重复扫描的点云分布更均匀适合建图重复扫描的帧率更稳定适合实时避障。我的建议是建图阶段用非重复扫描导航阶段切到重复扫描。第二个是“回波模式”。Mid360支持单回波、双回波和三回波。双回波模式下雷达会同时记录最强回波和最后一次回波对于有玻璃或者反光物体的场景很有用。但双回波会降低点云频率如果你的应用对实时性要求高单回波就够了。第三个是“坐标系设置”。Viewer里可以设置雷达的安装角度这个设置不会影响雷达本身的输出但会影响Viewer里的显示。真正影响ROS2的是驱动里的外参配置这个后面会讲。配置完之后记得把参数导出保存。Viewer支持把配置存成JSON文件下次启动直接加载不用重新设一遍。实操心得Viewer里的点云显示颜色可以按距离或者按反射率来映射。按距离映射适合看整体覆盖范围按反射率映射适合看材质差异。调试的时候两种都试试能帮你快速判断雷达是否工作在正常状态。4. ROS2驱动编译与数据链路打通4.1 ROS2 Foxy环境准备如果你还没装ROS2先按官方文档装Foxy。这里不展开讲安装步骤但提醒一个容易出问题的地方Ubuntu 20.04的软件源里默认没有ROS2的包需要先添加ROS2的apt源和密钥。装完之后记得把source /opt/ros/foxy/setup.bash加到你的.bashrc里否则每次开新终端都要手动source。验证ROS2是否装好运行ros2 topic list如果能看到/parameter_events和/rosout两个话题说明ROS2环境正常。4.2 Livox ROS2驱动的编译Livox官方在GitHub上提供了livox_ros_driver2这个包支持ROS2。编译流程和普通的ROS2包差不多但有几个细节要注意。首先创建工作空间mkdir -p ~/livox_ws/src cd ~/livox_ws/src git clone https://github.com/Livox-SDK/livox_ros_driver2.git然后回到工作空间根目录编译cd ~/livox_ws colcon build --symlink-install这里有个坑livox_ros_driver2依赖Livox SDK2如果你系统里没装SDK2编译会报找不到头文件的错。解决办法是先装SDK2cd ~ git clone https://github.com/Livox-SDK/Livox-SDK2.git cd Livox-SDK2 mkdir build cd build cmake .. make -j$(nproc) sudo make install装完SDK2之后再编译ROS2驱动应该就能过了。如果还是报错检查一下livox_ros_driver2的CMakeLists.txt里有没有正确找到SDK2的路径。有时候SDK2装到了/usr/local下但CMake没搜到这个路径需要手动指定。4.3 配置文件的关键参数livox_ros_driver2的配置文件在config目录下有一个MID360_config.json。这个文件里有几个参数必须改对否则雷达数据出不来。第一个是lidar_ip填雷达的实际IP。Mid360的默认IP是192.168.1.1XXXX是序列号后两位你可以在雷达的标签上找到。第二个是host_ip填你主机的IP也就是和雷达同网段的那个地址。第三个是frame_id这个决定了点云在ROS2里的坐标系名称后面配Nav2的时候要用到建议设成livox_frame或者mid360_frame。还有一个参数是publish_freq控制点云发布频率。Mid360的最高频率是10Hz但实际用的时候不一定拉满。如果你的导航算法处理不过来10Hz的点云可以降到5Hz减少计算压力。配置改完之后运行驱动source ~/livox_ws/install/setup.bash ros2 launch livox_ros_driver2 rviz_MID360_launch.py如果一切正常RViz2会弹出来里面能看到点云。这时候用ros2 topic hz /livox/lidar看一下发布频率确认数据流稳定。4.4 点云数据格式与坐标系livox_ros_driver2默认发布的是自定义的CustomMsg格式不是标准的sensor_msgs/PointCloud2。这个设计是为了保留Mid360的非重复扫描特性但代价是很多ROS2工具不认这个格式。如果你要用Nav2或者octomap需要把CustomMsg转成PointCloud2。驱动里提供了一个xfer_format参数设成1的时候会发布标准PointCloud2设成0的时候发布CustomMsg。我的建议是如果你只是做建图和导航直接用PointCloud2格式兼容性更好。如果你要做一些依赖非重复扫描特性的算法再用CustomMsg。坐标系方面Mid360的默认坐标系原点在雷达中心X轴朝前Y轴朝左Z轴朝上。这个和ROS2的REP-103标准一致所以不需要额外旋转。但如果你把雷达倾斜安装了就需要在URDF或者静态TF里加一个旋转矩阵来补偿。5. 与Nav2导航链路的对接5.1 从点云到代价地图Nav2本身不直接消费点云它需要的是代价地图costmap。所以中间需要一个转换环节把PointCloud2转成LaserScan或者直接生成代价地图层。第一种方案是用pointcloud_to_laserscan包把三维点云压扁成二维激光扫描。这个方案的好处是计算量小Nav2的代价地图层直接就能用。缺点是丢失了高度信息悬空障碍物和地面障碍物分不清。如果你的机器人只在平坦地面上跑这个方案够用。第二种方案是用spatio_temporal_voxel_layer或者octomap_server把点云转成三维体素地图然后投影到代价地图上。这个方案保留了高度信息能区分不同高度的障碍物但计算量大对主机的性能有要求。我两个方案都试过。在室内巡检机器人上因为要检测低矮的台阶和悬空的管道最后用的是octomap方案。在另一个室外配送机器人上地面基本平坦用pointcloud_to_laserscan就够了CPU占用低很多。5.2 代价地图参数调优不管你用哪种方案代价地图的几个参数都需要根据Mid360的特性来调。第一个是obstacle_range这个决定了多远范围内的障碍物会被加入代价地图。Mid360的有效测距是80米但代价地图不需要这么远一般设成5到10米就够了太远反而增加计算负担。第二个是raytrace_range这个决定了多远范围内的空闲空间会被标记为可通行。这个值要比obstacle_range大一点一般设成obstacle_range的1.5倍左右。第三个是inflation_radius这个决定了障碍物膨胀的半径。Mid360的点云比较密膨胀半径设得太大会导致可通行区域被过度压缩。我的经验是根据机器人的实际尺寸来设一般比机器人半径大10到20厘米就够了。还有一个参数是observation_persistence控制障碍物在代价地图里保留多久。Mid360的点云有噪声偶尔会出现一些虚假障碍物如果observation_persistence设得太短这些噪声会频繁触发路径重规划。设成2到3秒比较合适。5.3 定位与建图的配合导航的前提是定位。Mid360本身不提供定位需要配合其他传感器或者算法。常见的方案有两种一种是Mid360加IMU做LIO激光惯性里程计比如Fast-LIO或者LIO-SAM另一种是Mid360加轮式里程计做scan matching。Fast-LIO是我用得比较多的方案它对Mid360的支持很好建图精度也够。但Fast-LIO输出的是里程计不是全局定位。如果要跑Nav2还需要一个全局定位模块比如AMCL或者用Fast-LIO的地图做重定位。这里有个细节要注意Fast-LIO的坐标系和Mid360的坐标系要对齐。Fast-LIO默认的frame_id是camera_init而Mid360驱动发布的是livox_frame。需要在TF树里把这两个坐标系连起来否则Nav2找不到机器人的位姿。6. 常见问题与排查技巧实录6.1 雷达连不上或数据断流这是最常见的问题排查顺序可以按这个表来现象可能原因排查方法Viewer扫描不到雷达网段不对检查主机IP是否在192.168.1.x网段Viewer扫描不到雷达网线问题换一根屏蔽网线试试Viewer能连但点云稀疏扫描模式设置检查是否误设成了低频率模式ROS2驱动收不到数据配置文件IP错误核对MID360_config.json里的IPROS2驱动收不到数据防火墙拦截临时关闭ufw测试数据时断时续网卡冲突确认只有一张网卡在同网段我遇到最诡异的一次是雷达能ping通Viewer也能连但ROS2驱动就是收不到数据。最后发现是host_ip填错了——我填的是无线网卡的IP但雷达插在有线网卡上。ROS2驱动绑定的是host_ip对应的网卡填错了就收不到UDP包。6.2 点云在RViz2里显示异常点云显示异常有几种表现点云全白、点云位置偏移、点云闪烁。全白通常是颜色映射的问题RViz2里把Color Transformer改成Intensity或者AxisColor就行。位置偏移一般是TF配置的问题检查frame_id和静态TF是否正确。闪烁多半是发布频率和RViz2的刷新率不匹配把RViz2的Decay Time调大一点能缓解。还有一个情况是点云只显示了一部分比如只看到前方180度。这个通常是雷达的视场角设置问题Mid360虽然标称360度但实际安装的时候如果被遮挡了或者雷达的扫描范围被软件限制了就会出现这种情况。在Viewer里确认一下视场角设置。6.3 编译驱动时的报错处理livox_ros_driver2编译报错主要集中在几个地方。一个是找不到livox_sdk2这个前面说了先装SDK2。另一个是PCL版本冲突Ubuntu 20.04默认的PCL是1.10但有些ROS2包依赖PCL 1.12混用的时候会报链接错误。解决办法是统一用系统自带的PCL不要手动装新版本。还有一个报错是cannot find -lLivoxSDK2这个通常是SDK2装完之后没有运行sudo ldconfig导致链接器找不到库文件。运行一下sudo ldconfig再编译就好了。避坑技巧编译之前先source /opt/ros/foxy/setup.bash确保ROS2的环境变量已经加载。我见过有人忘了source结果CMake找不到ROS2的包报了一堆莫名其妙的错。6.4 Nav2规划失败或路径抖动Nav2规划失败的原因很多和Mid360相关的通常是代价地图的问题。如果代价地图里障碍物太多可通行区域被压缩得太小规划器就找不到路径。这时候可以调大inflation_radius的负值部分或者降低obstacle_range减少障碍物的数量。路径抖动通常是定位不稳定导致的。Mid360的点云有噪声如果定位算法对噪声敏感机器人的位姿就会抖动导致路径频繁重规划。解决办法是给定位算法加滤波或者降低点云的发布频率减少噪声的影响。还有一个情况是机器人原地转圈这个通常是TF树的问题。检查一下map到odom的变换是否正常如果这个变换丢了Nav2就不知道机器人在哪只能原地转。7. 一些实测下来的经验参数最后分享几个我实测下来比较稳的参数组合供参考。Mid360的扫描模式建图阶段用非重复扫描publish_freq设5Hz导航阶段用重复扫描publish_freq设10Hz。代价地图的obstacle_range设6米raytrace_range设8米inflation_radius设0.3米针对半径0.2米的机器人。Fast-LIO的配置里lidar_type设成1对应Mid360scan_line设4blind_spot设0.1。这些参数在Fast-LIO的官方配置里都有说明但Mid360的scan_line容易填错填成6或者8都会导致建图异常。网络方面如果主机有多网卡建议把雷达所在的网卡设成静态IP并且在路由表里加一条规则让192.168.1.0/24的流量只走这张网卡。这样能避免数据包从其他网卡发出去。这套配置在我自己的机器人上跑了几个月建图和导航都稳定。当然每个项目的硬件和场景不一样参数需要根据实际情况微调。如果你在配置过程中遇到上面没提到的问题大概率是某个环节的细节没对齐按着链路一层层排查总能找到原因。
返回列表