当机器人接收到“去客厅”的指令时,它的大脑——路径规划模块——就开始高速运转。这个模块并非在一个统一的“地图”上工作,而是在多个相互关联的坐标系中穿梭,计算出一条安全、高效的行走路线。我在一个仓储机器人项目中就曾因为混淆了规划坐标系,导致机器人规划的路径在转弯处总是撞上货架边缘。
你可以把规划空间想象成木匠的工作台。木匠根据图纸(地图)在工作台(规划空间)上标记、测量和切割材料(规划路径)。在机器人学中,规划空间是路径规划算法进行搜索和计算的抽象数学空间,它定义了机器人“可到达”和“不可到达”的区域。最常用的两种规划空间是位形空间和工作空间。
路径规划通常分为全局和局部两个层次,它们像战略与战术的关系,各自在不同的坐标系舞台上演绎。
全局规划器(如A*、Dijkstra算法)的舞台是世界坐标系或地图坐标系。它接收一个静态的、预先构建好的地图,地图上的每个像素或栅格都对应着世界中的一个固定位置。规划器在这个坐标系中,从机器人的目标点(同样是地图坐标)回溯到起点,找出一条连接两点的、避开所有已知障碍物的通道。这条路径是一系列世界坐标系下的位置点序列。
局部规划器(如DWA、TEB算法)的舞台则是机器人坐标系。它的任务更精细:根据全局路径的指引,结合实时传感器(如激光雷达)感知到的、在机器人坐标系下表达的局部障碍物信息,计算出机器人下一时刻应有的线速度和角速度。因为传感器数据天然在机器人坐标系下,在此坐标系下做避障计算最直接。
这两个阶段通过坐标变换紧密耦合。全局路径点需要被实时转换到机器人坐标系下,成为局部规划器追求的“临时目标点”;而局部规划器输出的速度命令,在发送给底层控制器前,可能需要根据机器人的朝向进行转换。
无论是全局还是局部规划,都需要一份“地形图”来评估每个位置的通过成本,这就是代价地图。它本质上是一个二维网格,但关键问题在于:这个网格锚定在哪个坐标系?
| 代价地图层 | 常用坐标系 | 描述与用途 | 更新频率 |
|---|---|---|---|
| 静态层 | 地图坐标系 | 基于先验地图(如SLAM建图所得),标识墙壁、固定家具等永久障碍物。全局规划主要依据此层。 | 一次加载,基本不变 |
| 障碍层 | 机器人坐标系 → 地图坐标系 | 融合实时传感器数据(如激光雷达点云)。传感器数据先在机器人坐标系下生成局部障碍信息,再通过机器人位姿变换到地图坐标系中,更新此层。 | 高频(如10Hz) |
| 膨胀层 | 地图坐标系 | 在障碍物周围生成一个成本渐增的区域,相当于为机器人建立一个“安全缓冲区”,防止擦碰。计算依赖于地图坐标系下的障碍物位置。 | 中频(障碍更新后触发) |
实际开发中,大部分导航框架(如ROS的Navigation2)维护的核心代价地图是基于地图坐标系的。传感器数据需要经过“机器人位姿”这个变换,才能正确“绘制”到这张全局地形图上。
编者提示: 在调试路径规划问题时,一个非常有效的手段是可视化代价地图的各个层。你可以同时查看地图坐标系下的静态层、实时更新的障碍层和膨胀层。如果发现障碍物的可视化位置与它在实际世界中的位置对不上,那么几乎可以断定是坐标系转换环节(很可能是机器人当前位姿)出了问题。这比单纯看路径输出直观得多。
规划器输出的结果需要被转换成机器人底盘能理解的命令。这个过程也涉及关键的坐标系转换。
局部规划器最终输出的通常是机器人坐标系下的线速度(vx, vy)和角速度(ω)。对于差分轮式机器人,vy通常为0。这些速度命令可以直接发送给底层电机控制器。但对于全向移动机器人(如麦克纳姆轮),可能需要将这些机器人坐标系下的速度,根据当前机器人的实际朝向,转换到世界坐标系下进行分解,再计算各轮转速。我在一个全向平台项目里就踩过这个坑,直接发送机器人坐标系下的速度导致斜向移动时控制异常。
不同的规划算法对坐标系的利用方式也不同。
理解算法在哪个空间操作,是正确实现和调试的基础。例如,如果你为RRT*算法提供的障碍物信息是在机器人坐标系下的,而没有转换到全局地图坐标系,那么算法采样的“自由”路径点将毫无意义。
假设你有一个简单的圆形机器人,半径为0.3米。你收到一个位于机器人坐标系下 (x=2.0, y=1.0) 的障碍物点。机器人的当前位姿在世界坐标系下为 (x=5.0, y=3.0, θ=π/4)。
这个练习能帮助你直观感受坐标变换如何影响碰撞检测和安全距离计算。