ARTICLE DETAIL

资讯详情

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

Livox Mid360与FAST_LIO2实战:从环境搭建到建图调优全流程

Livox Mid360与FAST_LIO2实战:从环境搭建到建图调优全流程 1. 为什么这套组合值得折腾Livox Mid360 与 FAST_LIO2 的定位拆解1.1 两个核心组件的真实定位Livox Mid360 这台激光雷达第一次拿到手的人往往会愣一下——它长得不像传统机械式雷达那样有个旋转的“脑袋”而是一个扁平的方盒子。这是因为它用的是非重复扫描的固态方案视场角做到了水平 360 度、垂直 -7 到 52 度等效点频能到 20 万点每秒。这个垂直视场角是它和早期 Mid40、Mid70 最大的区别也是它能拿来做建图与导航的关键。FAST_LIO2 则是港大 Mars 实验室开源的一套 LiDAR-惯性里程计算法全称是 Fast LiDAR-Inertial Odometry。它的核心思路是把雷达点云和 IMU 数据紧耦合用迭代扩展卡尔曼滤波IEKF做状态估计同时维护一个局部地图。相比 LOAM 系列它的优势在于不依赖特征提取直接对原始点云做配准所以在非结构化环境里更稳。把这两个东西凑在一起是当前低成本高精度 SLAM 方案里性价比很高的一条路线。Mid360 单台价格在万元以内FAST_LIO2 完全开源跑在普通 x86 工控机上就能实时出图。我见过不少做机器人、无人车、巡检设备的朋友第一套自研 SLAM 方案就是从这个组合起步的。1.2 这套方案能解决什么问题说人话就是你拿着这套东西走一圈它能告诉你“我现在在哪、周围长什么样”并且把周围环境拼成一张三维点云地图。具体能落地的场景包括室内外建图办公楼、地下车库、厂区、园区道路走一遍就能出点云地图机器人定位给移动底盘提供实时位姿配合导航栈做路径规划手持扫描拿着设备边走边扫做逆向工程或场景存档无人机/无人车里程计作为多传感器融合里的 LiDAR 里程计模块它不适合什么不适合要求厘米级绝对精度的大范围测绘那得上测绘级设备加 RTK也不适合纯视觉方案能搞定的轻量场景。它的甜点区是“几十米到几百米范围、需要三维结构、预算有限、要实时”。1.3 适合谁来读这篇内容如果你符合下面任意一条这篇内容就是写给你的手里有 Mid360想跑 FAST_LIO2 但卡在驱动或配置上跑通了但建图飘、点云糊、时间戳对不上想从零搭一套不想在环境配置上浪费三天已经跑通基础版本想搞清楚每个参数到底在干什么我默认你有基本的 Linux 操作能力知道cd、ls、sudo是什么ROS 的概念节点、话题、launch听过但可能不熟。如果完全没碰过 ROS建议先花半天把 ROS 的基本概念过一遍再回来。2. 环境搭建从裸机到能跑通的第一条命令2.1 系统与 ROS 版本的选择逻辑这一步看起来简单但选错了后面全是坑。Mid360 的官方驱动livox_ros_driver2对 ROS 版本有明确要求FAST_LIO2 也有自己的依赖。我的建议是系统版本ROS 版本推荐度说明Ubuntu 20.04Noetic最推荐生态最成熟驱动和算法兼容性最好Ubuntu 22.04Humble可用需要确认驱动分支部分包名有变化Ubuntu 18.04Melodic不推荐太老很多新包不支持为什么优先 20.04 Noetic因为 Livox 官方驱动在 Noetic 上的文档和 issue 最全FAST_LIO2 的原始仓库也是基于这个组合测试的。你选 22.04 Humble 不是不行但遇到问题时搜到的解决方案大概率是 Noetic 的需要自己翻译。ROS 安装本身网上教程一大堆。如果你嫌手动配源、装依赖麻烦可以用“鱼香 ROS 一键安装”这类脚本它把换源、装依赖、初始化 rosdep 这些步骤打包了。但我要提醒一句一键脚本省事但你得知道它到底干了什么否则后面出问题无从排查。至少把脚本里的关键步骤看一遍。安装完成后验证三件事# 1. ROS 环境变量是否生效 echo $ROS_DISTRO # 应该输出 noetic # 2. roscore 能否启动 roscore # 另开终端 # 3. rosdep 是否初始化 rosdep check roscpp注意rosdep 初始化失败是国内环境最常见的问题表现为rosdep update超时。解决办法是换用国内镜像源或者手动下载索引文件。这一步不解决后面编译任何包都可能卡住。2.2 Livox SDK 与驱动的安装顺序这里有个顺序问题很多人搞反必须先装 Livox SDK再装 ROS 驱动。因为驱动是依赖 SDK 的。Livox SDK 的安装git clone https://github.com/Livox-SDK/Livox-SDK2.git cd Livox-SDK2 mkdir build cd build cmake .. make -j$(nproc) sudo make install编译完成后/usr/local/lib下会出现liblivox_sdk2.so之类的库文件。你可以用ls /usr/local/lib | grep livox确认。然后是 ROS 驱动livox_ros_driver2mkdir -p ~/ws_livox/src cd ~/ws_livox/src git clone https://github.com/Livox-SDK/livox_ros_driver2.git cd .. source /opt/ros/noetic/setup.bash ./src/livox_ros_driver2/build.sh ROS1注意最后那行build.sh ROS1这个脚本会根据参数选择编译 ROS1 还是 ROS2 版本。如果你直接catkin_make大概率会报错因为驱动里有些条件编译的逻辑。编译成功后source devel/setup.bash然后可以测试驱动roslaunch livox_ros_driver2 rviz_MID360.launch如果雷达连着网线、IP 配置正确你应该能在 RViz 里看到点云。看不到的话先别急着怀疑驱动往下看网络配置那节。2.3 网络配置最容易被忽略的坑Mid360 通过网口和电脑通信出厂默认 IP 是192.168.1.1xx网段。你的电脑网卡必须配成同一网段比如192.168.1.50子网掩码255.255.255.0。配置方法以 Ubuntu 为例# 查看网卡名 ip link show # 假设是 enp3s0 # 临时配置 IP重启失效 sudo ip addr add 192.168.1.50/24 dev enp3s0 sudo ip link set enp3s0 up验证连通性ping 192.168.1.1xxping 不通的话检查三件事网线是不是插在雷达的网口上不是电脑的另一个网口、雷达是否上电Mid360 需要外部供电不是网线供电、防火墙是否拦了。实操心得我建议把 IP 配置写成 NetworkManager 的静态配置而不是每次用ip addr临时加。因为临时配置重启就没了调试到一半重启电脑会让人抓狂。在“设置 - 网络”里手动添加一个有线连接的静态 IP 最省事。2.4 FAST_LIO2 的编译与依赖处理FAST_LIO2 依赖几个东西Eigen、PCL、Sophus部分版本。Ubuntu 20.04 下大部分能通过 apt 装sudo apt install libeigen3-dev libpcl-dev然后克隆编译cd ~/ws_livox/src git clone https://github.com/hku-mars/FAST_LIO.git cd FAST_LIO git submodule update --init cd ../.. catkin_makegit submodule update --init这步不能省因为 FAST_LIO 里有些依赖是以子模块形式引入的比如 ikd-Tree。不更新子模块编译时会报找不到头文件。编译过程中如果报Sophus相关的错说明你的版本需要单独装 Sophus。可以手动克隆编译git clone https://github.com/strasdat/Sophus.git cd Sophus git checkout 1.22.10 mkdir build cd build cmake .. make -j$(nproc) sudo make install编译通过后先别急着跑。检查一下devel/lib下有没有fast_lio可执行文件有的话说明编译成功。3. 配置文件的逐参数拆解每个数字背后的含义3.1 Mid360 的 extrinsics 与外参标定FAST_LIO2 的配置文件在FAST_LIO/config/下通常你需要新建一个mid360.yaml。最关键的部分是外参extrinsic_R和extrinsic_T也就是 LiDAR 到 IMU 的旋转和平移。Mid360 内置了 IMU所以理论上 LiDAR 和 IMU 的相对位置是固定的官方会给出标定值。但实际使用中如果你把雷达装在设备上设备本身有倾斜这个外参就需要重新考虑。配置示例common: lid_topic: /livox/lidar imu_topic: /livox/imu time_sync_en: false time_offset_lidar_to_imu: 0.0 preprocess: lidar_type: 1 # 1 表示 Livox scan_line: 4 blind: 0.5 mapping: acc_cov: 0.1 gyr_cov: 0.1 b_acc_cov: 0.0001 b_gyr_cov: 0.0001 fov_degree: 360 det_range: 100.0 extrinsic_est_en: false extrinsic_T: [ 0.0, 0.0, 0.0 ] extrinsic_R: [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ]extrinsic_est_en: false表示不估计外参直接用给定的值。如果你确信标定准确保持 false如果发现建图有系统性倾斜可以改成 true 让算法在线估计但会增加计算量。blind: 0.5是盲区0.5 米内的点会被丢弃。Mid360 近距离确实有一些噪声点设 0.5 是常见做法。如果你的场景需要贴近物体扫描可以调到 0.3但要注意噪声。3.2 时间同步建图飘的头号嫌疑time_sync_en和time_offset_lidar_to_imu这两个参数是很多人建图飘的根源。Mid360 的 LiDAR 和 IMU 数据是分别通过 ROS 话题发布的如果两者时间戳不同步FAST_LIO2 的配准就会出错表现为点云重影、地图扭曲。time_sync_en: false表示不做硬件时间同步依赖软件时间戳。大多数情况下这样能跑但如果你发现建图质量差第一个要查的就是时间戳。检查方法# 查看两个话题的时间戳差异 rostopic echo /livox/lidar --noarr | grep header rostopic echo /livox/imu --noarr | grep header如果两者时间戳差了几十毫秒甚至更多就需要处理。time_offset_lidar_to_imu可以手动补偿单位是秒。比如 IMU 比 LiDAR 早 0.05 秒就填 0.05。注意这个偏移量不是随便填的需要通过实际数据测量。一个笨办法是录一段包用 Python 脚本读出来对比时间戳。别嫌麻烦这一步做对了后面省心很多。3.3 协方差参数噪声模型的调优acc_cov、gyr_cov、b_acc_cov、b_gyr_cov这四个是 IMU 的噪声协方差参数。它们决定了算法对 IMU 数据的信任程度。acc_cov加速度计测量噪声。值越大越不信任加速度计gyr_cov陀螺仪测量噪声。值越大越不信任陀螺仪b_acc_cov、b_gyr_cov零偏随机游走噪声默认值0.1对大多数消费级 IMU 是合理的。如果你用的是高精度 IMU可以调小如果 IMU 质量差、噪声大调大反而更稳。调参逻辑建图飘且表现为高频抖动说明太信任 IMU 了适当调大acc_cov和gyr_cov建图反应迟钝、转弯跟不上说明太不信任 IMU调小。3.4 地图相关参数det_range 与 fov_degreedet_range: 100.0是有效探测距离超过这个距离的点不参与配准。Mid360 标称探测距离 40 米80% 反射率设 100 其实偏大实际有效点可能到不了。我一般设 50 到 70既能覆盖有效范围又能减少远处噪声点的干扰。fov_degree: 360是视场角Mid360 水平确实是 360 度这个保持默认。scan_line: 4这个参数对 Livox 系列来说不是传统意义上的“线数”而是驱动里的一种配置。Mid360 用 4 就行改了反而可能出问题。4. 实操全流程从启动到出图的完整记录4.1 启动顺序与验证步骤正确的启动顺序是先起驱动再起 FAST_LIO2。反过来的话FAST_LIO2 订阅不到话题会一直等待。第一步启动雷达驱动source ~/ws_livox/devel/setup.bash roslaunch livox_ros_driver2 msg_MID360.launch注意这里用的是msg_MID360.launch不是rviz_MID360.launch。前者只发布数据不启动 RViz后者会同时开 RViz方便单独测试雷达。第二步验证话题rostopic list | grep livox # 应该看到 /livox/lidar 和 /livox/imu rostopic hz /livox/lidar # 应该看到 10Hz 左右的频率 rostopic hz /livox/imu # 应该看到 200Hz 左右频率不对的话检查网络带宽和驱动配置。Mid360 的数据量不小百兆网口可能吃紧建议千兆。第三步启动 FAST_LIO2source ~/ws_livox/devel/setup.bash roslaunch fast_lio mapping_mid360.launch这个 launch 文件需要你自己创建或者修改现有的。核心是加载正确的 yaml 配置并把lid_topic、imu_topic对上。4.2 RViz 配置看到点云才算成功FAST_LIO2 启动后会发布几个话题/cloud_registered当前帧配准后的点云/cloud_registered_body机体坐标系下的点云/Odometry里程计位姿/path轨迹在 RViz 里添加 PointCloud2 显示话题选/cloud_registeredFixed Frame 设为camera_init或body。如果能看到点云随着设备移动而更新说明基本跑通了。实操心得RViz 里点云显示设置有个坑Decay Time如果设得太大旧点云不消失看起来像地图糊了。建图时建议设 0 或很小的值只看当前帧看全局地图时再调大。4.3 建图质量判断什么样的图算“好”跑通不等于跑好。判断建图质量有几个直观标准墙面是否平直找一面已知的直墙看建出来的点云是不是一条直线。如果弯曲或分层说明位姿估计有问题回环是否闭合走一圈回到起点看起点和终点的点云是否重合。不重合说明有累积误差地面是否平整地面点云应该是一个平面如果起伏明显说明 Z 轴估计飘了我一般会先在一个小房间走一圈快速判断质量再去大场景。小场景问题少容易定位问题大场景问题多但不容易判断是哪个环节出的错。4.4 数据录制与离线调试实时跑通后建议录包做离线调试。因为实时调试时参数改了要重启效率低录包后可以反复回放快速对比不同参数的效果。rosbag record /livox/lidar /livox/imu -O mid360_test.bag录包时注意磁盘空间Mid360 数据量大一分钟可能几百 MB。录个两三分钟就够调试用了。回放rosbag play mid360_test.bag --clock--clock参数会发布模拟时间FAST_LIO2 需要用它来对齐时间戳。回放时记得把use_sim_time设为 true。5. 常见问题与排查技巧实录5.1 点云不动或完全没数据这是最常见的问题排查顺序如下现象可能原因排查方法rostopic 无 /livox/lidar驱动没起来检查 launch 是否报错有话题但无数据网络不通ping 雷达 IP有数据但 RViz 不显示Fixed Frame 错误改成 camera_init点云不动时间戳卡住检查 use_sim_time网络问题占了一大半。Mid360 的 IP 配置如果和电脑不在同一网段驱动能启动但收不到数据。用ifconfig确认电脑 IP用ping确认能通。5.2 建图飘、重影、扭曲这是第二大类问题原因通常有三个时间戳不同步。前面讲过用rostopic echo对比 LiDAR 和 IMU 的时间戳。如果差得多要么开硬件同步要么手动补偿time_offset_lidar_to_imu。外参错误。如果雷达装歪了但外参还是单位矩阵建图会有系统性倾斜。检查extrinsic_R是否和实际安装一致。运动过快。FAST_LIO2 虽然比 LOAM 稳但运动太快时点云配准还是会失败。手持建图时走慢点转弯时更慢。避坑技巧如果建图飘但找不到原因先把设备放在桌上静止不动看轨迹是否稳定。静止时轨迹乱跳说明 IMU 噪声或零偏有问题静止时稳定运动时飘说明是配准或时间同步问题。5.3 编译报错合集编译 FAST_LIO2 时常见的错误fatal error: Sophus/se3.hpp: No such file装 Sophus注意版本undefined reference to ...链接库缺失检查 CMakeLists 里的依赖PCL requires C14在 CMakeLists 里加set(CMAKE_CXX_STANDARD 14)ikd-Tree相关错误子模块没更新跑git submodule update --initLivox 驱动编译报错的话最常见的是build.sh没加ROS1参数导致编译了 ROS2 版本。5.4 性能与资源占用FAST_LIO2 在普通 i5 工控机上能跑到实时但如果你同时跑导航、视觉等其他模块可能会卡。优化方向降低点云降采样率filter_size_surf调大减小det_range减少参与配准的点数关闭extrinsic_est_en省掉在线估计的计算量内存方面长时间建图会累积地图点内存占用持续上升。如果内存吃紧可以定期保存地图并重启或者用pcd_save功能分段保存。6. 从跑通到用好几个进阶方向6.1 地图保存与后处理FAST_LIO2 支持保存 PCD 地图在配置里开pcd_save_en: true退出时会保存到指定目录。保存的点云可以用 CloudCompare 打开做后处理比如降采样、去噪、裁剪。如果要用于导航还需要把点云转成栅格地图occupancy grid。这一步通常用octomap或grid_map做不在 FAST_LIO2 范围内但流程是通的。6.2 与导航栈的对接FAST_LIO2 发布的/Odometry可以直接喂给move_base或nav2做定位输入。但要注意坐标系转换FAST_LIO2 用的是camera_init和body导航栈通常用map和base_link。需要写一个 tf 转换节点或者用static_transform_publisher做映射。6.3 多雷达或多传感器融合单台 Mid360 在垂直方向有盲区如果要做全向感知可以加第二台雷达或者融合视觉。FAST_LIO2 本身支持多雷达输入但配置复杂需要仔细对齐外参和时间戳。这一步建议在单雷达跑稳之后再折腾。我个人在实际操作中的体会是这套方案的门槛不在算法本身而在环境配置和参数调试。算法是开源的代码是现成的但每个环节的细节——网络、时间戳、外参、噪声参数——都可能成为拦路虎。把每个参数搞清楚它为什么存在、调大调小会怎样比盲目抄配置有用得多。踩过的坑多了回头看其实都是些基础问题但第一次遇到时确实能卡一整天。
返回列表