2026/10/8 20:13:07

RS-16激光雷达与SC-A-LOAM建图实战:从环境配置到参数调优

RS-16激光雷达与SC-A-LOAM建图实战:从环境配置到参数调优 最近在给一台差速底盘小车做自主导航的底层建图手头正好有一台速腾16线激光雷达RS-16系统是Ubuntu 18.04ROS melodic。之前试过用LOAM系列的算法但建图效果一直不太理想后来换了SC-A-LOAM在RS-16上的表现让我有点惊喜。这篇文章就记录一下我完整跑通SC-A-LOAM的过程包括环境搭建、驱动配置、算法编译、参数调整、问题排查等等全是实操层面的干货希望能帮到正好在折腾这套组合的朋友。先说结论RS-16 Ubuntu 18.04 SC-A-LOAM这套组合是完全可行的而且建图效果要比我预期的好不少。SC-A-LOAM在室外空旷环境下的表现尤其不错回环检测的精度也够用整条链路跑顺之后输出的点云地图能直接给后续的导航定位模块用。1. 为什么选SC-A-LOAM而不是其他LOAM变体1.1 LOAM、ALOAM、SC-A-LOAM的区别我最早尝试的是ALOAM它在KITTI数据集上的效果很好代码结构也清晰但有个明显的问题它没有回环检测模块。纯前端里程计会随着运行时间累积漂移尤其是长时间建图或在大场景里跑的时候地图会慢慢变形。后来我又看了原版LOAM它的代码比较老维护性差而且在多线雷达上的适配不如ALOAM顺手。直到接触SC-A-LOAM它最大的改进就是加了Scan Context全局回环检测。简单说Scan Context是一种用点云帧生成“图像签名”的方法系统在运行时会定期用当前帧和历史帧做全局匹配一旦发现闭环就通过图优化把累积的漂移拉回来。对于我这种要在室外环境跑几百米再绕回起点的情况回环检测几乎是刚需。1.2 SC-A-LOAM的算法核心流程SC-A-LOAM在整体架构上沿用了ALOAM的前端提取角点和平面点用scan-to-scan的方式估计帧间位姿再用scan-to-map的方式做精配准。但它额外加了两个模块一个就是上面说的Scan Context全局回环检测另一个是基于GTSAM的位姿图优化。具体流程大致是每进来一帧点云先做特征提取把角点和平面点分出来然后跟前一帧做匹配得到一个初步的帧间位姿。这个结果会送到局部地图做一次scan-to-map配准得到更精确的位姿。每隔一段距离或时间系统会生成一个关键帧并把这个关键帧的点云上下文描述子存进数据库。当新的关键帧进来时会和数据库里的历史帧做检索如果相似度超过阈值就认为检测到了回环然后把回环约束加入因子图触发一次全局优化。优化完的位姿反馈回前端地图就得到了修正。这套设计的好处是即使前端已经有一些漂移只要回环检测靠谱整体图还是能被拉回来。当然回环检测也不是万能的你得保证设备经过的区域有足够的视觉特征纯空旷的广场或长走廊容易让回环检测失效这个后面我会详细说怎么规避。1.3 版本与代码分支的选择建议SC-A-LOAM的官方仓库里有几个分支我建议直接选gtsam分支因为回环优化部分依赖GTSAM库。另一个分支是ceres版本的但优化效果和代码维护性都不如gtsam分支好。如果你只是做前端里程计测试不想要回环也可以切到纯ALOAM的模式但那就失去了选SC-A-LOAM的意义。我用的系统环境是Ubuntu 18.04 ROS melodic跟SC-A-LOAM官方推荐的系统版本是一致的。如果你用的是Ubuntu 20.04或ROS noetic也能编译但可能需要在依赖版本上做点调整尤其是PCL、Eigen、GTSAM这些库的版本建议先确认清楚再动手。2. 环境搭建与依赖安装最容易翻车的一步2.1 系统、ROS与依赖库版本清单先列一下我实际用的版本组合照着这个搭配不容易踩坑Ubuntu 18.04.5 LTSROS melodic desktop-fullEigen 3.3.4系统自带PCL 1.8.1系统自带Ceres Solver 1.13或1.14GTSAM 4.0.2速腾RS-16官方ROS驱动rslidar_sdk以上版本是经过验证的全部都直接apt安装或编译源码就能跑通。但有个坑要提前说Eigen和PCL如果自己手动编译过新版可能会导致SC-A-LOAM编译时出现ABI不兼容的报错所以如果你不是特别需要新版特性尽量别折腾这两个库。2.2 ROS melodic环境的安装细节ROS melodic的安装流程文档写得很清楚但我建议重点确认两件事第一源要挑对。国内用户建议直接换清华源或中科大源不然下载到一半失败会很想摔键盘。换完源之后执行sudo apt update再开始安装。第二rosdep的初始化问题。很多人在sudo rosdep init这一步卡住报网络错误或超时。这种情况多半是访问GitHub仓库受限最好用可用的网络镜像源把rosdep源替换掉再执行init和update。如果你已经卡在这步了别硬磕换源几分钟就能解决。安装完desktop-full之后建议立刻验证一下ROS能否正常启动跑一下roscore然后用rosrun turtlesim turtlesim_node验证图形界面尽量在开始装驱动之前就把系统环境确认好否则后面出了问题都不知道是ROS的问题还是别的问题。2.3 Ceres Solver和GTSAM的编译细节这两个库是SC-A-LOAM的核心依赖Ceres负责Scan-to-Map的优化部分GTSAM负责回环检测的全局优化部分。编译时建议按Ceres、GTSAM、SC-A-LOAM的顺序来因为SC-A-LOAM的CMake会同时找这两个库。Ceres的编译其实很简单但依赖项一定要装全。我在Ubuntu 18.04上安装时会用到这几个包sudo apt-get install -y libgoogle-glog-dev libgflags-dev libatlas-base-dev libsuitesparse-dev然后到Ceres源码根目录执行标准编译流程mkdir build cd build cmake .. make -j4 sudo make installGTSAM也一样依赖项主要是Boost和CMake编译时间会比较长建议用make -j4让它慢慢跑。编译GTSAM时有个小坑如果系统里同时存在不同版本的Boost可能会导致运行时崩溃所以建议在干净的Ubuntu 18.04环境里编译避免多版本混杂。2.4 工作空间的创建与SC-A-LOAM编译验证依赖装好之后就可以开始搭SC-A-LOAM的工作空间了。我通常会这样建mkdir -p ~/scaloam_ws/src cd ~/scaloam_ws/src git clone https://github.com/gisbi-kim/SC-A-LOAM.git cd .. catkin_make如果编译过程中报找不到某个库的头文件多半是CMake没有自动找到库路径。这时候可以用rospack find或pkg-config --cflags去确认库的实际安装位置然后在SC-A-LOAM的CMakeLists.txt里手动添加include路径。这里有个小经验不要一报错就整个删掉重编先看是哪一步失败的多数时候补个依赖就能解决。编译成功之后建议先用官方提供的数据包做个快速冒烟测试确认算法本身能跑再去接RS-16的驱动。这样可以把“算法问题”和“雷达驱动问题”分开排查效率会高很多。3. RS-16激光雷达驱动的配置要点3.1 速腾RS-16的参数与硬件连线RS-16是速腾聚创的一款16线机械式激光雷达垂直视场角-15°到15°测量距离一般在100米左右精度在厘米级。它通过网口输出UDP数据包默认的接收端口是669MSOP和778DIFOP。和很多工业雷达一样它不依赖USB直接插网线就能工作但需要你手动配置电脑的IP地址让电脑和雷达处于同一个子网段。硬件连接其实非常简单雷达接上电源一般是PoE供电或DC供电看具体套件网线一头接雷达另一头接电脑的千兆网口。然后设置电脑网卡的静态IP比如192.168.1.102子网掩码255.255.255.0网关可以不填。RS-16的默认设备IP一般出厂是192.168.1.200所以在同一子网下应该能被驱动找到。3.2 驱动包的选择rslidar_sdk与rslidar_pointcloud速腾官方提供了两套驱动方案。早期的rslidar_pointcloud是ROS1老版本驱动我现在用的rslidar_sdk是新一代SDK同时支持ROS1、ROS2代码结构更清晰配置也更灵活我建议直接选这个。rslidar_sdk有几个关键配置文件config/config.yaml负责SDK的参数比如雷达型号、UDP端口、话题名package_ros1.xml是用来给catkin识别的还有CMakeLists.txt。配置时重点确认这几项lidar_type: RS16或RSLIDAR16这个必须匹配否则解析不了数据包。udp_port: 669对应MSOP端口。topic_name: 发布点云的话题名我习惯设为/rslidar_points。frame_id: 设置为rslidar或laser_link尽量和后续算法里的坐标系对上。改完配置后重新catkin_make一次启动驱动节点roslaunch rslidar_sdk start.launch如果正常终端里会出现设备信息比如SN号、固件版本然后rostopic echo /rslidar_points能看到点云数据。3.3 网卡配置与组播地址的坑RS-16的驱动经常用组播方式发数据如果你的电脑和雷达不在同一个组播组就收不到数据包。首次配置时建议直接在ROS驱动配置文件里把组播地址设为0.0.0.0或关闭组播模式这样能避免很多麻烦。另外Ubuntu 18.04默认启用防火墙ufw如果没放行UDP端口也会导致收不到点云。我遇到过几次这种问题折腾半天发现是防火墙把UDP包过滤了。解决办法很简单sudo ufw allow 669/udp sudo ufw allow 778/udp或者直接临时关掉防火墙测试但我不建议长期关闭防火墙做完测试就记得恢复规则。还有个容易被忽视的点RS-16的数据量很大尤其是16线全速跑点云频率在10Hz左右如果电脑网卡是百兆口可能会因为带宽不足丢包导致点云“花屏”或出现空洞。建议使用千兆网卡最好直接插主板上的RJ45口不要经USB转网口除非你确定那个转接口是千兆的。3.4 用RViz快速验证点云是否正常驱动跑起来之后下一步就是用RViz看一下点云形态是否正常。启动方式很简单rviz然后在RViz里添加PointCloud2显示话题选择/rslidar_points固定坐标系选择rslidar或雷达的frame_id。如果一切正常你应该能看到雷达周围的点云地面是平的周围的建筑物、树木轮廓都很清晰。这里有个判断点云质量的小技巧把视角切到雷达的正上方垂直往下看点云应该呈一个完整的圆形而且没有明显的黑白噪点。如果点云有大量黑点或者大片空洞大概率是网线接触不良、供电不足或者UDP丢包而不是算法问题。另外如果点云有明显的“分叉”或“错位”说明雷达内部的时间戳同步可能有问题需要去驱动配置里检查时间戳来源。4. SC-A-LOAM在RS-16上的参数调整4.1 坐标系与frame_id的统一SC-A-LOAM的launch文件里默认的全局坐标系是camera_init激光雷达坐标系是laser_link。如果你的RS-16驱动发布的话题frame_id是rslidar那在launch文件里就需要做对应修改或者给rviz里设置固定的Fixed Frame为camera_init让它通过TF树找到雷达的坐标系。我习惯的做法是在雷达驱动和SC-A-LOAM之间加一个静态坐标变换把rslidar的坐标系转换到laser_linknode pkgtf2_ros typestatic_transform_publisher namelidar_to_base args0 0 0 0 0 0 rslidar laser_link /这样SC-A-LOAM不需要改代码就能直接订阅/rslidar_points而且RViz里也能自动完成坐标对齐。如果雷达安装位置不在车辆几何中心记得把平移量x y z也填进去保证点云投影正确。4.2 launch文件和yaml关键参数说明SC-A-LOAM的launch文件里有几个参数值得重点关注scan_line这个参数是定义最大线数对RS-16来说应该是16。minimum_range最小有效距离我设为0.5米低于这个距离的点会被过滤掉避免自车部件比如安装支架产生干扰点。maximum_range最大有效距离RS-16测距能到100米以上但我实际建图时通常设为80米太远的点反而会带来噪声还会增加计算负担。ground_remove是否移除地面点。SC-A-LOAM的前端本身不做地面分割而是在特征提取时会把平面点当作一类特征。我建议先关闭地面移除让算法自己提取特征这样在复杂地形上更稳定。4.3 点云预处理降采样与ROI过滤的必要性RS-16的原始点云16线全速输出时点数也不少直接灌给SC-A-LOAM会导致前端实时性变差。所以我通常会在驱动发布点云后加一个VoxelGrid降采样节点把体素大小设为0.1米或0.2米。这样点云密度降低但几何特征保留得还算完整SC-A-LOAM的匹配速度会有明显提升。对于有运动物体的场景我还会做一个简易的ROI过滤去掉雷达附近栏杆、行人、车辆等动态干扰点。可以用PCL的CropBox节点把距离雷达5米以内的区域切掉一部分具体范围根据你的实际场景来设。别看这步简单它对回环检测的稳定性帮助很大因为动态物体会产生错误的特征匹配。4.4 关键参数调整实录从崩溃到稳定的过程我第一次跑SC-A-LOAM时直接用了官方默认参数结果在RS-16上运行不到两分钟就报了Segmentation fault。后来排查发现问题出在最小距离和最大距离的设置上。RS-16的近处点云密度高如果minimum_range设得太小很多靠近雷达的噪声点会被当作有效特征导致匹配算法出现野值。我把minimum_range从0.1调到0.5后崩溃问题基本消失。第二个调整是地图分辨率。SC-A-LOAM的地图是用叠加点云的方式生成的体素分辨率会影响地图的精细程度和计算量。我试过0.05米、0.1米、0.2米三档最终定在0.1米兼顾了细节和实时性。如果你对地图精度要求高比如要用于后续的定位和导航可以试试0.05米但要做好CPU占用明显升高的准备。第三个调整是关键帧的间隔。SC-A-LOAM默认按时间或距离触发关键帧间隔太密会导致位姿图节点过多优化耗时增加间隔太疏会导致回环检测的匹配精度下降。我根据RS-16的实际场景把距离阈值设为1米时间阈值设为2秒跑下来效果比较均衡。5. SC-A-LOAM与RS-16的实战建图5.1 第一次上楼数据集录制与回放如果你没有实车条件或者想先在离线环境验证算法可以使用rosbag录制雷达数据然后回放给SC-A-LOAM跑。这里有个细节录制bag时frame_id也会被保存所以即使你后来修改了驱动的话题名回放时也要保持frame_id一致否则SC-A-LOAM的TF会出错。录制命令很简单rosbag record -O outdoor_01 /rslidar_points录制时尽量保证雷达不动原地转几圈这样能覆盖更多周围环境也能给回环检测创造机会。录制时长建议控制在10分钟以内文件太大回放时会卡顿。回放时启动SC-A-LOAM和RViz然后rosbag play outdoor_01.bag注意播放速度。如果电脑性能一般建议用--rate0.5减速播放避免算法处理不过来回调丢帧。SC-A-LOAM的建图速度和点云输入频率相关RS-16是10Hz理论上可以实时跑但实际因为特征提取和优化很吃CPU降低播放速度能显著提升建图质量。5.2 室外园区实测回环检测的效果与调优我录制了一段园区道路的数据全程大约800米包含一个U字形折返。用SC-A-LOAM跑完后回环检测成功检测到了折返点地图闭合效果非常好。对比之前用ALOAM跑出来的图SC-A-LOAM的地图边缘更干净、墙体更垂直。不过我注意到一个问题回环检测不是立刻生效的。SC-A-LOAM在某些帧数间隔才会触发全局优化所以地图是“先漂移、后拉回”的状态。如果你在RViz里看到地图在中途“扭曲”不用慌继续往下跑等算法触发回环优化后地图会逐渐回正。这也解释了为什么跑数据时不能只看中途结果要看最终输出的完整地图。回环检测的阈值参数叫scan_context_minimum_ring_key和scan_context_maximum_ring_key这两个参数控制着上下文描述子匹配的灵敏度。如果回环漏检多可以适当放宽匹配距离如果误检多就收紧阈值。我在园区里把距离阈值从默认的20米调到15米误检明显减少。5.3 室内环境的建图效果与局限性SC-A-LOAM在室内环境的表现有点两极分化。在走廊、办公室这种几何特征丰富的环境里建图效果很好墙体和家具轮廓清晰。但在开阔的大厅、仓库或纯白墙壁的房间里由于激光点云缺乏足够的角点和平面特征算法会出现漂移回环检测也容易失效。我做过一次室内测试在一个约20米×15米的仓库里跑因为货架和柱子提供了大量垂直结构SC-A-LOAM建图精度很高地图和实际尺寸的误差大概在20厘米以内。但在另一个完全空旷的会议室里点云几乎全是平面点特征太少算法跑一会儿就开始漂地图歪得没法看。所以如果你主要做室内建图建议给点云增加一些结构化特征比如在墙上贴一些反光条或者放置临时障碍物让特征点更丰富。室外环境反而问题不大树木、路灯、建筑物都是很好的特征来源。5.4 地图输出的保存与后续使用SC-A-LOAM跑完后会把地图以pcd格式保存下来默认路径一般在~/scaloam_ws/src/SC-A-LOAM/下叫map.pcd。这个PCD文件就是完整的点云地图可以拿来给后续的定位模块用。我用PCL的pcl_viewer快速查看地图效果pcl_viewer map.pcd如果地图点云太多可以使用pcl_voxel_grid做一次离线降采样把体素设为0.05米或0.1米减少存储体积和后续处理耗时。如果你想把地图转成2D占据栅格地图给move_base用可以用octomap_server先把点云图转成OctoMap再投影成2D栅格地图。这一步不是必须的取决于你的导航方案。如果直接用Cartographer做2D SLAM那就不需要SC-A-LOAM的地图了两者是不同路线的方案别搞混。6. 常见问题与排查技巧实录6.1 编译阶段最容易踩的坑编译阶段最容易出问题的地方就是依赖库版本冲突。我在重装环境时因为偷懒直接用apt安装了ros-melodic-pcl结果PCL版本和SC-A-LOAM源码需要的版本不一致编译时报了一堆模板相关的错误。最后的解决办法是删除apt版PCL改用源码编译安装PCL 1.8.1然后再编译SC-A-LOAM问题就消失了。如果你们遇到类似报错可以先检查PCL、Eigen、GTSAM的版本优先考虑版本不兼容的问题。另外CMake找不到GTSAM的报错也经常出现。检查方式很简单find /usr -name GTSAMConfig.cmake如果没有输出说明GTSAM没装好或没安装到系统默认路径。可以重装一次并确保make install执行成功或者把GTSAM的cmake路径手动添加到SC-A-LOAM的CMakeLists.txt里。6.2 雷达不出数据的排查顺序如果驱动启动后rostopic echo /rslidar_points没有任何数据建议按这个顺序排查先用ip addr看网卡是否UPIP有没有配置正确。用ping 192.168.1.200看雷达IP能否通。用tcpdump -i eth0 udp port 669抓包确认是否真的有UDP数据到达网卡。如果抓不到包检查网线、交换机、组播地址是否配置正确。如果抓到包但ROS话题没数据问题多半在驱动配置比如lidar_type设置错了、udp端口不对、frame_id匹配不上。这里特别提醒RS-16有时会因为供电不足而间歇性丢包。如果你的雷达用的不是配套电源而是自己接的电源一定要确认电压和电流够不够不然点云会一直“闪烁”排查起来特别头大。6.3 SC-A-LOAM运行时的运行时崩溃与清退化我遇到的另一个常见问题是“地图清退化”就是运行一段时间后地图上的某些区域点云突然变稀疏甚至出现大块空洞。这个问题的根源还是回环检测和全局优化之间的相互作用当全局优化修正历史位姿时之前已经插入地图的点云没有被重新投影到新位姿导致点云地图出现撕裂。解决办法有几种适当减小关键帧之间的间距让位姿修正更平滑。降低回环检测的匹配阈值减少误检避免大范围位姿跳变。如果你发现回环检测导致地图“翻车”可以临时关掉回环检测只保留前端里程计先看下效果等确认前端没问题再打开回环。这里的核心原则是回环检测是把双刃剑调得好能大幅提升地图精度调不好会把原本还能看的地图毁掉。建议先把前端调稳再去调回环参数。6.4 数据时间戳与TF树的对齐问题SC-A-LOAM对TF树和时间戳的要求比较严。如果你在RViz里看到点云和轨迹错位很可能不是算法问题而是时间戳不同步或TF树缺少某个坐标变换。我排查时会用rosrun tf view_frames生成TF树确认camera_init、laser_link、map这些关键坐标系都在。然后会用rostopic echo /tf看变换的时间戳确认雷达驱动发布点云的时间戳和TF变换的时间戳来自同一个时钟源。RS-16驱动默认使用雷达自身的时钟作为点云时间戳。如果你同时用了IMU或其他传感器需要做时间同步。最简单的方法是在雷达驱动配置里把时间戳来源改为system_time让点云使用节点所在电脑的系统时间这样和ROS里的其他传感器时间戳就统一了。6.5 性能调优如何让建图跑得更流畅如果你的电脑性能一般跑SC-A-LOAM时可能会卡顿尤其是建图范围变大后。我的建议是在驱动层面做降采样VoxelGrid设为0.2米。把SC-A-LOAM的scan_line参数设为16不要设为64或更多。减小最大有效距离比如从100米改为60米或80米减少远距离点云的处理量。在launch文件里调整keyframe_distance和keyframe_time减少关键帧数量降低优化负载。我用一台i5-840016GB内存的机器跑RS-16SC-A-LOAM基本能实时建图CPU占用在60%-85%波动。如果你们用的是轻薄本或者虚拟机建议优先用离线rosbag回放或者降低播放速度。7. SC-A-LOAM参数速查表与推荐配置这里给出一份我实测下来比较稳定的配置供大家参考。当然不同场景、不同雷达安装方式会有差异别完全照抄但可以作为初始基准值去调。参数项推荐值备注scan_line16对应RS-16线数minimum_range0.5m去除近处噪声点maximum_range80m减少远距离噪声和计算量降采样体素0.1m兼顾细节和实时性keyframe_distance1.0m每1米生成一个关键帧keyframe_time2.0s每2秒生成一个关键帧回环匹配距离阈值15m可根据场景微调地图保存格式PCD后续可转栅格地图这套配置在室外园区、校园道路、仓库内部都跑过整体稳定地图质量也能满足后续定位要求。想进一步调优的话建议用rosbag录制同一段数据改一个参数跑一次对比地图精度和建图耗时选出最适合你场景的数值。8. 写在最后的实在话整套RS-16 Ubuntu 18.04 SC-A-LOAM的链路跑通之后我最大的感受是这类项目最花时间的不是算法本身而是环境搭建、驱动调试和参数调优这些“脏活累活”。很多人卡在编译或驱动配置那一步就放弃了其实只要按顺序来一条条排查并没有想象中那么难。我的建议是如果你刚开始接触这个组合先别急着调算法参数。先把雷达驱动跑通确保rostopic echo /rslidar_points能看到稳定的点云然后下载官方示例数据把SC-A-LOAM跑一遍确认算法本身没问题最后再接入自己的雷达数据做参数调优。这样分层排查问题定位会清晰很多。另外野外实测时务必注意安全雷达旋转时保持周围无障碍物避免碰撞设备。使用激光雷达时也要注意激光安全等级RS-16属于安全级别较高的产品但还是要避免长时间直视雷达窗口。最后再分享一个小技巧给SC-A-LOAM录数据时可以在起点和终点留出明显的位置标记比如站个人或放个锥桶。这样回环检测是否生效一眼就能看出来。我就是在测试时放了两个锥桶跑完一看地图闭合心里瞬间踏实了。希望这篇记录能帮大家少踩几个坑早日让RS-16在你们自己的平台上稳定跑起来。