
简介本资源是一份面向机器人与自动驾驶领域初/中级开发者的技术集成指南聚焦于Livox MID-360激光雷达在Ubuntu 18.04平台上的完整部署与FAST-LIO2紧耦合定位系统实战验证。内容覆盖Livox SDK 2驱动安装、Livox-ros-driver2 ROS节点配置、点云与IMU数据对齐、FAST-LIO2编译调试及实时建图效果测试等关键环节解决多组件版本兼容、ROS环境适配与算法运行稳定性等高频痛点。压缩包仅含1个HTML格式主文档19KB结构清晰、步骤详实内含命令行操作截图、参数配置说明、典型报错分析及验证指令输出示例便于按需检索与快速复现。目前已有276人学习下载适合希望在真实硬件平台上落地LiDAR-IMU融合SLAM方案的科研人员与工程实践者。 先说结论这套组合现在几乎是做中低速移动机器人、园区无人车、室内外巡检机器人的标配建图方案。mid360本身是非重复扫描的混合固态雷达水平和垂直视场都足够大加上内置IMU配合FAST-LIO2这种紧耦合激光惯性里程计不需要额外装昂贵的惯导就能在室内外跑出比较稳的实时位姿和点云地图。这篇文章就是把我从零开始部署mid360 Livox-SDK2 Livox-ros-driver2 FAST-LIO2的完整过程、踩过的坑、以及后续做双雷达融合和倾斜安装坐标对齐的经验一次讲清楚。这套东西适合谁手里有mid360、想在ROS1Ubuntu 18.04/20.04 Melodic/Noetic下用FAST-LIO2建图的同学。我会尽量把每个步骤背后的原因也解释一下而不是只丢命令因为很多时候你照抄命令失败就是不明白它为什么要这么配。1. 这套组合到底解决什么问题1.1 为什么是mid360 FAST-LIO2mid360这个雷达很特殊它既不是传统机械旋转雷达也不是纯固态雷达而是混合固态靠内部棱镜旋转实现360度水平视场垂直视场有59度比一般机械雷达大不少。因为是非重复扫描点云会随着时间累积变得越来越密这对建图来说是天然优势。同时它自带一个六轴IMU一是省了单独配IMU的钱二是IMU和雷达在同一个设备里时间同步和固定外参都简单很多。但雷达再好没有好的里程计算法也只是个点云显示器。FAST-LIO2是目前开源激光里程计里对mid360支持最舒服的一个。它是紧耦合方案把IMU和激光点云放在一个迭代卡尔曼框架里做状态估计内置了livox点云的特征提取逻辑CMakeLists里也预留了livox_ros_driver2的接口。换句话说这套算法就是给livox雷达量身定制的你用velodyne或者ouster同样能跑但要改一堆参数而mid360基本就是开箱即用。1.2 你需要准备哪些硬件和系统硬件方面一台装有Ubuntu的电脑我建议至少i5级别CPU、8G以上内存最好有SSD因为建图过程会缓存大量点云数据一块千兆网口的机器一根网线直连mid360。注意尽量用千兆交换机或直连百兆网口虽然也能跑但在点云密度高的时候容易丢包我实测过千兆直连的丢包率明显低于经过百兆路由器中转。系统版本我这里以Ubuntu 20.04 ROS Noetic为例Ubuntu 18.04 Melodic的流程几乎一模一样只是个别依赖包名有差异。另外你还需要准备一根type-c线mid360除了网口还有一个USB口用来配置雷达参数或者升级固件虽然驱动跑起来之后不一定用到但设置静态IP、改雷达IP双雷达场景时必须要用Livox Viewer。软件层面的核心依赖链条是这样的Livox-SDK2是最底层负责和雷达通信Livox-ros-driver2是基于SDK2的ROS驱动把点云和IMU数据发布到ROS话题FAST-LIO2订阅这些话题做建图。这三者版本必须互相匹配尤其是SDK和driver不能用老版本的Livox-SDK那是给Horizon和Tele系列用的mid360必须走SDK2这条线。2. 环境准备把网口、驱动层先折腾明白2.1 网口静态IP配置mid360出厂默认IP是192.168.1.12所以电脑网口必须配置到192.168.1.x这个网段。我习惯把电脑IP设成192.168.1.10子网掩码255.255.255.0网关可以不填因为我们是直连不需要路由。在Ubuntu的Settings里把Wired改成Manual填好IP、掩码然后关闭再打开网口。配置完不要急着往下走先用ping验证物理链路是否通ping 192.168.1.12 -c 4能ping通说明网络层没问题接下来才能谈驱动。如果ping不通先检查网线、网口是否up再看是不是有别的网络配置把路由搞乱了。这里容易犯的错是电脑同时连着WiFiWiFi网段的网关刚好是192.168.1.1导致系统路由表优先走WiFi去访问雷达解决方法是手动加一条直连路由或者干脆把WiFi先关掉。还有一个很多人忽略的点防火墙。Ubuntu默认ufw是关闭的但如果你之前手动开过记得检查一下sudo ufw status如果状态是active建议暂时关闭或者放行livox使用的UDP端口。Livox SDK2和雷达通信走的是UDP端口范围比较大直接sudo ufw disable最省心内网开发环境这么干问题不大。2.2 Livox-SDK2编译安装SDK2的源码从GitHub拉下来之后编译安装很常规sudo apt install build-essential cmake libpcap-dev git clone https://github.com/Livox-SDK/Livox-SDK2.git cd Livox-SDK2 mkdir build cd build cmake .. make -j8 sudo make installlibpcap-dev这个依赖要特别注意它是SDK2抓取网络数据包用的少了它编译会报pcap相关头文件找不到。如果你是在纯净系统上装先把cmake和g装好不然cmake阶段就会弹出一堆错误。编译完成后SDK会被安装到/usr/local/lib头文件装到/usr/local/include/livox_sdk2。这个安装路径后面livox_ros_driver2和FAST-LIO2都要用到所以即使你只是想试一下也建议直接sudo make install省得后面自己维护库路径。验证SDK安装成功可以看看头文件在不在ls /usr/local/include/livox_sdk2如果你能看到livox_defs.h、livox_interface.h这些头文件说明SDK2本身已经就绪。2.3 Livox-ros-driver2编译ROS1这个环节最容易踩坑的一点是分支选择。livox_ros_driver2的默认分支可能不是ROS1需要在clone时加-b ros1参数或者clone之后再切换分支。我这里给出明确命令cd ~/catkin_ws/src git clone -b ros1 https://github.com/Livox-SDK/livox_ros_driver2.git cd ~/catkin_ws catkin_make如果你只是git clone默认分支在ROS1里编译大概率会报ROS2相关的依赖错误。我们用ROS1就老老实实切到ros1分支后续维护也方便。编译时建议分两步走先编译driver的消息生成头文件再编译全工作空间这样能避免一些包之间顺序找不到依赖的奇怪问题cd ~/catkin_ws catkin_make -DCATKIN_WHITELIST_PACKAGESlivox_ros_driver2 source devel/setup.bash catkin_make -DCATKIN_WHITELIST_PACKAGES source devel/setup.bash之所以这么操作是因为livox_ros_driver2里的自定义消息比如CustomMsg需要先被编译出来后面的节点才能include到头文件。虽然一次catkin_make通常也能过但如果你是在一个已经有很多包的工作空间里编译先跑白名单是最稳妥的。驱动编译好之后先别急着和FAST-LIO2连裸跑一次驱动验证雷达数据是不是正常roslaunch livox_ros_driver2 msg_MID360.launch启动之后用rostopic查看话题rostopic list重点看有没有/livox/lidar和/livox/imu这两个话题然后看一眼点云数据频率rostopic hz /livox/lidar正常情况下mid360点云频率是10HzIMU频率大概是200Hz左右具体数值跟固件版本有关。如果你看到hz数值在跳说明网络和驱动链路已经通了可以进入下一步。2.4 用Rviz验证驱动是否正常我习惯在驱动正常后立刻用Rviz看一眼点云这一步能提前暴露很多问题比如雷达安装角度、点云是否被遮挡、IP配置是否错误导致收到的是其他设备的数据。rosrun rviz rviz添加PointCloud2显示话题选/livox/lidar固定坐标系选livox_frame或者在Rviz里设置Global Frame为livox_frame。如果看到一圈带有颜色渐变反射率或距离着色的点云且跟着雷达转动而变化说明驱动没有问题了。注意mid360发布的话题类型是livox_ros_driver2::CustomMsg不是标准的sensor_msgs::PointCloud2。Rviz里可以直接显示CustomMsg但如果你后续想用其他工具处理可能需要另写转换节点。在这个阶段我还会顺手把雷达的序列号、固件版本记录下来后面调双雷达或者查问题时会用到roslaunch livox_ros_driver2 msg_MID360.launch # 另一个终端 rosrun livox_ros_driver2 livox_lidar_query3. 编译FAST-LIO2最容易卡壳的一步3.1 依赖安装与源码准备FAST-LIO2的编译依赖主要是Eigen3和PCL另外需要livox_ros_driver2提供头文件。Ubuntu 20.04安装这两个依赖很简单sudo apt install libeigen3-dev libpcl-devROS Noetic自带PCL 1.10够用。Eigen建议用apt安装的系统版本不用自己编译源码版因为FAST-LIO2对Eigen的版本要求没那么苛刻3.3以上就行。然后拉FAST-LIO2源码。这里有个仓库名的问题官方仓库是HKUST-Aerial-Robotics/FAST_LIO但里面包含了FAST-LIO和FAST-LIO2两个版本我们要用的是fast_lio子目录里的代码。建议直接clone整个仓库然后进fast_lio目录cd ~/catkin_ws/src git clone https://github.com/hku-mars/FAST_LIO.git3.2 CMakeLists.txt修改细节这是整个部署过程中最容易让人卡住的一步。FAST-LIO2的CMakeLists里写得比较早它会在编译时去/home/yourname/catkin_ws/devel/share/livox_ros_driver2/cmake找livox_ros_driver2的cmake配置。如果你的用户名、工作空间路径和作者当时写死的不一样编译就会报错提示找不到livox_ros_driver2Config.cmake。打开CMakeLists.txt找到livox_ros_driver2相关的部分按自己的路径改list(APPEND CMAKE_MODULE_PATH /home/yourname/catkin_ws/devel/share/livox_ros_driver2/cmake)或者更稳妥的做法是在find_package之前加上set(livox_ros_driver2_DIR /home/yourname/catkin_ws/devel/share/livox_ros_driver2/cmake)同时确认这几行存在find_package(livox_ros_driver2 REQUIRED) include_directories(${livox_ros_driver2_INCLUDE_DIRS}) add_definitions(${livox_ros_driver2_DEFINITIONS})如果你的ROS版本是Melodic可能还需要在CMakeLists里把C标准升到14因为FAST-LIO2部分代码用到了C14特性。Noetic默认就是C14或更高不用额外改。3.3 编译命令和常见编译错误在fast_lio目录下单独编译cd ~/catkin_ws catkin_make -DCATKIN_WHITELIST_PACKAGESfast_lio这一步如果报错最常见的就那么几类一是找不到livox_ros_driver2头文件报错信息类似fatal error: livox_ros_driver2/... No such file or directory。这个就是上面的CMakeLists路径没改对或者catkin_make时没有先source过livox_ros_driver2的setup.bash。我习惯在编译前先source ~/catkin_ws/devel/setup.bash二是Eigen版本冲突报错信息里带Eigen/Eigen或eigen3字样一般是因为PCL找的是系统自带Eigen而CMake找到的是自己下载的Eigen源码。解决办法是确保CMakeLists里没有手动添加Eigen源码路径全部用find_package(Eigen3 REQUIRED) include_directories(${EIGEN3_INCLUDE_DIRS})三是编译过程中卡死在ikd-Tree相关文件这是FAST-LIO2的核心数据结构编译耗时较长不是死机耐心等就好。首次编译十几分钟很正常别频繁CtrlC容易产生半截的中间文件反而更难排查。编译成功之后会生成fast_lio节点在你的devel/lib/fast_lio/目录下能看到可执行文件就说明差不多了。4. 跑起来mid360.yaml关键参数与launch启动4.1 配置文件的参数解读FAST-LIO2的config目录下有多个yaml文件我们要用的是mid360.yaml。打开它核心参数我都用实际经验解释一遍common: lid_topic: /livox/lidar imu_topic: /livox/imu time_sync_en: falselid_topic和imu_topic要和你驱动实际发出的话题一致。time_sync_en是时间同步开关mid360驱动本身会把点云和IMU时间戳同步好这里我建议关掉让FAST-LIO2直接用驱动时间戳省得两个时间源互相干扰。preprocess: lidar_type: 1 scan_line: 64 blind: 1.0 scan_resolution: 0.2lidar_type设为1代表livox类型如果是velodyne就设2切勿搞反。scan_line这里mid360模板给的是64代表把垂直视场按64条线切分这个值不用太纠结mid360点云本身不是按线扫的FAST-LIO2内部会按距离和角度把它虚拟成线数来处理。blind是盲区半径1.0表示1米以内的点不参与匹配因为近距离点噪声大、还可能打到雷达自身外壳上。mapping: acc_cov: 0.1 gyr_cov: 0.1 b_acc_cov: 0.0001 b_gyr_cov: 0.0001这几个协方差参数代表对IMU测量值的信任程度。默认值对mid360内置IMU来说基本能用但如果你发现起步瞬间轨迹明显跳动可以把gyr_cov调小一点比如0.05让算法更信任陀螺仪。反过来如果你觉得点云在地面部分有拖影可能是IMU噪声被过度信任了适当调大一点。外参部分extrinsic_est_en: true extrinsic_T: [-0.011, 0.023, 0.044] extrinsic_R: [1, 0, 0, 0, 1, 0, 0, 0, 1]mid360内置IMU和激光之间其实存在一个固定的杆臂厂家在SDK或者Viewer里能查到具体值。如果直接用默认单位阵建图在小范围场景里可能看不出来问题但跑大场景、快速旋转时就会暴露出来轨迹出现系统性的偏移。我自己的做法是先用Livox Viewer看一下雷达的IMU外参页面把平移和旋转抄下来填进去然后再把extrinsic_est_en打开让算法在运行中继续微调外参。4.2 启动顺序与Rviz观察启动顺序有讲究我一般是先启动FAST-LIO2节点再启动驱动或者反过来但要保证两个终端都source过工作空间。核心是两个launch不冲突# 终端1 source ~/catkin_ws/devel/setup.bash roslaunch fast_lio mapping_mid360.launch# 终端2 source ~/catkin_ws/devel/setup.bash roslaunch livox_ros_driver2 msg_MID360.launchmapping_mid360.launch内部会启动fast_lio节点并指定config/mid360.yaml。启动之后FAST-LIO2节点会打印点云数量和IMU状态看到类似Scan received and point cloud number: 5000这样的日志说明它在正常消费数据。Rviz里选择全局坐标系为camera_initFAST-LIO2里默认的全局系名称是camera_init不用觉得奇怪它就是一个参考系名字然后添加PointCloud2显示话题选/cloud_registered或者/cloud_effector。前者是注册后的点云地图后者是当前帧对齐后的点云两个都能看出建图效果。我一般先看/cloud_registered因为它把历史点云累积叠加最能直观判断位姿漂移情况。4.3 建图效果验证保存地图与轨迹建图完成后保存地图是FAST-LIO2里比较隐藏的功能。它会把你按固定距离或时间间隔保存的点云文件写到路径/home/yourname/下面具体可通过launch文件里的pcd_save_enable和path参数控制。在launch文件中找到param namepcd_save_enable typebool valuetrue/ param namepath typestring value/home/yourname//设置好后建图过程中每运行一定距离就会自动保存一个pcd文件停止节点时还会把完整地图存成scans.pcd。我建议开启pcd_save_enable因为你后面做地图复用、点云拼接、评估轨迹都离不开这个pcd文件。轨迹保存也值得一提。FAST-LIO2在运行过程中会以/path话题发布当前估计的位姿轨迹这是一个Path消息在Rviz里可以用Path显示。如果后续要做精度评估可以录包rosbag record -O lio_traj.bag /path /livox/lidar /livox/imu5. 实战中高频踩坑与排查5.1 驱动正常但FAST-LIO2无点云这是最诡异的问题之一rostopic list能看到/livox/lidar在发布Rviz也能显示点云但FAST-LIO2终端里就是没有数据进来。排查思路是按订阅关系来先看FAST-LIO2启动日志如果一直停在等待点云大概率是话题名不匹配。mid360的launch有几种命名空间有的会发布到/livox/lidar有的可能带设备前缀比如/mid360/livox/lidar。用rostopic list确认实际话题名再看yaml里写的是什么。另一个隐蔽原因是消息类型不匹配。FAST-LIO2期望的是livox_ros_driver2/CustomMsg如果你驱动发布的是sensor_msgs/PointCloud2有些老版本驱动器是这种类型FAST-LIO2会直接忽略。在驱动launch文件里检查一下输出类型或者用rostopic type /livox/lidar看类型名。5.2 地图飘、轨迹跳变地图飘是FAST-LIO2最常见的质量问题原因也很多我按频率从高到低排一是IMU外参不对。mid360内置IMU还好如果设备是外置IMU外参给错一点地图很快就会散掉。解决方法是先打印出厂标定值确认extrinsic_T和extrinsic_R确实对应你当前设备而不是照抄网上的模板。二是动得太猛导致IMU积分发散。手持设备快速甩动、车身急加速急刹车都可能让FAST-LIO2的初始化崩溃。解决方案是在启动后保持静止3到5秒让算法完成IMU初始化然后再开始运动。这招在车队调试里特别管用能立竿见影改善起步阶段的漂移。三是雷达和IMU的时间戳不同步。mid360默认没问题但如果你用外部IMU并且做了软件同步一旦不同步FAST-LIO2的紧耦合模型会立刻出问题。检查方法是在录包里对比/livox/lidar和/livox/imu消息之间的时间差如果超过10ms就要查驱动配置。5.3 CPU和频率问题FAST-LIO2对CPU的要求高于一般SLAM算法因为ikd-Tree的增量维护和紧耦合迭代都比较吃算力。如果你的机器比较老会出现点云hz时高时低、地图卡顿的现象。这时可以降低点云频率mid360驱动里可以设置点云发布频率默认10Hz可以降到5Hz也可以在FAST-LIO2的yaml里把preprocess的降采样参数调大一些减少参与匹配的点数。5.4 问题速查表现象大概率原因解决办法ping不通雷达网卡IP不在192.168.1.x网段或WiFi路由冲突手动设置静态IP临时关闭WiFi编译找不到livox头文件CMakeLists中livox_ros_driver2_DIR路径错误改为自己的catkin_ws/devel路径FASt-LIO2无点云话题名或消息类型不匹配rostopic list核对名字rostopic type核对类型地图快速发散IMU外参错误或未静止初始化核对设备外参启动后静止几秒地图整体漂移gyro covariance过小或外参轻微不准调整gyr_cov开extrinsic_est_en建图卡顿CPU不足降低点云频率加大降采样6. 进阶双雷达融合与倾斜安装坐标对齐6.1 mid360双雷达组网与外参标定当你需要更大覆盖范围时双mid360是很自然的方案。比如车头装一个、车尾装一个或者一个水平朝前一个倾斜朝下补盲区。但两台雷达不能直接接在同一电脑上而不做任何配置因为它们出厂IP都是192.168.1.12会在局域网里冲突。解决方法是先只接一台雷达用Livox Viewer把它的IP改成192.168.1.13或者更规范一点改成192.168.1.103。然后再接第二台同样用Livox Viewer改IP。这个操作必须在雷达通电且电脑直连它的前提下进行Livox Viewer会扫描网段里的设备选择设备后进入设置界面修改静态IP修改完成后雷达会重启重新断电上电后新IP才生效。IP改好之后驱动里要同时启动两个driver节点每个节点分别指定不同的IP。在livox_ros_driver2的launch里可以复制一份mid360的launch模板把xfer参数改成对应雷达的IP再把topic名称区分开比如第一台发布/livox_1/lidar、/livox_1/imu第二台发布/livox_2/lidar、/livox_2/imu。双雷达点云要输入FAST-LIO2主版本其实只支持单话题输入所以常规做法是先做点云融合把两个雷达的点云先外参变换到同一个坐标系再拼接成一个话题发布给FAST-LIO2。这个融合节点你可以自己写也可以直接用点云库的PCL拼接功能。外参可以通过手工测量加上点云配准微调简单的做法是先用pcl::IterativeClosestPoint对两台雷达的重叠区域做配准得到精确的相对位姿。我这里说一句经验之谈双雷达融合的坑通常不在算法而在时间同步。两个driver节点各自发布IMU和点云消息时间戳如果存在几毫秒偏差融合后的点云会有重影。建议用同一个系统时钟保证两台雷达的驱动都取主机时间不要依赖雷达自身时钟。6.2 倾斜安装时的坐标系对齐方法倾斜安装最常见的是把mid360斜着装比如车头朝上仰15度或者朝下俯30度来扫近距离地面。很多人以为倾斜安装之后必须在FAST-LIO2里把雷达外参改得很复杂其实关键是要搞明白坐标系关系。mid360内置IMU的情况下倾斜安装的是整个设备IMU坐标系和雷达坐标系之间的相对关系并没有改变变的只是IMU在世界系下的初始姿态。而FAST-LIO2本身就是靠IMU感知重力方向来初始化姿态的所以倾斜安装并不会让它失效只要启动时静止几秒让IMU收敛它就能正确估计出世界坐标系的水平面。但如果你用的是双雷达其中一个雷达倾斜安装那就要注意倾斜雷达相对于主体的外参已经不是单位阵了必须把倾斜角换算成旋转矩阵填到对应的extrinsic_R里。比如绕雷达X轴仰角15度那么旋转矩阵就是你高中物理里学过的绕X轴旋转的矩阵形式。很多教程喜欢直接贴一个9元素数组我建议你用Python的双消元公式或者直接用tf.transformations库来算import numpy as np from scipy.spatial.transform import Rotation as R r R.from_euler(x, 15, degreesTrue) print(r.as_matrix().flatten())把打印出来的9个数填到extrinsic_R里平移量按实际安装位置量一下填进去。这样点云在进入FAST-LIO2之前就已经被正确变换到了主体坐标系融合出来的地图就是对齐的。倾斜安装还有一个容易忽视的点盲区补偿。mid360的垂直FOV是59度倾斜安装后虽然扫到了更多地面但有可能车头正前方反而出现盲区或者车身两侧形成空洞。解决办法是在建图策略上让车稍微走S形路径让倾斜雷达扫到的区域尽量覆盖到预期盲区而不是指望单帧点云把整个环境都扫全。6.3 双雷达融合的实际操作顺序我把双雷达融合的调试顺序梳理一下避免你边做边乱单雷达逐台验证驱动确保每台雷达都能单独发布点云。改IP让两台雷达在同网段互不冲突。测量或标定两台雷达之间的外参至少要有平移量的粗略值。编写一个简单的融合节点把第二台雷达的点云根据外参变换到第一台雷达坐标系然后拼接后发布。先用rosbag录一段静止环境数据离线回放验证融合点云是否对齐。在线运行融合节点再启动FAST-LIO2观察地图是否清晰。微调外参直到融合点云无重影。整个流程里我花时间最多的是第3步因为手工测量总会有误差后来改用点云配准做自动精标定效率高了很多。如果你也有点云处理基础强烈建议直接用ICP或NDT做一次自动配准来求外参比自己拿卷尺量靠谱得多。到这里这套方案从单雷达到双雷达、从水平安装到倾斜安装的部署链路就算完整了。我个人的体会是这套组合最大的优势不是每个环节多厉害而是mid360 FAST-LIO2之间配合足够默契官方驱动、官方算法示例、社区教程都齐全遇到问题基本都能在网上找到对应方案。但反过来说正因为环节多任何一个中间步骤出了偏差都会导致最终建图效果不好所以每一步都要验证好了再往下走。最后再分享一个小技巧每次改完配置后在启动launch之前先source一次工作空间的setup.bash养成这个习惯能省掉很多不明所以的头文件找不到、动态库版本不对的报错。祝各位顺利跑出自己的地图。本文还有配套的精品资源点击获取