ARTICLE DETAIL

资讯详情

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

Livox Mid-360与FAST-LIO2实战:从驱动编译到三维建图全攻略

Livox Mid-360与FAST-LIO2实战:从驱动编译到三维建图全攻略 说实话第一次拿到Livox Mid-360的时候我下意识以为把线接好、驱动装好FAST-LIO2就能直接跑起来。结果从编译报错、时间戳跳变到建图飘移前前后后折腾了将近两周把能踩的坑基本都踩了一遍。这篇文章就是把这些过程完整记录下来从硬件接线、驱动编译、参数配置到实际建图一步步说清楚同时把网上很少提到的那些细节和排查经验一并整理出来。废话不多说直接进入正题。内容以Ubuntu 20.04 ROS Noetic为例如果你是Ubuntu 18.04 ROS Melodic大部分操作也通用个别差异我会在对应位置标注出来。1. 整体思路与项目拆解1.1 这套系统到底在做什么FAST-LIO2是港大MaRS实验室开源的激光惯性里程计与建图系统核心思路是把激光雷达点云和IMU数据紧耦合在一起通过迭代扩展卡尔曼滤波估计位姿同时用增量式kd-tree维护全局地图。和第一代FAST-LIO比FAST-LIO2最关键的改动就是去掉了特征提取这一步直接对原始点云进行配准这样在退化场景走廊、长直墙下的鲁棒性会好很多代码结构也更简单。Livox Mid-360则是一款非重复扫描的固态激光雷达视场角约为360°水平×59°垂直量程40米左右同时内置了一个IMU。它采用棱镜扫描方式点云分布随时间逐渐覆盖整个视场不会像传统机械雷达那样形成固定圈层所以特别适合和FAST-LIO2这种直接配准原始点云的算法搭配。你只需要一个Mid-360雷达、一台装有Ubuntu的电脑就能跑出一个实时定位和三维建图的系统。不需要额外的GPS、不需要昂贵的计算平台——实测我用的是一台八代i5笔记本16G内存跑起来CPU占用大约在60%-80%之间还算流畅。1.2 为什么要用FAST-LIO2而不是其他SLAM方案很多朋友上来就会问现在不是有LIO-SAM、LVI-SAM、Point-LIO这些吗为什么偏偏选FAST-LIO2我的判断标准有三个。第一Mid-360是非重复扫描雷达LIO-SAM这类依赖特征提取的方案在特征点稀疏或者场景重复时容易出现退化FAST-LIO2直接对原始点云做配准可以最大程度发挥Mid-360非重复扫描的覆盖优势。第二FAST-LIO2的代码结构相对清爽依赖少编译难度低对新手来说更友好。第三它自带的初始化流程足够健壮不需要额外的松耦合初始化步骤——LIO-SAM通常需要用别的方案先估计初始位置FAST-LIO2插上电动一动雷达就能完成初始化。所以如果你手里正好有一台Mid-360FAST-LIO2基本是最省事、成功率最高的选择。当然如果你之后想做紧耦合的视觉融合LVI-SAM或者Fast-LIVO是更好的方向但那是后话了。1.3 模块划分与整体流程图解整套跑通流程可以分为四个阶段硬件准备与驱动环境包括Mid-360接线方式、Ubuntu系统准备、ROS安装、依赖库安装。驱动编译与雷达数据采集编译livox_ros_driver2确认能正常收到点云和IMU数据。FAST-LIO2源码编译与参数配置下载源码修改launch和yaml参数编译通过。实机运行与问题排查启动建图、评估效果、解决常见问题。这四个阶段是按顺序依赖的每一个阶段没做好后一步都会出幺蛾子。特别是驱动阶段很多人觉得不就是编译一下吗结果外参、时间戳、雷达坐标系搞错后面建图飘得一塌糊涂回头查问题才发现源头在驱动。所以我建议你按顺序来每一步都确认无误再做下一步能省很多折腾时间。2. 硬件准备与环境配置2.1 Mid-360接线与安装注意事项Mid-360的物理接口是航插配套的线缆有一根网线、一根电源线和一个同步信号线。如果你买的是原装套装电源适配器是12V/3A的网线直接接到电脑或者交换机上。这里有几个容易忽略的点雷达的网口默认IP是192.168.1.102子网掩码255.255.255.0。电脑的有线网口要手动设置成静态IP比如192.168.1.50网关可以不填也可以填192.168.1.1确保和雷达在同一个网段即可。如果你用笔记本连着Wi-Fi上网查资料的网卡和连接雷达的网卡要分开千万别把Wi-Fi网卡配置成192.168.1.x否则路由表会冲突。雷达安装时尽量让IMU的x轴指向雷达正前方y轴指向左方z轴朝上。虽然FAST-LIO2支持外参标定但初始外参给得越准系统启动后的收敛速度越快前期建图越不容易飘。供电方面别用手头随便找的充电头电流不够会导致雷达启动后频繁重启症状就是点云断断续续网口指示灯闪烁不停。把网线插好、电源接上、电脑的网卡IP配好之后先不要着急跑FAST-LIO2先打开浏览器访问192.168.1.102:80能看到雷达的网页管理界面说明硬件链路没问题了。这个检查只要30秒却可以帮你排除很多低级问题。2.2 Ubuntu和ROS环境配置我推荐使用Ubuntu 20.04 ROS Noetic因为Noetic是ROS1的最后一个长期支持版本之后的维护周期到2025年资料最多踩坑的人也多你搜到的问题基本都有答案。ROS安装直接按照官方wiki操作就行核心步骤是sudo sh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list sudo apt install curl curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add - sudo apt update sudo apt install ros-noetic-desktop-full装完后别忘了初始化rosdepsudo rosdep init rosdep update如果你的网络遇到rosdep update失败可以先配置一下代理镜像源或者直接在GitHub上找rosdep相关的raw文件手动下载这个问题属于环境老问题网上方案非常多。然后是工作空间的创建mkdir -p ~/catkin_ws/src cd ~/catkin_ws catkin_make source devel/setup.bash echo source ~/catkin_ws/devel/setup.bash ~/.bashrc依赖库方面FAST-LIO2需要Eigen和PCLNoetic默认装的版本基本够用。如果你之前装过乱七八糟的Eigen版本建议先检查一下pkg-config --modversion eigen3 pkg-config --modversion pcl_ros如果没有执行sudo apt install libeigen3-dev libpcl-dev ros-noetic-pcl-ros ros-noetic-pcl-conversions这里特别提醒一句别再手动编译安装PCL了系统源里的版本虽然旧一些但是和ROS的集成最稳自己源码编译很容易出现版本冲突明显没必要。2.3 livox_ros_driver2与FAST-LIO2的版本匹配很多新手第一次接触Mid-360会去GitHub上搜livox_ros_driver然后编译老版本驱动结果死活收不到点云。原因是老的livox_ros_driver根本不支持Mid-360Mid-360必须用livox_ros_driver2才能正常工作。livox_ros_driver2的分支说明里写得很清楚master分支支持ROS1和ROS2并且从某个版本开始把MID-360的支持合入了主分支。另一个需要注意的点是FAST-LIO2在源码里也内置了一份livox_ros_driver2的submodule但版本不一定是最新的。为了减少麻烦我建议分别clone这两个仓库单独编译驱动再用FAST-LIO2的launch去调用它。版本匹配建议livox_ros_driver2用master分支最新版。FAST-LIO2用master分支最新版。如果遇到编译报错优先去两者仓库的issue里搜一下多半已经有人遇到并解决了。3. 驱动编译与雷达数据采集实操3.1 编译livox_ros_driver2克隆并编译驱动cd ~/catkin_ws/src git clone https://github.com/Livox-SDK/livox_ros_driver2.git cd ~/catkin_ws catkin_make编译完成后先不要直接source注意livox_ros_driver2的消息定义是自定义的所以如果你的FAST-LIO2和驱动是在同一个工作空间里编译需要保证build顺序是先驱动后算法。用catkin_make时默认会处理依赖关系但保险起见建议先把驱动单独编译一次确认无误后再加入FAST-LIO2源码一起编译。启动驱动测试source ~/catkin_ws/devel/setup.bash roslaunch livox_ros_driver2 rviz_MID360.launch如果一切正常RViz里会看到点云。如果没看到先用rostopic命令排查rostopic hz /livox/lidar rostopic echo /livox/imu -n 5正常情况下/livox/lidar的频率应该接近10HzMid-360的扫描频率是10Hz/livox/imu的频率是200Hz。如果hz命令显示0或者极小说明点云没有进来优先检查网线、IP和防火墙。3.2 确认点云和IMU数据正常还有一个小细节很多人遇到过RViz里看不到点云但是rostopic hz有数据。这种问题通常是Fixed Frame没设置对。RViz的Global Options里把Fixed Frame改成livox_frame或者laser_link和你的tf树里的frame_id一致就行。如果你用的是livox_ros_driver2默认frame_id一般是livox_frameIMU的frame_id一般是livox_imu。在FAST-LIO2的launch文件里这两个名字会直接用到所以先记下来。另外建议在跑SLAM之前把雷达放在桌面上拿起雷达稍微晃一晃同时录制一段rosbagrosbag record -O mid360_test.bag /livox/lidar /livox/imu录个一两分钟就够了。这段bag数据后面可用于反复调试不用每次跑SLAM都拿着雷达手动晃。我之前图省事每次都直接跑在线模式结果每次启动流程都要重新初始化浪费了很多时间。后来学乖了把几段不同场景的bag存下来调参效率和复现稳定性都高了很多。3.3 驱动层常见问题时间戳与坐标系驱动正常出点云之后处理时间戳问题。Mid-360的时间戳默认是纳秒级别livox_ros_driver2的驱动节点会把时间戳转换成ROS的time但如果你的系统时钟没有做PTP或者NTP同步点云时间戳和IMU时间戳可能存在几毫秒到几十毫秒的偏差。对于FAST-LIO2来说雷达和IMU的时间差会造成明显的漂移最典型的表现是雷达静止时建图没问题一旦快速运动或者旋转点云就开始出现重影和拖尾。解决思路有两个层面。第一驱动层面尽量用最新的livox_ros_driver2新版驱动对时间戳处理做了优化某些场景下可以自动补偿。第二如果时间差问题依旧存在可以在FAST-LIO2的launch里查看是否开启了use_sim_time在rosbag replay时一定要设置为trueparam name/use_sim_time valuetrue/而在线运行雷达时则必须设置为false。很多人建图飘移查了半天发现只是这个参数在回放bag时没开。坐标系配置也容易出问题。Mid-360的默认坐标系是前x左y上z和FAST-LIO2的坐标系约定一致。但如果你把雷达以外参方式安装比如倾斜安装那就需要在yaml里准确填写外参矩阵否则整个地图会整体倾斜甚至发散。这部分我们放到参数配置环节详细展开。4. FAST-LIO2编译与核心参数配置4.1 下载源码与整体编译FAST-LIO2源码相对简单核心目录包括include头文件、src源码、launch启动文件、config参数配置文件。直接克隆并编译cd ~/catkin_ws/src git clone https://github.com/hku-mars/FAST_LIO.git cd ~/catkin_ws catkin_make如果你的工作空间里已经有livox_ros_driver2catkin_make会自动处理依赖。如果编译过程中报找不到livox_ros_driver2的消息头文件通常是两个包的编译顺序不对可以执行catkin_make --pkg livox_ros_driver2 catkin_make或者干脆新建一个工作空间先编译驱动再把FAST-LIO2放进来编译这样最干净。FAST-LIO2的编译依赖OpenCVNoetic自带的opencv4版本可以满足要求。但如果你的系统之前装过opencv3编译时可能会出现头文件冲突。此时检查一下CMakeLists.txt里find_package(OpenCV REQUIRED)的版本要求优先让它找到系统默认的opencv即可。4.2 launch文件解析mapping_mid360.launchFAST-LIO2源码自带的launch文件是launch/mapping_mid360.launch里面定义了使用Mid-360时的节点启动参数。打开它有几个地方需要重点关注param namerviz typebool valuefalse/ param namepoint_filter_num typeint value4/ param namefeature_extract_enable typebool valuefalse/ param namemax_iteration typeint value3/ param namepoint_filter_num typeint value4/rviz参数控制是否自动启动RViz可视化建议调试阶段设为true正式跑批处理任务时设为false可以减少不必要的界面开销。point_filter_num是降采样间隔含义是每隔多少点取一个点参与配准和建图。Mid-360单帧点云数量大概在20000点左右这个值设为2-4比较合适。值越小计算量越大精度理论上越高但CPU占用也更高值越大计算越快但地图细节会丢失。我的建议是先用4确认流程没问题后再调小到2。feature_extract_enable如果设为true会启用特征提取预处理把原始点云提取成边面特征后再配准。对FAST-LIO2来说这个开关默认关闭直接用全点云配准。实测下来在室内中等场景不开特征提取的稳定性和精度更好因为Mid-360的非重复扫描点云密度不均匀特征提取反而可能丢失细小结构。不过在CPU性能较弱或者点云非常大的场景打开特征提取可以显著降载算是一个性能折中选项。4.3 config/mid360.yaml参数逐项说明打开config/mid360.yaml这是整套系统里最需要理解透彻的文件。我将其中核心参数的作用和调整逻辑说明如下参数默认值含义与调整建议common.lid_topic/livox/lidar点云话题名必须和驱动一致common.imu_topic/livox/imuIMU话题名必须和驱动一致common.time_sync_enfalse如果雷达和时间源做了硬件同步改为truepreprocess.lidar_type11表示Livox系列0表示Velodyne必须设为1preprocess.scan_line8Livox点云行数Mid-360固定为8preprocess.timestamp_unit3时间戳单位3表示纳秒2表示微秒preprocess.blind0.5盲区距离0.5米内的点会剔除mapping.filter_size_surf0.5地图点体素滤波尺寸越大地图越稀疏mapping.filter_size_map1.0全局地图下采样尺寸太大会丢细节mapping.max_iteration3位姿优化迭代次数默认即可mapping.cov_scale1.0退化场景下可调小增强鲁棒性mapping.point_filter_num4每N个点取1个参与计算mapping.det_range40.0有效测距范围mapping.imu_entrue是否启用IMUMid-360内置IMU保持truemapping.acc_mul1.0加速度倍率补偿mapping.gyr_mul1.0角速度倍率补偿其中最坑的两个参数是preprocess.timestamp_unit和preprocess.scan_line。timestamp_unit如果设置错误点云的时间戳会被错误解析导致FAST-LIO2报Timestamp unaligned之类的错或者建图发散。scan_line对于Mid-360一定要设为8这是由雷达的扫描模式决定的——Mid-360的出厂点云被划分成8条扫描线如果改成16或者默认的0特征匹配会完全混乱。4.4 外参矩阵与IMU加速度倍率标定FAST-LIO2使用的外参是雷达到IMU的变换矩阵也就是T_lidar_imu。Mid-360出厂时已经把雷达和IMU安装到一起理论上外参是固定值但如果雷达与IMU内部安装存在偏差可以通过标定工具获得更精确的外参。在mid360.yaml里外参矩阵以4x4的形式写在extrinsic_T下面extrinsic_T: [0.014, -0.999, 0.008, 0.02, 0.999, 0.014, 0.003, 0.02, -0.003, 0.008, 1.000, 0.02, 0.0, 0.0, 0.0, 1.0]这里列出的只是示例实际值需要根据你的情况填入。如果你不确定可以先都填0把雷达水平放置并静止几秒让FAST-LIO2完成初始化再检查建图是否漂移。如果静态场景下地图都歪得厉害基本就是外参问题。还有两个参数容易被忽略mapping.acc_mul和mapping.gyr_mul。它们对应IMU加速度和角速度的倍率补偿这两个值由IMU的精度决定Mid-360内置IMU的量程和比例因子通常是已知的出厂默认1.0基本够用。如果发现IMU积分轨迹明显偏快或偏慢比如原地转一圈估计的角度超过360度可以按比例微调这两个值。4.5 重要launch与yaml文件的对应关系FAST-LIO2的launch文件通过rosparam命令加载yaml配置rosparam commandload file$(find fast_lio)/config/mid360.yaml /所以如果你改了mid360.yaml重启节点就会自动生效不需要重新编译。这也是调参效率最高的方式。每次修改完参数后重启FAST-LIO2节点并重新跑bag对比效果即可。我建议把原版mid360.yaml先备份一份调参时用git管理改动这样出了问题可以随时回滚也能直观看出哪些改动影响了效果。5. 实机运行建图与效果评估5.1 在线运行FAST-LIO2的完整步骤确认驱动和FAST-LIO2都编译通过后启动雷达驱动source ~/catkin_ws/devel/setup.bash roslaunch livox_ros_driver2 livox_lidar_MID360.launch这个launch默认会启动点云发布和IMU发布打开另一个终端启动FAST-LIO2roslaunch fast_lio mapping_mid360.launch之后你会看到终端打印类似Start FAST-LIO2的日志同时RViz会出现当前扫描的点云。这时缓慢移动雷达或者移动机器人点云会逐渐叠加成地图。如果一切正常地图会越来越清晰车辆走过的路径会呈现出连续的轨迹。如果出现Point Cloud NaN、inflation too large等报错多半是参数问题先停下来对照上一节逐一检查yaml。不要硬着头皮继续跑数据已经废了。5.2 离线跑rosbag调参在线跑的问题是你没法复现同一段路径来对比不同参数的效果。所以我强烈建议离线调试流程第一步录制bagrosbag record -O room1.bag /livox/lidar /livox/imu第二步播放bagrosbag play room1.bag第三步启动FAST-LIO2注意把use_sim_time设为truerosparam set /use_sim_time true roslaunch fast_lio mapping_mid360.launch这里有个细节如果你用rosbag play的clock需要在launch里或者命令行里设置好/use_sim_time且要在播放bag之前设置。如果你忘了设置FAST-LIO2的TF和时间戳会一直等待系统表现为卡住不动但实际上所有节点都活着。另外rosbag play默认以两倍速播放时可以按空格暂停你可以以此观察建图过程在哪个位置开始发散从而反推问题点。5.3 建图效果评估一个直观的评估方法是看轨迹和地图的重合度。回到起点时如果地图在起点位置出现明显的错位或重影说明回环误差大可能是IMU标定不准或者外参有问题。更定量的评估方法是把FAST-LIO2输出的轨迹保存下来用evo工具对比真值。不过在只有雷达和IMU的情况下你可以先用目测法绕同一场景走两圈看地图的第二圈和第一圈是否重叠。另外观察点云的厚度也能反映问题。原地静止时一堵墙的点云应该集中在一个薄层内。如果点云的厚度明显超过5厘米说明位姿估计有漂移优先检查IMU加速度倍率和时间戳。6. 常见问题与避坑指南6.1 编译期常见报错报错信息原因与解决方案livox_lidar/imu未找到驱动未编译或launch未加载确认编译了livox_ros_driver2fatal error: livox_lidar/CustomMsg.h: No such file包依赖顺序问题先编译驱动再编译FAST-LIO2/usr/bin/ld: cannot find -lopencv_*OpenCV版本不匹配安装libopencv-dev或调整CMakeListsROS包找不到fast_lio没有source devel/setup.bash重新source后再试CMake Error at /usr/lib/cmake/pcl/PCLConfig.cmakePCL未安装或版本冲突卸载手动编译的PCL安装系统源版本6.2 运行期常见问题现象原因与解决方案RViz无点云但rostopic hz正常Fixed Frame设置不对改成livox_frame地图发散旋转时拖影严重时间戳单位错误检查timestamp_unitIMU外参错误检查外参矩阵运行几秒后程序崩溃点云中存在NaN设置blind参数剔除近点异常值雷达点云只有部分方位IP不在同一网段检查电脑网卡IP是否为192.168.1.x建图时轨迹越来越偏雷达安装不牢固有轻微晃动或者外参矩阵不准确需要重新标定静止时地图抖动但不大IMU和点云时间戳偏差确认时间同步配置或使用硬件同步6.3 经验总结最容易让人崩溃的3个坑结合我自己和周边同学的反馈以下几个问题出现频率最高这里单独拎出来说一说。第一个坑用了旧版的livox_ros_driver。很多人一搜教程找到的livox_ros_driver for ROS1仓库编译也顺利但点云就是出不来。看了issue才知道Mid-360只支持livox_ros_driver2。所以如果不是老雷达如Horizon、HAP千万别用旧驱动。第二个坑外参矩阵乱填。FAST-LIO2的初始外参如果偏差过大系统在初始化阶段就会发散。我见过有人直接把外参填成0结果跑起来地图立刻变成一团乱麻。正确做法是先用厂家的默认标定文件再通过静态场景验证。如果怀疑外参不准可以用FAST-LIO2自带的标定工具或者livox的标定程序重新标定。第三个坑时间戳单位错误。这个坑最隐蔽因为表现不是直接报错而是建图精度下降、点云拖尾。MID-360默认时间戳是纳秒在yaml里timestamp_unit要设为3。如果你下载的版本默认值是1或者2一定要改过来。我最初就因为没仔细看默认值来回重装了好几遍才定位到问题是时间戳。6.4 实用小技巧如何快速判断问题范围这里分享一个我自己的排查方法。遇到问题先不要急着改参数而是做以下三步第一确认驱动层数据正常。rostopic hz /livox/lidar和rostopic hz /livox/imu都正常说明硬件和驱动没问题问题在算法层或配置层。第二用最小化launch测试。把FAST-LIO2的launch里的rviz开关关掉只跑核心节点排除RViz卡顿的干扰。实测RViz在点云量大的时候会占用大量CPU导致FAST-LIO2的计算线程变慢反而引起建图卡顿。第三做个静态测试。把雷达放在地上不动启动系统如果静态场景下地图不发散说明外参和IMU基本正常问题多半出在时间戳或动态标定上如果静态都飘优先检查静态安装、外参矩阵和IMU方向。7. 写在最后的一点体会整篇文章也就是把Mid-360和FAST-LIO2这套组合从头到尾梳理了一遍。说实话这套组合的硬件门槛并不高真正的门槛在配置细节和问题定位上。Mid-360这台雷达本身性价比很高非重复扫描的特性在室内外场景都有不错的表现FAST-LIO2又是目前兼容性很好的开源方案两者搭配起来哪怕你之前没跑过SLAM按这个流程走也能在一天之内看到自己的第一张三维点云地图。如果你打算在这个基础上继续深入可以考虑下面几个方向用LIO-SAM或LVI-SAM对比一下不同算法在同一份bag数据上的表现把FAST-LIO2输出的位姿和点云接入octomap_server构建可用于导航的八叉树地图或者进一步研究FAST-LIO2源码中的ikd-Tree实现这个数据结构很有启发性弄懂之后对理解现代激光SLAM会有很大帮助。
返回列表