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:轴距

实际工程中,我们通常用等效前轮转角 δ 来近似,也就是把左右前轮转角平均一下。这样就能复用自行车模型的方程了。

工程小贴士:我建议你在做车辆控制时,先按自行车模型算出一个目标转角,然后用阿克曼几何反算出左右轮各自的转角。这样既简单又准确。

阿克曼转向模型和自行车模型的关系,可以用下面这张图来理解:

运动学模型分类与关系 自行车模型 后轴中心 + 前轮转角 阿克曼转向模型 左右轮独立转角 差速驱动模型 左右轮独立速度 近似 不同结构 适用场景:低速(<5m/s)路径跟踪、自动泊车、园区物流 自行车模型方程 dx/dt = v·cos(θ) dy/dt = v·sin(θ) dθ/dt = v·tan(δ)/L 状态: [x, y, θ, δ] 差速驱动模型方程 dx/dt = (vL+vR)/2 · cos(θ) dy/dt = (vL+vR)/2 · sin(θ) dθ/dt = (vR-vL)/W 状态: [x, y, θ]

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。

好了,这一章的内容就是这些。三种模型,一个离散化方法,搞懂了这些,后面讲路径跟踪控制器的时候,你就知道底层在算什么了。