ARTICLE DETAIL

资讯详情

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

ROS2接入Livox MID-360激光雷达:从驱动配置到Cartographer建图全攻略

ROS2接入Livox MID-360激光雷达:从驱动配置到Cartographer建图全攻略 在ROS2里把Livox MID-360激光雷达从驱动装上到跑通Cartographer建图并保存地图我前前后后折腾了差不多一周。这中间踩的坑不少尤其是IP配置、QoS匹配这两个环节官方文档默认你什么都懂社区帖子又大多是ROS1时代的写法所以哪怕你ROS2基础不错第一次接MID-360也容易卡住。这篇笔记就是我整理后的完整路径适合手里已经拿到MID-360、准备在ROS2环境里做点云采集或SLAM建图的开发者参考我用的是Ubuntu 22.04 ROS2 Humble但思路在20.04 Foxy上也一样。先说结论MID-360和ROS2这套组合放在室内轮式机器人、配送小车这类移动底盘上非常能打。360度水平视场角加上ROS2的节点化架构从数据采集、建图导航到后续接目标检测工作流都很顺。但集成过程确实有门槛主要卡在驱动编译、网络参数和中间件匹配三个地方。下面我就按从零到一的过程把这台雷达真正接进ROS2里。1. 先认识这台雷达MID-360不是传统的机械式激光雷达1.1 没有旋转电机凭什么做到360度视场传统机械雷达是靠电机带动激光头高速旋转把光束扫向四周所以机械结构磨损、震动、噪声都是长期痛点。MID-360是一个固态激光雷达内部没有旋转电机它靠多个激光收发模块在竖直方向排布再通过光学棱镜把光束折向不同方向从而实现视场覆盖水平方向做到了360度。刚开始我也怀疑过没有旋转机构怎么保证周围一圈都能照到实际上它的水平视场就是靠这种光学扫描结构撑起来的垂直视场则是59度覆盖范围在上下方向上相当充足。对移动机器人来说这意味着只需要把雷达往底盘上一装周围一整圈的环境信息都拿到了不需要额外加装多个雷达。机械雷达在移动机器人上还有个实际问题底盘震动会直接传导给旋转机构时间久了扫描精度会下降而且多线机械雷达成本普遍偏高。MID-360这种固态方案没有旋转磨损重量只有265克左右对整机功耗和重量预算都很友好。1.2 非重复扫描点云会越积越密这是MID-360最容易引起误解的参数。机械雷达每一帧扫描的角度是固定的同一个位置扫一百次点云分布基本不变。MID-360不一样它的光束路径在每帧之间会有微小偏转导致每一帧点云的采样位置都不同帧与帧之间的点在空间上是错开的。所以时间累积越长一个局部区域被填充的点就越多空间分辨率越高。熟悉SLAM的朋友应该已经意识到这个特性对建图是有利的。Cartographer在做扫描匹配时本质上是在一个时间窗口内把多帧点云累积起来再做配准MID-360的这种越积越密特性正好能让子图submap里的点云覆盖更完整。但反过来如果你做单帧目标检测就要有心理准备单帧点云可能比较稀疏一辆车不一定能完整描出来通常需要累积几帧后再送下游算法。1.3 关键参数一览我整理了一份常用参数表方便后面配置时对照参数项数值/说明水平视场角360度垂直视场角59度-7度到52度测量距离0.1米到40米10%反射率下点频最大约200,000点/秒帧率5Hz / 10Hz / 20Hz 可设置通信接口百兆以太网默认IP192.168.1.50防护等级IP67重量约265克还有一个容易忽略的点MID-360本身内置了IMU。这个IMU在建图时非常重要后面讲Cartographer配置时我会专门说明。很多人在ROS2里只订阅点云、不订阅IMU建图跑起来发现方向动不动就歪八成就是IMU没有参与优化。2. 环境准备Ubuntu 22.04与ROS2 Humble的选型与安装2.1 为什么是Humble而不是Foxy接触ROS2的新手常纠结版本。我的建议很直接新项目直接在Ubuntu 22.04上装ROS2 Humble。Humble是LTS版本官方支持周期到2027年Foxy已经停止维护了你学习的时候照着Foxy写代码过半年可能连官方二进制包都不好找没必要给自己挖坑。Livox官方驱动livox_ros_driver2同时支持Foxy和Humble但我在Humble上编译运行都很顺社区里关于Humble的提问也最多遇到问题更容易搜到答案。Ubuntu 20.04也可以装Humble但要自己从源码编译不少依赖新手没必要折腾直接上22.04最省事。2.2 官方二进制安装与社区一键脚本安装ROS2 Humble有两种主流方式。第一种是官方二进制安装先设置locale添加ROS2 apt源然后安装ros-humble-desktop。这里有一个容易踩的坑locale一定要支持UTF-8否则后面编译、运行可能遇到诡异的中文乱码或者工具链错误。# 设置localeUbuntu 22.04 下建议先执行 sudo apt update sudo apt install -y locales sudo locale-gen en_US en_US.UTF-8 update-locale LC_ALLen_US.UTF-8 LANGen_US.UTF-8 # 添加ROS2 apt源 sudo apt install -y curl gnupg lsb-release sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key \ -o /usr/share/keyrings/ros-archive-keyring.gpg echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu \ $(lsb_release -cs) main | sudo tee /etc/apt/sources.list.d/ros2.list /dev/null sudo apt update sudo apt install -y ros-humble-desktop echo source /opt/ros/humble/setup.bash ~/.bashrc source ~/.bashrc第二种方式是社区的一键安装脚本网上常说的鱼香ROS一键安装就属于这一类。这个脚本会自动配置源、安装ROS2和常用工具链对初学者很友好。不过我用过几次之后还是建议装完以后要自己知道环境变量、源文件在哪里不然后面colcon build报错你完全不知道去哪排查。一键脚本是一个很好的起点但不能替代你对系统的理解。2.3 装完以后先做三件事ROS2装好之后我建议你先别急着接雷达花十分钟确认几个基础能力验证环境变量和核心命令ros2 --help rviz2 --help编译工具链Humble自带colcon但最好手动确认一下sudo apt install -y python3-colcon-common-extensions python3-rosdep sudo rosdep init rosdep update先跑一下官方的小乌龟例子确认整个通信链路正常。这一步能排除大量环境问题免得你后面把ROS2安装问题误判成雷达驱动问题。提示如果你在终端里执行ros2命令提示command not found八成是source没有生效。确认~/.bashrc里有source /opt/ros/humble/setup.bash或者手动执行后再试。3. 驱动编译与网络配置把雷达先变成一台能出数据的设备3.1 拉取Livox_ROS_Driver2并编译Livox官方的驱动已经统一放在GitHub的Livox-SDK/Livox_ROS_Driver2仓库里注意是Driver2不是老的livox_ros_driver。第一代驱动主要用于MID-100等早期型号MID-360必须用Driver2。你把仓库clone下来放进ros2工作空间的src目录里编译即可。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 source install/setup.bash编译过程中驱动会自动拉取Livox SDK2的依赖如果你网络条件一般clone会比较慢可以用Gitee上的镜像仓库或者提前把依赖下载好。编译如果报缺少依赖用rosdep把这个工作空间里所有包依赖装一遍。cd ~/livox_ws rosdep install --from-paths src --ignore-src -r -y colcon build --symlink-install3.2 IP与广播码所有连接问题的源头这是新手最容易卡住的地方。MID-360本质上是一台网络设备点云数据通过以太网口输出默认IP是192.168.1.50。你的电脑必须和它处于同一个网段才能收到数据。先把有线网卡配成静态IP# 示例把网卡eth0配成192.168.1.5掩码255.255.255.0 sudo ip addr add 192.168.1.5/24 dev eth0 sudo ip link set eth0 up然后确认能ping通雷达ping 192.168.1.50如果ping不通先检查网线是不是直连电脑中间不要经过普通交换机有些交换机会过滤广播包导致雷达数据传不过来。再检查雷达是否已经通电MID-360需要单独供电供电不足时网口可能不工作。ping通之后还有一个很多人忽略的配置broadcast_code。每台MID-360都有一个唯一的广播码贴在雷达或者转换盒的标签上是类似3JEDL7K001XXXXX的一串字符。驱动默认的config文件里写的是示例码如果你不改成自己雷达的广播码驱动启动后会发现不了设备。配置文件在~/livox_ws/src/Livox_ROS_Driver2/config/livox_lidar_config.json打开后找到lidar_configs数组把broadcast_code改成你自己的。{ lidar_configs: [ { broadcast_code: 你的广播码, enable_high_sensitivity: true, lidar_ipaddr: 192.168.1.50, lidar_net_info: { host_ip: 192.168.1.5, port: 7500 } } ] }如果雷达的IP被人改过不在192.168.1.50可以用Livox Viewer官方上位机扫描局域网能搜到雷达后直接在上位机里改IP改完再回到配置里对应修改。提示我之前就栽在broadcast_code上折腾了一下午连不上设备日志一直报timeout。后来仔细看官方文档才知道这台雷达每台的广播码都不一样必须手动改。千万记得先核对这个字段。3.3 启动驱动并用rviz2验证配置完成后启动驱动ros2 launch livox_ros_driver2 msg_MID_360.launch.py另开一个终端先看看话题是否正常ros2 topic list ros2 topic hz /livox/lidar如果hz命令能持续输出点云频率说明驱动已经正常工作了。这时再开rviz2rviz2在rviz2里把Fixed Frame设为livox_frame然后添加PointCloud2插件话题选择/livox/lidar。如果你的网络配置和设备状态都没问题屏幕上应该能看到一圈点云这就意味着雷达已经正式接进ROS2了。4. 点云数据链路从话题到QoS的那些事4.1 数据流长这样驱动正常工作后你会在ROS2里看到几个核心话题/livox/lidar是点云主话题类型是sensor_msgs/msg/PointCloud2/livox/imu是内置IMU的数据话题。此外还有/livox/pointcloud等辅助话题不同版本命名略有差异以你实际看到的为准。理解这条数据链路对你后面写自己的节点很有帮助。点云数据从雷达网口进来经过驱动解析成ROS2消息发布到DDS总线上订阅节点通过不同的QoS策略接收。如果中间任何一环的QoS配置不匹配数据不会报错但就是收不到。4.2 QoS不匹配是有话题但看不到图的罪魁祸首很多人在rviz2里看到话题列表里有/livox/lidar以为数据通了结果怎么选中都不出点云问题几乎都在QoS上。ROS2的通信机制和ROS1有一个显著区别发布者和订阅者之间需要达成一种契约也就是QoS策略。发布端的策略和订阅端如果不兼容数据就不会被传过去。Livox驱动默认的发布QoS是RELIABLE可靠传输这意味着数据不丢包但是延迟会偏高。而rviz2创建订阅时默认的QoS策略有时候是KEEP_LAST DEPTH两者匹配不上表现就是静悄悄地不显示点云。解决办法有两个方向。一是在rviz2的PointCloud2显示插件属性里把QoS策略手动改为与发布端匹配。二是自己写订阅节点时显式指定QoS策略例如在Python节点里import rclpy from rclpy.node import Node from rclpy.qos import QoSProfile, ReliabilityPolicy from sensor_msgs.msg import PointCloud2 class LidarSub(Node): def __init__(self): super().__init__(lidar_sub) qos QoSProfile(depth10, reliabilityReliabilityPolicy.RELIABLE) self.sub self.create_subscription( PointCloud2, /livox/lidar, self.callback, qos) def callback(self, msg): self.get_logger().info(f收到点云宽度: {msg.width})提示激光雷达这种高频传感器理论上用BEST_EFFORT更流畅因为丢掉几帧对建图影响不大。但实际测试下来Cartographer这类SLAM算法为了不丢关键帧反而建议用RELIABLE。根据你的具体场景去试不要盲目套用别人的配置。4.3 时间戳、坐标系与IMU配合点云数据要正确显示还有一个容易忽略的问题时间戳和坐标系。在rviz2里Fixed Frame必须设成和点云消息头部frame_id一致的坐标系一般驱动会发livox_frame。如果设置成map或odom而你的TF树里又没有这些坐标系关系点云是显示不出来的。时间戳方面ROS2的消息头里带有一个时间戳它来自雷达驱动受系统时间影响。如果你发现点云和IMU时间戳差很多检查一下系统时间是否准确建议配置好NTP服务或者手动校时。另外MID-360内置的IMU在建图时几乎是必须用的。因为非重复扫描雷达的每一帧点云里都夹杂着雷达自身运动造成的畸变Cartographer会利用IMU数据估算运动来补偿这种畸变。所以做SLAM时别忘了把/livox/imu话题也发给Cartographer。5. 建图实战接入Cartographer并保存地图5.1 为什么选Cartographer在ROS2里做建图可选方案很多比如slam_toolbox、Cartographer、Nav2自带的mapper等。slam_toolbox对2D激光雷达友好但没有IMU配合时会飘得厉害。Cartographer是Google开源的一套SLAM库它能够把激光点云投影到2D平面用子图做局部位姿优化同时引入IMU做重力对齐和运动补偿和MID-360这种3D点云内置IMU的组合非常搭。另一个原因是社区资料足够多。你在网上搜ros2 cartographer 激光雷达建图能找到大量讨论虽然很多是ROS1时代的但核心思路相通排查问题时有参考。5.2 编译cartographer_ros的ROS2分支Cartographer在ROS2环境下的编译比普通包要复杂一些因为它依赖ceres-solver、protobuf、abseil等一堆库。把cartographer和cartographer_ros的ROS2分支代码放到src目录下cd ~/livox_ws/src git clone https://github.com/ros2/cartographer.git git clone https://github.com/ros2/cartographer_ros.git cd ~/livox_ws rosdep install --from-paths src --ignore-src -r -y colcon build --symlink-install如果编译过程中报ceres相关错误多半是依赖版本冲突可以先把系统里的ceres卸掉让rosdep重新装合适版本。5.3 用pointcloud_to_laserscan把3D点云变成2D激光Cartographer的2D建图接口默认接收的是LaserScan或者经过投影后的点云。MID-360输出的是3D PointCloud2需要先把点云投影成2D激光数据。社区常用的工具是pointcloud_to_laserscan它是一个ROS2功能包作用是把一定高度范围内的点云投影到水平面上生成LaserScan消息。我这里简单写一个launch片段思路先启动livox驱动再启动pointcloud_to_laserscan把/livox/lidar转换成/scan最后启动cartographer节点订阅/scan和/livox/imu。投影时有一个小技巧高度范围不要设太大通常取雷达平面上方一点到下方一点之间比如target_frame设为base_linkmin_height取-0.2max_height取0.2这样能过滤掉地面点减少建图噪声。5.4 Lua配置要点面向MID-360的关键参数Cartographer的核心配置在lua文件里。你打开cartographer_ros的配置文件模板重点修改这几个参数。tracking_frame要设成雷达坐标系livox_framepublished_frame设成base_linkmap_frame设成mapodom_frame设成odom。provide_odom_frame通常设为true让Cartographer发布map到odom的变换。use_odometry建议设为false因为MID-360没有轮式里程计同时IMU数据是主要运动源。num_range_data这个参数可以适当调大比如设置成100到200让Cartographer在每一段子图里累积更多帧点云正好发挥MID-360非重复扫描的优势。min_range和max_range根据实际环境设置。MID-360最近能测到0.1米但过近的点通常有噪声建议min_range设0.2或0.5max_range设20米左右就够室内用了设太大反而会把远处的干扰点纳入匹配。options { map_builder MAP_BUILDER, trajectory_builder TRAJECTORY_BUILDER, map_frame map, tracking_frame livox_frame, published_frame base_link, odom_frame odom, provide_odom_frame true, publish_frame_projected_to_2d true, use_odometry false, num_laser_scans 1, num_subdivisions_per_laser_scan 1, num_point_clouds 0, ... }不同版本lua字段名略有差异以你clone下来的模板为基础修改。关键是把tracking_frame、published_frame对齐你的TF树。5.5 跑建图与保存地图启动顺序建议这样先启动livox驱动确认/livox/lidar和/livox/imu有数据再启动pointcloud_to_laserscan确认/scan有数据最后启动cartographer节点打开rviz2观察建图效果。# 终端1 ros2 launch livox_ros_driver2 msg_MID_360.launch.py # 终端2 ros2 launch pointcloud_to_laserscan pointcloud_to_laserscan.launch.py # 终端3 ros2 launch cartographer_ros my_mid360.launch.py建图完成后保存地图一般是把Cartographer的pbstream文件转成pgm和yaml。注意ROS2环境下的运行方式ros2 run cartographer_ros cartographer_pbstream_to_ros_map \ -pbstream_filename map.pbstream \ -resolution 0.05执行后会生成map.pgm和map.yaml。这两个文件是后续给nav2做导航用的标准地图格式。别忘了在建图过程中定期保存pbstream不然程序异常退出就白跑了。5.6 建图跑飘的原因排查热词里激光雷达建图飘出现频率很高我也遇到过。飘是一个现象直接原因是Cartographer的扫描匹配在某个方向上退化导致位姿估计漂移。常见原因有这么几类第一IMU没有参与优化。很多人只把点云接进Cartographer忽略了IMU。没有IMU做重力对齐机器人在楼道、长廊这种特征稀疏的场景旋转漂移几乎是必然的。第二运动畸变没有补偿。如果你推着底盘快速转动雷达一帧还没扫完位姿已经变了很多点云自然拉花。非重复扫描雷达对运动更敏感建议建图时推得慢一点尤其转弯时。第三坐标系和TF树配置不对。雷达坐标系、IMU坐标系、base_link之间如果缺少正确的静态变换Cartographer拿到的点云和IMU不在同一个世界坐标下地图就会错乱。第四max_range设太大。室外环境还好室内如果对着一面白墙或者玻璃窗远处噪声点会让匹配器发疯。把max_range限制在环境真实尺度范围内往往能立竿见影地改善。6. 高频问题速查表与避坑笔记6.1 排查思路总览接MID-360这套流程问题基本集中在三个层面网络层、驱动层、算法层。网络层出问题表现是ping不通设备、驱动找不到雷达驱动层出问题表现是话题有但没数据、rviz2看不到点云算法层出问题表现是建图飘、地图跳变。排查问题时按这个顺序来不要一上来就怀疑Cartographer参数。6.2 一张表说清楚常见问题我把实际踩坑整理成表格方便你对照排查现象直接原因处理动作ping不通192.168.1.50网口没配静态IP、供电不足直连网线配置静态IP单独供电驱动启动报timeoutbroadcast_code没改成自己的修改config文件里的广播码/livox/lidar话题有但rviz2看不到点云QoS不匹配把rviz2或自己订阅节点的QoS改为RELIABLE点云能显示但地图跑飘IMU没参与优化确认/livox/imu话题已被Cartographer订阅建图过程中地图突然平移扫描匹配失败检查环境特征、降低速度、调整max_range点云里有大量噪点雷达受干扰或反光物体调整min_range/max_range检查安装位置6.3 几条不写进文档的经验一是雷达需要预热。MID-360刚启动的前一分钟左右点云表现不稳定建图最好等雷达稳定了再开始否则前几张submap可能带病出道后面很难修正。二是供电一定要稳。MID-360对供电质量比较敏感我用过一个劣质DC-DC模块雷达时而断连时而正常排查了半天发现是电压波动。后来换成纹波小的电源问题立刻消失。三是colcon build之后记得source。开发过程改配置文件如果用了--symlink-install一般不用重新编译但如果改了C代码必须重新build。还有每次新开终端都要source install/setup.bash不然ros2 launch找不到包。四是如果你自己写订阅节点同时订阅点云和IMU建议用多线程回调组callback group避免一个回调阻塞另一个。ROS2默认是单线程执行器两个回调都放在同一个组里某个回调处理时间过长另一个就会卡住点云数据会越积越多。写在最后的一点体会整套流程跑通之后最大的感受是MID-360不是一台传统雷达你得习惯点云是动态累积的这个设定很多基于单帧点云的算法思路要调整。ROS2这边的核心门槛也不是驱动本身而是QoS、TF树、DDS通信这些新概念一旦理解了后续加目标检测、语义分割、八叉树地图这些扩展就顺理成章。我个人建议新手上路时先把点云能在rviz2里稳定显示当成第一个里程碑再考虑建图。很多人一上来就直奔Cartographer遇到问题反而不知道是雷达没接好还是SLAM参数不对。一步步来每个阶段都有明确的可验证结果效率反而最高。这套环境我目前还在持续用后续如果踩到新的坑再继续分享。
返回列表