ARTICLE DETAIL

资讯详情

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

R2000激光雷达SLAM实战:从驱动配置到gmapping与cartographer建图

R2000激光雷达SLAM实战:从驱动配置到gmapping与cartographer建图 项目标题是“PF--r2000激光雷达slam技术实现”先说点实际的。很多搞机器人的人一看到“倍加福R2000”这台激光雷达第一反应是“这玩意儿能不能跑SLAM”。我在这块折腾过一段时间可以负责任地说R2000不仅适合做SLAM而且做出来的建图效果比多数家用级雷达稳定得多。这篇文章我会从设备认知、驱动部署、ROS数据对接、gmapping与cartographer建图实操到常见问题排查把整个技术链路完整过一遍给同样手上有R2000、或者正准备选型2D激光雷达做SLAM的朋友一个可参考的完整方案。先说明一下我验证的环境Ubuntu 20.04系统ROS Noetic版本雷达型号是R2000系列倍加福也就是PepperlFuchs代码基于官方公开的ROS驱动包通过以太网连接。整个流程不涉及硬件改装也不需要外接额外的单片机只要按步骤来基本上一个下午就能跑通建图。1. 项目背景与设备选型思路1.1 R2000到底是一台什么样的激光雷达简单来说R2000是倍加福推出的一款2D工业激光扫描仪市面上常见的基本都是脉冲测距原理也就是TOFTime of Flight方案。TOF的好处非常直观直接通过激光飞行时间计算距离不像三角测距那样在远距离时精度下降明显也不容易受环境光干扰。R2000的扫描做得很有意思它的外壳是固定的内部有一个旋转棱镜负责完成360度扫描所以从外面看没有那种“来回甩头”的机械结构。这一点在机器人上很实用至少不用担心雷达转动时把线缆绞坏防护等级也更高。在性能方面R2000的典型参数大致是这样的最大测量距离可以到30米以上具体和被测物体的反射率有关扫描频率可调一般最高能到50Hz甚至100Hz这个级别角度分辨率也可以配置从0.1度左右往下能调得更细。更重要的是R2000输出的数据里面除了距离值还有振幅值这就是很多人常说的“反射强度信息”。有振幅值意味着你能拿它来做反光标志识别比如自动充电桩的对接、地标定位这类任务这是普通rplidar给不了的能力。1.2 为什么R2000适合用来做SLAM很多人习惯用几个几百块的国产雷达做SLAM图的是便宜和上手快。但真到实际项目里你会发现SLAM建图对雷达的要求其实是比较苛刻的核心就三点数据噪声小、频率足够高、时间同步稳定。R2000在这三方面都做得不错。首先是数据噪声。TOF方案在室内环境下基本不会出现三角测距那种“跳点”和“飘点”现象尤其在白墙、金属表面、深色物体这些场景下R2000的距离读数依然比较稳定。其次是频率。SLAM算法在建图过程里非常依赖连续两帧数据之间的位姿差如果雷达频率太低机器人稍微转快一点相邻帧点云之间的畸变就会很大直接导致匹配失败。R2000的高频输出能把这个问题压制得很小。最后是时间同步R2000走以太网输出数据带时间戳驱动封装之后直接进ROS的/scan话题时间线很干净后续接AMCL或者cartographer都省心。如果你想在自己的移动底盘上搭一套SLAM选雷达的时候不要只看“测距多少米”要把“连续运动下能不能建出干净的地图”当作核心指标。R2000在这个维度上属于那种参数看着不夸张但实际表现很能打的设备。2. 环境准备与驱动部署2.1 Ubuntu 20.04 和 ROS Noetic 的基础环境在开始折腾雷达之前先把基础环境捋一遍。官方R2000驱动是基于ROS的网络上主流的版本都已经适配到Noetic所以直接用Ubuntu 20.04 ROS Noetic这套组合最省事。如果你还在用Ubuntu 18.04的Melodic也没太大问题但有些依赖版本需要额外注意不太建议新手在旧版本上折腾。ROS Noetic的安装我就不详细展开了官方源装桌面完整版即可。装完ROS之后先确认一下最基本的工具都正常尤其是tf、rviz、gmapping这几个包后面都要用到。可以用一行命令确认rosversion -d rospack find gmapping如果不报错说明基础环境没问题。接着把工作空间建好我习惯用robot_ws这个命名你们随意mkdir -p ~/robot_ws/src cd ~/robot_ws catkin_make2.2 获取R2000驱动源码并完成编译R2000的ROS驱动是有公开代码的我这边用的是GitHub上的r2000_ros或者是相关的驱动包不同仓库的目录结构会有一点差异但核心的东西一致一个负责和雷达通信的驱动节点负责解析UDP数据包再转换成ROS的sensor_msgs/LaserScan消息。先进入src目录拉取代码cd ~/robot_ws/src git clone https://github.com/PepperlFuchs/r2000_ros.git如果网络环境拉取GitHub不太通畅也可以直接把压缩包下载到本地再解压进src目录效果一样。编译之前先看一两个依赖有没有装比如PicoJSON库很多版本已经在代码里内嵌了不需要额外安装。如果缺了编译时会直接报头文件找不到到时候再补也不迟。编译时直接在workspace根目录执行cd ~/robot_ws catkin_make编译通过之后先source一下环境变量然后查看驱动节点是否注册成功source devel/setup.bash roslaunch r2000_ros r2000.launch如果launch文件正常起来说明驱动本身没有大问题。但这个时候大概率雷达还没出数据因为我们还没配置网络。2.3 网络配置与通信验证R2000是通过以太网跟PC通信的而且严格来说它用了一个比较特别的方式雷达本身工作在一个出厂IP上PC端必须设置到同一网段才能访问。不同批次、不同型号的R2000出厂IP可能不一样有些是192.168.0.100有些可能是其他地址千万不要想当然第一次用的时候先从雷达机身上的铭牌贴纸确认一下出厂设置。我记得第一次拿到的机器锦牌上标的IP是192.168.2.10但我一开始按照网上教程设置在192.168.0.100折腾了很久连不上后面看了铭牌才发现自己网段完全错了。这里给大家一个非常重要的建议拿到雷达第一件事就是看铭牌上面会标注默认IP和端口信息。PC端配置静态IP的时候只需要把网段调成跟雷达一致就行。比如雷达是192.168.2.10那PC的网卡IP就设成192.168.2.2子网掩码255.255.255.0不用设网关。配置完成后先试一下能不能ping通ping 192.168.2.10能ping通之后再用浏览器打开雷达的IP地址正常情况下会进入一个配置界面可以查看和修改雷达的各种参数包括分辨率、扫描频率、运行模式等等。如果连这个网页都打不开基本不用往下走了先排查网线和IP。网络通了之后重新启动驱动launch文件这次在终端里应该能看到驱动节点发布scan话题了rostopic hz /scan只要这个命令输出一个稳定的频率例如15Hz左右说明驱动已经完全跑通可以正式开始SLAM对接了。3. R2000数据模型与ROS接口细节3.1 距离和振幅R2000输出的两路核心数据R2000的原始数据包是通过UDP封装的里面包含了每一个扫描点的角度、距离、振幅信息。ROS驱动把它解析之后会发布多个话题其中最重要的就是/scan距离信息类型是sensor_msgs/LaserScan同时很多驱动版本还会发布/scan_amplitude、/scan_raw等话题里面是振幅数据和原始测量值。振幅数据这个东西在SLAM之外有相当大的价值。打个比方普通雷达告诉你“距离这里两米有一面墙”振幅数据还能告诉你“墙上的这个位置反射特别强”。如果你在地图环境里人为贴了一些高反光条或者装了反光柱R2000可以通过振幅值把它们识别出来用于充电桩定位、码头对接、或者是固定地标导航。这个能力是普通rplidar不具备的也是R2000在工业项目里受欢迎的一个重要原因。在实际SLAM过程中大部分时候我们用/scan就够。但是如果你后面想做更高级的功能比如利用反射标志物修正累计误差那R2000这一路振幅数据能给你省很多事。3.2 正确配置/scan话题和frame_id驱动起来之后第一件事不是急着去跑gmapping而是先把TF树和话题名称整理好。R2000驱动节点本身并不发布TF它只负责输出雷达数据。你需要在launch文件里固定好frame_id然后由robot_state_publisher或者自己写一个小节点发布“base_link - laser”的坐标变换。先说frame_id。在R2000驱动launch里有一个参数专门用来设置雷达的坐标系名称我这里设置成lasernode namer2000_node pkgr2000_ros typer2000_node outputscreen param nameframe_id valuelaser / param nametopic_name valuescan / param namedevice_ip value192.168.2.10 / /node注意topic_name这里直接填scan驱动的实现通常会在内部自动加斜杠变成标准的/scan话题。如果你的机器人上还有其他雷达比如后面用了一个相机或者别的传感器建议把话题改成带前缀的形式比如/left_scan、/right_scan避免冲突。TF树方面最简配置就是两个坐标系base_link是机器人的本体中心laser是雷达扫描中心。在urdf模型里或者单独一个静态坐标变换节点里发布频率和驱动相同即可。一定要确保base_link到laser的变换是准确的如果雷达安装位置偏了10厘米而你不在TF里修正建出的地图会有系统性偏差后面定位也会跟着偏。3.3 扫描频率和角度分辨率的配合关系R2000最让我喜欢的一点是角度分辨率和扫描频率可以独立调节但它俩之间存在一个权衡关系角度分辨率越细单圈数据量越大在保证每圈数据能在规定时间内传输完成的前提下扫描频率就要降下来。具体调多少合适取决于你的场景。室内低速移动的机器人建议10Hz到15Hz的扫描频率配上0.1度左右的角度分辨率就够了。这个时候单圈点数是3600个左右匹配效果好CPU压力也不大。如果机器人的移动速度比较快或者要跑AGV那种动态路径可以适当提高扫描频率到20Hz以上角度分辨率稍微降低到0.18度左右保证运动畸变小。我个人的使用习惯是普通室内导航用15Hz 0.1度RPM室外大场景用20Hz 0.14度这样建图匹配基本没有压力。如果你把角度分辨率设成0.05度然后又要求50Hz扫描R2000不一定跑得动即使跑动起来网络传输和ROS回调的负载也会变得很大得不偿失。4. SLAM建图实操从/scan到地图4.1 把R2000接入gmapping完成2D激光SLAM建图驱动正常出数之后现在进入正题让雷达数据真正跑进SLAM算法里。gmapping在ROS里是个非常经典的2D激光SLAM方案对雷达精度要求不算苛刻特别适合作为R2000的首个SLAM测试。先写一个launch文件同时启动驱动和gmapping。gmapping的核心参数launch node namer2000_node pkgr2000_ros typer2000_node outputscreen param nameframe_id valuelaser / param nametopic_name valuescan / param namedevice_ip value192.168.2.10 / /node node namebase_to_laser pkgtf2_ros typestatic_transform_publisher args0.2 0.0 0.1 0 0 0 base_link laser / node namegmapping_node pkggmapping typeslam_gmapping outputscreen param namebase_frame valuebase_link / param nameodom_frame valueodom / param namemap_frame valuemap / param namemaxUrange value20.0 / param nameminimumScore value50 / param nameparticles value30 / remap fromscan to/scan / /node /launch解释一下几个关键参数。base_frame和odom_frame必须跟你的机器人底盘驱动一致特别是odom坐标系如果底盘没有正确发出odometrygmapping根本跑不起来因为雷达匹配出来的位姿变化没有里程计做先验约束。maxUrange写20米意思是超过20米的点不参与建图R2000最大测距到30米但室内环境里20米之后的数据往往已经非常稀疏参与进去反而增加计算负担。minimumScore设成50如果雷达数据质量不错这个值基本不会被触发但能防止在特征稀少的走廊里出现错误匹配。启动之后别急着推机器人先在rviz里看一下当前的map、scan、robotModel这几个显示项。正常情况下雷达扫描点应该整齐地覆盖在地图周围随着机器人移动地图会逐渐向外扩展。控制机器人移动时速度不要过快转弯也尽量放慢。gmapping对快速旋转比较敏感转太快容易丢匹配导致地图产生叠影。我的经验是室内建图时线速度控制在0.3m/s以内角速度在0.4rad/s以内基本稳得很。4.2 保存地图与使用地图导航建图完成之后用map_saver保存地图这是ROS里最常用的做法rosrun map_server map_saver -f ~/room_map执行完会在当前目录或者home目录生成room_map.pgm和room_map.yaml两个文件。pgm是栅格图片可以直接用看图软件打开查看yaml是地图描述文件里面记录了分辨率、原点坐标、栅格占据阈值这些关键信息后续做导航时map_server会根据yaml加载地图。打开pgm看一眼如果地图边缘干净、直线平整、转角清晰说明R2000的建图质量非常在线如果地图上出现很多细碎的虚影、墙体边缘有毛刺那大概率不是雷达的问题而是运动畸变或者底盘里程计不准回头检查一下底盘编码器有没有明显的打滑。保存完地图之后整个SLAM建图阶段的成果就算落地了。如果你只是打算做建图到这里已经结束如果还要做自主导航那接着把map_server挂上再用AMCL做定位即可。R2000发布的高质量scan数据在AMCL里同样表现稳定具体参数可以通过自适应蒙特卡洛定位的默认配置再微调。4.3 进阶玩法R2000跑cartographer的表现gmapping用顺了之后很多朋友会想试试更现代的cartographer。cartographer对传感器的要求比gmapping高一点尤其是需要比较稳定的测距数据和相对准确的时间戳。R2000刚好满足它的胃口。cartographer有自己独立的配置方式需要写lua配置文件。接入R2000时最核心的是在trajectory_builder_2d节点里配置激光相关参数trajectory_builder_2d { use_imu_data false, min_range 0.1, max_range 30., min_z -0.5, max_z 0.5, missing_data_ray_length 5., num_accumulated_range_data 1, ... }R2000的扫描数据本来就是二维的z方向始终为0所以min_z和max_z这一步主要用来过滤雷达内部可能产生的异常点。min_range设0.1米低于这个距离的数据直接丢掉因为距离太近时TOF雷达容易出现不稳定的反射。实际跑起来之后cartographer在走廊、库房这类结构化环境中的回环修正能力确实比gmapping强不少尤其是绕一圈回到起点时地图不会出现明显的错位。代价是cartographer对CPU的消耗明显更大如果你的机器人主控只是ARM级别的型号建议先把scan频率降到10Hz再试。5. 常见问题与避坑指南5.1 我自己踩过的问题速查表我把这段时间用R2000跑SLAM遇到的问题整理成一个速查表方便大家直接对照排查这些问题很多都不是雷达本身的问题而是配置和细节上的坑。现象可能原因解决办法雷达连不上ping不通IP网段不一致查看铭牌默认IP把PC网卡调到同一网段驱动能启动但没有/scan数据参数device_ip填错在launch里改成雷达实际IP/scan频率波动大网络丢包或网卡供电不足换质量好的网线优先使用有线千兆网口地图出现叠影墙体变厚转角太快或里程计不准降低建图速度检查底盘odom输出雷达数据里有明显的跳点目标表面反光过强或玻璃调整雷达安装角度必要时过滤range值gmapping启动后地图不更新缺少odom TF或者驱动没有输出scan检查TF树是否完整确认/scan话题类型正确5.2 两个容易被忽略但影响极大的坑先说网络丢包这个事。R2000走的是以太网UDP输出UDP本身不保证可靠传输一旦网络质量不好雷达数据就会出现瞬间的掉帧。掉帧在SLAM里的后果非常隐蔽雷达在同一时刻发出的数据不完整扫描线出现一个缺口gmapping会把这个缺口当成环境中的真实空隙地图上就多出一块黑色区域严重时甚至导致匹配错误。所以强烈建议使用质量稍微好一点的超五类或六类网线不要用那种细扁的“软线”凑合同时尽量插在PC的千兆网口上减少网络栈处理延迟。第二个坑是安装位置。R2000的扫描面是水平的一个平面但有些型号的下方会有一小块盲区或者底部结构件遮挡。如果你把雷达装在机器人腹部偏下的位置前方正好有一块低矮的挡板这会导致雷达几米范围内的扫描线被金属边缘切掉一角反映到地图上就是机器人周边出现一条固定方向的黑线而且在机器人转弯时会跟着转动非常像幽灵障碍物。排查这个问题的方法很简单先启动雷达然后在rviz里原地看着扫描点云如果机器人还没动就发现某一角度范围的激光一直缺失或者数据值突变先检查是不是周围有金属结构件挡了扫描面。玻璃和镜子也是R2000这类TOF雷达的“天敌”。超白玻璃会把大部分激光直接透射出去雷达要么测不到距离要么把玻璃后面的物体当成真实距离。如果建图环境里有大面积玻璃幕墙最好的办法是物理上避免或者在建图参数里把maxRange调短一些让算法不去“深信”那些远处的稀疏点。5.3 如何判断R2000的数据质量是否达标最后分享一个我用来快速验证雷达数据质量的土办法。在室内静态场景下人站着不动用rostopic记录一分钟/scan数据rosbag record /scan -O test.bag录完之后回放在rviz里观察固定一个点的距离值波动。正常情况下一面平整白墙在2米处的读数波动应该在±2cm以内。如果波动超过5cm甚至时不时出现完全不一样的跳变值那就要考虑是不是雷达镜头脏了、供电电压不稳或者网线链路有问题。R2000虽然是工业级产品但也不是刀枪不入安装和使用环境同样会影响数据质量。写在最后的小建议R2000这台雷达说实话工业属性很强不太适合只想“拿来玩具”的玩家但对真正想深入做移动机器人SLAM和导航的人来说它是一台能陪你打硬仗的设备。它不像消费级雷达那样即插即用前期需要花一点时间在网络配置和驱动调试上但一旦跑通后面无论是gmapping还是cartographer出图的稳定性都会让你觉得前期折腾是值得的。我自己在这套方案上踩的坑不少尤其是IP配置和网络丢包两个问题浪费了将近两天时间。现在回想最大的教训就是接到硬件先查铭牌、别盲目相信网上的默认配置排查问题要把“通信链路”放在第一位再往后才是算法参数。如果按照这个思路走R2000的SLAM搭建过程完全可以控制在一两天之内。如果你手里正好也有R2000或者正在犹豫要不要入这一台希望这篇内容能给你一个清晰的技术路线。后面有机会的话我还会写一篇基于R2000振幅数据做反光地标检测的扩展内容那个玩法在实际项目里是真的好用。
返回列表