2. 运动学模型基础:两轮差速模型、阿克曼模型、单车模型
做轨迹跟踪,第一个绕不开的坎就是运动学模型。
说白了,你得先知道你的机器人或者车辆,到底是怎么动起来的。模型选错了,后面控制算法再花哨也白搭。我见过不少新手,上来就套用复杂的动力学模型,结果参数调得焦头烂额,其实一个简单的运动学模型就能解决问题。
这一章,我们就来聊聊三种最常用的运动学模型:两轮差速、阿克曼和单车模型。我会把它们的推导过程、适用范围,以及我实际项目中踩过的坑,都掰开揉碎了讲清楚。
核心观点:运动学模型是轨迹跟踪的“底层语言”。选对模型,等于成功了一半。低速场景下,运动学模型往往比复杂的动力学模型更实用、更鲁棒。
2.1 两轮差速模型
这是最基础,也是我最早接触的模型。你想想看,一个扫地机器人,或者一个AGV小车,它们怎么转弯?靠的就是左右两个轮子的速度差。
模型的核心思想很简单:通过控制左右轮的线速度 \( v_L \) 和 \( v_R \),来控制车体的线速度 \( v \) 和角速度 \( \omega \)。
模型推导
假设两个轮子间距为 \( L \)(轮距),车体中心的速度和角速度可以表示为:
v = (v_R + v_L) / 2
ω = (v_R - v_L) / L
然后,我们关心的是车体在世界坐标系下的位姿 \( (x, y, \theta) \)。它的运动学方程是:
ẋ = v * cos(θ)
ẏ = v * sin(θ)
θ̇ = ω
这里有个细节,我刚开始做的时候经常搞混:\( \theta \) 是航向角,不是转向角。差速模型没有“前轮转向”的概念,它靠的是瞬时旋转中心(ICR)来转弯。
我的经验: 在实际代码中,我习惯把左右轮速度作为控制输入,然后通过上面的公式解算出 \( v \) 和 \( \omega \)。这样做的好处是,后续的轨迹跟踪控制器(比如纯追踪)可以直接用 \( v \) 和 \( \omega \) 作为输入,非常方便。
适用范围
- 低速场景(通常 < 1 m/s):轮子不打滑,模型精度高。
- 室内机器人:服务机器人、仓储AGV、扫地机。
- 全向移动:可以原地旋转(\( v=0, \omega \neq 0 \)),灵活性高。
避坑指南: 我曾经在一个项目中,直接用差速模型控制一个重载AGV。结果速度一快,转弯时轮子严重打滑,轨迹完全失控。后来我才意识到,差速模型假设轮子与地面是纯滚动,没有滑移。一旦速度上去,或者地面摩擦系数不够,模型就失效了。这时候,你需要考虑动力学模型,或者加入滑移补偿。
2.2 阿克曼模型
阿克曼模型,说白了就是汽车模型。它的特点是:前轮转向,后轮驱动。而且,为了实现纯滚动转向,两个前轮的转向角是不一样的——内侧轮转角大于外侧轮。这就是阿克曼转向几何。
不过,在轨迹跟踪里,我们通常用单车模型来近似阿克曼模型。但这里我们先讲完整的阿克曼模型,让你有个概念。
模型推导
阿克曼模型的核心是转向几何关系。假设车辆轴距为 \( L \),前轮转角为 \( \delta \)(通常取平均值),后轴中心的转弯半径 \( R \) 为:
R = L / tan(δ)
后轴中心的速度 \( v \) 与角速度 \( \omega \) 的关系是:
ω = v / R = v * tan(δ) / L
所以,运动学方程可以写成:
ẋ = v * cos(θ)
ẏ = v * sin(θ)
θ̇ = v * tan(δ) / L
你看,这里多了一个控制量 \( \delta \)(前轮转角)。这就是阿克曼模型和差速模型最大的区别。
关键点: 阿克曼模型不能原地旋转。它的最小转弯半径受限于 \( L \) 和最大转角 \( \delta_{max} \)。这一点在路径规划时一定要考虑进去。
适用范围
- 轮式车辆:汽车、无人车、部分轮式机器人。
- 中高速场景(1-10 m/s):相比差速模型,阿克曼模型在高速下更稳定。
- 非全向移动:需要一定的转弯半径,不能原地掉头。
我的建议: 如果你在做无人车项目,直接用阿克曼模型会有点复杂。因为你需要精确控制两个前轮的转角。我通常的做法是,先用单车模型做控制算法验证,等实车测试时再考虑阿克曼转向几何的补偿。
2.3 单车模型 (Bicycle Model)
单车模型,是阿克曼模型的一种简化。它把车辆的两个前轮和两个后轮,分别合并成一个虚拟的“前轮”和“后轮”。
你想想看,这样一简化,模型就变得非常简洁。而且,在低速和中高速场景下,单车模型的精度都足够用。我个人非常喜欢用这个模型,尤其是在做MPC(模型预测控制)的时候。
模型推导
单车模型的状态量通常是 \( [x, y, \theta, \delta] \),控制量是 \( [v, \dot{\delta}] \)(速度和转角变化率)。它的运动学方程是:
ẋ = v * cos(θ)
ẏ = v * sin(θ)
θ̇ = v * tan(δ) / L
δ̇ = ω_δ (转角变化率)
这里,\( L \) 是轴距,\( \delta \) 是前轮转角,\( \omega_{\delta} \) 是转向角速度。
为什么我要把 \( \delta \) 也作为状态量?因为在实际系统中,转向执行器是有惯性的,不能瞬间跳变。把 \( \delta \) 纳入状态,可以让控制量更平滑,避免出现剧烈的转向动作。
对比表格: 三种模型的核心差异
| 特性 | 两轮差速 | 阿克曼 | 单车模型 |
|---|---|---|---|
| 控制输入 | \( v_L, v_R \) | \( v, \delta \) | \( v, \dot{\delta} \) |
| 状态量 | \( x, y, \theta \) | \( x, y, \theta \) | \( x, y, \theta, \delta \) |
| 能否原地旋转 | 能 | 不能 | 不能 |
| 最小转弯半径 | 0 | \( L / \tan(\delta_{max}) \) | \( L / \tan(\delta_{max}) \) |
| 适用速度 | 低速 (< 1 m/s) | 中高速 (1-10 m/s) | 全速域 (简化后) |
| 模型复杂度 | 低 | 中 | 中低 |
适用范围
- 路径规划与跟踪:几乎所有基于几何的跟踪方法(如纯追踪、Stanley)都基于单车模型。
- 高速场景:忽略轮胎侧偏角,模型依然有效。如果需要更高精度,可以加入侧偏角补偿,变成动力学模型。
- 算法验证:做仿真验证时,单车模型是首选。它足够简单,又能反映车辆的核心运动特性。
避坑指南: 我曾经在做一个高速无人车项目时,直接用单车模型做MPC。结果在急转弯时,车辆严重偏离轨迹。排查后发现,单车模型忽略了轮胎的侧偏特性。在高速大转角下,轮胎侧偏角不可忽略。后来我在模型里加入了线性轮胎模型,才解决了问题。所以,单车模型在低速下很准,但在高速下,一定要考虑动力学修正。
2.4 如何选择模型?
嗯,到这里,三种模型都讲完了。你可能会问:那我到底该用哪个?
我的建议是,遵循一个原则:够用就好,不要过度复杂。
- 如果你的机器人是室内AGV,速度不超过1 m/s,两轮差速模型足够了。
- 如果你在做无人车项目,速度在10 m/s以下,单车模型是最佳选择。
- 如果你需要精确控制转向几何,或者在做车辆动力学仿真,再考虑完整的阿克曼模型。
记住,模型只是工具。我们的目标是让机器人跑得准、跑得稳,而不是追求模型的数学美感。我在项目中,经常先用单车模型快速迭代算法,等效果满意了,再根据实际表现决定要不要加更复杂的模型。