ARTICLE DETAIL

资讯详情

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

MID360激光雷达室内快速定位与建图实战:Fast-LIO全流程拆解

MID360激光雷达室内快速定位与建图实战:Fast-LIO全流程拆解 去年冬天我把MID360架在一台自制双轮差速底盘上在机房走廊里来回跑了十几圈。整个过程中没有RTK、没有GPS也没有外部视觉标识系统就靠一颗雷达加上一块不怎么新的工控板在完全封闭的室内环境里输出了稳定可重复的定位轨迹同时还把走廊、办公室门口、拐角结构全部建成了点云地图。今天把整套“MID360室内快速定位”方案从头到尾拆一遍包括硬件选型、驱动配置、Fast-LIO建图、地图质量评估以及我在真实环境下踩过的一堆坑。先说清楚这套东西适合谁如果你手里正好有一颗MID360想在室内环境做一个能实时定位和建图的机器人底盘或者手持SLAM设备或者你刚入手这颗雷达想知道从零开始怎么把它跑起来再或者你已经在用其他雷达做定位想对比一下换到MID360后流程有什么差异——这篇文章都能给你一个完整的参考路径。文中涉及的所有操作我都按实际跑通的版本记录不是纸面推演。1. 为什么室内定位要选MID360项目思路是怎么定的1.1 室内定位难在哪室内定位的核心难点在于“没有卫星信号也没有稳定的外部参考”。GPS信号在室内基本是废的基站定位精度太粗WiFi/蓝牙指纹方案需要提前采集环境数据而且一旦环境变化就得重新采集。对于移动机器人或者需要实时知道自己位置的设备来说激光雷达SLAM几乎是最省心的选择雷达自己测量周围环境的几何信息算法通过帧间匹配推算自身位姿变化不依赖任何外部基础设施。但室内环境对激光雷达本身有额外要求。普通的单线雷达只能扫一个平面机器人遇到楼梯、斜坡、层高变化时就容易丢失参考同时室内走廊、办公室这种场景特征重复度过高雷达如果视场角太小或者点云密度不够帧间匹配就容易退化。这也是我最终选择MID360作为核心传感器的原因。1.2 MID360这颗雷达到底强在哪MID360是Livox推出的一款非重复扫描固态雷达核心参数上非常贴合室内场景360度水平视场角垂直方向视场角59度-7度到52度单颗雷达就能覆盖机器人四周和上方空间量程最远40米对室内几十米尺度的走廊、大厅完全够用量测精度在20米处大约2厘米重复定位精度可以到1厘米左右非重复扫描模式让点云在很短的积分时间内就能铺满视场角对动态场景和快速旋转非常友好重量大约265克体积小放在小车底盘上几乎不占空间。当初我在选型时对比过单线雷达加IMU的方案也对比过普通16线机械雷达。单线雷达的问题前面说了垂直方向看不到东西在室内一旦有坡道或者机器人点头匹配很容易挂掉16线机械雷达虽然垂直方向有视场角但机械旋转结构在长时间运行后有磨损风险点云帧率也受转速限制且价格高不少。MID360作为固态雷达没有旋转电机可靠性好垂直视场又比大多数机械雷达大很多非常契合室内机器人的使用方式。1.3 定位建图方案选型Fast-LIO、FAST_LIO_LC、LIO-SAM怎么选雷达硬件确定后算法选型是第二个关键决策。目前主流方案主要有三个Fast-LIO、LIO-SAM、FAST_LIO_LC以及R3LIVE等变体。给个对比方案核心思路优势劣势Fast-LIO迭代卡尔曼滤波紧耦合雷达与IMU轻量、算力要求低、室内小场景稳定无回环检测长时间大场景有累计漂移LIO-SAM因子图优化雷达/IMU/GPS多源紧耦合大场景全局一致性好有回环能力配置复杂算力开销大嵌入式上容易掉帧FAST_LIO_LC在Fast-LIO基础上加入增量回环检测与全局优化兼顾轻量和大场景一致性比Fast-LIO多依赖一些第三方库编译稍麻烦我的判断很简单室内定位第一诉求是“实时、低延迟、稳定不丢”而不是“全局地图最漂亮”。Fast-LIO在这三个里最轻单核CPU负载都不高算力预算紧张的底盘也能跑短时间室内定位的累计漂移基本可控。如果你需要在比较大的室内空间比如整层办公楼、地下车库长时间建图很在意地图首尾闭合那就用FAST_LIO_LC它是在Fast-LIO地基上加了回环优化同门师兄弟思路后续切换成本也不大。LIO-SAM当然也很好但对多数只做室内定位的开发者来说配置成本偏高我一般不建议作为第一套方案往机器上塞。方案定下来之后整个项目的主线就清楚了MID360作为主传感器点云输入IMU作为运动预测和退化场景兜底Fast-LIO负责实时解算位姿再把过程中不断更新的局部地图转成完整点云地图做后续使用。下面按实际动手顺序逐步说。2. 硬件准备与驱动调试先把设备整明白再谈算法2.1 完整硬件清单与连接方式硬件不复杂但别在这块省事。我实际用的清单MID360雷达一台支持ROS的工控机或者Mini PC我用的是一块Intel第8代i5的小主机16G内存没有独立显卡9轴IMU我用的是机器底盘自带的一个IMU模组型号是BMI088直接通过串口接入工控机供电MID360的供电范围是5V到24V我直接用了底盘上24V转5V的DCDC模块单独给雷达供电避免和电机驱动共地干扰网络MID360通过以太网口输出点云需要配置好静态IP地址与雷达通信。接线顺序上有个细节雷达和工控机之间最好用独立网口直连不要和底盘上其他设备混在一个交换机上。我一开始图省事把所有设备都接在同一个百兆交换机上结果点云出现周期性丢帧排查到最后才发现是广播流量冲击导致雷达数据UDP丢包。MID360的点云数据量并不大但这颗雷达的UDP协议设计需要稳定的接收端丢包多了Fast-LIO的前端里程计会明显抖动。后来改成雷达直连工控机网口问题立刻消失。2.2 安装雷达驱动并验证点云质量驱动安装是第一步。Livox官方给了两个ROS驱动包livox_ros_driver和livox_ros_driver2。旧版本用在ROS1上非常成熟新版本支持ROS2也带时间同步等功能。我用的是ROS1环境所以直接用了livox_ros_driver2的ROS1分支或者你也可以直接用官方推荐的配置。安装完驱动后先做一件没有算法参与的“裸点云验证”打开RViz添加PointCloud2话题话题名一般是/livox/lidar你应当能直接看到动态的360度点云。这一步非常关键它能帮你确认整个链路是否通畅。怎么判断点云质量是否正常雷达放在桌面RViz里应能看到平整的桌面平面和周围的墙体快速转动雷达或移动雷达点云应跟随运动呈现合理位移不应出现大量拖影在距离墙体2米左右时墙面的点云厚度噪声应明显小于10厘米如果点云厚度过大说明点云时间戳或雷达本身有异常需要先解决再继续。这里我给一个建议验证时请正对几面白墙或玻璃附近走动。MID360在纯白墙和玻璃上的点云会有一定反射损耗但如果点云完全丢失大面积区域多半不是雷达的问题而是激光打到了太远的发射区或者雷达安装高度与视场角不匹配。把雷达装在40厘米高度、向前倾斜5到10度一般室内的墙面、桌椅腿都能覆盖到这个装法后面建图最舒服。2.3 传感器标定与外参确定Fast-LIO是雷达和IMU紧耦合的里程计雷达和IMU之间的外参矩阵是否准确直接影响定位精度。拿远近距离扫描同一个墙面来感受一下外参偏差一点点融合出来的轨迹可能就会在高速旋转时飘出去相当远的距离。具体做法是先确定雷达在世界坐标下的安装姿态。我习惯把雷达坐标系定义为X轴朝向车体前方Z轴朝上Y轴按右手定则指向左侧。这样和大多数移动机器人底盘的习惯一致后面的控制接口也省心。量出IMU与雷达之间的三个平移量x、y、z单位是米实测用卡尺就能测误差控制在5毫米以内就行Fast-LIO对外参平移误差容忍度较高。旋转外参确保IMU与雷达的三个轴方向尽量一致。安装结构设计时注意把IMU放得正一点或者设计固定垫块来校准角度旋转外参误差超过2到3度时融合结果会明显退化。如果雷达与IMU之间的实际角度安装有偏差可以选择手动画一个旋转矩阵放进配置里也可以先小范围原地旋转采集一帧点云和IMU数据用软件标定工具计算。我建议前期先把结构装准软件标定后面再做。提示Fast-LIO内部用的是R_imu_lidar和t_imu_lidar两个参数。表示的是“从IMU坐标系变换到雷达坐标系”还是“从雷达坐标系变换到IMU坐标系”不同版本的仓库定义有差异。一定要看头文件里的注释或源码在修改之前先拿ROS的TF工具发布一个外参TF再用RViz叠加显示雷达点云和IMU原始坐标轴验证方向对不对避免方向反了导致前端一启动就发散。3. 用Fast-LIO跑通实时机载定位核心配置与启动流程3.1 代码下载与编译Fast-LIO的代码仓库在GitHub上原版是HKUST-MARL维护的FAST-LIO此外还有一个带回环检测的FAST_LIO_LC分支。这里以原版Fast-LIO为主线说明后面第4节再讲怎么切换到带回环的版本。编译环境我用的是Ubuntu 18.04 ROS Melodic你如果用Ubuntu 20.04 ROS Noetic也可以代码原生支持。编译前需要先安装依赖库livox_ros_driver并确保编译优先级正确# 创建ROS工作空间并克隆代码 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone https://github.com/Livox-SDK/livox_ros_driver2.git git clone https://github.com/hku-mars/FAST-LIO.git cd ~/catkin_ws catkin_make source devel/setup.bash如果你喜欢用catkin_tools用catkin build也可以。注意这两个包之间没有强依赖顺序但必须先让livox_ros_driver编译成功Fast-LIO的launch文件里会引用雷达的话题。3.2 配置文件关键参数逐项拆解Fast-LIO的配置集中在config/avia.yaml里虽然原装配置文件是给Avia写的但改成MID360也很容易。重点改这几个参数common: lid_topic: /livox/lidar imu_topic: /livox/imu time_sync_en: falselid_topic和imu_topic要和雷达驱动发布的话题一致。MID360本身虽然不带IMU但当你把IMU数据转发到其他话题时这里要填对。time_sync_en在室内简单场景先设成false等后面做更严格的多传感器融合时再开。preprocess: lidar_type: 1 scan_line: 4 blind: 0.5 max_range: 40.0lidar_type: 1表示接收Livox定制的点云格式这必须和雷达驱动匹配。scan_line是模拟的扫描线数对非重复扫描雷达来说不是真实线数配置里填4不会影响功能。blind是近距盲区半径0.5米以下点云会被滤掉避免雷达正下方杂散点干扰匹配。max_range设成40米室内足够设太大会让远处的动态点噪声混进前端。preprocess: point_filter_num: 6这个参数很关键代表每6个点才保留1个点参与运算。MID360满帧率输出时点云量约20万点每秒直接全量喂给Fast-LIO普通工控机会有点吃力。我实测在室内场景下point_filter_num6不但速度更快匹配结果反而更稳因为稀疏化后点云中的噪声点被部分滤掉了。如果你的CPU很强可以调到3或4但一般没有这个必要。IMU相关参数imu: acc_n: 0.01 gyr_n: 0.001 acc_w: 0.0001 gyr_w: 0.00001 imu_rate: 200这些是IMU噪声密度和零偏随机游走系数。不同IMU模组参数差异很大如果没有官方标称值可以先按上面这套典型配置起步之后用Allan方差分析工具精确标定。imu_rate必须和IMU实际发布频率一致否则时间戳对齐会出问题。我用的IMU发布频率是200Hz这里就写200。雷达与IMU外参lidar_imu_extrot: R: [1, 0, 0, 0, 1, 0, 0, 0, 1] T: [0, 0, 0]如果IMU和雷达严格同向安装且位置重合这个就是单位阵。实际不太可能完全重合按前面量出的平移量填进T即可。R先用单位阵如果初始化后发现静止时点云有旋转漂移再做标定更新。3.3 启动流程与实时轨迹验证配置改完后启动顺序很关键。我先开雷达驱动再开Fast-LIO# 终端1启动雷达驱动 roslaunch livox_ros_driver2 msg_MID360.launch # 终端2启动Fast-LIO roslaunch fast_lio mapping_avia.launch第一次启动Fast-LIO界面会打印点云接收信息、IMU接收信息。启动后先把雷达静止放在地面上几秒钟让前端完成初始化过程。然后缓慢推动底盘观察RViz里的当前点云/cloud_registered和雷达原始点云/livox/lidar是否重合。我的判断标准缓慢移动2到3米后当前点云与原始点云叠加显示应基本对齐若有明显错开则说明外参或IMU配置不对需要停下来排查不要继续往下走。如果前端显示轨迹平滑、没有明显跳变就说明基础定位链路已经通了。这时候把底盘推回起点RViz里轨迹终点与起点理论上应几乎重合误差在几十厘米以内算正常。室内快速移动时如果出现瞬间漂移大概率是“退化场景”导致的。Fast-LIO在前后端匹配时遇到很长的直走廊、纯白墙壁这种几何结构单一的环境激光匹配会退化位置估计沿走廊方向会产生漂移严重时会直接发散。这时候完全靠纯激光或纯视觉都没法根治我的经验是一是把雷达安装高度略微降低让桌椅腿等小结构进入视场角增加匹配特征二是在走廊两头放些纸箱作为临时特征三是后续引入回环检测用全局约束掉累积漂移。4. 快速建图与室内地图优化不仅要定位还要留下一张能用的图4.1 把Fast-LIO输出的局部地图保存成完整点云地图Fast-LIO跑起来后/cloud_registered话题会持续发布“注册到全局坐标系下的当前帧点云”。这就是一张活体地图你想在办公室实时看直接RViz订阅这个话题就能看出结构轮廓。但要用它做导航、避障或者展示肯定得把它保存成离线文件。有两种保存方式第一种是直接用ROS的rosbag record录一段/cloud_registered和/Odometry话题跑完后再离线拼接。这种方式简单可靠适合做验证和沉淀原始数据。缺点是bag文件很大后期处理费时间。第二种是在Fast-LIO仓库里跑一个自动保存节点比如有一些仓库里自带的cloud_msgs官方案例会在轨迹达到一定长度后自动把全局点云导出为PCD文件。我用的是改过的办法跑完之后用下面的命令把最近一帧全局点云保存下来rosservice call /aft_mapped_to_init这个服务会触发保存生成一个pcd文件。如果你需要更高精度的离线地图我建议在运动过程中多绕几圈让雷达从多个角度“看”同一个区域。点云地图只有在多次视角重叠时才会真正长得密集、均匀、无死角。4.2 地图质量评估怎么判断这张图能不能用保存完地图别急着放不到导航里。先做几个简单的质量检查直观检查墙面点云地图中的墙面应当平直厚度在10厘米以内。如果墙面是散的、厚度达到几十厘米说明定位轨迹有抖动或累积误差过大。检查地面是否平整。地面点云应形成一个平面如果出现波浪状起伏多半是雷达安装高度附近的地面反射不稳定或外参没校准准确。用卷尺做距离验证。在地图中选取两个明显特征点比如两个门框的角点在地图上测出距离再用卷尺实测。如果误差在10到20厘米以内说明整体尺度正确。我测过一层300平米的办公区用Fast-LIO跑出来的地图室内对角线的长度误差约在0.3米以内。这个精度用于导航路径规划完全没有问题。你要是苛求更高精度和闭环一致性那就得用FAST_LIO_LC这类带回环的方案。4.3 切换到FAST_LIO_LC开启回环优化室内长时间建图累计漂移是绕不开的问题。Fast-LIO没有回环模块闭环检测只靠匹配局部地图时间一长走廊尽头和起点之间就会出现视觉上能看出来的错位。我的做法是切到FAST_LIO_LC。FAST_LIO_LC是在Fast-LIO基础上加入了增量式回环检测与全局位姿图优化使用的依赖库主要是ikd-Tree一个增量KD树和GTSAM图优化库。编译的时候多装一个GTSAM就行sudo apt install libgtsam-dev启动方式和Fast-LIO几乎一样只是在config里多了回环相关参数。我的实际经验是当你绕一圈回到起点时RViz里的轨迹首尾会“啪”一下被拉入闭环地图重影显著减少。整个优化过程会稍微占用一定CPU但室内场景完全可以接受。我实测在同一层办公楼里跑了两圈FAST_LIO_LC建出的地图首尾错位从原来的约半米降到10厘米以内这对后续机器人在走廊里反复跑是很关键的。如果你的场景比较小比如一两间办公室Fast-LIO足够如果整个楼层或地下车库都要用直接上FAST_LIO_LC省得后面重做。5. 室内环境下的高频问题排查实录这一节挑几个我在实操中真正遇到过、也比较典型的问题展开。每一个都是踩过的坑不是网上复制来的经验。5.1 问题速查表现象可能原因排查方向RViz中没有点云网口IP没配好或雷达供电异常检查网口指示灯用ifconfig确认雷达IP能ping通点云有大量白色空洞雷达安装在低矮位置视场角内没有足够障碍物适当调高雷达安装高度或者把雷达倾斜安装建图时地图随时间向外膨胀IMU噪声参数设得太宽松导致IMU积分漂移没被雷达修正调小acc_n、gyr_n重新做IMU静止初始化快速转动时轨迹严重飘外参旋转量有误差或IMU与雷达时间同步有问题重新标定外参检查IMU发布时间戳是否乱跳地图首尾错位明显缺少回环累计漂移切换到FAST_LIO_LC或者运动时多走“8”字形点云频率低导致定位卡顿工控机性能不足或point_filter_num设置太小适当增大point_filter_num降采样更快雷达在白色墙面附近丢点数严重激光打到平滑白墙或玻璃上产生镜面反射靠近时减速增加其他方向的特征点或调整雷达倾角5.2 典型问题展开雷达丢点与退化场景第一个典型问题是“白墙丢点”。MID360是固态面阵雷达遇到全白、平滑的墙面部分激光能量无法有效反射回接收器点云会出现孔洞。这在室内非常常见。我一开始把雷达垂直朝前到了走廊白墙区域点云前方几乎空了Fast-LIO只能靠两侧墙壁匹配概率上还不至于发散但轨迹明显有横向抖动。解决方式是把雷达稍微向下倾斜5到10度让激光“看”到更多地面和墙面的连接线以及桌椅腿等立体结构。这个改动立竿见影前端匹配的有效点数量大幅上升。第二个典型问题是“直走廊退化”。一条笔直的走廊激光匹配在沿走廊方向几乎没有约束。我试验过在一条50米长的走廊里直行Fast-LIO的轨迹会相对真实路径明显弯曲或出现缓慢漂移末端位置误差可能达到1米以上。这个问题的本质是几何结构退化任何纯激光SLAM都会遇到但我们可以用运动规划来缓解转弯时故意走一个S形让雷达在不同角度扫到走廊两侧的房门、消防栓、灭火器箱等特征或者建图时在走廊中间放几个临时标志物比如纸箱。等地图生成后再删掉这些临时物体即可。回环检测是终极解法但前提是你得绕回起点。第三个典型问题是“外参标定不准的隐性症状”。它有迷惑性静止时点云和IMU似乎都对一移动就漂。这是因为外参旋转量误差在纯旋转或快速直线运动时才被显著放大。我一开始用单位阵跑小车直行时轨迹还算正常但一把遥控器打到底原地旋转轨迹立刻画出了一个半径逐渐增大的螺旋。短期内可以用point_filter_num和IMU噪声参数微调来压制但根本解决还是得用标定工具重新计算外参。建议在结构上做一个固定IMU与雷达相对位置的小支架而不是用双面胶随便粘这样标定一次后长时间不用动。6. 进一步扩展从单纯定位到可用的室内机器人系统定位建图做到这个程度可以说MID360的基础能力已经发挥出来了。但这套东西通常不是终点后面我做的事情还有几个方向给你参考。一个方向是接线上级导航。地图出来后用move_base之类的方式做路径规划需要把点云地图转成2D栅格地图或者3D代价地图。我通常用pcl把PCD地图按高度切片投影到二维栅格把高于地面一定高度的点标为障碍物低于某个高度的点忽略。这样机器人就能在地图上进行全局路径规划同时实时定位继续用Fast-LIO输出的话题就可以实现“已知地图环境下的室内自主移动”。另一个方向是轻量化部署。如果你的机器人是电池供电的小底盘CPU可能只是个四核ARM板。Fast-LIO这套方案在ARM上也能跑但要注意两点一是把point_filter_num调大让每帧参与匹配的点少一些二是把地图分辨率调低比如局部地图体素降采样到0.1米以上。我在一块瑞芯微RK3588板子上跑过帧率大概能稳定在8到10Hz室内低速移动完全够用。还有一个方向是多传感器融合把视觉相机加进来做更健壮的定位。MID360在无纹理墙面前也有激光点云但视觉可以提供颜色和纹理信息两者互补后能显著提升在动态环境里的鲁棒性。R3LIVE这套方案就是把雷、视、惯三者融合能实时渲染彩色点云地图。不过这套系统对算力要求更高不太适合低成本底盘得先评估好CPU和GPU余量再上。最后分享一个小技巧。如果你只做室内定位不要一味追求“地图多精细”先把定位稳定性和轨迹重复性调好。我刚开始总想把点云地图做得很密很漂亮调整各种降采样参数试图让墙更光滑后来发现这些工作对定位精度的帮助非常有限。先把外参标定准、把退化场景跑顺、把回环加进去这几步的收益远大于在地图后处理上抠细节。MID360本身精度很高只要前端稳定后面不管是定位还是建图都会自然好起来。
返回列表