☰
速腾RS-LiDAR-16 + FAST-LIO2在ROS Melodic下的三维建图实战指南
2026/10/7 5:59:02 网站建设 项目流程

前前后后折腾了三个周末,才把速腾16线雷达在ROS Melodic环境下的FAST-LIO2建图链路彻底跑通。期间踩的坑比我预想的多得多:驱动编译不过、点云话题没输出、IMU时间戳对不上、建图跑一会儿轨迹就开始飘……很多问题网上搜不到完整答案,只能自己一行行日志去猜。这篇教程就是把整个从驱动配置到建图验收的流程完整记录下来,包含所有关键配置文件和踩坑后的解决方案,给那些准备在Ubuntu 18.04 + ROS Melodic环境下用速腾RS-LiDAR-16做三维建图的同学一条能直接走通的路。

这套方案解决的是典型的"激光雷达+惯导紧耦合建图"问题:机械式16线雷达负责提供大视场的环境几何信息,FAST-LIO2把IMU和点云做紧耦合迭代优化,比传统的LOAM类方案在剧烈运动、低纹理环境下稳很多。如果你手头正好是速腾16线,而且打算做矿洞、地下空间、园区这种场景的实车建图,这篇内容应该能帮你省下大量趟坑时间。

1. 为什么是速腾16线 + FAST-LIO2:选型逻辑与实际价值

1.1 机械式16线的不可替代性

这几年固态雷达很火,尤其Livox MID360在FAST-LIO2官方示例里几乎被当成默认配置。但机械式360度扫描雷达有它自己的独特价值:水平视场角完整覆盖360度,垂直方向16条扫描线分布在-15到+15度区间,无论巷道侧壁还是顶部构造都能扫到,不存在固态雷达视场角不足的盲区问题。

速腾RS-LiDAR-16的测距能力在10%反射率下能做到20米左右,80%反射率下能到100米,精度±2厘米左右,水平角分辨率0.2度。这个精度在中低速移动平台的建图场景下完全够用,而且价格相比64线甚至128线便宜一个数量级。矿洞这种环境我实测过,粉尘大水汽重,固态雷达的非重复扫描在这类条件反射率极不均匀,反而机械雷达因为每条线都固定角度扫过去,点云分布均匀,匹配稳定性更好。

1.2 FAST-LIO2为什么能接管机械雷达数据

FAST-LIO2的核心是迭代误差状态卡尔曼滤波(IESKF),把IMU预积分和激光点云配准放到同一个优化框架里,前端用ikd树管理地图点,省掉了传统LiDAR里程计里提取特征点、匹配特征点这一大堆容易炸的中间步骤。它对点云形式不敏感,直接输入PointCloud2就行,所以机械雷达只要消息类型对、帧率稳定,就能跑。

相比FAST-LIO第一代,2代最大的改进是去掉了特征提取模块,直接对原始点云做帧到地图的配准。这意味着16线这种点云相对稀疏的雷达不再需要依赖特征提取质量,只要环境本身有几何结构,就能给优化提供约束。运动剧烈、场景退化的时候,IMU权重能拉住轨迹,这也是为什么这套组合在矿洞、隧道里比纯雷达里程计稳。

1.3 这套方案的边界条件

别指望这套组合无所不能。我已经在实际项目里验证过几个前提:第一,必须有IMU数据,哪怕是一个几十块的九轴模块,纯雷达是没有办法跑FAST-LIO2的,程序会初始化失败或者瞬间发散;第二,外参精度直接影响建图效果,粗糙到5厘米、3度误差就会明显飘;第三,长直通道这种退化场景,无论什么里程计都会沿巷道方向漂,必须有回环或者其他约束。

如果你的目标只是2D导航地图,用cartographer配速腾16线更直接,没必要上FAST-LIO2这种3D方案;如果要做的是3D扫描重建、定位和数字孪生底图,这套组合就是性价比很高的切入点。

2. 驱动配置完整链路:接线、IP、SDK编译、点云验证

2.1 接线、供电和IP规划

RS-LiDAR-16这代雷达,数据和电源是分开的:一根网线走数据,一组红黑电源线需要外接直流电源。第一次拿到手,我直接接了普通12V适配器,结果是雷达风扇转了但网口数据死活不通,最后发现是供电电流不够,雷达启动自检没过。建议选12V电压、功率至少10W的稳压适配器,不要用那种标的很虚的杂牌电源,供电不稳的后果不一定是马上断开,而是跑一段时间丢帧、时间戳抖动。

网线直接连电脑千兆网口,电脑网卡IP手工设为192.168.1.102,子网掩码255.255.255.0,网关留空不填。雷达默认出厂IP一般是192.168.1.200。配置完先用ping验证链路通断,ping不通的话优先查防火墙和网卡驱动,而不是怀疑雷达坏了。这里有个细节:有些主板自带的网卡开启节能模式后,对雷达固定IP的UDP包响应很迟钝,建议在网卡高级设置里把Energy Efficient Ethernet关掉。

2.2 rslidar_sdk的编译与config配置

驱动的选择上,新老版本差距很大。千万别再去用十年前那个分散的rslidar_pointcloud老驱动,直接拉官方新版的rslidar_sdk,新驱动把驱动解析、点云组装、ROS话题发布全部集成在一个包里,一个node就能出点云。

编译之前把依赖装齐:

sudo apt install ros-melodic-pcl-ros ros-melodic-rviz ros-melodic-tf2 mkdir -p ~/rslidar_ws/src cd ~/rslidar_ws/src git clone https://github.com/RoboSense-LiDAR/rslidar_sdk.git cd ~/rslidar_ws catkin_make

新版SDK的配置文件在config/config.yaml,核心字段就下面这几个,不同小版本字段名可能略有差异,以官方示例config为基准去对:

lidar: - driver: lidar_type: RS16 frame_id: rslidar msop_port: 6699 difop_port: 7788 start_angle: 0 end_angle: 360 - ros: ros_send_point_cloud: true ros_send_packet: false

这里我踩过的坑是frame_id没填,导致后面FAST-LIO2启动后visualizer显示出来的点云在原点位置乱跳,其实只是坐标系名不匹配的问题。另一个容易踩的地方是lidar_type,如果填错成RS32或者RS128,驱动虽然不会报错,但解析出来的点数会少得离谱,点云呈现严重的断裂或整块缺失。

2.3 点云话题验证:帧率、点数、可视化的三重确认

驱动起来之后不要急着上FAST-LIO2,先确认点云数据本身是干净的:

source ~/rslidar_ws/devel/setup.bash roslaunch rslidar_sdk start.launch rostopic hz /rslidar_points

正常情况下RS-LiDAR-16在10Hz转速模式下,话题频率会稳定在10.00Hz左右,一帧点数在28000点上下的量级。如果你看到频率忽高忽低,或者点数明显不对,先回头查供电和网线质量,这两个是隐形杀手。

rviz里添加PointCloud2话题,Fixed Frame设为rslidar,点云应该呈现一个以雷达为中心的完整水平环绕结构。这个时候可以顺手转一下雷达,确认点云能跟着旋转,并且近距离物体没有明显双影或模糊。出现双影优先查驱动里的时间戳单位配置,SDK默认的时间单位如果和实际设置不一致,机械雷达高速旋转时会看到周围物体被"撕裂"成两层甚至多层,这个问题越早发现越好。

3. FAST-LIO2编译与参数调校:从源码到跑起来

3.1 依赖准备:把最常见的编译报错先堵死

FAST-LIO2在ROS Melodic下的编译其实不复杂,但依赖项必须提前装。不要等到catkin_make报错再一个个查,先把这些一次性装好:

sudo apt install ros-melodic-pcl-ros ros-melodic-tf2-geometry-msgs ros-melodic-cv-bridge sudo apt install libeigen3-dev libgoogle-glog-dev libgflags-dev

源码目录结构里带了livox_ros_driver这个子模块,实际编译时会连它一起编译,所以即便你用的不是Livox雷达,子模块代码缺失一样会编译失败。git clone完成之后先执行:

cd ~/catkin_ws/src git clone https://github.com/hku-mars/FAST_LIO.git cd FAST_LIO git submodule update --init

这一步漏掉的话,编译中段会报找不到livox相关头文件的错,而且报错位置很误导,会让你以为是自己缺依赖。装完之后在~/catkin_ws下catkin_make,一次性编过基本没问题。如果用的老版本FAST-LIO2,提示找不到Sophus,那也是缺依赖,sudo apt install libsophus-dev或者按报错提示编译安装即可。

3.2 config和launch文件怎么改成速腾的参数

FAST-LIO2的launch文件长这样,不同版本会有些差异,但框架就是这么个框架:

<launch> <param name="config_file" value="$(find fast_lio)/config/rslidar16.yaml"/> <node pkg="fast_lio" type="fastlio_mapping" name="fastlio_mapping" output="screen"/> <node pkg="rviz" type="rviz" name="rviz" args="-d $(find fast_lio)/rviz_cfg/loam_livox.rviz"/> </launch>

你要做的事情是以仓库里已有的mapping_velodyne.launch为模板,把topic参数改成速腾的点云话题。最重要的配置文件是config/rslidar16.yaml(这个文件可能不存在,用velodyne.yaml改名也行),核心参数就几个:

common: lid_topic: "/rslidar_points" imu_topic: "/imu/data" time_sync_en: false preprocess: lidar_type: 1 scan_line: 16 timestamp_unit: 2 blind: 0.5 mapping: extrinsic_T: [0.0, 0.0, 0.0] extrinsic_R: [1, 0, 0, 0, 1, 0, 0, 0, 1]

lidar_type填1代表旋转式机械雷达,填2代表Livox那种非重复扫描固态雷达,这个填错的话程序也不会崩,但初始化会一直收敛不了,姿态在rviz里能看到明显抖动。scan_line固定填16,它会让预处理阶段按线号组织点云,把强度值和线号匹配到一起。blind是盲区过滤距离,速腾的近距离点经常有杂散噪声,0.5米以内的点直接丢掉,避免干扰配准。

3.3 IMU数据的准备与外参标定

没有IMU就跑FAST-LIO2这句话我已经强调了两次,这里再说具体的。IMU的话题类型是sensor_msgs/Imu,至少要包含角速度和线加速度,协方差矩阵可以全零,但数据频率必须高于雷达点云帧率的至少一倍,最好在100Hz以上。用维特智能、Xsens这种串口IMU的同学,先用自己的板子驱动把话题发出来,再跑FAST-LIO2。

外参标定是最容易忽悠过去但实际上绕不开的一环。IMU固连在雷达上之后,两者原点之间的平移量、三个轴的旋转偏移,都会直接影响点云配准。我的经验是分两步走:第一步先用尺子大概量出平移量,旋转矩阵先给单位阵;第二步启动FAST-LIO2,在点云能正常建图的前提下持续观察轨迹是否有恒定方向的偏置。如果轨迹朝一个方向匀速歪,大概率是外参角度有固定偏差,用lidar_align这类工具做一次离线标定能拿到更精确的结果。

注意外参方向的约定,FAST-LIO2里extrinsic_T是雷达坐标系原点到IMU坐标系的平移,不是IMU在雷达坐标系下的坐标,这个方向反了的话建图结果会呈现一种奇怪的镜像漂移。

4. 建图实测与质量验收:map保存、回环、指标

4.1 启动顺序与rviz观察要点

驱动、IMU发布节点、FAST-LIO2,三个节点的启动顺序有个讲究:先把雷达和IMU的话题确认都在正常输出,再启动FAST-LIO2。其中一个很容易犯的毛病是开着rviz直接启动,导致帧率被可视化拖累。我自己的习惯是全部用命令行启动,等里程计初始化收敛后,再打开rviz看效果。

启动FAST-LIO2后,前几秒钟是关键窗口期。雷达保持静止,让滤波器利用IMU数据完成初始对准。如果这时候图像上点云乱跳、地图像撒棉花一样散开,大概率是外参或者IMU方向有问题。正常的情况是点云在几十帧内逐步对齐成一条完整的巷道或者房间轮廓,姿态在rviz里保持稳定。

4.2 保存地图的几种方式与差异

建图结束之后保存地图,很多人会困惑到底订阅哪个话题。FAST-LIO2输出的地图相关话题一般有/cloud_registered和/path、/Odometry,其中/cloud_registered是当前帧点云经里程计变换到世界坐标系后的结果,连续订阅它就能得到完整地图点云。

我推荐的保存方式是用pcl_ros自带的节点:

rosrun pcl_ros pointcloud_to_pcd _input:=/cloud_registered

这个节点会持续把收到的点云拼接后保存为一个pcd文件,保存的文件名带时间戳,跑完之后在终端把节点Ctrl+C,pcd文件就落在当前目录。如果你希望直接把构建的地图作为最终成果,建议保存前把雷达抬高一点、角度放平,避免地面点过密把细节遮住。点云文件比较大的时候,再用pcl_voxelgrid做下采样,尺寸能缩小一个量级,查看和发布都方便。

4.3 怎么判断地图质量:细节、一致性、闭合差

判断地图能不能用,不要只看视觉上"像不像",要量化看几项指标。第一是闭合差,绕一圈回到原点时,起点和终点在rviz里显示的偏移量是不是小于0.3米,这个比任何主观感受都有说服力。第二是墙面厚度,在rviz里放大点云看墙壁截面,如果墙壁点云厚度在5厘米以上,说明点云配准有累积误差或者外参有偏差。第三是细节清晰度,犄角旮旯的物体轮廓是不是分明、有没有重影。

我实测速腾16线在10Hz下建一个边长100米左右的园区,正常建图完成后墙厚控制在2到4厘米是没问题的。如果墙厚超过10厘米,优先检查雷达本身是否固定牢靠,雷达支架或者IMU安装座有肉眼看不见的微晃动,在数据里就会被放大成墙体偏厚。

5. 避坑全记录:时间戳、外参、退化环境的完整排查链

5.1 时间戳不统一导致的诡异漂移

很多人把建图飘的问题一股脑归咎于算法不行,实际上机械雷达+外接IMU最常见的坑就是时间戳不统一。雷达的驱动节点网络传输有延迟,IMU如果用的是USB串口,延迟更严重,两路数据在时间轴对不齐时,FAST-LIO2的滤波器会把这种不对齐当成运动状态,表现就是轨迹缓慢漂移、点云边缘模糊、急停之后地图出现十几厘米的"回头"。

排查时间戳问题有个快速方法:单独订阅雷达和IMU话题,看两路消息的header.stamp时间轴是否单调且相差不大。你会发现很多USB串口IMU驱动默认用的是接收到数据的时刻,而雷达节点用的是雷达内部时钟固件时间,两者差几百毫秒到几秒都不奇怪。解决思路是让整个系统统一用一台主机的时钟,雷达驱动如果能关掉内部时间戳就用接收时刻,IMU驱动也一样,把时间同步交给系统时间。FAST-LIO2配置里的time_sync_en开了之后会做一定程度的补偿,但治标不治本,真正安全的是保证源头时间戳一致。

5.2 外参标定不准的表现与修正链路

外参不准和IMU内参误差在数据上的表现高度相似,都是地图飘。区分方法有一个:雷达静止时看地图是否稳定,如果静止时点云都缓慢转动,问题一定在IMU数据或外参;如果静止时正常,动起来才飘,优先查外参中的角度误差,然后是IMU的噪声参数。

外参角度误差每偏1度,在10米远的距离上就会产生约17厘米的点云偏移,所以不要用肉眼"差不多"去衡量外参。我遇到过一次外参z轴偏了2厘米,建图后半段巷道逐渐向一边扭曲,当时排查了很久才意识到是IMU固定座的加工公差导致。合理的做法是:粗装之后用激光测距或者CAD模型标尺精确量出三轴偏移,旋转部分用标定软件去做。

5.3 矿洞、隧道这类退化环境的漂移怎么压

矿洞建图是这次项目测试的重点,长直巷道、低纹理、粉尘、水汽,几乎把所有能触发退化因素占全了。FAST-LIO2在这种环境里最大的问题是沿巷道轴向缺乏可靠约束,IMU的微小零偏会被滤波放大,表现为前方/后方比例协调但整条轨迹在直道里逐渐往一侧偏。

实际操作中我的处理方式是:控制移动速度,每秒不超过0.5米,转弯处停1到2秒让滤波器重新收敛;雷达尽量朝向有起伏的岩壁,避免平行于光滑平面行走;另外有条件的话,把IMU的随机游走和噪声参数先跑一次标定填进去,零偏至少给一个初始估计。粉尘大的环境,16线雷达的有效测距会缩到正常值的六成左右,所以建图路线不要离侧壁太远,尽量保持在雷达有效测距范围内。

5.4 十六线雷达的点云特性和FAST-LIO2的已知坑

16线雷达点云到了FAST-LIO2手里,有一个容易被忽略的地方:通道数不够,远处点稀疏,近处点密集,点云密度极度不均匀,blind这个参数如果设太大,会把近处有效约束全丢掉;设太小,近距离的杂乱点又会影响配准。我自己的值是0.3到0.5之间,具体看雷达安装高度和周边障碍物距离。盲区过滤本身不参与地图一致性检验,所以调参时可以大胆试。

FAST-LIO2的内存占用和ikd树更新频率直接相关。矿洞这种长时间运行场景,跑了半小时后会发现卡顿加剧,这是因为地图点数量级增长后,配准计算耗时增加。解决办法是每隔一段时间重启里程计节点,或者把filter_size_surf这类体素降采样参数调大一点,减少地图点数量。这个参数在config的preprocess或mapping块里,不同版本位置不同,找一下就行。

最后再分享一个实际操作中的小技巧:每次启动建图前,把雷达尾部的航插和IMU的串口重新插拔一次,然后静置雷达等待3分钟再开始。机械雷达长时间运输后,内部时钟和电机相位偶尔会出现偏移,静置预热能明显减少前几分钟的数据抖动。这套组合跑顺之后,矿洞、园区、地下车库的场景都能稳定出图,但前提永远是先检查数据质量,再谈算法参数。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询