
1. 开始之前这套系统的数据流和坐标系比编译更重要先交代一下背景。我的场景是手里有一台速腾 Helios16 线版本需要在 Ubuntu 18.04 ROS Melodic 环境下把官方驱动跑起来再把点云喂给 fast-LIO2 做在线建图。这套链路我前后完整搭过三遍每次重装系统都会在同样的地方卡住不是驱动本身编不过而是网络配置、时间戳、坐标系这些文档里不会明说的细节。很多入门的人一上来就 git clone 两个仓库然后 catkin_make结果编译全过启动后却看不到点云或者 fast-LIO2 一启动就 waiting for IMU data。问题几乎都出在链路理解上。所以这一节先花五分钟把数据流和坐标系讲清楚后面每一步你都知道自己在调什么。1.1 硬件与软件清单缺一样都跑不起来速腾 Helios 激光雷达一台供电线和网线接好。一台装有 Ubuntu 18.04 的主机虚拟机不建议网卡和时戳问题会把你逼疯。一个 IMU。注意Helios 本体不带 IMUfast-LIO2 是 LiDAR-惯性紧耦合方案没有 IMU 话题它根本不会运行。我用的是一个外接的工业级 IMU驱动自行发布/imu/data话题。软件上就是两个仓库RoboSense 官方的rslidar_sdk和港大开源的fast-lio。1.2 数据流从 UDP 包到地图的完整路径Helios 通过网线把原始扫描数据以 UDP 包形式发到主机默认两个端口MSOP 数据口 6699、DIFOP 配置口 7788。rslidar_sdk负责监听这两个端口解析成sensor_msgs::PointCloud2发布到/rslidar_points话题。fast-LIO2 订阅这个点云话题同时订阅 IMU 的/imu/data用迭代误差状态卡尔曼滤波把两者紧耦合起来输出里程计、配准后的点云地图以及map - body的 TF 变换。这条链路里有个关键点点云话题里必须带每个点的time字段帧内相对时间和ring字段线号。fast-LIO2 靠这两个字段做去畸变和线束识别。如果驱动版本不对或者配置没开点云话题缺了这两个字段后面建图必然出问题——而且它不会报错只会让你的地图糊掉。1.3 坐标系三个 frame 心里要有数rslidar激光雷达自己的坐标系驱动发布点云时用的 frame_id。body或base_linkIMU 所在的机体坐标系fast-LIO2 里叫body_frame。map或camera_init世界坐标系fast-LIO2 把第一帧的机身位置作为原点。fast-LIO2 要求你提供从rslidar到body的外参旋转矩阵extrinsic_R和平移向量extrinsic_T。这个外参必须跟你实际的安装方式一致雷达装在哪、IMU 装在哪、两者朝向差多少度。很多人地图重影、轨迹漂移查了半天最后发现是外参符号写反了。2. 环境准备ROS、Eigen、PCL 的版本地雷一次排完Ubuntu 18.04 配 ROS Melodic 是老组合了整体成熟稳健。但 fast-LIO2 对 Eigen 版本有隐性要求这是这段时间我见过最多人翻车的地方单独拿出来说。2.1 ROS Melodic 安装与国内源加速安装本身没什么特殊之处关键是用国内镜像源会快很多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-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 sudo apt update sudo apt install ros-melodic-desktop-full sudo rosdep init rosdep update echo source /opt/ros/melodic/setup.bash ~/.bashrc source ~/.bashrc sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential注意Ubuntu 18.04 上的 ROS 工具链还是 Python 2 那一套rosdep用的也是python-rosdep不要手贱装 python3 版本否则后面初始化工作空间时会报各种莫名其妙的错。2.2 Eigen 3.3.7fast-LIO2 的硬门槛这是最隐蔽的一个坑。Ubuntu 18.04 软件源里的libeigen3-dev默认是 3.3.4而 fast-LIO2 的代码里用到了一些在 3.3.7 才稳定的头文件比如Eigen::aligned_allocator相关的一些行为。直接用系统自带的版本去编译运气好能过运气不好会出error: static assertion failed这类问题网上搜也搜不到对应原因因为报错信息跟 Eigen 版本根本对不上。我的建议是直接升级到 3.3.7一劳永逸sudo apt remove libeigen3-dev wget https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.tar.gz tar -xzf eigen-3.3.7.tar.gz cd eigen-3.3.7 mkdir build cd build cmake .. sudo make install sudo ln -s /usr/local/include/eigen3/Eigen /usr/local/include/Eigen最后那个软链接很关键。Eigen 安装后默认在/usr/local/include/eigen3下但不少项目包括 fast-LIO2 的某些头文件直接搜/usr/local/include/Eigen不建这个链接编译时会告诉你找不到头文件。2.3 一次装齐的依赖清单sudo apt install libyaml-cpp-dev libpcap-dev libgoogle-glog-dev libgflags-dev sudo apt install ros-melodic-pcl-ros ros-melodic-pcl-conversions ros-melodic-tf2-geometry-msgslibyaml-cpp-dev是 rslidar_sdk 解析 config.yaml 用的libpcap-dev是驱动抓包调试用的没有它会编不过。PCL 那三个是 fast-LIO2 点云处理的基础依赖。装完之后最好重启一下终端确认$ROS_PACKAGE_PATH正常。3. 速腾 Helios 驱动rslidar_sdk从源码到出现点云3.1 拉取代码与编译不要漏了子模块rslidar_sdk 不是放进catkin_ws/src就能直接编的它有子模块少了子模块编译时会报找不到消息定义。正确流程mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone https://github.com/RoboSense-LiDAR/rslidar_sdk.git cd rslidar_sdk git submodule update --init cd ~/catkin_ws catkin_make source ~/catkin_ws/devel/setup.bash有个经验之谈这个仓库的版本演进比较快不同版本 config.yaml 的字段名有差异。如果你参考的是网上老教程里面的字段比如ros_send_point_cloud可能在新版本里已经改了名字。最稳妥的办法是打开仓库自带的config/config.yaml看注释以它为准。3.2 网络配置IP 不对驱动编译得再好也没用Helios 默认 IP 一般是192.168.1.201不同批次可能不一样以设备标签为准。主机这边要在接雷达的网卡上配一个同网段的静态 IP比如192.168.1.102/24。如果系统用的是 netplan改/etc/netplan/01-netcfg.yamlnetwork: version: 2 ethernets: eth0: dhcp4: no addresses: - 192.168.1.102/24改完执行sudo netplan apply。然后先 ping 一下雷达ping 192.168.1.201ping 不通就往下查网线、供电、网口状态别急着开驱动。能 ping 通但没点云再检查防火墙sudo ufw disable简单粗暴测试阶段最有效。如果不想全局关防火墙就只放行两个 UDP 端口sudo ufw allow 6699/udp sudo ufw allow 7788/udp3.3 config.yaml 关键字段逐个解释这是驱动能否正确出点云的核心。我用的配置如下字段名以你仓库版本的默认文件为准common: lidar_count: 1 lidar: - driver: lidar_type: RSHELIOS frame_id: rslidar msop_port: 6699 difop_port: 7788 angle_compensate: true start_angle: 0 end_angle: 360 ros: ros_send_point_cloud: true ros_send_packet: false point_cloud_topic: /rslidar_points逐个说lidar_type必须写RSHELIOS。写错了驱动会按照别的型号的协议去解析数据包出来的点云要么是空的要么是一团乱点。frame_id点云消息的坐标系名我习惯用rslidar这个要跟后面 fast-LIO2 配置里的雷达 frame 对应起来。msop_port/difop_port数据口和配置口一般保持 6699/7788。angle_compensate角度补偿必须开。Helios 这类雷达有安装误差不开的话点云会有明显的层间错位。point_cloud_topic发布话题名fast-LIO2 的配置文件里要填这个名字我统一用/rslidar_points。另外如果你的驱动版本支持时间戳模式选择建议把时间戳来源设为主机时间不同版本字段名不同有的叫timestamp_link值为 0。这样才能保证点云和 IMU 用的是同一把时钟fast-LIO2 才能稳定运行。3.4 运行与验证先别急着开 fast-LIO2启动驱动roslaunch rslidar_sdk start.launch如果启动脚本不存在也可以直接rosrun rslidar_sdk rslidar_sdk_node它会自动读取默认路径下的 config.yaml。然后开三个终端分别验证rostopic list | grep rslidar rostopic hz /rslidar_points rvizrostopic hz输出应该在 10Hz 左右取决于雷达转速设置说明驱动已经把 UDP 包解析成点云了。rviz 里 Fixed Frame 设成rslidar添加 PointCloud2 话题确认看到的确实是环境的三维轮廓而不是乱点、断点、或者只有一层。到这一步驱动层就算通了。很多教程停在这但后面 fast-LIO2 还有一堆参数等着你。4. fast-LIO2 编译与参数适配三个必须改的地方4.1 编译先解决 Livox 依赖问题fast-LIO2 官方仓库主要针对 Livox 雷达开发但代码本身兼容标准 PointCloud2 输入。编译前需要确认 CMakeLists 里的USE_LIVOX选项是 OFF否则它会去找livox_ros_driver的消息头文件你没装就编译失败。cd ~/catkin_ws/src git clone https://github.com/hku-mars/fast-lio.git cd ~/catkin_ws catkin_make如果没报错说明环境没问题。如果报错说找不到某个 Eigen 头文件或静态断言失败就回到第 2.2 节确认 Eigen 是不是真的升级成功——很多时候你以为升级了但 CMake 缓存的还是旧路径。4.2 新建 RoboSense 专用的 launch 和 yamlfast-LIO2 自带的 launch 文件里没有专门给 RoboSense 的一般是基于 velodyne 的例子改。我的做法cd ~/catkin_ws/src/fast-lio cp launch/mapping_velodyne.launch launch/mapping_robosense.launch vim launch/mapping_robosense.launch把里面的 rosparam 路径改成指向robosense_16.yaml这个文件在 config 目录里有没有就复制velodyne.yaml改名launch node pkgfast_lio typefastlio_mapping namefastlio_mapping outputscreen rosparam file$(find fast_lio)/config/robosense_16.yaml / /node /launch然后打开config/robosense_16.yaml这是最需要关注的文件。4.3 参数含义每个数字都是花时间换来的common: lid_topic: /rslidar_points imu_topic: /imu/data time_sync_en: false preprocess: lidar_type: 1 scan_line: 16 blind: 4 point_filter_num: 4 mapping: acc_cov: 0.1 gyr_cov: 0.1 b_acc_cov: 0.0001 b_gyr_cov: 0.0001 fov_degree: 180 det_range: 50.0 extrinsic_est_en: true extrinsic_T: [-0.011, -0.023, 0.044] extrinsic_R: [1, 0, 0, 0, 1, 0, 0, 0, 1]参数说明表参数含义我的建议lidar_type点云类型1 表示标准 PointCloud2Velodyne 风格2 表示 Livox 自定义消息必须设 1scan_line雷达线数Helios 16 线设 16型号是 32 线的设 32blind近距盲区单位米忽略该距离内的点室内小场景设 1~2室外设 4point_filter_num抽稀间隔每 N 个点取一个点云密度高就设 4 或 5降低 CPU 压力acc_cov/gyr_covIMU 加速度计和陀螺仪的噪声协方差普通 IMU 设 0.1高性能 IMU 可调小到 0.01b_acc_cov/b_gyr_covIMU 零偏随机游走一般 0.0001 起步fov_degree参与匹配的水平视场角根据 Helios 型号的视场角来360° 视场的型号直接设 360extrinsic_est_en是否在线估计雷达与 IMU 外参第一次跑建议 true后面标定完改 falseextrinsic_T/extrinsic_R雷达坐标系到 IMU 坐标系的平移和旋转按实际安装尺寸填写符号错了地图必飘这里多说一句lidar_type: 1的原理。fast-LIO2 对标准的sensor_msgs::PointCloud2会读取每个点的time字段帧内相对时间和ring字段线号用它们做帧内运动补偿。rslidar_sdk 发布的点云里这两个字段是带了的所以这个组合本身是通的。后面如果发现地图扭曲多半是这里出了问题后面第 5 节细说。4.4 编译错误速查表我整理了几个高频错误和对应解法报错特征原因解法找不到Eigen/Dense头文件Eigen 路径没配好检查是否升级到 3.3.7确认/usr/local/include/Eigen软链接static assertion failedEigen 版本太旧按 2.2 节升级找不到livox_ros_driver/CustomMsg.hUSE_LIVOX被打开了CMakeLists 里设 OFF或删除相关 includeM_PI未定义C 标准库的数学宏问题在报错文件顶部加#define _USE_MATH_DEFINES并确保 C14 标准运行时std::bad_alloc点云话题为空或空指针先rostopic hz确认驱动在发数据再检查 yaml 的lid_topic是否拼错5. 联调与排错从没有点云到地图重影的完整排查链路真正让大多数人崩溃的不是编译而是编译全过、启动后却看不到想要的结果。这一节按照我实际排错的顺序给你一条可以照着走的链路。5.1 第一步驱动层自查fast-LIO2 没反应先别急着查它回头确认驱动层。逐项执行rostopic hz /rslidar_points rostopic echo /rslidar_points -n 1rostopic hz理想情况是 10Hz 左右。如果是 0看下面几个可能网卡静态 IP 丢了。Ubuntu 18.04 重启后有时 netplan 配置没生效ip addr看一下网卡有没有 192.168.1.102。防火墙把 UDP 挡了。直接sudo ufw disable。雷达没正常供电或者网线松了。注意 Helios 的指示灯状态按手册确认它在正常工作。rostopic echo /rslidar_points -n 1重点看两点fields里有没有time和ringheader.stamp是不是当前时间。time/ring 缺失说明驱动配置里的点云输出类型不对回到 config.yaml 检查。5.2 第二步IMU 与时间戳自查fast-LIO2 启动后日志停在等待 IMU 数据或者干脆没反应九成是 IMU 话题不对。确认你的 IMU 驱动确实在发rostopic hz /imu/data rostopic echo /imu/data -n 1rostopic echo里除了看数值是否合理还要看三个 cov 字段是否全为零。fast-LIO2 会用acc_cov和gyr_cov作为测量噪声方差如果你把 yaml 里的值设成 0或者 IMU 消息里的 covariance 数组全零卡尔曼滤波会直接认为 IMU 测量绝对可信结果就是地图剧烈抖动甚至发散。时间戳上最容易踩的坑是点云和 IMU 时间差恒定偏大。如果 IMU 驱动自己有一套时间基准比如接了 GPS 授时而点云用的是主机时间两边差几百毫秒fast-LIO2 跑起来会表现为初始几秒看起来正常然后地图开始甩头。解决方法就是在都还没接 GPS 的情况下两个话题全部用主机时间并把time_sync_en设为 false。5.3 第三步fast-LIO2 运行层自查进入了 fast-LIO2 的日志界面看几行关键输出有没有成功接收点云和 IMU 的统计不同版本日志格式不同但一般会打印点云帧号和点数。number of cloud points是否是个合理的数量级。如果每次都是 0检查lidar_type是不是设成了 1。日志里有没有报坐标变换相关的 warning。启动命令是roslaunch fast_lio mapping_robosense.launch同时开 rviz 看地图和里程计rviz -d ~/catkin_ws/src/fast-lio/rviz_cfg/loam_livox.rvizrviz 里 Fast-LIO2 的配置模板针对 Livox 定制Fixed Frame 可能设的是livox_frame把它改成map或camera_init取决于你的 fast-LIO2 版本默认的输出 frame再把点云话题改成/cloud_registered就能看到建图效果。5.4 第四步地图质量与坐标系自查地图出来之后常见问题有两个地图重影或者轨迹持续漂移。地图重影也就是同一面墙出现双层影子优先查三件事外参符号。把雷达装在 IMU 左边还是右边、朝前还是朝后extrinsic_T的正负号必须对应。这个我在第 4 节说过是人最容易出错的地方。点云时间字段异常。Helios 的time字段单位在部分驱动版本里不是微秒而是别的量纲fast-LIO2 做去畸变时算出来的帧内位移就会错得离谱。排查方法rostopic echo /rslidar_points -n 1看一帧内最大的time值和最小值的差。一帧 100ms 左右正常情况这个差应该接近 100000 微秒。如果量级差很多网上搜一下对应驱动版本的 time 字段单位在代码里补一个缩放。blind设小了。近处的杂散点噪声极大会拉偏配准结果把 blind 提到 2~3 米试试。轨迹漂移尤其是原地转圈后地图对不上先看 IMU 零偏是否收敛。fast-LIO2 的前几十帧卡尔曼滤波在估计零偏这个阶段地图质量差是正常的。跑一分钟左右如果还在飘把acc_cov和gyr_cov调大一点让滤波器更相信 Lidar 而不是 IMU反之如果地图抖动但轨迹不飘说明 IMU 被过度信任适当调小协方差。5.5 完整排错速查表现象优先检查再检查完全没有点云话题rostopic list里有没有/rslidar_pointsrslidar_sdk 是否启动、config.yaml 的 topic 名有话题但 hz 为 0网络 ping 雷达 IP防火墙、UDP 端口点云全是 NaNlidar_type写错供电不足fast-LIO2 收不到点云yaml 的lid_topic拼写和驱动话题一致lidar_type设为 1fast-LIO2 收不到 IMUyaml 的imu_topic拼写IMU 节点是否启动地图重影外参符号点云time字段单位地图抖动IMU 协方差太小抽稀参数point_filter_num加大跑一会儿内存暴涨点云抽稀太少rslidar_sdk 的 point_cloud_topic 是否只发点云不发 packet6. 一些写在最后的实操心得这套系统我重装过三轮每次都有新的感悟。最有价值的一条经验是先把数据录下来再慢慢调参数。参数调试阶段不需要雷达一直转着先录一个包rosbag record /rslidar_points /imu/data -O helios_test.bag然后回放rosbag play helios_test.bag这样你可以反复用同一份数据测试不同的blind、point_filter_num、IMU 协方差改动后马上知道效果不用每次都在真实环境里来回走动。这个方法帮我至少省了两天时间。第二条经验是Ubuntu 18.04 上的工具链偏老装东西时不要随意升级系统级的库。比如把 PCL 从系统源升级到最新版反而会导致 rslidar_sdk 和 fast-LIO2 编译出一些奇怪的符号错误。保持在 apt 源的版本够用了。第三条照顾一下刚入门的朋友如果你看到这篇时还在纠结为什么 rviz 里没有点云先回头看一眼网线——我遇到过好几次所谓的驱动问题最后发现是网口插错了或者雷达电源灯压根没亮。硬件层的事先排除再去碰软件。最后再分享一个小细节。fast-LIO2 跑通之后建议把extrinsic_est_en从 true 改成 false把你实测的外参写死。在线估计外参虽然方便但在长时间运行时会引入额外的自由度对建图精度有微小影响。标定完之后固定下来系统才真正进入稳定状态。