3、运动学模型基础:自行车模型、阿克曼转向模型、差速驱动模型、运动学模型的离散化
各位同学,欢迎来到第三章。这一章我们聊聊运动学模型。
说实话,很多做轨迹跟踪的朋友,一上来就怼动力学模型,结果调参调到怀疑人生。我个人习惯是,先搞清楚运动学模型再说。为什么?因为大部分低速场景下,运动学模型已经够用了,而且它简单、直观、好调试。
你想想看,一个机器人或者一辆车,它怎么动?无非就是位置、速度、朝向这几个东西。运动学模型就是描述这些东西之间关系的数学工具。今天我把最常用的三种模型掰开揉碎了讲给你听。
3.1 自行车模型(Bicycle Model)
自行车模型,名字听着挺生活化。说白了,就是把四轮车简化成两轮车——前轮一个点,后轮一个点,中间用一根杆连着。
为什么这么简化?因为四轮车的转向特性,在低速时跟自行车差不多。前轮负责转向,后轮负责直行。这个模型在路径跟踪里用得特别多,尤其是做纯跟踪(Pure Pursuit)和斯坦利(Stanley)控制器的时候。
它的核心状态量就四个:
- x:车辆后轴中心的横坐标
- y:车辆后轴中心的纵坐标
- θ:车辆的航向角(车头朝向)
- δ:前轮转角
控制量是两个:v(后轮速度)和 δ(前轮转角)。
运动学方程长这样:
dx/dt = v * cos(θ)
dy/dt = v * sin(θ)
dθ/dt = v * tan(δ) / L
其中 L 是轴距,也就是前后轮之间的距离。
关键点:自行车模型假设车辆没有侧滑,后轮方向始终与车身方向一致。这个假设在低速(通常 < 5 m/s)和良好路面下是成立的。
我在项目中遇到过一个问题:用自行车模型做高速跟踪,结果车辆在弯道里一直往外偏。后来才发现,高速时轮胎侧偏不可忽略,运动学模型已经不够用了。所以记住,自行车模型是低速利器,高速慎用。
3.2 阿克曼转向模型(Ackermann Steering Model)
阿克曼转向,这才是真实汽车的转向方式。你想想看,汽车转弯时,四个轮子的轨迹其实是四个不同的圆弧。如果左右前轮转同样的角度,轮胎就会侧滑,磨损严重。
阿克曼转向的核心思想是:所有车轮的转向中心交于一点。
具体来说,左前轮和右前轮的转角不一样。内侧轮转角大,外侧轮转角小。这样每个轮子都能沿着自己的圆弧纯滚动,没有侧滑。
阿克曼转向的几何关系:
cot(δ_left) - cot(δ_right) = W / L
其中:
- δ_left:左前轮转角
- δ_right:右前轮转角
- W:轮距(左右轮之间的距离)
- L:轴距
实际工程中,我们通常用等效前轮转角 δ 来近似,也就是把左右前轮转角平均一下。这样就能复用自行车模型的方程了。
工程小贴士:我建议你在做车辆控制时,先按自行车模型算出一个目标转角,然后用阿克曼几何反算出左右轮各自的转角。这样既简单又准确。
阿克曼转向模型和自行车模型的关系,可以用下面这张图来理解:
3.3 差速驱动模型(Differential Drive Model)
差速驱动,这是轮式机器人最常见的底盘形式。比如你看到的扫地机器人、AGV小车,基本都是差速驱动。
它的原理很简单:左右两个轮子各自独立驱动。如果两个轮子速度一样,车就走直线。如果左轮快右轮慢,车就往右转。反过来就往左转。如果两个轮子速度相反,车就能原地掉头。
差速驱动的运动学方程:
dx/dt = (vL + vR) / 2 * cos(θ)
dy/dt = (vL + vR) / 2 * sin(θ)
dθ/dt = (vR - vL) / W
其中:
- vL:左轮速度
- vR:右轮速度
- W:轮距(左右轮之间的距离)
- θ:机器人朝向角
注意:差速驱动模型有一个奇点问题——当 vL = -vR 时,机器人原地旋转,线速度为零。这时候角速度是 2vR/W。有些控制算法在这个点附近会出问题,需要特殊处理。
我曾经在一个仓储机器人项目里踩过这个坑。机器人需要原地掉头,结果控制器一直在震荡,因为算法在奇点附近数值不稳定。后来我加了一个死区判断,当线速度小于阈值时,直接切换到纯旋转模式,问题就解决了。
3.4 三种模型的对比
这三种模型各有各的脾气。我整理了一个表格,方便你对比:
| 特性 | 自行车模型 | 阿克曼转向 | 差速驱动 |
|---|---|---|---|
| 适用对象 | 四轮汽车(简化) | 真实汽车 | 轮式机器人 |
| 控制量 | 速度 v + 前轮转角 δ | 速度 v + 左右轮转角 | 左轮速度 vL + 右轮速度 vR |
| 状态量 | [x, y, θ, δ] | [x, y, θ, δ_left, δ_right] | [x, y, θ] |
| 能否原地掉头 | 否 | 否 | 能 |
| 低速精度 | 高 | 高 | 高 |
| 模型复杂度 | 低 | 中 | 低 |
3.5 运动学模型的离散化
好了,模型有了,但计算机是离散的,它不认识微分方程。我们需要把连续模型变成离散形式,才能在代码里用。
离散化最常用的方法就是欧拉法。说白了,就是用一小段时间内的变化量来近似微分。
一阶欧拉法的公式很简单:
x(k+1) = x(k) + dx/dt * Δt
y(k+1) = y(k) + dy/dt * Δt
θ(k+1) = θ(k) + dθ/dt * Δt
拿自行车模型举例,离散化之后就是:
x(k+1) = x(k) + v * cos(θ(k)) * Δt
y(k+1) = y(k) + v * sin(θ(k)) * Δt
θ(k+1) = θ(k) + v * tan(δ(k)) / L * Δt
其中 Δt 是采样时间,一般取 10ms~100ms,看你控制器的频率。
经验之谈:Δt 不是越小越好。太小了计算量大,太大了模型误差大。我一般取 20ms~50ms,也就是 20Hz~50Hz 的控制频率。对于大多数轨迹跟踪场景,这个范围够用了。
除了欧拉法,还有龙格-库塔法(RK4),精度更高,但计算量也大。我个人的习惯是:
- 做仿真或者离线规划时,用 RK4,精度高一点
- 做实时控制时,用欧拉法,速度快,够用就行
差速驱动模型的离散化也是一样的套路:
x(k+1) = x(k) + (vL+vR)/2 * cos(θ(k)) * Δt
y(k+1) = y(k) + (vL+vR)/2 * sin(θ(k)) * Δt
θ(k+1) = θ(k) + (vR-vL)/W * Δt
嗯,这里要注意一点:离散化的时候,θ(k) 用的是当前时刻的航向角,而不是更新后的。这叫显式欧拉法。如果你用隐式欧拉法,θ 要用 θ(k+1),那就需要解方程了,实时性不好。
核心要点:离散化就是把连续世界的微分方程,变成计算机能跑的差分方程。欧拉法是最简单、最实用的方法。记住三个字——乘 Δt。
好了,这一章的内容就是这些。三种模型,一个离散化方法,搞懂了这些,后面讲路径跟踪控制器的时候,你就知道底层在算什么了。