我的业余时间大多耗在了机器人和小玩具的折腾上,这次的项目标题叫Build an Autonomous Mapping Rover,翻译过来就是“打造一辆自主建图漫游车”。听起来挺唬人,实际上就是一台能自己走走转转、把周围环境扫描成地图的小车。放在一两年前,这种系统还属于实验室专属,现在零配件和开源算法都成熟了,普通人完全可以在家里搭一套能跑、能出图、能导航的完整样机。
这篇文章不谈那些虚的天花乱坠的概念,只讲我实际搭建过程中的完整思路、硬件选型、软件配置,以及踩过的那些坑。目标是让你看完之后,手里有货、心里有数,能自己复现一台能建图、能定位、能自主航点导航的漫游车。
1. 项目整体设计与思路拆解
1.1 自主建图漫游车到底在解决什么问题
先说清楚一个概念:自主建图漫游车由三个核心能力构成——环境感知、实时定位建图、自主路径规划。很多人一开始只盯着“建图”两个字,觉得能扫出一张地图就算成功,其实建图只是基础。真正让这台车“自主”的,是在建好的地图上实现实时定位(即定位)和避障导航(即规划)。换句话说,漫游车至少要能在未知环境里走一遍,把地图“画”出来,然后在这张地图上找到自己在哪里,才能规划去某个目标点的路线。
这套逻辑在扫地机器人、园区巡检车、仓库自动搬运设备上都能见到,本质是同一套技术栈。我的项目目标定得很具体:让小车在室内环境(比如客厅、走廊、办公室)里自主巡航,通过雷达扫描生成二维栅格地图,然后在地图上指定目标点,小车自动规划路径并安全到达。整个系统建图分辨率控制在5厘米,可实时在地图上看到小车位置。
1.2 为什么选择“轮式底盘+2D雷达+开源算法”这条技术路线
我当初在方案选型上纠结过一段时间,主要有三条路线:视觉SLAM(用深度相机或双目相机)、3D激光SLAM(用三维激光雷达)、2D雷达SLAM(用单线激光雷达)。
视觉SLAM价格最便宜,一个深度相机才几百块,但弱点非常明显:对环境光照敏感,走廊强光、暗光、白墙无纹理区域都容易丢特征。3D激光SLAM效果最好,但一套雷达动辄几千上万,对计算平台要求也高,不适合作为入门项目的核心传感器。
最终我选择了2D单线雷达配合轮式里程计的组合,核心原因是性价比极高,且技术生态非常成熟。RPLIDAR A1这一级别的雷达只有三百元左右,扫描半径12米,刷新率10Hz,配合电机编码器算出来的轮式里程计,在小范围室内场景下完全够用。算法层面有GMapping、Cartographer这样的开源方案可以直接用,社区资料也丰富,遇到问题几乎都能找到解决方案。
实际跑下来这套方案让我省了不少心,但这不是说它没有坑——2D雷达有天然限制,它只能扫描一个平面,所以对桌腿、椅子腿这类低矮障碍物很敏感,但对于低于雷达安装高度的物体(比如地上的线缆、低矮台阶)它就“看不见”了。所以在搭建时要把雷达安装高度放在20到30厘米左右,才能兼顾室内家具的检测范围。这属于硬件层面就需要提前想清楚的约束,后面会在安装部分细说。
1.3 系统架构:模块化设计才是后期不痛苦的根源
我把整套系统按功能拆成了几个独立模块,每个模块之间通过消息通信:
- 底盘控制模块:接收速度指令,驱动电机,同时发布编码器里程计数据。
- 传感器数据模块:采集雷达扫描数据,并配合IMU(惯性测量单元)提供姿态参考。
- 建图与定位模块:运行SLAM算法,实时拼接激光帧生成地图,同时输出机器人在地图中的位姿。
- 导航规划模块:加载已生成的地图,执行定位(AMCL),并完成全局路径规划与局部避障。
- 上层调度模块:负责接收任务指令(比如目标点坐标),协调导航模块执行。
这样设计的好处是坏了一个模块不影响其他模块调试。建图的时候只开雷达、底盘和SLAM算法,导航的时候再单独启动导航栈。如果你把代码焊死在一个进程里,后面排查问题会非常痛苦。
2. 硬件搭建:从零拼出一台能跑的漫游车
2.1 底盘、电机与驱动板的选型与教训
底盘是整个项目的地基,要保证承载能力、行驶稳定性,还要方便安装雷达和计算板。我用的是一块通用的四轮亚克力底盘,尺寸大约30cm×25cm,四个直流减速电机带霍尔编码器,每个电机额定电压12V,减速比1:30,最大转速约300RPM。
这里有一个关键细节:直流减速电机必须带编码器,没有编码器就没有轮式里程计,后续SLAM定位会非常困难。编码器分为霍尔编码器和光电编码器,霍尔编码器抗干扰能力更强,室内环境首选这种。我用的是每圈13脉冲、配合减速比1:30后等效每圈390脉冲的型号,精度基本够用。
电机驱动板用的是经典的双H桥驱动模块,型号是TB6612FNG,比L298N轻、效率高,支持两路电机调速,最大持续电流1.2A,足够驱动这种小电机。如果你的电机功率更大,可以换BTS7960或者大电流的MOS驱动模块。接线时特别注意共地,逻辑电源和电机电源必须共地,否则PWM信号会因为电压基准不同导致电机抖动甚至失控。这是我第一次接线踩过的坑线,后面会细讲。
2.2 主控与计算平台:怎么选性价比最高
漫游车有“轻量控制”和“重计算”两层任务。轻量控制包括读取编码器、输出PWM、采集IMU数据,我用了一块STM32F103开发板来做;重计算包括雷达数据处理、SLAM建图、路径规划,我用了一台运行Ubuntu的迷你主机作为上位机。
STM32F103是典型的低成本MCU,主频72MHz,专门负责底层实时控制。上位机最初我试过树莓派4B,跑轻量级建图勉强够用,但建图时CPU常年满载,后面还要跑导航和可视化,明显吃力。我换成了一台带四核J4125处理器的迷你工控机,8GB内存,跑ROS系统完全没压力,整机功耗也只有15W左右,用一块12V锂电池就能同时给底盘和电脑供电。
如果你预算宽裕,也可以用NVIDIA Jetson Orin Nano这类带GPU的板子,以后想加视觉模型识别就方便了。但作为纯建图导航项目,J4125级别的机器绝对够用。这里的原则是:计算平台性能留够30%余量,不要刚刚好,否则后面加功能必然卡顿。
2.3 雷达、IMU与传感器安装的物理要求
雷达我选了思岚RPLIDAR A1,这是一颗360度扫描的单线激光雷达,测量半径12米,测距误差在厘米级别,采样频率8000次/秒,扫描频率可以调到10Hz。它通过串口转USB连接上位机,ROS里已经有现成的驱动包,插上就能出激光话题。
IMU我选的是MPU6050六轴惯性测量单元,注意IMU的安装位置要尽量靠近小车的旋转中心,并且保持水平。如果不水平,陀螺仪和加速度计的零偏会变化,后续融合出来的航向角会漂移。安装雷达时,雷达中心线要与小车前进方向对齐,偏差角度哪怕只有几度,建出的地图也会整体旋转,影响后续定位。
传感器安装顺序建议是这样的:先把底盘拼好,确认电机转向一致,再装IMU,最后装雷达。每装一层就测试一层,不要一次性全装完再通电,否则出了问题很难定位出是哪部分线踩了坑或哪颗螺丝松了。
2.4 供电系统:最容易忽视又最容易出事的一环
供电是整个项目里最容易出问题的地方,而且一出问题就是反复重启、电机抖动、雷达丢帧这种疑难杂症。我的经验是:动力电源和逻辑电源必须分开。底盘电机启动瞬间电流很大,12V电机空载电流可能只有200mA,但堵转时冲击到2A以上都有可能。如果计算板、雷达、IMU都跟电机共用同一路电源,电机一转,电压瞬间跌落,计算板就会重启。
我的做法是:
- 一块12V/5200mAh锂电池直接给电机驱动板供电。
- 电机的正负极从电池端单独引出。
- 再用一块降压模块(DC-DC 12V转5V/3A)单独给上位机、雷达和MCU供电。
- 给上位机供电的线尽量短且粗,降低线路压降。
电池我最终选了带保护板的锂电池组,过放保护非常重要。有些便宜电池没有保护板,把电压耗到6V以下,电池就报废了。另外,开机顺序也有讲究:先接电池供电,再开上位机,等系统起来后再跑底盘驱动。反过来的话,上位机启动瞬间电流大,容易把电池电压拉低,引发MCU误启动。
3. 软件系统:ROS环境搭建与核心算法参数
3.1 为什么选ROS全家桶而不是自己造轮子
软件部分我当然不是从零写SLAM算法,ROS(Robot Operating System)是这个项目的绝对主力框架。ROS不是一个操作系统本身,而是一套运行在Linux上的分布式通信中间件,它把传感器驱动、算法模块、可视化工具都做成了独立的“节点”,节点之间通过话题(Topic)进行订阅和发布。
选择ROS最大的原因是生态成熟,雷达驱动、底盘驱动、GMapping建图、AMCL定位、导航栈全部有现成的开源包。我自己只需要写底盘驱动和任务调度的代码,其他都靠配置参数来适配。如果你非要从无到有写一套SLAM,那已经不是项目,而是科研课题了。
这里要区分一下ROS1和ROS2。ROS1为Noetic版本(支持Ubuntu 20.04)资料最多,坑最少,非常适合学习和小型项目。ROS2在实时性、多机通信上有优势,但一些经典包(比如GMapping)在ROS2下还需要额外适配。我的项目用的是ROS1 Noetic,稳定性最高。如果你决定用ROS2,也能跑Cartographer 2D建图和Nav2导航栈,但调试门槛确实高一截。
3.2 机器人模型URDF与TF坐标树:地图乱掉的根源多半在这里
在ROS里跑SLAM之前,必须先定义好机器人模型URDF和TF变换树。TF是坐标变换,系统要知道雷达在车身上的哪个位置、底盘中心在哪里、雷达安装高度是多少,才能把雷达扫描到的点投影到世界坐标系里。
我的坐标树很简单:
map -> odom -> base_footprint -> base_link -> lasermap:全局地图坐标系,由SLAM算法维护。odom:里程计坐标系,根据编码器积分得到。base_footprint:机器人在地面上的投影点。base_link:机器人本体坐标系,通常定义在底盘中心。laser:雷达坐标系,安装位置相对于base_link有一个平移和旋转量。
最常犯的错误是雷达安装位置测量不准。雷达安装高度差了1厘米、安装角度偏了2度,建图质量就会明显劣化。地图会出现双层边缘、重影、整体扭曲这些问题。我在第一次跑建图时就发现走廊地图是歪的,排查了半天,最后发现雷达支架垂直度偏了3度,重新固定后立即恢复正常。
测量方法简单但要有耐心:用卷尺量雷达中心到小车前进方向中轴线的左右距离差,再量雷达平面到地面的高度。URDF文件里这些数值要精确到毫米级。
3.3 底盘驱动节点:里程计必须稳,否则一切白费
底盘驱动节点是上位机和MCU沟通的桥梁,它接收/cmd_vel话题上的速度指令,转发给下位机,同时从下位机读取编码器计数,计算并发布里程计数据(/odom)。
里程计的计算公式不复杂。假设差速底盘,左右轮编码器单位时间内的脉冲增量分别为delta_left和delta_right,每个脉冲对应的车轮行进距离为pulse_to_meter,那么左右轮的行程为:
distance_left = delta_left * pulse_to_meter distance_right = delta_right * pulse_to_meter两轮间距为wheel_base,则小车前行位移和航向角变化为:
distance_center = (distance_left + distance_right) / 2 delta_theta = (distance_right - distance_left) / wheel_base把这个航向角累加起来,再配合初始位置,就能推出小车在世界坐标系里的坐标。这就是最经典的差速里程计模型。要注意的是,里程计的累积误差是不可避免的,所以后面才需要雷达和粒子滤波(AMCL)来修正它,这正是SLAM链条中“定位”的作用。
我用串口线连接STM32和上位机,协议用的是简化的文本帧格式。比如向上位机发送vx:0.2;vw:0.0;\n,下位机按固定周期解析执行;下位机向上位机发送l:123;r:456;\n作为编码器脉冲计数。串口波特率我设在115200,足够用,再高容易出错。
3.4 建图算法选型:GMapping与Cartographer的对比
建图算法我前后试了两种,分别是经典的GMapping和Google的Cartographer。两者都能建出不错的二维栅格地图,但适用场景略有不同。
GMapping基于粒子滤波,原理是把机器人可能的位姿用一批粒子来表示,每帧激光数据来的时候更新粒子权重,最终收敛到最可能的位姿。优点是参数少、调试容易、小场景下效果很好、对CPU要求低。缺点是大场景或者回环较多时粒子容易耗尽,位置估计会崩溃,也就是俗称的“打滑”“飞轨”。
Cartographer是基于图优化(Graph SLAM)的算法,它会维护历史轨迹和约束,在后端做闭环检测,大场景、回环环境下表现远好于GMapping。但参数多、配置复杂,对CPU要求也高。我最终在小场景测试用GMapping,大场景跑了一圈后切到了Cartographer。两者各有适用范围,不需要纠结,建议先从GMapping起步,跑通全链路后再尝试Cartographer。
下面给出我在GMapping里调得比较顺的一组参数,适合30平米左右的室内场景:
| 参数名 | 建议值 | 说明 |
|---|---|---|
maxUrange | 4.0 | 激光最大有效距离,超过此距离的点不参与匹配,4米比较合适 |
minimumScore | 200.0 | 激光帧与地图匹配的最低得分,低于此值算法认为匹配失败,可适当调低 |
particles | 30 | 粒子数量,室内小场景30就够,太大耗CPU |
linearUpdate | 0.5 | 小车平移0.5米时触发一次扫描匹配 |
angularUpdate | 0.2 | 小车旋转0.2弧度(约11.5度)时触发扫描匹配 |
lsigma | 0.05 | 激光噪音标准差,数值越小越信任激光 |
ogain | 3.0 | 地图占用概率增益,影响地图明暗对比 |
调参的核心原则是:先保证建图时小车移动速度慢(线速度0.2m/s,角速度0.3rad/s以内),再根据地图效果微调参数。如果地图出现重影,看看是不是雷达安装松动、移动过快或maxUrange过大纳入了远处噪音点。如果地图出现空洞,考虑降低minimumScore或增加particles。
4. 自主导航与航点巡航实现
4.1 从静态地图到实时定位:AMCL怎么知道“我在哪”
建图完成后,系统要解决的下一个问题是“我怎么知道自己在地图上的哪个位置”。我采用了ROS的AMCL(Adaptive Monte Carlo Localization,自适应蒙特卡洛定位)包处理这个任务。
AMCL的原理是维护一堆粒子,每个粒子代表一个可能的机器人位姿(x、y、yaw)。初始阶段粒子分布在整个地图上,每次接收到激光帧后,算法计算每个粒子位置的激光模拟与实际激光的匹配度,匹配度高的粒子保留,匹配度低的淘汰。这个过程不断迭代,粒子逐渐收敛到机器人真实位置附近。这个场景可以用一个类比理解:闭着眼睛在一片大房间里找自己的位置,每摸到一次墙就可以筛掉一大批不可能的猜测,摸的次数越多,位置越精确。
在启动AMCL之前,需要给定一个初始位置估计。如果初始姿态误差太大,粒子可能会收敛到错误的位置,也就是“定位绑架”问题。实用做法是先手动遥控小车转一圈,让激光扫到周围环境,逼着粒子尽快收敛,然后再切换到自动导航模式。
AMCL参数里有两个非常关键:min_particles和max_particles。粒子太少容易被噪音带偏,粒子太多吃CPU。我设置为min_particles=500、max_particles=2000,小场景500~1000个粒子就够,大场景建议上限到3000以上。另一个参数update_min_d和update_min_a控制粒子更新的频率,分别表示小车移动多少距离、旋转多少角度才进行一次重采样。我设置为0.1m和0.1rad,能很好地平衡定位精度和实时性。
4.2 全局路径规划与局部避障:谁来决定小车怎么走
导航栈中路径规划分为两层:全局路径规划和局部路径规划。
全局路径规划器(GlobalPlanner)会在静态地图上从机器人当前位置到目标点搜索一条可行路径,常见算法有Dijkstra和A*。局部路径规划器(DWA)则负责实时处理动态障碍物,它会在小范围内采样多条速度指令,评估每条指令能否避开障碍、方向是否偏向目标、速度是否合理,然后选最优的一条执行。两者的关系像一个公司里的总监和组长:总监定大方向,组长解决路上的突发情况。
DWA里我最常用也最推荐调的是这几个参数:
| 参数名 | 建议值 | 说明 |
|---|---|---|
max_vel_x | 0.3 | 最大前进线速度,单位m/s,室内太快容易扫飞地图 |
min_vel_x | 0.0 | 最小前进速度,设为0允许原地转向 |
max_vel_trans | 0.3 | 最大平移速度 |
max_vel_theta | 0.8 | 最大角速度,单位rad/s |
min_in_place_vel_theta | 0.3 | 原地旋转的最小角速度,防止旋转过慢 |
xy_goal_tolerance | 0.1 | 到达目标点的允许距离误差,0.1米比较合适 |
yaw_goal_tolerance | 0.1 | 到达目标点的允许角度误差,约5.7度 |
sim_time | 2.0 | 轨迹模拟的时间窗口长度(秒),太短容易急转,太长反应迟钝 |
说实话导航调参是最花时间的一步,但也是最出成就感的一步。第一次看到小车自己从客厅穿过走廊开到卧室门口,心里是真的爽,感觉前面几个星期的折腾都值了。
4.3 完整巡航流程:建图、保存、定位、导航一条龙
整个系统的实际使用流程是这样的:
- 启动建图:启动雷达驱动、底盘驱动、GMapping。
roscore roslaunch turn_on_wheeltec_robot lidar.launch roslaunch turn_on_wheeltec_robot base.launch roslaunch turn_on_wheeltec_robot gmapping.launch遥控小车扫图:用键盘遥控节点或手柄,慢慢推着小车走遍房间每个角落。难点在于要把房间的每个犄角旮旯都扫到,地图边缘才不会缺一块。
保存地图:用
map_server包把ROS中的栅格地图保存下来,生成map.pgm和map.yaml两个文件。加载地图并启动定位:关掉建档启动节点,启动
map_server提供了地图,再启动AMCL定位节点。设置目标点:在Rviz中点击“2D Nav Goal”按钮,在地图上点击目标位置并设置朝向,然后小车就会自主规划路径开过去。
加入巡航任务:如果要实现多点巡航,我写了一个简单的调度节点,定时读取坐标队列里的目标点,依次发送给导航栈。每个目标点到达后停留3秒再发送下一个点。
这套流程看似简单,实际执行中有无数细节。最典型的是:建图时如果小车转得稍快,激光帧之间重叠角度大,地图边缘就会出现撕裂感。解决办法只有一个字:慢。建图速度宁慢勿快,这是所有踩过的坑里最重要的一条经验。
5. 常见问题与排查技巧实录
5.1 地图重影、错位、乱漂的根因排查
建图过程中最常见的问题就是地图重影或漂移。我总结了一套排查思路,从高频到低频排序:
雷达固定松动:雷达支架螺丝没拧紧,跑起来雷达轻微晃动。排查方法:断电后用手轻晃雷达,如果能感觉到任何位移,就是松动,拧紧即可。
里程计标定不准:左右轮距、轮径参数不对,导致里程计积分出来的轨迹和实际轨迹之间有偏差。排查方法:让小车直线走2米,看里程计反馈值是不是2米,差太多就检查轮径参数编码器分辨率。再让小车原地转360度,看航向角是否回到0,如果偏了就检查左右轮编码器是否一致。
激光最大距离过长:
maxUrange设置过大(比如9米以上),远处光线弱的墙体被误检测成噪点并参与匹配,导致地图整体扭曲。把maxUrange调到4~6米通常能明显改善。移动速度过快:建图时让小车跑得太快,激光帧重叠不够,匹配算法找不到足够的共同特征。减慢到线速度0.2m/s以内即可。
地面反光严重:某些瓷砖地面在低角度激光照射下产生镜面反射,雷达收到的点会拉成一条“假直线”。这时可以调高雷达安装高度,让入射角更陡,减少反光影响。
5.2 导航时小车抖、撞墙、找不到路怎么办
导航阶段的问题和建图阶段完全不一样。小车抖(左右扭动)通常是DWA局部规划器参数里sim_time太短,导致轨迹模拟不够远,规划器对未来缺乏预见性,就会频繁变方向。我建议sim_time至少设为1.5到2.0秒。
小车撞墙一般是局部代价地图的膨胀半径(inflation_radius)设置太小。这个参数控制障碍物周围“虚拟禁区”的范围,默认0.1米会让小车贴着墙走,稍微有点惯性误差就蹭墙。调到0.2到0.3米能有效避免剐蹭。
小车找不到路则要检查是否有动态障碍物挡在可行路径上,或者在窄通道中规划失败。排查方法是在Rviz里显示全局规划路径(Global Plan)和局部规划路径(Local Plan),看是哪一层没规划出来。如果是全局层没路径,说明静态地图里障碍物太密,检查膨胀半径;如果是局部层没路径,说明DWA在当前位置附近找不到可行速度空间,可以尝试提高max_vel_theta让小车的更多旋转选项来调整方向。
5.3 串口通信异常:乱码、断连、数据错乱的排查实录
底盘节点和MCU之间的串口通信是项目里最容易出诡异问题的地方。有一次我打开底盘驱动节点,里程计数据时而正常时而乱跳,用串口助手直接看原始数据,发现部分数据帧明显错位,甚至出现非法字符。排查下来原因是我用的USB转串口模块在干扰下偶发丢字节导致帧错位,而我的驱动代码没有做完整的帧校验。
解决思路有三条:
- 帧格式设计:用起始符(比如
0xAA 0x55)加数据长度,再加CRC16校验,让驱动节点丢弃不合法帧。 - 提高波特率健壮性:对电机的PWM频率做调整,换更粗的串口线,或者将串口线远离电机线,减少电磁干扰。
- 异常重同步:驱动节点检测到连续5帧非法数据时自动重新同步帧头,而不是停留在错误状态。
这类问题最有意思的地方在于:它不是某一个硬件坏了,而是整个链路里的噪声被放大后的结果。排查价值很高,解决之后整个系统的稳定性会有一个质的提升。
6. 扩展方向与个人经验总结
6.1 这套系统还能往哪些方向扩展
自主建图漫游车完成之后,它已经是一个可以二次开发的折腾平台,而不只是一台会动的玩具。按照我的经验,值得延展的方向有三个:
第一是多传感器融合。在2D雷达的基础上增加深度相机,用视觉信息补足低矮障碍物检测,弥补2D雷达的扫描盲区。融合方式可以用扩展卡尔曼滤波(EKF)把IMU、轮式里程计、视觉里程计全部融合成一个高精度里程计,这会让长距离建图的精度提升一大截。
第二是语义建图。现在雷达建出来的是二维栅格地图,只有“有没有障碍”这个信息。如果接入目标检测模型,把摄像头画面里的门、桌子、椅子识别出来,把语义标签叠加到地图上,就能实现“房间里有一张桌子”这种语义级别的地图,这对后续的复杂任务调度很有价值。
第三是云端地图管理。建好的地图可以上传到云端,做多楼层、多区域的地图存储和切换,让机器人在大区域环境下自主选择加载对应楼层的建图文件。这个方向更偏工程,适合想把项目做成产品的同学。
6.2 我踩过的大坑与应该早点知道的事
回头看这个项目,有不少事情如果一开始就知道,能省掉大量返工时间。这里挑几个值得说的:
第一,硬件安装的精度决定了算法效果的上限。这是最痛彻的领悟。一开始我总觉得软件调参能弥补硬件误差,后来发现雷达歪了3度、轮距测量差了5毫米,地图和导航的精度就永远差了那么一点,怎么调参都调不回来。如果你也想做这类项目,安装环节把尺子量准,绝对是投入产出比最高的一件事。
第二,不要在同一个地方反复折腾超过1小时,先查外围再做深入排查。有一次我搞了一晚上里程计数据乱跳,后来发现是USB线接触不良。这类经验说起来简单,但人一旦钻进“调算法参数”的坑里,就不愿意回头看硬件连线了。现在我的排查顺序永远是:供电、接线、通信、传感器标定,最后才是算法参数。
第三,数据可记录性是项目的生命线。有时候某个现象只在特定跑动路径下出现,如果当时没有录包(ROS的Bag文件),复现起来就会非常痛苦。所以我从第一天就开启了rosbag record的习惯,每次跑完实验先把数据包录下来,再慢慢分析。有了数据包,定位重建、算法对比、故障复盘都有了抓手。
做一个自主建图漫游车,表面上是把一堆硬件和代码组装在一起,实际做下来你会发现它把嵌入式控制、传感器原理、概率机器人、路径规划、系统调试这些知识全部串成了一条线。这种项目最大的价值不是你最终得到的那张地图,而是你在这个过程里建立起来的系统级直觉——当一个复杂系统出问题时,你能不能快速判断问题在哪一层、是什么性质、优先级多高。
如果你也想动手做一台,我的建议是别纠结选型太久,先用手头最便宜的雷达加一块树莓派把建图跑通,再一步步升级。真正的坑都埋在实际跑的过程中,提前看再多资料都不如自己让小车跑起来撞一次墙来得实在。