尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

mid360+FAST-LIO2部署实战:从驱动编译到SLAM建图全流程

mid360+FAST-LIO2部署实战:从驱动编译到SLAM建图全流程 简介激光雷达SLAM建图是机器人感知与导航的核心技术之一而混合固态雷达凭借非重复扫描特性在特征匹配与地图构建中展现出独特优势。要将这类雷达真正跑起来离不开底层驱动、ROS适配层与紧耦合里程计算法的协同工作底层通信库负责解析雷达数据ROS驱动将点云与IMU消息发布为标准话题紧耦合算法则融合两者实时估计位姿并增量式构建地图。在Ubuntu 20.04与ROS Noetic环境下完成Livox-SDK2、Livox-ros-driver2及FAST-LIO2的编译与参数配置是打通建图链路的关键。本文从环境准备、驱动编译、网络配置到高频问题排查系统梳理mid360与FAST-LIO2的完整部署过程帮助开发者快速上手激光惯性SLAM实践。 拿到mid360之后很多人第一反应是赶紧接上电脑扫一圈但实际把这颗雷达跑起来、再把FAST-LIO2的建图链路打通中间隔着一整套环境配置和驱动编译的活。这个部署过程说难不难说简单也真有不少坑SDK2和ros-driver2的版本关系、FAST-LIO2对消息类型的依赖、雷达网络配置、IMU时间同步任何一个环节没对齐最后看到的点云就是一片乱飘或者直接没数据。这篇文章把我自己在一台Ubuntu 20.04工控机上从零部署mid360 Livox-SDK2 Livox-ros-driver2 FAST-LIO2的过程完整梳理了一遍。适合刚拿到mid360、准备做SLAM建图的同学也适合已经被编译报错折腾到头大、想快速排查问题的人。文章里涉及的命令和配置可以直接抄但更重要的是我会把每一步为什么这么做的原因讲清楚这样你遇到类似问题也知道往哪个方向查。1. 动手之前把这套系统里的四个角色认清楚1.1 mid360这个雷达到底特殊在哪mid360是Livox推出的一款混合固态激光雷达跟传统的机械式雷达不是一个路子。它在内部用棱镜扫描形成的是非重复扫描图案点云会随着时间不断填充视场里的盲区。这个特性对SLAM来说非常友好因为随着雷达转动同一片区域会被反复扫描点云密度会越来越高特征匹配的稳定性比单帧机械雷达好不少。它的视场角是一个接近70°的圆形FOV量程官方标称是40米10%反射率下实际室内建图十几米范围内效果很好室外贴着建筑走也够用。更重要的是mid360内部集成了一个六轴IMU这颗IMU对FAST-LIO2来说太关键了因为FAST-LIO2本身就是紧耦合的LiDAR-Inertial里程计没有IMU的数据整个算法跑不起来。还有一个很容易忽略的点mid360只支持Livox-SDK2不支持老的Livox-SDK1。如果你之前玩过Horizon或者MID-40习惯性去装SDK1那mid360是连不上的。这个兼容性问题后面还会细说。1.2 SDK2、ros-driver2、FAST-LIO2三者各管什么很多新手把这三个东西混在一起其实它们的层级完全不同Livox-SDK2是Livox官方的底层通信库负责通过以太网协议跟雷达硬件通信解析雷达数据包把原始点云和IMU数据从网线里“抠”出来。它不关心ROS是纯C库。Livox-ros-driver2是ROS适配层内部调用Livox-SDK2拿到数据再把数据封装成ROS话题发布出去比如/livox/lidar和/livox/imu。它同时支持ROS1和ROS2但要用对应的分支或编译选项。FAST-LIO2是香港大学Mars实验室开源的紧耦合激光惯性里程计算法它订阅ros-driver2发布的话题把激光点云和IMU数据融合在一起实时估计雷达的位姿并构建增量式地图。打个比方SDK2是“网卡驱动”ros-driver2是“操作系统里的网卡接口”FAST-LIO2则是跑在系统里的地图应用。你只装驱动不装算法只能在Rviz里看到一堆原始点云只装算法不装驱动算法连数据都拿不到。1.3 为什么不用Livox-SDK1和ros-driver1这几乎是每个mid360用户都会踩的坑。网上大量老教程还在用Livox-SDK1和livox_ros_driver甚至连ROS驱动包的仓库名都类似很容易下错。mid360的底层通信协议和协议解析方式跟老一代雷达不同SDK1根本识别不到它。如果你在编译或者启动驱动时看到类似Device not found、lidar count 0的提示先检查一下自己是不是装成了老版本。正确做法是直接clone仓库名带2的两个项目Livox-SDK2和Livox-ros-driver2。版本选对了后面一大半问题都不存在。2. 环境准备用Ubuntu 20.04 Noetic是最舒服的组合2.1 推荐软硬件版本组合我部署过好几次这套环境最省事的组合是Ubuntu 20.04 ROS Noetic Livox-SDK2 Livox-ros-driver2ROS1分支 FAST-LIO2。这个组合里ROS Noetic用的是Python3很多依赖包都是现成的二进制安装编译链路比较顺。如果你想用Ubuntu 18.04 ROS Melodic理论上也可以但要注意两点一是系统的CMake版本可能太老Livox-SDK2要求CMake 3.14以上Ubuntu 18.04默认的CMake是3.10需要手动升级二是PCL、Eigen这些库的版本偏旧FAST-LIO2编译时可能因为C标准问题报一些莫名其妙的错误。想用ROS2的话ros-driver2有ROS2分支FAST-LIO2官方没有原生ROS2版本社区有一些移植版但用起来没有ROS1省心。我自己还是建议先跑通ROS1这套把整个链路弄熟之后再折腾ROS2。2.2 ROS和基础依赖安装装ROS Noetic是第一步直接按官方流程来最稳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装完之后记得初始化rosdep并设置环境变量sudo rosdep init rosdep update echo source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrc接下来安装编译FAST-LIO2需要的核心依赖主要是Eigen和PCLsudo apt install libeigen3-dev libpcl-devEigen在这里尤其重要FAST-LIO2大量使用Eigen的矩阵运算如果系统里没有Eigen或者版本太老编译到一半就会报一堆模板错误。PCL是点云处理的基础库rviz显示点云、点云滤波、地图保存都会用到。如果你是连ROS基础都没装过的新手建议先别急着往下走打开一个新终端运行一下roscore能正常启动就说明ROS环境没问题。2.3 编译前的检查清单正式开始编译之前我建议你先花两分钟检查下面这几项能省掉后面很多排查时间CMake版本cmake --version至少3.14以上如果低于这个版本SDK2编译会直接报错。Eigen版本pkg-config --modversion eigen32.x版本太老3.3.x以上比较保险。gcc/g版本gcc --versionUbuntu 20.04自带的gcc 9完全没问题。网络设置确认雷达和电脑的网线已经连好电脑网卡IP要跟雷达IP在同一网段后面第3.3节细说。这个检查清单看起来琐碎但真的能救命。我遇到过不止一次用户反馈SDK2编译失败最后发现是CMake版本只有3.10。与其在报错信息里猜来猜去不如一开始就把环境基础打好。3. Livox-SDK2和Livox-ros-driver2的编译与验证3.1 编译Livox-SDK2Livox-SDK2的编译很简单官方README里给了标准流程直接执行git clone https://github.com/Livox-SDK/Livox-SDK2.git cd Livox-SDK2 mkdir build cd build cmake .. make -j8 sudo make install这里有个细节-j8是并行编译参数如果你的机器内存不大或者CPU核心少建议改成-j4避免编译时内存占满导致进程被系统杀掉。SDK2本身的源码量不算大正常机器几分钟就能编完。编译完成后会默认把库文件安装到/usr/local/lib头文件安装到/usr/local/include。如果你在编译ros-driver2时找不到SDK2的库记得先执行sudo ldconfig刷新一下动态链接库缓存。这个操作很容易被漏掉漏掉之后编译器会提示找不到liblivox_sdk2.so其实库就在系统里只是链接器还没刷新缓存。3.2 编译Livox-ros-driver2ROS1分支创建catkin工作空间把ros-driver2源码放进去mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone https://github.com/Livox-SDK/Livox-ros-driver2.git cd ~/catkin_ws catkin_make source devel/setup.bash关于ros-driver2有一个容易踩坑的地方它同时支持ROS1和ROS2但ROS1的代码被放在仓库的ROS1目录下ROS2的代码在ROS2目录下整个仓库的顶层CMakeLists.txt是ROS2的。如果你在ROS1环境下直接对整个仓库执行catkin_make可能会发现根本没编译出ROS1的节点。实际上ros-driver2仓库会在你指定了ROS1环境时自动处理这个问题。前提是你的终端已经source了ROS1的环境并且catkin_make是在工作空间根目录执行的。如果你发现编译出来的节点名不对可以cd到ROS1目录下看一下它的结构和说明。稳妥起见我把官方推荐的方式列在下面source /opt/ros/noetic/setup.bash cd ~/catkin_ws catkin_make source ~/catkin_ws/devel/setup.bash编完之后用rospack find livox_ros_driver2验证一下能不能找到这个包能正常找到路径就说明ok。3.3 连接雷达并验证点云这一步是整个部署里最容易卡住的地方因为mid360用的是以太网通信不是USB直接出数据。mid360默认IP是192.168.1.100你的电脑网卡必须配置成同一网段的IP比如192.168.1.50子网掩码255.255.255.0。我一般是用nmtui或者直接在系统设置里配置有线网络的IPv4为手动模式填好IP和掩码然后ping 192.168.1.100验证连通性。能够稳定ping通再往下走ping不通的话后面驱动启动肯定是设备找不到先检查网线和IP配置。驱动启动前还需要修改一个配置文件。在ros-driver2的config目录下找到MID360_config.json检查里面的用户配置路径是否正确。需要注意如果雷达的IP不是默认的需要在配置里改成实际IP另外要确认lidar_type设置为MID360对应的类型。启动驱动节点roslaunch livox_ros_driver2 msg_MID360.launch如果一切正常你会看到终端里打印出雷达设备信息然后可以通过rostopic list看到/livox/lidar和/livox/imu这两个话题。用rostopic hz /livox/lidar查看频率正常应该是10Hz左右rostopic hz /livox/imu应该是200Hz左右。再用rosrun rviz rviz打开RvizAdd一个PointCloud2显示话题选/livox/lidar就能看到mid360扫描出来的点云了。这里要提醒一句mid360的点云是非重复扫描的所以Rviz里的点云不是机械雷达那种一圈一圈的整齐线条而是像“磨砂”一样逐渐填充整个圆。很多新手第一次看到这个画面以为雷达坏了其实完全是正常的。4. FAST-LIO2编译与mid360参数配置4.1 编译FAST-LIO2驱动部分搞定之后FAST-LIO2的部署就水到渠成了。先把源码放到同一个catkin工作空间的src目录下cd ~/catkin_ws/src git clone https://github.com/hku-mars/FAST_LIO.git cd ~/catkin_ws catkin_make source devel/setup.bashFAST-LIO2的编译依赖ros-driver2因为它的代码里直接用了livox_ros_driver2::CustomMsg这一自定义消息类型。所以在编译FAST-LIO2之前必须确保livox_ros_driver2已经编译好并且当前终端已经source过devel环境。如果编译时提示找不到livox_ros_driver2的头文件多半就是环境没source干净。另一个容易踩的坑是编译时提示找不到PCL或者Eigen也就是第2.2节提到的依赖没装。先回过去装依赖再重新编译。4.2 mid360的yaml参数逐项说明FAST-LIO2的配置在src/FAST_LIO/config/mid360.yaml这个文件决定算法能不能正确驱动mid360。我挑几个关键项说一下common: lid_topic: /livox/lidar imu_topic: /livox/imu time_sync_en: true extrinsic_est_en: true extrinsic_T: [0.0, 0.0, 0.0] extrinsic_R: [1, 0, 0, 0, 1, 0, 0, 0, 1] preprocess: lidar_type: 1 scan_line: 4 blind: 0.1 timestamp_unit: 2lid_topic和imu_topic必须跟ros-driver2发布的话题名一致否则算法收不到数据。time_sync_en这个参数要打开它会启用雷达和IMU的时间同步对FAST-LIO2这种紧耦合算法来说时间对齐直接影响建图精度。lidar_type: 1表示使用livox自定义消息类型这个不要改。scan_line: 4对应mid360的4条激光线束。blind: 0.1表示滤除0.1米以内的点因为近距离点云噪声太大而且容易把雷达自身反射进去。extrinsic_T和extrinsic_R是雷达坐标系到IMU坐标系的平移和旋转。用mid360内置IMU时最稳妥的方式是把它们设为单位阵并打开extrinsic_est_en让算法在线估计外参。FAST-LIO2的在线外参估计功能已经比较成熟实际跑起来很快会收敛到真实值。timestamp_unit这个参数要特别注意它表示点云时间戳的精度单位。如果你的点云时间戳看起来不对比如建图时点云抖动、位姿跳变优先检查这个值的设置是否和驱动的时间戳精度匹配。4.3 首次跑通建图的完整过程启动驱动新终端source ~/catkin_ws/devel/setup.bash roslaunch livox_ros_driver2 msg_MID360.launch启动FAST-LIO2另一个新终端source ~/catkin_ws/devel/setup.bash roslaunch fast_lio mapping.launch如果配置没问题rviz会自动打开你会看到点云实时堆积成地图同时终端里会输出每次迭代的位姿信息和耗时。手持雷达或者把雷达装在机器人上缓慢移动地图会随着运动不断扩展。第一次跑的时候我给一个非常具体的建议先站着不动让雷达静止扫描几秒钟等点云稳定了再缓慢平移。这样算法能先初始化好IMU状态建图的成功率会高很多。如果一上来就大幅度甩动雷达IMU容易饱和初始化阶段就可能发散。跑通之后还可以录一个bag包保存数据方便反复调试参数。录制bag的指令很简单rosbag record /livox/lidar /livox/imu后面调试的时候直接用rosbag play回放数据就不用一直举着雷达了。这个习惯我强烈建议养成对排查问题效率提升巨大。5. 实战中遇到的高频问题和我的排查方法5.1 编译期报错速查表编译问题是最让人头大的但其实很多都是共性问题。下面这几个是我遇到比较多、也经常在网上看到别人问的现象直接原因解决办法编译SDK2提示CMake版本过低系统CMake低于3.14升级CMake到3.14或用pip装新版cmakeros-driver2编译后找不到节点没有在ROS1环境下编译source ROS1环境后重新catkin_makeFAST-LIO2编译找不到livox_ros_driver2头文件环境未source或ros-driver2未编译source devel/setup.bash后再编译编译报一堆Eigen模板错误Eigen版本太旧安装libeigen3-dev新版本提示找不到liblivox_sdk2.soSDK2安装后没有刷新库缓存执行sudo ldconfig或把/usr/local/lib加入LD_LIBRARY_PATH关于Eigen报错再补充一句有时候你明明装了新版本Eigen但CMake用的是系统里另一个旧版本。建议编译前打印pkg-config --modversion eigen3确认实际生效的版本别被“我装了啊”骗了。5.2 运行期问题排查运行期的问题比编译期更隐蔽因为编译过了不等于系统在工作。我这里列几个常见表现驱动启动后提示device not found先ping雷达IPping不通就是网络问题ping通了还是找不到检查是否把SDK1的旧驱动当成SDK2用了或者设备SN没有正确识别。有/livox/lidar但没看到/livox/imumid360的IMU数据默认是开启的但确认一下驱动的launch文件里是否设置了IMU使能的参数有些版本的驱动默认关闭IMU输出。没有IMU数据的话FAST-LIO2根本起不来。建图时点云抖动、重影优先检查time_sync_en是否打开以及外参配置是否正确。用内置IMU就保持单位阵加在线估计千万别随便填一个自己量出来的数填错比不填更可怕。rz/rviz里点云位置固定不变不随雷达移动说明FAST-LIO2没收到IMU数据或者算法没在运行。看终端的输出是不是卡在初始化阶段。地图整体漂移这种情况多半是运动太快或者环境太单调比如对着白墙反复平移。mid360的非重复扫描特性已经能提供足够的特征了如果还是漂把移动速度放慢或者检查IMU的坐标系方向是否配置正确。5.3 扩展讨论双雷达融合与倾斜安装坐标对齐很多人在search的时候会关注两个进阶话题一台机器人装两个mid360以及把mid360倾斜安装时怎么对齐坐标系。这里我把自己了解的情况说一下方便你评估这两个方向。关于双雷达融合FAST-LIO2官方原生代码是单激光雷达IMU的结构不支持直接输入两台雷达的点云。想要做双雷达建图常见的做法有两种一是用两个mid360各跑一套驱动发布两个点云话题然后在上游做点云拼接把拼接后的点云作为一个话题喂给FAST-LIO2但这样时间同步和外参标定的工作量非常大二是直接选用原生支持多雷达的开源LIO方案比如STAR-LIO这类多LiDARIMU的紧耦合系统它从设计上就支持多台雷达省去自己拼接的步骤。如果你确实要做双雷达我的建议是先跑通单雷达的FAST-LIO2把坐标系、外参、时间同步这些概念都理清楚了再上多雷达方案。不然两个雷达之间的相对外参没标定好融合出来的地图肯定是散的。关于倾斜安装坐标对齐这里要澄清一个概念FAST-LIO2使用的外参是雷达坐标系到IMU坐标系的变换。如果你用的是mid360内置IMU那么无论你把雷达横着装、竖着装还是45度斜着装雷达和那颗内置IMU之间的相对位姿都是不变的所以严格来说不需要改配置文件里的外参。算法输出的位姿是相对于起始状态的地图本身不会因为倾斜安装而发散。真正需要改坐标系变换的场景是你想把建图结果对齐到车辆坐标系比如轮式机器人上一台mid360斜着装在车前部这种情况下建图结束后需要做一个固定的坐标变换把里程计轨迹转换到车体系。另一个容易混淆的点如果接的是外置IMU比如vins或者ins那雷达和IMU之间的外参就需要精确标定倾斜安装会放大标定误差这时候不能再用单位阵或者手工量必须用标定工具跑一遍数据。5.4 我踩过的一个坑盲目升级CMake最后分享一个我自己踩过的坑。有一阵子在Ubuntu 18.04上部署为了满足Livox-SDK2的CMake版本要求我直接removed系统自带的CMake然后从源码编译装了新版CMake。结果装完之后系统里一大堆依赖老版本CMake的软件全都不干活了rosdep、catkin全都异常最后只能重装系统。后来我学乖了要么直接用pip install --user cmake装一个用户态的新版CMake要么用apt源里提供的backport版本绝不贸然替换系统自带的CMake。这个教训我一直记着也希望看到这里的朋友别再踩一遍。按照我的经验如果你用的是Ubuntu 20.04 Noetic这套组合其实压根不需要折腾CMake系统默认版本就够用。版本选对环境干净这整套流程跑下来比想象中要顺很多。本文还有配套的精品资源点击获取
返回列表