最近在给一台差速底盘小车做自主导航的底层建图,手头正好有一台速腾16线激光雷达(RS-16),系统是Ubuntu 18.04,ROS 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 LTS
- ROS melodic desktop-full
- Eigen 3.3.4(系统自带)
- PCL 1.8.1(系统自带)
- Ceres Solver 1.13或1.14
- GTSAM 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数据包,默认的接收端口是669(MSOP)和778(DIFOP)。和很多工业雷达一样,它不依赖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_link:
<node pkg="tf2_ros" type="static_transform_publisher" name="lidar_to_base" args="0 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注意播放速度。如果电脑性能一般,建议用--rate=0.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看网卡是否UP,IP有没有配置正确。 - 用
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-8400,16GB内存的机器跑RS-16,SC-A-LOAM基本能实时建图,CPU占用在60%-85%波动。如果你们用的是轻薄本或者虚拟机,建议优先用离线rosbag回放,或者降低播放速度。
7. SC-A-LOAM参数速查表与推荐配置
这里给出一份我实测下来比较稳定的配置,供大家参考。当然,不同场景、不同雷达安装方式会有差异,别完全照抄,但可以作为初始基准值去调。
| 参数项 | 推荐值 | 备注 |
|---|---|---|
| scan_line | 16 | 对应RS-16线数 |
| minimum_range | 0.5m | 去除近处噪声点 |
| maximum_range | 80m | 减少远距离噪声和计算量 |
| 降采样体素 | 0.1m | 兼顾细节和实时性 |
| keyframe_distance | 1.0m | 每1米生成一个关键帧 |
| keyframe_time | 2.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在你们自己的平台上稳定跑起来。