尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

思岚A1激光雷达SLAM建图从入门到排雷:ROS环境、gmapping与cartographer实操

思岚A1激光雷达SLAM建图从入门到排雷:ROS环境、gmapping与cartographer实操 从盒子里拆出这台思岚A1的时候你可能已经看过无数教程了接上USB线、装个驱动、启动SLAM、建图保存看起来就像一条笔直的流水线。真正动手以后你大概率会发现事情远没有这么简单——串口打不开、雷达转起来了却没有话题输出、TF树报错刷屏、好不容易跑通gmapping结果地图歪得像抽象画。这篇文章从一台全新A1的视角带你把“雷达上电到拿到一张能用的地图”这个完整链路走一遍顺便把新手最常见的几个翻车点做一次专项排雷。这篇东西适合谁刚装好ROS但第一次碰激光雷达的人以及已经能让雷达出点云、但一到SLAM就迷失在TF和话题迷宫里的初学者。我会尽量少讲理论推导多给能直接复制粘贴的命令和配置同时把每条命令、每个参数背后的理由说清楚——毕竟知其然还要知其所以然出了问题才知道去哪里改。1. 为什么新手入门SLAM几乎都从一台A1开始1.1 这个价位的激光雷达A1是绕不开的选项思岚A1的官方参数里最值得注意的是这几点测距半径0.15到12米360度扫描每秒采样8000个点扫描频率默认10Hz通过串口UART输出再借助配套的USB适配器接到电脑上。几百块钱的价位能做到这个水平在2D激光雷达里是真的找不到第二个——这也是为什么不管是自己搭ROS小车、做课程设计还是写毕设开题大家的第一台雷达几乎都是它。用小卖部的雪糕来类比吧市面上高端的2D激光雷达动辄大几千性能确实好但新手用起来心理负担极重一些杂牌山寨雷达便宜是便宜数据抖动和售后问题能把人折磨疯。A1恰好卡在“价格不心疼、精度够入门、文档超多”这个甜蜜区市面上凡是叫得出名字的教学案例从古月居到各类开源小车项目几乎都有A1的身影。1.2 和A2、A3以及最新型号相比A1到底差在哪有对比才有清晰认知。我做了张表把A1和常见同门兄弟放在一起看型号测距半径采样频率适用场景和A1的差距A112m8000点/秒室内建图、入门SLAM基准A216m4000-8000点/秒大房间、轻度工业抗光干扰更好A325m16000点/秒中型环境、精度要求高扫速快、测距远、贵好几倍S系列具体看型号-商业产品集成更紧凑、更稳、成本高对新手来说A1的12米测距在普通客厅和实验室环境里完全够用——大多数情况下你的墙离雷达不会超过5米。采样频率低一点也问题不大因为SLAM算法对点云密度没有那么敏感更关键的是数据是否稳定、话题是否连续。1.3 认识A1的局限别把它用在不该用的地方A1是一条2D雷达只能提供某个平面内的距离信息它看不到头顶、看不到脚下。这意味着它适合做室内平面建图和导航避障不适合做真正的三维重建在阳光直射或者强光环境下测距会出现明显偏差所以室外空旷环境慎用建图质量高度依赖硬件安装的稳固程度——雷达稍微晃动一点地图就会出现重影刚开始做SLAM的时候很多人觉得算法是决定性因素其实硬件安装的稳定性往往才是新手地图漂移的头号原因。后面我会专门展开讲这个问题。2. 开工前的环境准备ROS版本、工作空间与串口权限2.1 版本选型为什么现在推荐Ubuntu 20.04加ROS NoeticROS的版本绑定Ubuntu版本这个老生常谈的坑还是要再讲一遍不能随便挑一个Ubuntu版本然后硬装ROS。如果你的电脑是全新环境我强烈建议选择Ubuntu 20.04配ROS Noetic的组合。理由有三条Noetic是ROS1最后一个长期维护版本教程存量最大遇到问题基本都能搜到现成答案思岚A1官方驱动rplidar_ros对Noetic的支持是稳定路线开箱即用Ubuntu 22.04对应的ROS2 Humble虽然越来越主流但大量教学案例、答疑贴仍集中在ROS1新手在ROS2里踩了坑求助效率反而更低Ubuntu 24.04对应ROS2 Jazzy我也试过但配套的中文资料还少何况很多老一点的SLAM包比如gmapping的ROS2移植版在Jazzy上编译需要注意一些依赖细节真不建议第一台雷达就把环境难度拉满。先把ROS1流程跑通建立正确的“话题、TF、节点”心智模型再迁移到ROS2会顺畅得多。2.2 一键安装脚本和手工安装怎么选ROS安装最劝退新手的其实就是那几行source和rosdep尤其是网络条件不好的时候rosdep update经常会僵在那里。开源社区里比较流行的一键安装脚本比如“鱼香ROS一键安装”对新手来说是效率最高的选择wget http://fishros.com/install -O fishros . fishros它会引导你选择安装ROS版本、配置rosdep、设置环境变量整个过程比手工敲十几条命令要快。别觉得用脚本就是“不懂原理”——能用好工具本身就是一种能力你自己手动装过一遍之后再用脚本反而能体会到它帮你省了哪些事。装完ROS之后记得初始化工作空间mkdir -p ~/catkin_ws/src cd ~/catkin_ws catkin_make echo source ~/catkin_ws/devel/setup.bash ~/.bashrc source ~/.bashrc这里有个细节很多人会疏忽catkin_make执行完后会自动生成devel/setup.bash但如果你在catkin_make之前就迫不及待地把source命令写进.bashrc那么在第一次构建时因为devel目录还不存在source会报错。所以顺序必须是先构建再把source写进bashrc。2.3 串口权限处理雷达插上但不认设备的根源把A1的USB线插到电脑上先确认系统认出了设备lsusb如果你看到一个CP210x或者Silicon Labs的USB转串口设备说明硬件层面是通的。接着看设备节点ls -l /dev/ttyUSB0默认情况下这个设备的属主是root普通用户没有读写权限。所以直接运行驱动就会报Failed to open serial port。解决方案有两种第一种临时授权重启后失效sudo chmod 666 /dev/ttyUSB0第二种把当前用户加进dialout组一劳永逸sudo usermod -a -G dialout $USER然后重新登录或者重启生效。注意$USER这个变量在你当前终端里指的就是当前用户名无需手动替换。加完组之后用groups命令确认一下输出里有dialout否则还是没有权限。这里埋一个伏笔即便你加好了权限USB设备还有一个“拔插后编号变化”的老毛病今天/dev/ttyUSB0明天可能变成/dev/ttyUSB1。这个问题我放在最后的排查环节具体讲因为它牵扯到驱动配置里的设备路径。3. 让雷达转起来rplidar驱动安装与数据验证3.1 编译驱动包千万别选错分支思岚官方在GitHub上维护了rplidar_ros支持ROS1和ROS2两个版本。ROS1下更多的是rplidar_ros的Noetic分支。在ROS1的catkin工作空间里拉下来编译cd ~/catkin_ws/src git clone https://github.com/Slamtec/rplidar_ros.git cd ~/catkin_ws catkin_make如果你使用的是ROS2官方也提供了对应的分支但新手阶段建议先在ROS1里跑通。编译过程如果出现依赖缺失多半是缺少ros-noetic-urg-node或者tf2这类基础包用sudo apt install ros-noetic-urg-node这类命令补齐即可。这个包名只是示例实际报错缺什么就装什么。3.2 启动雷达并验证话题数据要让雷达转起来先给驱动一个正确的串口参数。rplidar_ros的launch文件里默认配置的接口是/dev/ttyUSB0如果你的设备节点不同就需要修改。启动命令roslaunch rplidar_ros view_rplidar.launch这个launch文件会自动启动rviz你应当能看到雷达扫描出来的红色点云并且旋转的雷达带动点云动态刷新。如果不想开rviz也可以分两个终端做验证roslaunch rplidar_ros rplidar.launch然后新开一个终端查看话题rostopic list | grep scan rostopic hz /scanrostopic hz /scan正常会输出约10Hz的发布频率。如果出现明显的低于10Hz或者断断续续说明要么供电不足要么USB线质量太差——A1的电机和测距模块都靠USB供电笔记本USB口供电不稳是常见问题建议优先用带屏蔽的短线或者换一个供电能力强的USB口。3.3 读懂LaserScan消息别被一堆字段吓到很多新手在rviz里看到点云就高兴得忘了看数据本身。但搞清楚/scan话题发的到底是什么对后续排查SLAM问题帮助极大rostopic echo /scan --noarr你会发现消息里主要字段有angle_min、angle_max扫描角度范围A1是-180度到180度共360度angle_increment相邻两个激光点的角度间隔A1大概是1度左右实际约0.9度range_min、range_max有效测距范围0.15到12米ranges核心数组每个元素是对应角度上测到的距离值intensities信号强度信息如果ranges数组里大部分值是Inf或者0说明雷达看到的区域要么太近要么反射信号太弱或者是全黑吸光材质。这些基础知识在SLAM建图时能帮你判断到底是“环境问题”还是“算法问题”。我的习惯是先用rostopic echo盯几秒原始数据再决定要不要调算法参数——这比盲调SLAM参数高效得多。3.4 固定雷达时最容易犯的物理错误驱动跑通之后雷达线怎么摆放、雷达怎么固定直接影响建图效果。见过不少新手把雷达放在一个半透明的塑料盒子上面或者用小型的支架夹住边缘结果雷达旋转时细微的震动都会被算法捕捉进去最后地图边缘出现一圈毛刺。正确做法是使用思岚官方配套的铝制支架或者DIY一个底座至少保证雷达在旋转时没有肉眼可见的晃动。如果是搭小车底盘轮子和雷达的刚性连接同样重要——这些都是算法无法修复的“物理层错误”。4. 第一张地图gmapping建图全流程实操与参数解读4.1 为什么第一个SLAM算法选gmapping而不是别的提到2D激光SLAM新手接触最多的三个名字是gmapping、hector_slam、cartographer。我直接推荐先跑gmapping理由非常朴素gmapping基于粒子滤波原理相对直观网上资料最多搜“gmapping 参数”能翻出成百上千条讨论它对2D激光雷达的支持最成熟A1搭配gmapping属于“官方适配”级别的组合配置量小核心就是launch文件里几个参数适合建立对“节点话题TF”的完整认知hector_slam不依赖里程计但要求雷达帧率很高A1的10Hz用起来容易漂cartographer精度高但配置复杂的多属于后话。所以第一个下午请交给gmapping。4.2 建图前必须搞清楚一件事谁给你提供里程计和TF这里必须先打一个预防针因为你只有一台雷达而没有一个会跑的底盘gmapping光靠激光数据是建不了图的它还需要里程计odometry信息和TF变换。完整闭环必须包含一个可移动的底盘差速小车、麦克纳姆轮车、或者带轮子的机器人平台底盘能发布/odom话题和odom - base_link的TF变换雷达固定在底盘上并发布base_link - laser的静态TF变换如果你是直接用笔记本接雷达没有底盘那gmapping这一套是跑不动的。这个时刻你有两个选择找一台ROS小车或者自己动手做一个底盘让雷达真正动起来换用能手持建图的方案比如cartographer的纯激光SLAM模式不需要里程计本文默认你有一个能移动且能发布/odom的底盘。没有底盘的读者也别急下一章会讲怎么用cartographer的纯激光模式弥补这个缺口。4.3 安装gmapping并编写建图launch文件安装gmapping很简单sudo apt install ros-noetic-gmapping然后自己写一个建图launch文件放在~/catkin_ws/src/下任意功能包里的launch目录中。我习惯把这种常用配置放在一个专门的自定义包里管起来避免散落各处找不到。关键launch文件内容大致是这样的launch !-- 启动A1雷达驱动 -- node namerplidar_node pkgrplidar_ros typerplidarNode outputscreen param nameserial_port value/dev/ttyUSB0/ param nameserial_baudrate value115200/ param nameframe_id valuelaser/ /node !-- 发布雷达与底盘中心的静态TF -- node pkgtf2_ros typestatic_transform_publisher namelaser_to_base param nameframe_id valuebase_link/ param namechild_frame_id valuelaser/ param nametranslation value0.2 0 0.1/ param namerotation value0 0 0 1/ /node !-- 启动gmapping -- node namegmapping_node pkggmapping typeslam_gmapping outputscreen param namebase_frame valuebase_link/ param nameodom_frame valueodom/ param namemap_frame valuemap/ param namemaxUrange value10/ param nameminUrange value0.1/ param namelinearUpdate value0.2/ param nameangularUpdate value0.5/ param nameparticles value30/ /node /launch这里每个参数背后都有讲究base_frame必须是底盘坐标系的名称通常叫base_link如果你的底盘或者URDF里用了别的名字就需要保持一致maxUrange、minUrange指定激光的有效范围。A1官方测距上限是12米但真实环境下超过10米的数据噪声明显变大我建议限制在10米以内能减少无意义的干扰点linearUpdate和angularUpdate分别表示机器人移动多少米或转过多少弧度才触发一次扫描匹配。设得越小地图更新越频繁但计算负载也越高设得太大可能出现地图“跳变”感。0.2米和0.5弧度是相对中庸的起步值particles是粒子数默认30到80之间。少了地图容易发散多了CPU吃紧。新手在性能一般的笔记本上建议先用304.4 建图时的操作手法比参数更影响地图质量的因素启动建图后你要亲自控制底盘移动。不少人的第一张地图糊成一片九成不是参数问题而是操作手法太“野”。我的经验是起步后先让底盘原地旋转一圈让雷达“看到”整个房间这样gmapping的初始位姿收敛更快移动速度保持慢速线速度不要超过0.3米/秒角速度不要超过0.5弧度/秒转弯时尽量在某一个固定点原地旋转不要在行进中急转弯经过走廊、门框这些特征稀疏的区域时稍微放慢速度给雷达更多捕捉特征的时间全程盯着rviz里的图和机器人当前位置一旦发现轨迹开始偏移立刻后退并沿原路走一段让算法重新锁定位置。这就像开车走陌生山路宁可慢一点也别迷路。4.5 保存地图map_saver的正确打开方式地图构建完毕保存的命令大家可能已经背下来了rosrun map_server map_saver -f ~/my_map这条命令会订阅/map话题把当前地图保存为my_map.pgm和my_map.yaml两个文件。-f后面的路径决定保存的文件名和位置可以自己改。很多新手发现保存下来的地图是全黑或者全白纠结半天。绝大多数情况是因为在保存前gmapping还没收到足够的有效建图数据或者保存的那一刻地图正在更新。解决办法很简单保存前先停住底盘等rviz里的地图不再明显变化再执行保存命令。不要小看这个停顿它至少能帮你少生成几十张废图。yaml文件里面的几个字段也要能看懂因为之后做导航时还会用到它image: my_map.pgm resolution: 0.05 origin: [-10.0, -10.0, 0.0] occupied_thresh: 0.65 free_thresh: 0.196resolution单位是米/像素数值越小地图越精细但文件也越大origin表示地图左下角在真实世界坐标系中的位置它和TF坐标系的匹配很重要否则导航时机器人会认为自己在地图外面。5. 从gmapping到Cartographer升级路线的关键配置5.1 什么时候需要换cartographergmapping跑通第一张图之后新鲜感过去你早晚会碰到它的天花板当你快速移动或者经过大空间时地图开始出现重影和拖尾当房间结构复杂比如多间房间串联、回字形走廊gmapping很难做到闭环修正当你只有雷达没有底盘需要手持建图时这就是换用Google的cartographer的时机。它的核心优势是引入回环检测loop closure机器人在回到曾经到过的地方时会自动修正此前累计的轨迹误差——这是gmapping和hector_slam不具备的能力。但必须提前说一句cartographer对新手并不友好安装更复杂、参数更多、调试周期更长。我给的建议是先把gmapping全流程跑熟练再逐步往cartographer迁移感受两种算法在精度和稳定性上的差距。5.2 安装cartographer的两种路线路线Aapt直接安装只适合体验默认参数sudo apt install ros-noetic-cartographer ros-noetic-cartographer-ros路线B源码编译适合想要深度定制和自己调参的情况。这个过程需要额外安装一堆依赖库abseil、ceres-solver等编译时间可能超过半小时。新手第一次建议走路线A先看默认效果觉得不够用再走源码。5.3 针对A1的cartographer配置要点使用cartographer时你通常需要一个基于cartographer_ros的Launch文件和一个lua参数文件。核心的lua配置片段如下include map_builder.lua include trajectory_builder.lua options { map_builder MAP_BUILDER, trajectory_builder TRAJECTORY_BUILDER, map_frame map, tracking_frame laser, published_frame odom, odom_frame odom, provide_odom_frame true, use_odometry false, num_laser_scans 1, num_subdivisions_per_laser_scan 1, ... }几个关键项的含义tracking_frame通常设置成激光雷达的frame_id比如laserpublished_frame一般设为odomcartographer会输出从map到odom的TFprovide_odom_frame设为true时cartographer会自动发布odom帧帮助你省去自己写里程计节点的麻烦use_odometry设为false表示我们只有激光数据没有车轮里程计。这是手持建图的典型配置也是A1单雷达场景下最推荐的配置如果你有底盘并且里程计质量不错可以把use_odometry设为true配合车轮编码器的里程计信息地图的长期稳定性会更好。5.4 纯激光手持建图的实操心得没有底盘的读者使用cartographer的纯激光模式可以在室内手持雷达缓慢走动完成建图。我实测的场景是普通三居室手持A1缓慢地从中厅走到主卧再走回中厅地图的走向、房间分隔基本正确没有出现gmapping那种明显的累积漂移。记住一个诀窍纯激光SLAM非常依赖“充分的视角变化”所以手持雷达时不要只保持一个高度和姿态要有意识地摆动、转圈、上下倾斜一点。这相当于给算法提供了更多的约束条件。当然动作幅度也不要太大太猛否则数据畸变会让回环检测直接失灵。用“平稳地绕圈”代替“快速地扫过”效果会好很多。6. 建图失败排查手册六个常见错误的完整定位过程6.1 串口打不开权限不足或设备号漂移最常见错误报错信息长这样[FATAL] Failed to open serial port /dev/ttyUSB0排查链路按顺序来lsusb确认设备在线ls -l /dev/ttyUSB*查看当前设备节点名groups确认当前用户在dialout组里如果没有权限执行sudo usermod -a -G dialout $USER并重新登录如果上面全部没问题还报错考虑设备号漂移。A1的USB转串口芯片在某些主板上会被固化为不同的设备节点比如一会儿ttyUSB0一会儿ttyUSB1。一劳永逸的办法是用udev规则固定设备别名新建一个规则文件sudo nano /etc/udev/rules.d/99-rplidar.rules内容写KERNELttyUSB*, ATTRS{idVendor}10c4, ATTRS{idProduct}ea60, MODE:0666, SYMLINKrplidar10c4和ea60对应的正是Silicon Labs CP210x常见USB转串口芯片的厂商号和产品号不同批次可能有差异可以先lsusb -v查看后替换。保存后执行sudo udevadm control --reload-rules sudo udevadm trigger重新插拔雷达你就会看到/dev/rplidar这个固定节点。然后在驱动launch文件里把serial_port改成/dev/rplidar再也不用管设备号变来变去的问题。6.2 雷达在转rviz里却什么点云都看不到雷达电机明明转动数据话题似乎也有但rviz里一团黑。按下面的链路排查第一步看话题频率rostopic hz /scan如果完全没有输出大概率驱动节点没启动成功或者话题名不是/scan。我在实际的调试中经常遇到的一个情况是安装了多个版本驱动包不同包发布的frame_id不同结果点云显示在离机器人很远的地方而rviz的视角又恰好没对准。解决办法直接运行rostopic echo /scan --noarr看一帧数据确认angle_min、angle_max、ranges长度是否正常。第二步看rviz的Fixed Frame。rviz左侧的Global Options里Fixed Frame如果还停在默认的map上而你的TF树还不完整点云确实会显示不出来。把Fixed Frame改成laser点云立刻可见。这里再次强调一个常见的认知误区不是“雷达扫到了点云rviz就自动把它画在正确位置”rviz里的点云位置完全依赖TF树提供的坐标关系TF断了点云就全部堆积到原点或者干脆看不见。6.3 TF树不完整“no tf data”的根因SLAM报错里刷屏最猛的一条[ERROR] Could not get transform from odom to laser翻译过来就是在odom坐标系到laser坐标系之间找不到TF变换。用工具看一下rosrun tf view_frames这个命令会在当前目录生成frames.pdf打开它就能看到当前完整的TF树。正常的建图TF树必须包含三条链路odom - base_link由底盘里程计节点发布base_link - laser由static_transform_publisher发布map - odom由gmapping或cartographer发布缺哪条补哪条。如果你用的是自己搭的死小车可能需要先保证底盘节点正常发布odom到base_link的变换如果雷达在底盘上的安装位置有偏移需要修改static_transform_publisher里的坐标平移值不能照抄别人launch文件里的数值。6.4 地图一直模糊、重影、漂移先别急着改算法参数有时候地图能看但很糊像是叠加了半透明的第二层地图。这种情况大多数不是gmapping参数的问题而是以下三个物理层因素之一雷达固定不牢靠旋转时底座跟着抖底盘轮子打滑里程计报的位移和实际不符室内光照变化剧烈或者雷达正对强反光物体镜子、玻璃、白墙近距离我建议的排查顺序是先用手固定雷达底座确认雷达本身没有晃动再检查小车轮胎是否磨损严重或者地面是否太滑最后才去调整linearUpdate和angularUpdate参数。很多人在没有排除物理层问题时光改代码改了一个下午地图还是一样糊——这个弯路我自己走过希望大家不要再走。6.5 保存地图时提示找不到/map话题运行map_saver时如果提示等待/map话题说明当前没有节点发布地图数据。有几个可能gmapping或者cartographer没有真正启动成功gmapping未收到足够的数据没开始建图你启动的是只跑雷达的launch文件压根没有SLAM节点用rostopic list | grep map检查一下。如果只有你准备要建的/map话题但发布频率不是稳定的1到5Hz说明SLAM节点还没进入稳定建图状态。等rviz里的地图渲染连续、不再跳变之后再保存。6.6 一张特别的坑USB供电不足导致雷达频繁重启最后一个问题容易被忽略雷达转着转着突然停了然后又重新启动rostopic hz /scan的频率忽高忽低。查看dmesg日志dmesg | tail -20如果看到usb设备不断断开重连的记录基本可以判定是供电问题。A1的电机峰值电流不小普通笔记本USB口供电能力有限尤其是在同时给底盘、雷达、路由器供电的场合。解决办法是使用有源USB Hub或者把雷达电源单独接到稳压模块上。不要小看这个问题——我见过有人为了这个问题重装了三遍ROS最后发现只是USB Hub的问题。还有一个容易踩的细节连接线越长压降越大A1在长线下可能会频繁启动失败。尽量使用雷达包装里自带的短线避免用那种3米的打印机线。7. 谈谈我跑了半年A1之后的一点体会用思岚A1做SLAM建图这件事本身并不难难的是建立起一套正确的排查心智先物理层再环境层最后算法层。这张顺序表我到现在都在用每次地图出问题先摸一摸雷达底座是否松了再抬头看看环境里有没有镜子最后才打开launch文件动参数。你刚跑通第一张地图的时候大概率会画出一张歪歪扭扭、边缘毛糙的图。不要灰心那是正常的。我自己的第一张GMapping地图差点把客厅和厨房融为一体后来发现是小车右轮打滑太严重换了一套橡胶轮胎之后同样参数下的地图质量肉眼可见地提升。如果你想把这条路走下去我的建议是先用gmapping把“雷达底盘SLAM保存地图”的闭环跑通再去尝试cartographer的纯激光手持建图最后再考虑融合IMU和里程计做更鲁棒的建图。每往上走一步都要回头看看底层那些话题、TF、坐标变换你是否真正理解了——这些地基打牢了后面做ROS导航、路径规划、多传感器融合才不会被频繁的小问题绊倒。
返回列表