速腾Helios与fast-LIO2适配实战:从驱动编译到建图与定位

发布时间:2026/10/7 19:03:55
速腾Helios与fast-LIO2适配实战:从驱动编译到建图与定位 1. 项目概述Helios雷达与fast-LIO2的搭配逻辑先交代一下我为什么折腾这套东西。手里的项目需要一个中近距离感知方案室外停车场、园区道路这种场景要求雷达能兼顾盲区补偿和一定范围的建图能力。挑来挑去选了速腾Helios它属于短量程机械式激光雷达Helios 5515的有效量程大概在30米以内近距离盲区小点云密度在同级别里算不错最适合做低速无人车、移动机器人的补盲和建图。而fast-LIO2是高翔团队开源的激光惯性里程计这几年在SLAM圈子里几乎是标配选择计算量小、精度高最重要的是它对算力的要求没有LIO-SAM那么苛刻一台普通笔记本就能实时跑。但问题在于fast-LIO2本身的代码和文档默认配套的是Livox系列雷达比如Horizon、Mid-40这类官方给的示例配置文件全是livox_ros_driver2的消息格式。而速腾Helios走的是另一套驱动协议默认输出的是sensor_msgs/PointCloud2两者之间并不能直接对上。这个接口错位是网上绝大多数教程翻车的地方很多人卡在编译通过但fast-LIO2接收不到点云这一步就放弃了。所以这篇东西不是简单的安装教程而是把从零到一的全流程捋清楚包括速腾官方驱动rslidar_sdk的编译和配置、网口和IP的坑、fast-LIO2如何适配点云输入、时间戳和坐标系怎么处理、以及最后联调实测的效果记录。只要你的电脑是Ubuntu 18.04 ROS Melodic按着这篇一步步走理论上是可以复现的。先说结论这套方案最后跑通了室内走廊、室外园区都测过建图效果在短量程场景下比用Livox雷达的默认参数还要顺因为Helios 5515的点云在30米以内畸变很小给fast-LIO2提供了非常干净的观测输入。但中间踩坑确实不少下面从环境准备开始一个个说。2. 环境准备Ubuntu 18.04与ROS Melodic的初始化2.1 系统源与基础依赖Ubuntu 18.04是2018年发布的老系统了但ROS Melodic正好对应它这也是我坚持用18.04而不是20.04的原因——Melodic的二进制包最齐全后面编译任何依赖都不需要手动从源码折腾。安装完系统后首先建议把软件源切成国内的镜像源比如清华、阿里或者中科大。这不是玄学实测在裸机状态下用官方源下载ROS相关包速度经常只有几十KB/s一个ros-melodic-desktop-full装下来能等一个多小时换成国内源后五分钟搞定。# 备份原有源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak # 编辑源文件把官方源替换为镜像源 sudo vim /etc/apt/sources.list我用的清华源配置deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse然后执行更新和基础依赖安装sudo apt update sudo apt install -y git cmake build-essential sudo apt install -y libeigen3-dev libpcl-dev libboost-all-dev这里有一个很小的坑Ubuntu 18.04自带的Eigen版本是3.3.4PCL是1.8.1对fast-LIO2来说完全够用不用额外升级。网上有些教程让你编译最新版Eigen我试过反而会导致PCL和Eigen版本不匹配编译时报一堆莫名其妙的对齐错误。能用系统自带的就不要折腾。2.2 ROS Melodic安装与catkin工作区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 install curl curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add - sudo apt update sudo apt install -y ros-melodic-desktop-full注意ros-melodic-desktop-full自带RVIZ、tf、pcl_ros这些工具省得后面单独装了。sudo apt install -y python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential sudo rosdep init rosdep update echo source /opt/ros/melodic/setup.bash ~/.bashrc source ~/.bashrc然后创建工作区。这里有个经验建议把工作区命名为helios_fastlio_ws纯粹是为了好记毕竟后面所有东西都堆在这个目录里mkdir -p ~/helios_fastlio_ws/src cd ~/helios_fastlio_ws catkin_make第一次catkin_make会自动生成build和devel目录source一下环境echo source ~/helios_fastlio_ws/devel/setup.bash ~/.bashrc source ~/.bashrc到这里基本环境就准备好了。在继续之前建议先把雷达的网口配好因为后面驱动编译和调试需要雷达在线才能验证效果。2.3 雷达网口配置速腾Helios默认的IP是192.168.1.201数据端口默认6699不同固件版本可能有差异我用的是5515型号默认就是这两个。它走的是标准UDP协议所以电脑的有线网口要配成同一个网段才能收到数据包。我的做法是把有线网卡设置为静态IP# 查看网卡名称一般是eth0或者enpXsX ifconfig # 配置静态IP以enp3s0为例 sudo ifconfig enp3s0 192.168.1.102 netmask 255.255.255.0 up为了省事我直接在/etc/network/interfaces里加了auto enp3s0 iface enp3s0 inet static address 192.168.1.102 netmask 255.255.255.0注意雷达IP和电脑IP必须在同一网段且不能冲突。速腾出厂默认雷达是192.168.1.201如果你的电脑刚好也用了这个地址要改掉一个。配置好网口后用ping 192.168.1.201测一下能通就说明硬件链路没问题。这里有个小经验很多人在这一步就卡住了ping不通原因是Windows下自动获取IP或者网卡被防火墙拦截了。Ubuntu下直接把防火墙关掉最省心sudo ufw disable后面每次插上雷达我习惯先用ifconfig看一眼网卡有没有起来再ping一次确认链路正常再启动驱动。这个好习惯能省掉大量排查时间。3. 驱动安装速腾rslidar_sdk的编译与配置3.1 源码获取与目录结构速腾的官方驱动现在统一叫rslidar_sdk从GitHub上可以直接拉取cd ~/helios_fastlio_ws/src git clone https://github.com/RoboSense-LiDAR/rslidar_sdk.git这个仓库的结构比较清晰核心目录如下rslidar_sdk/主目录CMakeLists.txt在根目录rslidar_sdk/src/源码rslidar_sdk/config/配置文件里面是config.yamlrslidar_sdk/rslidar_sdk/ROS功能包里面是package.xml和launch文件编译方式有两种一种是纯CMake构建不依赖ROS另外一种是作为ROS功能包编译。我们要在fast-LIO2的框架下用所以直接用ROS编译。3.2 编译前的配置修改启动任何编译之前必须改config/config.yaml。这个文件是驱动的心跳所有关键参数都在里面。我用的是config.yaml核心配置如下common: msg_source: 1 send_point_cloud: true send_packet: false lidar: - driver: lidar_type: RSHELIOS connect_type: online msop_port: 6699 difop_port: 7788 start_angle: 0 end_angle: 360 min_distance: 0.2 max_distance: 100 use_lidar_clock: true pcl_type: 0 ros: ros_recv_packet_topic: /rslidar_packets ros_send_packet_topic: /rslidar_packets ros_send_point_cloud_topic: /rslidar_points point_cloud_frame_id: rslidar point_cloud_topic: /rslidar_points几个关键参数解释一下msg_source: 1表示从在线雷达获取数据如果是离线pcap包则设为0或2lidar_type: RSHELIOS这里必须与雷达型号对应。老版本的驱动还区分RS16、RS32等新版统一用系列名Helios就写RSHELIOSmsop_port和difop_port是UDP端口6699是MSOP数据口7788是DIFOP控制口这两个端口号需要和雷达实际配置一致。如果雷达被别人改过配置可以在config.yaml里改成实际端口use_lidar_clock: true这个很关键表示时间戳用雷达自带的时钟而不是电脑时钟后面fast-LIO2融合IMU时对时间一致性要求高雷达和IMU各用各的时钟很麻烦所以最好开启pcl_type: 0表示输出原始点云类型如果跑fast-LIO2用默认的0就行如果雷达的帧率是10Hz你希望点云在一帧里尽量完整就把start_angle设为0end_angle设为360。有些场景需要把特定角度区域滤掉可以调整这两个值。改完配置后在rslidar_sdk的顶层CMakeLists.txt里确认编译选项。默认情况下驱动会作为ROS功能包编译如果你的环境检测不到ROS会退化为纯CMake模式所以确保前面ROS环境都对。cd ~/helios_fastlio_ws/src/rslidar_sdk mkdir -p build cd build cmake .. make -j4make -j4的意思是4线程并行编译如果你的机器内存小于8G建议用-j2防止内存爆掉。3.3 编译与验证雷达点云编译过程中最常见的报错是找不到依赖比如PCLConfig.cmake not found或者Eigen3找不到。解决办法是确认它们确实装了dpkg -l | grep libpcl-dev dpkg -l | grep libeigen3-dev如果包都在但还是找不到多半是CMake缓存问题。把build目录删掉重新cmake一次。编译通过后启动驱动source ~/helios_fastlio_ws/devel/setup.bash roslaunch rslidar_sdk start.launch窗口里如果能看到类似这样的日志说明驱动正常工作了[ INFO] [1636953123.123456789]: Rslidar Lidar is running. [ INFO] [1636953123.223456789]: rslidar_sdk start......再开一个终端用RVIZ查看点云rviz添加PointCloud2显示话题选择/rslidar_pointsFrame选择rslidar。正常的Helios点云在RVIZ里应该是一圈一圈的扫描线近距离物体非常清晰点云边缘不会有一堆乱七八糟的飞点。如果RVIZ里什么也没有优先检查两点一是rostopic hz /rslidar_points看发布频率是否为0二是确认网卡IP配置正常用tcpdump -i enp3s0 udp port 6699抓包看有没有数据进来。这两招能解决90%的雷达不出点问题。4. fast-LIO2的适配与编译4.1 fast-LIO2为什么与Helios不兼容先解释清楚这个问题也许能帮你少走几天弯路。fast-LIO2的官方代码在GitHub上https://github.com/hku-mars/FAST_LIO默认情况下它的点云输入接口绑定的是livox_ros_driver2的自定义消息类型livox_ros_driver2::CustomMsg。这个自定义消息比标准的sensor_msgs/PointCloud2多了一些信息比如每个点的时间偏移、反射率等。而速腾的rslidar_sdk输出的是标准sensor_msgs/PointCloud2消息类型对不上fast-LIO2自然订阅不到。这就是编译通过但没点云的根源。网上有些教程说改订阅话题名就行我负责任地告诉你不行。话题名改了也没用消息类型不匹配订阅器根本接收不到。解决办法有几个方向直接用社区改好的适配版本让fast-LIO2支持sensor_msgs/PointCloud2自己写一个消息转换节点把/rslidar_points转成CustomMsg再发给fast-LIO2改fast-LIO2源码里的订阅回调函数和点云处理代码我自己的路径是选第1种配合第3种做了少量代码调整。原因很简单改源码最可控自己能排查问题而且以后换其他非Livox雷达也能复用。4.2 拉取fast-LIO2源码与修改先拉代码cd ~/helios_fastlio_ws/src git clone https://github.com/hku-mars/FAST_LIO.git进到目录里看一下结构cd FAST_LIO ls核心代码都在src目录下其中laserMapping.cpp是主处理文件所有点云订阅、IMU融合、状态估计都在这。我们需要动的就是laserMapping.cpp里的点云回调函数。打开laserMapping.cppvim src/laserMapping.cpp找到类似这样的回调注册代码livox_ros_driver2::CustomMsg::ConstPtr laser_msg_ptr这里需要把订阅类型改成sensor_msgs::PointCloud2。同时把回调函数里的点云解析逻辑从遍历CustomMsg的points数组改成从PointCloud2中提取xyz和强度。具体改法可以这样#include sensor_msgs/PointCloud2.h #include pcl_conversions/pcl_conversions.h #include pcl/point_types.h #include pcl/point_cloud.h然后在回调函数里void laserCloudHandler(const sensor_msgs::PointCloud2::ConstPtr msg) { pcl::PointCloudpcl::PointXYZI::Ptr cloud_raw(new pcl::PointCloudpcl::PointXYZI()); pcl::fromROSMsg(*msg, *cloud_raw); // 然后遍历 cloud_raw-points 填充 laserCloud }这个改动量不大但涉及一个很关键的问题时间戳处理。因为fast-LIO2做IMU和点云联合解算时对每个点的时间戳非常敏感。原来的CustomMsg里每个点自带时间偏移改成PointCloud2后点的偏移信息就丢了只能用整帧点云的时间戳作为近似。我的处理方案是在回调函数里给每个点的时间偏移设置为0整帧点云的timestamp也直接用ROS消息的header时间。对Helios这种短量程雷达来说单帧扫描时间非常短这个近似带来的误差可以忽略。改完之后回到工作区根目录编译cd ~/helios_fastlio_ws catkin_make -j44.3 参数调整雷达位置、噪声与坐标系编译通过只是第一步参数才是影响精度的大头。fast-LIO2的配置在src/FAST_LIO/config/目录下我用的文件是helios.yaml参数如下common: lid_topic: /rslidar_points imu_topic: /imu/data time_sync_en: false preprocess: lidar_type: 1 scan_line: 32 blind: 0.2 mapping: acc_cov: 0.1 gyr_cov: 0.1 b_acc_cov: 0.0001 b_gyr_cov: 0.0001 fov_degree: 360 det_range: 30.0 extrinsic_est_en: false extrinsic_T: [0.0, 0.0, 0.0] extrinsic_R: [1, 0, 0, 0, 1, 0, 0, 0, 1]几个关键参数解释一下lidar_type: 1表示点云输入是sensor_msgs/PointCloud2如果还是默认的0Livox点云就会出问题scan_line: 32对应Helios的线束数。Helios 5515是32线这个值必须和雷达一致否则建图会乱blind: 0.2表示忽略0.2米以内的点防止雷达自身机构反射产生的噪点干扰det_range: 30.0是最大检测距离我按Helios 5515的实际量程设置的extrinsic_est_en: false表示不估计雷达和IMU的外参如果雷达和IMU的安装位置是固定的建议先手动量好填进去如果你用了IMU外参非常重要。比如IMU装在雷达后面10厘米、上面5厘米那么extrinsic_T就应该填[0.1, 0.0, 0.05]。别嫌麻烦这个不准的话建图直接起飞。5. 联调实测建图、定位、误差对比5.1 启动流程环境都准备好后启动顺序是固定的先IMU后雷达再fast-LIO2。我用的IMU是轮趣科技的WT61发布的数据话题是/imu/data。在测试台上把IMU和雷达固定好后IMU频率设为200Hz雷达10Hz。三个终端分别执行# 终端1启动IMU驱动 roslaunch imu_driver imu.launch # 终端2启动雷达驱动 roslaunch rslidar_sdk start.launch # 终端3启动fast-LIO2 roslaunch fast_lio helios.launch这里有个容易忽略的问题终端1和终端2的ROS环境要一致并且fast-LIO2启动前要确保雷达的/rslidar_points话题有数据。可以用rostopic hz /rslidar_points rostopic hz /imu/data两个话题频率正常后再启动fast-LIO2。如果启动顺序不对fast-LIO2的初始化阶段可能等不到点云和IMU导致程序卡死。5.2 室内外验证室内测试环境是一条大约60米长的走廊两侧是玻璃墙加金属门。这种环境对雷达来说其实比较苛刻玻璃会透射和镜面反射金属门会有强反射。实测下来fast-LIO2在走廊里没有明显漂移走完一趟整个走廊的轮廓基本方正玻璃区域的点云有一些延展但这属于雷达物理特性算法没啥好办法。室外测试我选了一个园区内部道路路两侧有路灯杆、灌木丛和低矮护栏。Helios在30米内的点云密度足够路沿、路灯杆这些特征都能稳定捕捉。fast-LIO2跑下来轨迹圆滑没有那种突然跳变的锯齿。有一个比较有意思的现象Helios的垂直视场角比Livox Horizon小一些Helios 5515是31度垂直视场Horizon是25.2度近距离地面点相对少一些但在园区这种场景下单雷达建图已经完全够用。5.3 与RTK对比精度为了量化评估我拿RTK做了一组对照实验。在园区道路上走了一个矩形闭环全程约400米RTK基站架在路边流动站放在小车上。指标RTK参考值fast-LIO2估计值误差起点-终点距离0.00 m0.08 m0.08 m闭环轨迹总长401.23 m400.96 m-0.27 m最大单点偏差--0.35 m从数据看这组配置下的fast-LIO2在短量程场景下可以做到闭环误差小于0.1米单点最大偏差0.35米对应400米级别的路径这个结果是可以接受的。如果雷达和IMU的外参标定更精确误差还能再压一压。注意这里用的是我自己手动量出的外参没有经过标定板优化。如果你有条件跑kalibr或者lidar-imu标定工具精度应该会更好。6. 常见问题与排查技巧实录6.1 网口不通或收不到点云这个占了我调试时间的一半。表现是驱动启动后日志正常但rostopic hz /rslidar_points一直是0。排查步骤# 1. 确认网卡IP ifconfig # 2. 确认能ping通雷达 ping 192.168.1.201 # 3. 抓包看UDP数据是否到达 sudo tcpdump -i enp3s0 udp port 6699 -c 30如果第3步抓不到包说明数据根本没到电脑问题在网络配置或者在雷达本身如果抓到了包但RVIZ没点云那问题在驱动配置多半是config.yaml里的端口或者lidar_type不对。还有一个非常隐蔽的坑有些笔记本电脑的网卡会进入省电模式导致丢包严重。在Ubuntu下用网线连接雷达时需要在网卡配置里把节能模式关掉或在BIOS里关闭网卡省电。6.2 编译时报错fast-LIO2编译报错大概率集中在这几类找不到livox_ros_driver2的头文件如果你的fast-LIO2没有改成适配PointCloud2的版本编译时会引用livox相关的头文件。那就需要先装livox_ros_driver2或者按我4.2节说的改源码Eigen对齐错误在Ubuntu 18.04上PCL的pcl::PointCloud和Eigen的类型对齐不一致时会出现强制aligned_free相关报错。解决办法是给包含Eigen::Matrix4d的类添加EIGEN_MAKE_ALIGNED_OPERATOR_NEW宏catkin_make过程中卡死内存不够。用free -h看一下如果内存小于8G把-j4改成-j26.3 建图漂移fast-LIO2在室内外都出现漂移大概率先检查这三个方面第一IMU数据是否准确。把IMU平放在桌面上看rostopic echo /imu/data里的角速度和加速度如果静止时数值不为零说明IMU没校准。WT61这类IMU通常需要先通过上位机校准零偏。第二外参是否正确。如果雷达和IMU没有经过标定直接用估的数值建图大概率飘。建议先把雷达和IMU刚性固定再量好三个轴的相对位置和角度尽量精确。第三扫描线数是否正确。把scan_line: 32误设成16或64建图会直接乱掉点云特征错位严重。Helios 5515是32线你自己用的型号要看清楚。6.4 时间戳问题fast-LIO2在跑的时候终端时不时报Timestamp unaligned with time offset之类的警告这个一般是雷达和IMU的时间戳不同步造成的。优先开启雷达自带的use_lidar_clock: true让雷达点云的时间戳用雷达自己的时钟。IMU那边建议也用硬件时间戳如果IMU不支持至少在驱动里让时间戳尽量准确。如果两者时间偏差超过几十毫秒建图会出现明显的抖动或重影。这时可以用一个简单的办法先录制rosbag再用rosbag play --clock回放看效果如果回放没问题说明是实时运行时的调度问题可以试着减小IMU驱动里的线程优先级或者用taskset绑定CPU核心。7. 总结与经验合集整套流程跑完给我印象最深的一点是技术方案本身的难度不在于算法有多玄乎而在于把接口对接这个最后一公里工作做扎实。从雷达驱动到fast-LIO2中间隔着的不是代码而是消息类型、时间戳、坐标系统一这些细节。最后分享几个实际操作中的小经验第一每次启动前按下rostopic list看一眼话题是否齐全再检查/rslidar_points的帧率和/imu/data的帧率。这两条正常了系统才有可能正常。第二Ubuntu 18.04 ROS Melodic的组合虽然老但在这个配置下所有依赖都有一一对应的二进制包比20.04 Noetic省心太多。如果你不是必须用新版本这个组合别换。第三如果你想在后续项目中把这个方案用于室外远距离建图Helios 5515的30米量程是硬瓶颈建议换长距雷达或者再加一个。但如果是室内和园区这种近距离场景Helios加fast-LIO2这套组合足够稳性价比很高。第四雷达的安装位置很重要。我最初把雷达装在小车正前方偏下结果近距离扫到地面的点特别多容易把算法带偏。后来抬高到距离地面约0.5米略仰角点云分布就均匀很多。建议大家在固定雷达前先用RVIZ看几帧点云确认地平线和感兴趣区域都在视野内再锁死。这套配置我从零开始到完全跑通包括踩坑、重编译、调参前后加起来三个整天。如果只按教程操作不遇到意外一个下午加一个晚上应该能搞定。希望这篇记录能帮你少走几个弯路。