ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

RS-16激光雷达与SC-A-LOAM建图实战:Ubuntu 18.04环境从驱动到回环优化

RS-16激光雷达与SC-A-LOAM建图实战:Ubuntu 18.04环境从驱动到回环优化 先把结论放在前面这套组合是可行的而且效果比我一开始预想的好不少。RS-16虽然不是速腾家最贵的雷达但在16线这个档位里属于室内外都能兼顾的型号SC-A-LOAM作为带回环检测的轻量化LOAM变体正好补上A-LOAM“只建图不回环”的短板。这篇文章就围绕“Ubuntu 18.04 ROS Melodic RS-16 SC-A-LOAM”这套实际跑通的环境从驱动配置、算法编译、参数调优到踩坑排查尽量把能写明白的都写明白给准备在自己机器人平台上复现这些内容的朋友一个可以直接照做的参考。1. 为什么选RS-16和SC-A-LOAM这套组合1.1 RS-16雷达的实际定位速腾RS-16属于16线机械式激光雷达360度水平扫描垂直视场角30度左右测量距离标称到100米量级。它的优势不光是便宜而是在这个价位上提供了足够稳定的点云密度和可接受的功耗对于室内机器人、园区巡检车、校园物流车这类场景16线其实比32线、64线更务实。RS-16的具体参数网上都能查到我这里只挑几个对SLAM影响大的说单回波模式下点频约30万点/秒双回波会翻倍但SLAM一般用单回波足够默认扫描频率10Hz也可设20Hz帧率会影响前端里程计的计算节奏通过网口UDP输出数据默认MSOP端口6699DIFOP端口7788垂直角度范围从-15度到15度相邻线束夹角算下来并不均匀远处地面点会比较稀疏。这些参数决定了它在建图算法里的表现10Hz扫描率和LOAM类算法非常匹配因为LOAM系算法本身就是按帧处理点云、提取边缘点和平面点帧率太低会丢运动细节太高则CPU开销变大。RS-16的10Hz默认设置几乎是给这类算法量身定做的。1.2 SC-A-LOAM算法栈的特点SC-A-LOAM这个名字最开始容易让人误解成A-LOAM的简单魔改实际上它是在LOAM框架里集成了Scan Context全局描述子带闭环检测和图优化能力。简单理解传统A-LOAM只有前端里程计和建图两部分跑久了轨迹会慢慢漂移回环检测模块能在机器人重新回到曾经到过的区域时识别出“这里我来过”然后把累积误差一次性拉回来。SC-A-LOAM的模块划分很清晰特征提取跟LOAM一样从原始点云里提取边缘点和平面点帧间里程计用当前帧特征与局部地图匹配估计位姿变化建图维护一个全局或局部子图把匹配后的点云插入地图闭环检测基于Scan Context描述子做全局检索找到历史帧与当前帧的相似关系位姿图优化检测到闭环后对轨迹做整体优化消除漂移。这五个模块里回环检测是它与A-LOAM最大的区别也是我喜欢拿它来做园区级建图的原因。没有回环的LOAM算法小车在走廊拐几圈之后地图两头就容易错位SC-A-LOAM能显著改善这个问题而且整体的计算负载比LIO-SAM轻——LIO-SAM需要IMU预积分如果你手头没有好的IMU或者标定不充分跑起来反而麻烦。1.3 这套组合适合什么场景RS-16 SC-A-LOAM不是万能的适合的场景是中等规模环境几千到几万平方米、有闭合路径、机器人运动不至于太剧烈、对实时性要求不极端。无人机快速飞行或者地下矿山那种极端环境这套组合不是最优解前者适合用更轻量的帧间配准算法后者需要更强鲁棒性的退化环境处理。我在实验室园区里用它跑了一圈大约2公里的闭合路径最后回到起点时地图重合度肉眼可见地好。同样的路径用A-LOAM跑起点附近会有比较明显的错位。这里的关键就是回环检测后面章节我会具体说怎么把回环阈值调到合适的范围。2. 环境准备Ubuntu 18.04、ROS Melodic与第三方依赖安装2.1 Ubuntu和ROS版本匹配Ubuntu 18.04对应ROS Melodic这套组合是最成熟的ROS社区支持完善Apt源里该有的包基本都有。如果你机器上之前装过ROS Noetic或者Ubuntu 20.04我的建议是别混装直接找一台干净的机器或者重装系统SLAM环境的依赖关系太复杂混装会带来一堆编译期找不到头文件的诡异问题。安装ROS Melodic的时候记得配好源之后完整执行这两个步骤sudo apt update sudo apt install ros-melodic-desktop-fulldesktop-full包含RViz、Gazebo、TF、PCL和Eigen这些常用依赖对跑雷达SLAM足够。装完之后在~/.bashrc里加上source /opt/ros/melodic/setup.bash然后执行sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential初始化rosdepsudo rosdep init rosdep updaterosdep经常因为网络原因失败多试几次或者临时切换源也能解决这里不展开。2.2 Ceres、Eigen、PCL、OpenCV的版本陷阱SC-A-LOAM编译最麻烦的不是它本身的代码而是依赖库的版本兼容。Ubuntu 18.04系统自带的Eigen是3.3.4这个版本跑LOAM框架没问题不需要额外升级。PCL用ROS Melodic自带的1.8.1也够用。真正需要小心的是Ceres Solver和GTSAM。Ceres建议用1.14.0版本不要用最新版或者太老的版本。1.14.0对Eigen 3.3兼容性最好。安装步骤sudo apt-get install libgoogle-glog-dev libgflags-dev libatlas-base-dev libsuitesparse-dev git clone https://github.com/ceres-solver/ceres-solver.git cd ceres-solver git checkout 1.14.0 mkdir build cd build cmake .. make -j4 sudo make install这里有个经验make -j4比make -j8稳虽然多核编译快但内存不够的话在链接阶段会直接OOMCeres链接时耗内存很凶我实验室的16G内存机器开-j8都失败过。GTSAM在Ubuntu 18.04上可以通过Apt装一个旧版本但建议从源码编译4.0.2因为SC-A-LOAM改动的部分依赖GTSAM的位姿图优化接口Apt版本不保证匹配。编译GTSAM也比较吃内存同样建议用-j4。git clone https://github.com/borglab/gtsam.git cd gtsam git checkout 4.0.2 mkdir build cd build cmake -DGTSAM_BUILD_TESTSOFF -DGTSAM_BUILD_UNSTABLEON .. make -j4 sudo make installGTSAM编译完大约要二十分钟到半小时看机器性能这一步别催让它慢慢编就是。2.3 为什么必须装这么多优化库LOAM族算法的核心是优化帧间里程计是求解一个非线性最小二乘问题建图阶段是帧到子图的匹配优化回环检测后的位姿图优化也必须靠GTSAM这类因子图库。简单打个比方Ceres负责的是“局部调整”——比如当前帧点云和上一帧点云怎么对齐最合理GTSAM负责的是“全局整容”——发现闭环后把整条轨迹上的所有关键帧位姿一起调整。缺少任何一个库编译能过但运行会挂或者在回环优化那一步直接崩溃。如果你用的SC-A-LOAM分支代码里还依赖OpenCV做图像投影或者Scan Context的描述子生成记得确认OpenCV版本Ubuntu 18.04配OpenCV 3.2就能跑不要自己编译OpenCV 4那是给自己找事。3. RS-16驱动安装与点云话题打通3.1 网口配置雷达和电脑的IP关系RS-16通过以太网线直接连电脑不需要路由器但IP必须配在同一网段。雷达出厂默认IP一般是192.168.1.200电脑网卡必须设成静态IP比如192.168.1.102子网掩码255.255.255.0网关不用管。这里有一个特别容易忽略的坑Ubuntu的网络管理器有时候会默认把有线网卡设成DHCP导致雷达数据一个包都收不到。最好直接在“设置-网络-有线-IPv4”里改成手动地址192.168.1.102子网掩码255.255.255.0网关留空改完重启网络服务然后用ping 192.168.1.200验证连通性。如果能ping通说明链路正常接下来才是驱动的问题。3.2 rslidar_sdk编译与launch文件速腾官方提供了两个代际的驱动老的rslidar_sdk是基于ROS包的新的rslidar_sdk是支持ROS/ROS2并且配置方式改为YAML的版本。在Ubuntu 18.04下建议用较新的版本它支持RS-16型号也支持通过配置文件直接设置雷达IP和MSOP端口。git clone https://github.com/RoboSense-LiDAR/rslidar_sdk.git cd rslidar_sdk新版驱动需要先编译它的依赖库比如rslidar_msg并且通过catkin_make编译时要把SDK目录放进ROS工作空间的src里。建议这样mkdir -p ~/rslidar_ws/src cd ~/rslidar_ws/src git clone https://github.com/RoboSense-LiDAR/rslidar_sdk.git cd rslidar_sdk git submodule update --init cd ~/rslidar_ws catkin_make source devel/setup.bash编译完成后关键一步是修改驱动配置文件新版驱动通常在rslidar_sdk/config/config.yaml中设置lidar: - driver: lidar_type: RS16 msop_port: 6699 difop_port: 7788 ros: ros_frame_id: rslidar ros_send_point_cloud_topic: /rslidar_points如果你买的RS-16是非默认配置需要把对应IP和端口改掉具体参数写在雷达外壳标签上。大部分时候保持默认即可。3.3 验证点云别急着跑SLAM先看原始数据驱动发布点云后第一件事不是启动SC-A-LOAM而是在RViz里确认数据质量。启动驱动roslaunch rslidar_sdk start.launch然后在另一个终端打开RViz添加PointCloud2显示话题选择/rslidar_points。正常表现是旋转的16圈同心环点云站在雷达旁边能看到周围物体轮廓。如果点云只有半边、断断续续或者完全没有先检查UDP端口和IP然后检查发射功率——RS-16的激光对人眼安全但反射率低的物体远距离点会稀少这不算故障。我遇到过一种很隐蔽的情况点云在RViz里看起来正常但话题频率显示只有1Hz而不是10Hz。这时需要用rostopic hz /rslidar_points确认实际频率如果明显偏低多半是驱动配置里设置了双回波或者帧率不对改回单回波10Hz即可。4. SC-A-LOAM编译与启动4.1 下载源码并适配工作空间SC-A-LOAM的源码在GitHub上有多个维护版本有的基于ROS Melodic有的适配了新版GTSAM接口。建议找一个较新的fork然后放到同一个catkin工作空间下这一步很关键SC-A-LOAM的package.xml里会声明依赖如果你把它单独放在rslidar_ws外面用catkin_make包编译时会因为找不到依赖而失败。这里有个省事方案直接在~/rslidar_ws/src下再clone一份cd ~/rslidar_ws/src git clone https://github.com/your-fork/sc-a-loam.git cd ~/rslidar_ws catkin_make如果你之前编译过驱动SC-A-LOAM会排在后面编译依赖关系会自动解析。编译成功后会生成几个节点ascanRegistration、alaserOdometry、aMapping、aloopClosure和aFactorGraph。前三个是LOAM原有模块后两个是SC-A-LOAM新增的回环和图优化模块。4.2 launch文件与话题名对齐SC-A-LOAM默认订阅的话题可能是/points_raw或/velodyne_points而RS-16驱动发布的是/rslidar_points。不改话题名直接跑节点会一直等待消息看起来像是程序卡死实际是没数据进来。解决方式两种第一种修改launch文件里的remap标签remap from/points_raw to/rslidar_points/第二种改代码里的订阅名这个不推荐改代码会增加维护成本而且容易改错。launch文件里还有几个参数值得注意param namescan_line typeint value16/ param namescan_period typedouble value0.1/ param nameminimum_range typedouble value0.3/ param namemaximum_range typedouble value100.0/scan_line16对应RS-16线数scan_period0.1对应10Hz。如果雷达设成20Hz这个参数要改成0.05否则前端里程计的时间戳计算会出错轨迹会明显漂移。4.3 第一次跑SC-A-LOAM的预期表现启动顺序建议是先起驱动再起SC-A-LOAM。可以用一个launch文件把驱动和SLAM串起来也可以分开起为了排查方便我习惯分开。第一次跑的时候控制机器人缓慢移动同时观察RViz里三个关键内容当前帧特征点边缘点红色、平面点绿色分布是否合理里程计轨迹是否平滑连续有没有跳动累积地图是否随运动一致增长有没有分层或者重影。这个阶段如果地图还显得粗糙不用急着调参先把一个闭合路径完整跑完如果回环检测生效地图会在回到起点附近时有一次明显的“对齐”动作原来的错位会被修正。我整个验证过程大约花了两个小时真正跑通之后回头看最耗时间的其实是话题名对齐和参数微调而不是编译环境。5. 实测定点参数调优与效果观察5.1 扫描频率与前端里程计的配合SC-A-LOAM的前端里程计依赖相邻两帧点云的重合度来估计运动。10Hz下雷达每100毫秒转一圈如果机器人运动速度过快相邻两帧间运动畸变会变大特征匹配精度下降。日常园区小车的速度一般在1~3m/s10Hz完全够用。如果你把雷达调到20Hz注意两点scan_period改成0.05点云带宽翻倍驱动到算法之间的传输可能成为瓶颈20Hz的收益在于运动畸变更小但代价是CPU占用明显上升。实测RS-16在10Hz下跑SC-A-LOAM大约占用一个2.5GHz的CPU核心20Hz下接近两个核心还会影响后续的回环检测实时性。对大多数地面机器人10Hz就是最稳的平衡点。5.2 距离阈值与点云裁剪室外环境下RS-16的最远量程虽然标称100米但远处点稀疏且噪声大直接参与特征提取会影响匹配精度。SC-A-LOAM的launch里maximum_range我习惯设成80米minimum_range设成0.5米这是因为近处点集在雷达盲区内容易产生不稳定的边缘特征。室内场景可以更激进一点maximum_range设30米就够这样能减少无用计算。这个参数影响的是预处理不影响相对量程的标定可以按场景随时改。5.3 回环检测阈值与误检控制SC-A-LOAM的回环检测比较依赖Scan Context描述子检索的阈值。阈值设置偏松会产生误检导致地图被错误地拉变形阈值设置偏紧回环迟迟检测不到累积误差无法消除。实际调参时我的做法是先在录好的bag上来回离线调用RViz观察闭环发生时刻的轨迹是否产生不合理的跳跃。系统通常提供类似loop_closure_search_radius和距离阈值参数建议从默认值出发每次只调一个参数观察地图变化再决定下一步。如果你在走廊、仓库这类自相似环境里跑误检概率会比室外高很多因为Scan Context描述子在长直走廊里区分度不高。这种情况下我会关掉回环仅用前端里程计和建图来出一个局部一致的地图然后靠后期手工处理或GPS融合来校准全局坐标。5.4 初始位姿和坐标系的坑RS-16驱动发布的点云默认在rslidar坐标系下SC-A-LOAM会按launch里设置的TF关系把它转换到camera_init或base_link坐标系下。如果你的RS-16水平安装这个转换很简单一个平移加一个绕Z轴的180度偏航就够如果雷达有仰角安装一定要在TF里配置好俯仰角否则点云投影到地面时会产生椭圆变形特征匹配会莫名其妙飘。判断方法很简单启动后用RViz的Grid网格对比地面点云形态如果地面点云是水平平整的说明TF没问题如果地面点云一侧高一侧低说明俯仰角或翻滚角没配好。6. 踩坑记录从症状到根因的排查链路6.1 症状RViz中点云忽多忽少、里程计间歇性跳变这个锅很多时候不是SC-A-LOAM的而是驱动和算法之间的通信丢包。RS-16的点云走UDP一个UDP包就是一条扫描线的一部分如果电脑网卡收到丢包丢的往往不是整帧而是某几条线。排查链路先看rostopic hz /rslidar_points是否稳定在10Hz附近如果频率经常掉到8Hz、9Hz说明丢包。用ifconfig查看网卡接收队列有没有大量error或dropped有的话说明网卡缓冲区不够或系统中断分配不均。检查网口是否连接在USB转网卡上——USB转千兆网卡在高速UDP下容易丢包最好用板载PCIe网卡。我最后发现是共享交换机上接了太多设备雷达数据被其他大流量挤掉把雷达直连到电脑的独立网口后问题消失。6.2 症状地图分层和漂移地图分层一般发生在建图过程中机器人转弯时原因是前端里程计在快速旋转时特征匹配不准确而回环还没检测到累计误差持续累积。排查链路回放bag观察漂移发生在哪个时间段是直线段还是转弯段如果是转弯段检查scan_period和实际雷达帧率是否一致检查特征提取结果转弯时边缘点和平面点数量是否骤降如果骤降说明该场景退化比如走廊转弯处没有足够几何特征。RS-16在空旷场地和长走廊里的表现差异很大空旷场地点云特征稀疏LOAM系算法容易退化。这时候可以尝试调大minimum_range把近处无意义的点去掉让算法更关注远处有区分度的结构。6.3 症状编译SC-A-LOAM时报GTSAM相关头文件找不到这个比较常见尤其在安装了多个GTSAM版本后。GTSAM默认会安装到/usr/local/lib/cmake/GTSAM但如果你之前用Apt装过旧版Apt版本会装在/usr/lib/cmake/GTSAMCMake会优先找到系统路径下的旧版导致头文件版本不匹配。解决方式是卸载Apt版sudo apt remove libgtsam-dev libgtsam-unstable-dev然后重新编译SC-A-LOAM。如果还不行就在CMakeLists里显式指定GTSAM路径。6.4 症状启动后算法节点一直等待话题这个基本就是话题名不对齐前面章节说过。排查方法rostopic list | grep point看看实际话题名是什么再对照launch里的remap。还有一种情况驱动节点和SC-A-LOAM节点在同一个ROS master下但要确认都用的是同一个ROS_MASTER_URI如果你在多个终端分别source过不同的工作空间某些环境变量可能会冲突。6.5 症状地图反向、车头方向不对这通常是TF或初始偏航角的问题。RS-16的安装方向不同点云坐标系和机器人前向坐标系的关系就不同。如果不希望改代码最好的方式是让雷达驱动在发布点云时就把坐标系旋转到机器人前向对齐。我更推荐的做法是在launch里维护一个静态TFnode pkgtf2_ros typestatic_transform_publisher args0 0 0 0 0 3.14159 base_link rslidar/具体航向角根据你的安装方式来定。这个坑在单线雷达上不明显在16线雷达上特别明显因为16线点云有完整的3D结构方向反了之后地图会整体镜像旋转单看局部还不容易发现。7. 给后来者的几个实操建议SC-A-LOAM在Ubuntu 18.04下跑通RS-16这件事难度排序其实是环境配置 话题对齐 参数调优 编译本身。环境配置占掉了一半精力GTSAM和Ceres版本选对了后面会非常顺利。我建议拿到新雷达或者新算法代码之后不要先急着上真机花半个小时把整个流程用bag回放捋一遍会省掉很多拆装雷达的时间。录bag的方法也简单rosbag record /rslidar_points /tf /tf_static有bag之后参数怎么折腾都不怕把真机搞坏。尤其是回环检测阈值、扫描频率这类参数离线调参效率远高于真机反复跑路径。另一个实际体会是CPU散热。RS-16本身功耗不高但跑SC-A-LOAM时CPU持续高负载如果笔记本长时间跑建图降频会导致算法前端掉帧地图开始飘。有条件的话用台式机或者带主动散热的工控机性能释放稳定很多。最后SC-A-LOAM跑通了之后下一步值得尝试的是给系统接一个低成本IMU配合雷达做松耦合或紧耦合的惯性里程计。这套组合对地面机器人的鲁棒性提升非常明显尤其是在颠簸路面和退化场景里点云里程计会失效IMU还能撑住一小段时间。先把RS-16的基本功打牢再考虑传感器融合路线会顺很多。
返回列表