
1. 从一堆热词里看“自主机器人基础”到底在讲什么“自主机器人基础”这个标题看起来像是一门课的导论或者一个系列分享的第一篇。但如果你把围绕它的热搜词摊开来看会发现大家真正在搜的东西非常具体ROS怎么装、SLAM怎么建图、路径规划算法怎么跑、多机通信怎么配、仿真环境怎么搭。这说明一个事实——绝大多数人对“自主机器人”的兴趣不是从学术定义开始的而是从“我想让一个东西自己动起来”开始的。我自己第一次接触这个方向的时候也是这个路径。先装系统再装ROS然后跑一个仿真小车看着它在Gazebo里歪歪扭扭地走起来那种感觉比读十篇综述都管用。所以这篇内容我不打算写成教科书式的“自主机器人概论”而是按照一个从业者真正会经历的路径来组织从环境搭建、到感知与建图、到路径规划、再到多机与仿真把“自主机器人基础”这个题目拆成能上手的东西。适合谁看如果你是完全零基础想找一个清晰的入门路线这篇可以当作你的第一张地图。如果你已经装过ROS、跑过SLAM但总觉得各个模块之间是散的这篇可以帮你把感知、定位、规划、控制这条链路串起来。如果你在做AGV、无人机或者机械臂相关的项目里面关于路径规划和多机通信的部分应该能直接对应上你的实际需求。需要提前说明一点自主机器人是一个交叉度极高的领域涉及操作系统、传感器、控制理论、算法、仿真工具。任何一篇内容都不可能把所有细节讲透。我的策略是每个环节讲清楚“它解决什么问题”“核心原理是什么”“实际怎么操作”“容易在哪里翻车”让你在需要深入某个方向时知道该往哪走。2. 环境搭建ROS安装这件事为什么总能卡住一批人2.1 ROS版本与Ubuntu版本的绑定关系很多人第一次装ROS就卡住根本原因不是操作有多难而是没搞清楚版本对应关系。ROS的每个发行版都和特定的Ubuntu版本绑定装错了就是一堆依赖报错。这个绑定关系不是随便定的因为ROS底层依赖大量的系统库和内核特性Ubuntu版本变了库的ABI就可能不兼容。目前主流的情况是这样Ubuntu 20.04对应ROS Noetic这是ROS 1的最后一个长期支持版本Ubuntu 22.04对应ROS 2 Humble这是ROS 2目前生态最成熟的版本。热搜词里出现的“ubuntu20.04配置ros noetic和cuda”和“fishbot安装ros humble”正好对应了这两条路线。选哪个我的建议很直接如果你做的项目不依赖ROS 1时代的老包直接上ROS 2 Humble。ROS 2在实时性、多机通信、安全机制上比ROS 1有本质改进而且社区重心已经全面转向ROS 2。但如果你要复现的代码、要用的驱动只支持ROS 1那就老老实实装Noetic不要跟自己较劲。2.2 一键安装脚本省了什么又藏了什么热搜里“鱼香ros一键安装”出现的频率非常高说明很多人选择了脚本安装这条路。一键安装脚本确实省事它帮你做了几件事自动检测系统版本、配置软件源、导入密钥、安装核心包、初始化rosdep。手动做这些步骤熟练的人也要十几分钟新手可能折腾一两个小时。但一键脚本藏了一个问题它把中间过程都吞掉了。当你后面遇到某个包找不到、某个依赖冲突的时候你完全不知道问题出在哪一层。我的做法是第一次装的时候用脚本但装完之后花十分钟把关键文件看一遍——/etc/apt/sources.list.d/下面的源配置、/opt/ros/下面的目录结构、~/.bashrc里追加的环境变量。知道这些东西在哪后面出问题才有排查的入口。还有一个细节rosdep init和rosdep update这两步在国内网络环境下经常失败。一键脚本通常会帮你换源或者走本地缓存但如果你手动装这两步需要额外处理。这不是技术难度问题是网络环境问题知道原因就不会慌。2.3 装完之后必须验证的三件事装完ROS不代表装好了。我见过太多人装完之后直接开始跑教程结果卡在莫名其妙的地方。装完至少验证三件事第一roscore能不能正常启动。这是ROS 1的核心节点管理器启动不了说明核心包有问题。ROS 2里对应的是ros2 daemon相关的机制验证方式是跑一个ros2 run demo_nodes_cpp talker看有没有输出。第二环境变量有没有生效。echo $ROS_DISTRO应该输出你装的版本名。如果没有输出说明source那行没加到.bashrc里或者加错了路径。第三小海龟仿真能不能跑起来。ROS 1是rosrun turtlesim turtlesim_nodeROS 2是ros2 run turtlesim turtlesim_node。这个小程序看起来简单但它验证了节点通信、话题发布订阅、图形界面显示这一整条链路。小海龟能跑说明基础环境没问题。注意如果你在虚拟机里装ROSGazebo和RViz这类图形化工具可能会因为显卡驱动问题跑不起来。这不是ROS的问题是虚拟机图形加速的问题。条件允许的话双系统或者直接装Ubuntu物理机体验会好很多。3. SLAM机器人怎么知道自己在哪里、周围长什么样3.1 SLAM要同时解决两个问题而这两个问题互相依赖SLAM的全称是Simultaneous Localization and Mapping同时定位与建图。这个名字本身就说明了它的核心难点定位需要地图建图需要知道自己的位置两个问题互相依赖形成了一个鸡生蛋蛋生鸡的死循环。解决这个死循环的思路是用传感器数据同时估计位置和地图。具体怎么做以激光SLAM为例激光雷达每一帧扫描得到一组距离数据机器人运动过程中相邻两帧之间会有重叠部分。通过匹配这些重叠部分可以推算机器人移动了多少这是前端里程计。但里程计会累积误差所以还需要后端优化用回环检测来修正累积误差——当机器人回到曾经走过的地方识别出来并修正整条轨迹。视觉SLAM的原理类似只是把激光换成了相机。相机的好处是信息丰富、成本低坏处是受光照影响大、计算量大。热搜里“视觉slam”和“slam十四讲”同时出现说明很多人是从视觉SLAM入门的。《视觉SLAM十四讲》这本书确实适合入门它把数学推导和工程实现结合得比较好但前提是你得有一定的线性代数和概率论基础。3.2 建图效果不好先查这五个地方很多人跑SLAM建图出来的地图歪歪扭扭、重影严重然后就开始怀疑算法。根据我的经验大部分建图问题不是算法本身的问题而是下面这几个地方出了问题排查项常见问题判断方法传感器标定激光雷达安装角度偏差、相机内外参不准看墙壁在rviz里是不是直的时间同步多传感器时间戳不一致检查各话题的header.stamp运动速度移动太快导致帧间匹配失败放慢速度重新建图环境特征长走廊、空旷场地特征少换有家具的环境测试TF树坐标系变换配置错误rosrun tf view_frames检查这五个里面TF树的问题最隐蔽也最常见。ROS里的坐标变换是一个树状结构从map到odom到base_link到各个传感器每一层都要正确配置。如果某一层断了或者配错了rviz里看起来就是一团乱。我建议每次建图之前先用rosrun tf view_frames生成一张TF树图确认所有坐标系都连上了再开始。3.3 从建图到导航中间缺的那一环建完图只是第一步让机器人用这张图来导航中间还有一个关键步骤地图的保存和加载。ROS 1里用map_server来保存和加载栅格地图保存出来是一个.pgm图片加一个.yaml配置文件。yaml里记录了地图的分辨率、原点位置、占用阈值这些元信息。这里有个容易忽略的点地图原点的设置。如果原点设错了导航的时候机器人会认为自己在一个偏移的位置上路径规划就会出问题。原点信息在yaml文件里是origin: [x, y, yaw]它表示地图左下角在真实世界坐标系中的位置。建图的时候如果起始位置不是原点这个值就不是零。加载地图之后还需要配置代价地图costmap。代价地图是在静态地图基础上叠加障碍物膨胀层、传感器实时障碍物层等用于避障。膨胀半径设多大直接决定了机器人能不能贴着障碍物走。设太小容易撞设太大窄通道过不去。这个参数没有标准答案要根据机器人实际尺寸和运动精度来调。4. 路径规划从A到B算法到底在算什么4.1 全局规划和局部规划是两件事路径规划在自主机器人里通常分成两层全局规划和局部规划。全局规划负责在已知地图上找一条从起点到终点的最优路径常用的算法有A*、Dijkstra、RRT等。局部规划负责在机器人行进过程中根据实时传感器数据调整路径避开突然出现的障碍物常用的有DWA、TEB等。为什么分两层因为全局规划假设环境是静态的计算量大但只需要算一次局部规划要实时响应计算量必须小但频率高。两层配合才能既保证路径最优又能动态避障。热搜里“动态避障小车路径规划”和“多agv路径规划强化学习”分别对应了这两个层面的不同需求。动态避障更关注局部规划的实时性多AGV路径规划则要考虑多个机器人之间的协调避免死锁和碰撞。4.2 A*算法的核心是一个代价函数A是全局规划里最常用的算法它的核心是一个代价函数f(n) g(n) h(n)。g(n)是从起点到当前节点的实际代价h(n)是从当前节点到终点的估计代价也叫启发函数。A的高效之处在于只要h(n)不超过实际代价它就能保证找到最优路径同时比Dijkstra搜索更少的节点。启发函数的选择很关键。如果h(n)始终为0A*就退化成Dijkstra搜索范围大但保证最优。如果h(n)远大于实际代价搜索快但可能找不到最优路径。常用的启发函数有曼哈顿距离、欧几里得距离、对角线距离选哪个取决于机器人能不能斜着走。在实际工程里A还有几个变种值得了解Weighted A通过给h(n)乘一个大于1的权重来加速搜索代价是可能不是最优Jump Point Search通过跳过对称路径来加速在栅格地图上效果很好Hybrid A*考虑了机器人的运动学约束适合阿克曼转向的车辆。4.3 局部规划里的DWA和TEB怎么选DWADynamic Window Approach和TEBTimed Elastic Band是ROS里最常用的两种局部规划器。DWA的思路是在速度空间里采样对每个采样速度模拟一段轨迹然后用一个评价函数打分选得分最高的。评价函数通常包括到目标点的距离、到障碍物的距离、速度大小等。TEB的思路不同它把路径表示成一条弹性带带上的点受到两种力的作用一种来自障碍物把带子推开一种来自相邻点之间的约束保持带子平滑。通过优化这条带子的形状得到一条既避障又平滑的轨迹。怎么选DWA计算量小、参数少、调起来快适合差速驱动机器人。TEB能处理更复杂的运动学约束轨迹更平滑但参数多、调参难度大适合阿克曼或者全向移动机器人。我的一般建议是先用DWA跑通如果发现轨迹不够平滑或者过窄通道困难再考虑换TEB。提示局部规划器的参数和机器人实际尺寸、最大速度、加速度强相关。不要直接抄别人的参数至少要把机器人半径、最大线速度、最大角速度这几个改成你自己的。5. 传感器融合与多机通信让机器人真正“自主”的两个关键5.1 单一传感器不够用融合才是出路自主机器人要感知环境靠一种传感器往往不够。激光雷达精度高但贵、对透明物体检测差相机信息丰富但受光照影响大、深度估计不准IMU频率高但会漂移轮式里程计短期准但长期累积误差。传感器融合的思路是把多种传感器的数据结合起来取长补短。最常用的融合框架是卡尔曼滤波及其变种。扩展卡尔曼滤波EKF处理非线性系统无迹卡尔曼滤波UKF避免了对非线性函数的线性化粒子滤波适合非高斯分布的情况。在ROS里robot_localization包提供了EKF和UKF的实现可以融合IMU、里程计、GPS等数据。融合的核心是状态估计系统当前的位置、速度、姿态是什么。每个传感器提供一部分信息滤波器根据各传感器的噪声特性分配权重最终输出一个最优估计。这里的关键是噪声矩阵的配置配置得不对融合效果可能还不如单一传感器。5.2 多机通信配置里最容易踩的坑热搜里“ros多机通信配置”和“ros多个节点发布移动指令话题时底盘节点如何取舍”这两个问题说明多机场景下的通信和协调是很多人的痛点。ROS 1的多机通信基于TCP/IP核心是ROS_MASTER_URI和ROS_IP这两个环境变量。主机运行roscore从机把ROS_MASTER_URI指向主机的IP和端口。听起来简单但实际配置时经常出问题原因通常是这几个主机和从机不在同一网段、防火墙拦截了端口、hostname解析不对、ROS_IP没设置导致用了错误的网卡地址。我的排查顺序是先ping通、再telnet端口、再检查环境变量、最后看hostname解析。这四步走完基本能定位问题。至于多个节点同时发布移动指令的问题本质是控制权冲突。底盘节点订阅了多个话题每个话题都可能发来速度指令底盘该听谁的常见的解决方案有三种一是用优先级仲裁高优先级的指令覆盖低优先级的二是用多路复用器mux只转发当前激活的话题三是用动作服务器action server替代话题通过目标抢占来管理控制权。选哪种取决于你的场景如果是遥控和自主导航共存mux比较合适如果是多机协同可能需要更复杂的仲裁逻辑。5.3 仿真环境在摔坏真车之前先把算法跑通Gazebo是ROS生态里最常用的仿真环境它能模拟物理引擎、传感器噪声、光照条件让你在虚拟环境里测试算法。热搜里“ros小车自主导航仿真”和“ros和gazebo”说明很多人是从仿真入门的这个路径是对的。Gazebo仿真的核心是URDF/Xacro文件它描述了机器人的几何形状、关节连接、惯性参数、传感器配置。写URDF是个细致活一个连杆的惯性矩阵写错了机器人可能在仿真里抖得像筛糠。我的建议是先用现成的模型比如TurtleBot3、FishBot跑通之后再改自己的。仿真里跑通之后迁移到真机上还有一道坎仿真里的传感器是理想的真机上的传感器有噪声、有延迟、有标定误差。所以仿真里调好的参数到真机上一定要重新调。但仿真的价值在于它能帮你快速验证算法逻辑对不对避免在真机上反复试错浪费时间。6. 从基础到进阶几条值得走的路线6.1 如果你想做移动机器人导航路线可以这样走先装好ROS和Gazebo用TurtleBot3或者FishBot跑通建图和导航的完整流程。然后深入看navigation2ROS 2或者move_baseROS 1的源码理解代价地图、全局规划器、局部规划器、恢复行为这几个模块怎么配合。再然后尝试换自己的机器人模型调参适配。最后加入动态障碍物、多楼层、窄通道这些复杂场景测试算法的鲁棒性。6.2 如果你对视觉SLAM感兴趣先补数学基础线性代数、概率论、非线性优化。然后看《视觉SLAM十四讲》把里面的代码跑一遍。接着选一个开源框架深入ORB-SLAM3或者VINS-Mono都是不错的选择。跑通之后尝试在自己的数据集上测试理解特征提取、匹配、位姿估计、回环检测每个环节的实际表现。最后考虑多传感器融合把IMU和视觉结合起来提升鲁棒性。6.3 如果你在做多机或者AGV调度先理解单机导航的完整链路然后学习多机通信的配置和调试。接着研究多机路径规划算法包括集中式和分布式两种思路。集中式用一个中央调度器分配路径简单但扩展性差分布式每个机器人自己规划灵活但容易死锁。强化学习在多AGV调度里是一个热门方向但训练成本高实际落地还需要考虑实时性和安全性。7. 一些没人会主动告诉你的实操经验第一个经验不要追求一次把所有模块都跑通。自主机器人是一个系统工程感知、定位、规划、控制任何一个环节出问题整体都跑不起来。正确的做法是分模块验证每个模块单独测试通过之后再集成。比如先验证激光雷达数据正常再验证建图正常再验证定位正常最后才做导航。第二个经验日志比调试器好用。ROS的rosbag可以录制所有话题数据出问题的时候回放数据比反复跑现场高效得多。我习惯在每次测试时都录bag尤其是出问题的那次回放的时候可以慢慢分析。第三个经验参数不要硬编码。机器人的尺寸、速度、传感器安装位置这些参数写成配置文件或者用ROS的参数服务器管理。换一台机器人或者改一个传感器只需要改配置不用改代码。第四个经验仿真和真机的差距主要在传感器噪声和执行器延迟上。仿真里调好的参数到真机上至少要把速度降一半重新调。真机的惯性、摩擦、电机响应都和仿真不一样急不得。第五个经验社区里的一键安装脚本和现成配置能省很多时间但不要完全依赖。至少要知道它帮你做了什么出问题的时候才有排查的方向。完全的黑盒出了问题就是无头案。自主机器人这个方向入门门槛确实不低涉及的知识面广工具链也复杂。但它的反馈很直接——你写的代码机器人动起来了建出图了绕过障碍了这种成就感是很多纯软件方向给不了的。从一个小车跑起来开始慢慢往上加传感器、加算法、加场景每一步都有东西可学每一步都有坑可踩。踩过的坑最后都会变成你自己的经验。