3. 运动学模型基础
各位同学,欢迎来到运动学模型这一章。
说实话,搞机器人路径跟踪,最绕不开的就是运动学模型。你想想看,你给机器人发一个速度指令,它到底怎么动?轮子怎么转?车头往哪拐?这些全得靠运动学方程来算。
我个人习惯把运动学模型比作「机器人的腿」。没有它,你的控制算法再漂亮,也只是纸上谈兵。今天我们就来啃下这块硬骨头——两轮差速模型和阿克曼模型。
3.1 两轮差速模型:最常用的移动底盘
两轮差速模型,说白了就是靠两个独立驱动的轮子,通过转速差来实现转向。我在项目中遇到过很多次,这种底盘结构简单、成本低,室内机器人几乎都在用。
3.1.1 模型结构
想象一下:两个轮子左右分布,中间一个万向轮或者从动轮撑着。左轮速度 vL,右轮速度 vR,轮距(两个轮子中心之间的距离)为 L。
- 当 vL = vR,机器人直行
- 当 vL > vR,机器人向右转弯
- 当 vL < vR,机器人向左转弯
- 当 vL = -vR,机器人原地旋转
核心公式:
机器人线速度:v = (vR + vL) / 2
机器人角速度:ω = (vR - vL) / L
转弯半径:R = v / ω = L * (vR + vL) / (2 * (vR - vL))
3.1.2 运动学方程推导
嗯,这里要注意。我们通常用位姿 (x, y, θ) 来表示机器人在世界坐标系中的状态。其中 θ 是朝向角。
那么,机器人的运动学方程就是:
ẋ = v * cos(θ)
ẏ = v * sin(θ)
θ̇ = ω
写成离散形式(用于代码实现):
x(k+1) = x(k) + v * cos(θ(k)) * Δt
y(k+1) = y(k) + v * sin(θ(k)) * Δt
θ(k+1) = θ(k) + ω * Δt
我的经验:实际编码时,记得把 θ 归一化到 [-π, π] 区间。我曾经因为没做归一化,积分漂移导致机器人原地转圈,排查了整整一下午。
3.2 阿克曼模型:汽车底盘的灵魂
阿克曼模型,就是汽车转向的那个经典结构。前轮转向,后轮驱动。你想想看,为什么汽车转弯时,内侧轮子和外侧轮子的转角不一样?
原因很简单:内侧轮子走的圆弧半径小,外侧轮子走的圆弧半径大。如果转角一样,轮胎就会打滑。阿克曼转向几何就是为了解决这个问题。
3.2.1 模型参数
| 参数 | 符号 | 说明 |
|---|---|---|
| 轴距 | L | 前后轴之间的距离 |
| 轮距 | W | 左右轮之间的距离 |
| 前轮转角 | δ | 前轮平均转向角 |
| 后轮速度 | v | 后轴中心的速度 |
3.2.2 运动学方程
阿克曼模型的核心运动学方程:
ẋ = v * cos(θ)
ẏ = v * sin(θ)
θ̇ = (v / L) * tan(δ)
离散形式:
x(k+1) = x(k) + v * cos(θ(k)) * Δt
y(k+1) = y(k) + v * sin(θ(k)) * Δt
θ(k+1) = θ(k) + (v / L) * tan(δ(k)) * Δt
避坑指南:我曾经在阿克曼模型上栽过跟头。δ 不能太大,否则 tan(δ) 会爆炸。实际车辆的前轮转角一般不超过 ±35°。另外,低速时阿克曼模型很准,但高速时需要考虑动力学因素。
3.3 两种模型的对比
我整理了一个对比表,方便你快速理解:
| 特性 | 两轮差速 | 阿克曼 |
|---|---|---|
| 转向方式 | 转速差 | 前轮转角 |
| 原地旋转 | 支持 | 不支持 |
| 侧向移动 | 不支持 | 不支持 |
| 控制输入 | vL, vR | v, δ |
| 典型应用 | 室内机器人、AGV | 无人车、智能汽车 |
3.4 知识体系结构图
下面这张图,是我用 SVG 画的。它把本章的核心逻辑串起来了:
3.5 代码实现要点
最后,我分享一下实际写代码时的几个要点:
- 时间步长 Δt 要固定:控制周期不稳定,积分误差会累积。我一般用 10ms 或 20ms。
- 边界检查:阿克曼模型的 δ 要限幅,两轮差速的 vL、vR 也要限幅。
- 位姿初始化:第一次启动时,记得给 (x, y, θ) 赋初值。我习惯用 (0, 0, 0)。
- 调试技巧:先让机器人走直线,再走圆弧,最后走复杂路径。一步一步来,别想一口吃成胖子。
一个小技巧:如果你用的是 ROS,可以用 odom 话题直接获取里程计数据。但自己实现一遍运动学方程,能帮你更深入理解底层原理。
好了,运动学模型就讲到这里。记住,模型是基础,后面所有的路径跟踪算法——纯追踪、Stanley、MPC——全都建立在这两个模型之上。把今天的内容吃透,后面的路就好走了。