2、坐标系与运动学基础:全局坐标系、局部坐标系、机器人运动学模型(差速轮、阿克曼)、位姿表示

做机器人运动规划,说白了就是回答三个问题:我在哪?我要去哪?怎么去? 第一个问题就绕不开坐标系。坐标系搞不清楚,后面所有的路径规划、避障算法都是空中楼阁。我刚开始做项目时,就因为坐标系搞反了,让机器人在实验室里原地转了三分钟,差点撞到示波器。嗯,从那以后我再也不敢轻视这个基础了。

2.1 全局坐标系与局部坐标系

全局坐标系,也叫世界坐标系。你可以把它想象成一张地图的绝对参考系。比如在工厂里,我把坐标系原点设在车间大门的正中央,X轴指向东,Y轴指向北。那么不管机器人跑到哪个角落,它的位置都能用唯一的 (x, y, θ) 来描述。这个坐标系是固定不动的,所有静态障碍物的位置也都在这个坐标系下定义。

局部坐标系就不一样了。它绑在机器人身上,随着机器人移动而移动。我个人习惯把局部坐标系的原点设在机器人中心,X轴指向机器人正前方,Y轴指向左侧。为什么要搞两套坐标系?你想想看,激光雷达扫描到的障碍物,数据天生就是在局部坐标系下的。但你要规划全局路径,又得把这些数据转换到全局坐标系下。这两者之间的转换,就是运动规划的核心基本功。

核心公式: 从局部坐标 (xL, yL) 转换到全局坐标 (xW, yW),需要知道机器人当前的位姿 (xR, yR, θ):

xW = xR + xL * cos(θ) - yL * sin(θ)
yW = yR + xL * sin(θ) + yL * cos(θ)

我在项目中遇到过一个问题:传感器数据更新频率和里程计更新频率不一致,导致坐标转换时出现跳变。后来我加了一个时间戳对齐的缓冲队列,才把这个问题解决掉。

2.2 位姿表示

位姿,就是位置加姿态。位置好理解,就是 (x, y) 坐标。姿态呢?对于平面移动机器人,姿态就是一个角度 θ,表示机器人朝向与全局X轴的夹角。通常我们规定逆时针为正方向。

位姿的表示方式,我见过三种:

  • 向量形式: [x, y, θ]T,最直观,最常用。
  • 齐次变换矩阵: 4x4 的矩阵,把旋转和平移统一起来。做坐标变换时特别方便。
  • 四元数: 虽然平面机器人用不上,但如果你做无人机或者机械臂,四元数能避免万向锁问题。

我的习惯: 在代码里,我统一用齐次变换矩阵来维护位姿。虽然计算量稍微大一点,但不容易出错。尤其是做多传感器融合时,矩阵乘法比角度加减法靠谱多了。

2.3 差速轮运动学模型

差速轮机器人,就是两个驱动轮加一个万向轮。通过控制左右轮的速度差来实现转向。这是最基础、最常用的底盘结构。

运动学模型其实很简单:

v = (vR + vL) / 2
ω = (vR - vL) / d

其中 vR 和 vL 是左右轮线速度,d 是轮距。v 是机器人中心线速度,ω 是角速度。

有了 v 和 ω,我们就可以更新位姿:

x' = x + v * cos(θ) * Δt
y' = y + v * sin(θ) * Δt
θ' = θ + ω * Δt

避坑指南: 我曾经在差速轮模型上犯过一个低级错误——直接用轮子转速乘以轮胎半径得到线速度,结果发现实际速度和理论值差了10%。后来排查发现,轮胎有磨损,半径已经不是出厂值了。所以,一定要做轮径校准。我的做法是让机器人走一段直线,用高精度测量设备对比实际位移和理论位移,反推出真实轮径。

2.4 阿克曼运动学模型

阿克曼模型就是汽车模型。前轮转向,后轮驱动。它的运动学比差速轮复杂一些,因为存在一个瞬时转动中心(ICC)的概念。

核心公式:

R = L / tan(δ)
ω = v / R
θ' = θ + ω * Δt

其中 L 是轴距,δ 是前轮转向角,R 是转弯半径。

阿克曼模型有一个重要约束:不能原地转向。它的最小转弯半径由最大转向角决定。我在做停车场自动泊车项目时,就因为这个约束,不得不重新设计路径规划算法——差速轮能走的U型弯,阿克曼车就是走不了。

关键区别:

特性 差速轮 阿克曼
转向方式 差速转向 前轮转向
原地转向 可以 不可以
运动学约束 较少 非完整约束
轨迹平滑度 一般 较好(曲率连续)

2.5 本章知识体系

下面这张图,是我自己梳理的坐标系与运动学知识框架。你看一眼,就能明白各个概念之间的关系。

坐标系与运动学基础 - 知识体系 全局坐标系 局部坐标系 坐标变换(旋转+平移) 位姿表示 [x, y, θ] 差速轮模型 阿克曼模型 v = (vR + vL)/2 ω = (vR - vL)/d R = L / tan(δ) ω = v / R 核心:所有运动规划都建立在正确的坐标系转换和运动学模型之上

嗯,这张图把本章的核心逻辑串起来了。从坐标系出发,到位姿表示,再到两种运动学模型。你写代码的时候,脑子里也要有这张图——每一步操作,都要清楚自己是在哪个坐标系下,用的是什么模型。

实战建议: 我建议你在写运动规划代码之前,先把坐标系转换函数写好并测试通过。写一个 local_to_global() 和一个 global_to_local(),用几个已知点验证一下。这一步做好了,后面会省很多调试时间。

可可精品资料库