速度解算原理:底盘速度分解、轮子速度合成、逆运动学与正运动学

各位同学,今天我们来聊聊全向轮底盘最核心的部分——速度解算。说实话,我刚入行那会儿,觉得这东西不就是几个轮子转嘛,有什么难的?直到第一次调试四轮全向底盘,车子跑起来像个醉汉,我才意识到:速度解算没搞明白,底盘就是个笑话。

咱们先看一个场景:你给底盘发了个指令「以0.5m/s的速度向前走」。底盘收到指令后,四个轮子该怎么转?转多快?这就是速度解算要回答的问题。说白了,就是把你想要的车体运动,翻译成每个轮子该干的事

核心思想:全向轮底盘的速度解算,本质上是「车体速度 ↔ 轮子速度」的双向映射。正向叫正运动学,反向叫逆运动学。

1. 底盘速度分解:从车体到轮子

我习惯把底盘看作一个刚体。它在平面上运动,有三个自由度:

  • vx:沿车体X轴的速度(前进/后退)
  • vy:沿车体Y轴的速度(左移/右移)
  • ω:绕车体中心的角速度(旋转)

你想想看,这三个量一组合,底盘就能走出任意轨迹。但问题是——轮子不会直接理解vx、vy、ω,它只认识「转多快」。所以我们需要把车体速度,分解到每个轮子的安装位置上。

这里有个关键点:每个轮子的速度,由两部分叠加而成——平移分量和旋转分量。平移分量是车体平动时,轮子跟着走的速度;旋转分量是车体自转时,轮子绕中心转动的线速度。

我的经验:做速度分解时,一定要先明确坐标系。我习惯用「车体坐标系」——车头方向为X正,左侧为Y正,逆时针旋转为ω正。坐标系搞反了,底盘会往反方向跑,我吃过这个亏。

2. 轮子速度合成:从轮子回到车体

逆过程呢?如果我知道四个轮子各自转多快,能不能反推出车体在怎么运动?当然可以。这就是轮子速度合成,也叫正运动学。

我记得有一次调试里程计,发现底盘明明在走直线,里程计却显示在画圈。查了半天,原来是轮子速度合成时,有个轮子的安装角度写错了。嗯,细节决定成败。

正运动学的本质是:每个轮子的速度,都是车体速度在该轮子方向上的投影。把四个轮子的投影信息综合起来,就能解算出车体的实际速度。

3. 逆运动学与正运动学:一对孪生兄弟

这两个概念,说白了就是:

  • 逆运动学:已知车体速度 → 求各轮速度(控制用)
  • 正运动学:已知各轮速度 → 求车体速度(里程计用)

它们互为逆运算。数学上,逆运动学是一个3×4的矩阵乘法,正运动学是它的伪逆。为什么是伪逆?因为四个轮子有三个自由度,信息是冗余的——这其实是好事,冗余意味着容错。

注意:正运动学不是简单的「逆运动学矩阵求逆」。因为逆运动学矩阵不是方阵,没有标准逆矩阵。必须用伪逆(Moore-Penrose伪逆)来求解。我见过有人直接求逆,结果矩阵维度都配不上,编译都过不了。

4. 速度解算的数学公式推导

好,咱们来点硬核的。以四轮全向底盘为例,轮子安装角度为45°(麦轮常见布局)。

逆运动学公式:

对于第i个轮子:
ω_i = (1/R) * [ -sin(θ_i) * v_x + cos(θ_i) * v_y + L_i * ω ]

其中:
- ω_i:第i个轮子的角速度
- R:轮子半径
- θ_i:第i个轮子的安装角度(相对于车体X轴)
- L_i:第i个轮子到车体中心的距离
- v_x, v_y, ω:车体速度指令

写成矩阵形式更直观:

[ω₁]   [ -sinθ₁  cosθ₁  L₁ ] [v_x]
[ω₂] = [ -sinθ₂  cosθ₂  L₂ ] [v_y]
[ω₃]   [ -sinθ₃  cosθ₃  L₃ ] [ ω ]
[ω₄]   [ -sinθ₄  cosθ₄  L₄ ]

对于标准四轮麦轮底盘(轮子安装角度分别为45°、135°、225°、315°),公式可以简化为:

ω₁ = (1/R) * ( -v_x + v_y + L*ω )
ω₂ = (1/R) * ( -v_x - v_y + L*ω )
ω₃ = (1/R) * (  v_x - v_y + L*ω )
ω₄ = (1/R) * (  v_x + v_y + L*ω )

你看,每个轮子的速度,就是v_x、v_y、ω的线性组合。系数正负号取决于轮子安装位置。

正运动学公式:

[v_x]   [ -sinθ₁  -sinθ₂  -sinθ₃  -sinθ₄ ] [ω₁]
[v_y] = [  cosθ₁   cosθ₂   cosθ₃   cosθ₄ ] [ω₂]
[ ω ]   [   1/L₁    1/L₂    1/L₃    1/L₄ ] [ω₃]
                                               [ω₄]

实际应用中,我们通常用最小二乘法求解这个超定方程组。ROS里的base_controller就是这么干的。

避坑指南:我曾经在正运动学里忘了除以轮子半径R,结果里程计算出来的速度比实际大了三倍。检查了半天才发现,轮子直径是0.1m,半径0.05m,我直接用了直径。嗯,这种低级错误,犯过一次就记住了。

5. 知识体系总览

为了让你更直观地理解整个速度解算的脉络,我画了张图:

全向轮底盘速度解算知识体系 车体速度指令 (vₓ, vᵧ, ω) 逆运动学(控制) 速度分解:车体 → 各轮子 各轮子角速度 (ω₁, ω₂, ω₃, ω₄) 正运动学(里程计) 速度合成:各轮子 → 车体 控制流程 反馈流程 闭环控制

这张图把整个速度解算的流程串起来了。你看,从车体速度指令出发,经过逆运动学分解成各轮子速度,驱动电机转动;反过来,从轮子编码器读到的速度,经过正运动学合成,就能得到车体的实际速度——这就是里程计的原理。

我个人习惯把逆运动学叫做「前向通道」,正运动学叫做「反馈通道」。两者配合,才能实现闭环控制。你想想看,如果只有逆运动学没有正运动学,底盘就是开环的,跑偏了你都不知道。

好了,速度解算的原理就讲到这里。记住一句话:逆运动学让你能控制底盘,正运动学让你知道底盘在干嘛。两者缺一不可。


公众号:蓝海资料掘金营,微信deep3321