从入门小白成长为嵌入式高手(三)——底盘运动学解算(RoboMater篇)
目录
麦克纳姆轮姿态解算
一、麦克纳姆轮简介
麦克纳姆轮,也就是我们常说的麦轮,是一种可实现全向移动的特殊车轮,由瑞典工程师 Bengt Ilon 于 1973 年发明。
(一)、核心结构

轮毂(Hub):轮体主体,连接电机传递动力。
斜向辊子(Rollers):外围均匀分布一圈小滚子,轴线与主轮轴呈 45°(标准)。滚子可自由自转,接触地面形成近似圆轮廓 。

类型:分左旋(A)/右旋(B)两种镜像轮,四轮底盘必须成对(如前左、后右为A,其余为B,也就是对角轮毂为相同旋向)。
(二)、工作原理(力的分解)
1. 轮子转动 → 滚子与地面摩擦产生斜向推力(45°)。合力方向与滚子垂直。
2. 推力分解为:
纵向分力(沿轮轴):驱动前后。
横向分力(垂直轮轴):产生侧向力。
通过分力矢量合成,实现任意平面运动。
接下来对单个轮子进行受力分析,假设电机输出轴向前转(从左侧看逆时针转),带动轮毂向前转速度为V,滚子在地面的合力为F,F与滚子侧面垂直。

接着对轮子合力进行分解:
纵向分力(F1沿轮轴)可以用来驱动小车前后运动。
横向分力(F2垂直轮轴)可以产生侧向力,用于小车左右平移。
如果我们需要小车朝一个方向运动,我们只需要将无效分力进行抵消,保留有效分力即可。

下面我们对于整车运动状态进行一个受力分析:
如果要使小车产生一个向前的速度,我们该如何做的,按照上诉所说,我们需要保留向前的分力,将侧面分力进行一个抵消即可,轮子只有两个方向的运动状态,顺时针和逆时针(后面的受力分析为了方便我们将输出的力大小设为相等),假设我们将B轮运动方向设为顺时针(依旧从左侧看),将和
产生的合力矢量和加起来(F),显然,F的合力方向并不为向前方向,而是向左的方向,大小为
.

接下来我们对B轮逆时针方向进行受力分析:
显然,和
产生的合力矢量和加起来(F),会将A,B轮产生的横向力抵消,只保留了纵向力,合力方向沿轮轴向前,大小为
.

同理,我们对四个轮子进行受力分析,可得出,当四个轮子都逆时针转时(从左侧看),小车整体会向前运动,但是由于实际电机的安装方向,左侧轮子电机的输出轴朝左,右侧轮子的电机输出轴朝右,所以左侧轮子的输出轴转向和右侧轮子的输出轴转向是相反的(就是左侧电机是逆时针转,右侧电机是顺时针转)

(三)、运动方式(四轮底盘)
直行:四轮同速同向 → 横向分力抵消。
横移(蟹行):对角轮同速、邻轮反向 → 合成纯侧向力。
原地旋转:左侧两轮与右侧两轮反向 → 绕中心自转。
斜向/任意方向:各轮差速组合。
为了方便大家理解,这里附了张图,第一个图是小车向前运动,第二个图是小车向右运动,
第三个图是小车斜向运动,第四、五、六个图是小车顺时针旋转。

二、运动学解算
运动学解算我们可以分为静态解算和动态解算,这里先进行静态的解算
接下来我们用代码进行描述:需要注意的是左轮电机和右轮电机的安装方式是相反的,输出轴方向也是相反的,需要对电机的运动做反向处理(即 “ - ”表示负方向 )。对每个轮子进行速度分解,分为纵向速度和横向速度,如此,我们便可得到每个轮子所需要的速度了。所有速度的矢量和就是底盘运动的实际速度了。
/***
y
/ \
|
|
-------->x
'\' '/' 表示滚子朝向, "vx" "vy" 表示实际想要底盘的运动方向
lf rf
\ /
\ --------- /
\ | /
|
|
/ | \
/ --------- \
/ \
lb rb
***/
vt_lf = vx + vy ; //左前轮电机
vt_rf = vx - vy ; //右前轮电机
vt_lb = -vx + vy ; //左后轮电机
vt_rb = -vx - vy ; //右后轮电机
三、坐标系变换
为什么要进行坐标系变换?
在带云台的底盘中 :
云台有自己的坐标系:以云台朝向为前(Y 轴),右侧为 X 轴。
底盘有自己的坐标系:以底盘自身朝向为前(Y 轴),右侧为 X 轴。
如果给以底盘的坐标系作为小车整体移动的参考系,小车只能按照底盘参考系方向进行移动,当你第一视角,也就是云台旋转后(云台坐标系与底盘坐标系不再重合情况下),底盘的移动方向将难以操控。比如你想往前,但是车实际上往左走;当你云台再转,你想往前,车又往后走。小车控制将会变得非常反人类,这也是我们要使用云台坐标系作为整车运动参考系的原因。
不过,若是简单使用云台坐标系而不进行坐标变换,则会出现一下问题:
当云台旋转时,云台坐标系与底盘坐标系不再重合。如果直接用云台给出的 vx、vy 控制底盘,由于参考坐标系的不同,小车运动方向会跟着云台移动而乱飘,是我们难以控制小车移动。
因此必须通过坐标系旋转变换,把:云台坐标系下的速度指令 → 转换到底盘坐标系下之后再送入麦轮解算公式,才能实现:“云台指哪,底盘就向哪走”(跟随云台方向移动)。
如何变换?
在变换之前我们需要对矩阵有一个认识和概念:矩阵就是排成矩形的一堆数,有行和列。比如一个 2×3 矩阵A= ,这就是一个二维矩阵,有行和列 两个维度。
接下来我们简单介绍一下矩阵的乘法:两个矩阵进行相乘需要满足条件:
第一个矩阵的列数 = 第二个矩阵的行数。
第一个矩阵的行向量乘上第二个矩阵的列向量
举个例子:
在坐标变换过程中我们需要用到一个二维的旋转矩阵,将底盘坐标参考系变换到云台坐标参考系,便于速度向量计算。
设点的极坐标模长为ρ,与x轴的夹角为θ,坐标系旋转后的夹角为α。初始坐标为(a,b)=(ρcosθ,ρsinθ)(也就是底盘坐标。),使用的参考系是上y右x。变换后的坐标为(a',b'),使用的参考系为上y'右x'。(也就是云台坐标)。
我们怎么通过通过ρ和θ来表示变换后的极坐标呢?
其实简单的使用正弦和余弦知识便可以求解。
ρ为极坐标模长,在变换过程中长度不变,故有ρ'=ρ
θ'=θ+α
如此便可得出
变换后的极坐标
a'=ρcos(α+θ)=ρcosα*cosθ-ρsinα*sinθ
b'=ρsin(α+θ)=ρsinα*cosθ+ρcosα*sinθ
再转化一下,用a,b,α来表示
a'=cosα*a-sinα*b
b'=sinα*a+cosα*b
我们于是便可以得到旋转矩阵:
即
我们只需要知道α角便可以求得变换后的坐标,这个可以通过读取yaw轴电机反馈的数据进行处理,经过量化的出云台偏离底盘的角度我们便可以将云台坐标参考系映射到底盘坐标参考系了,进而能稳定控制整车的底盘运动。
代码流程
#include "math.h"
#define M_PI 3.14159265358979323846 //圆周率
sin_theta = sin(feedback_angle * M_PI/180); //feedback_angle为yaw电机反馈角度
cos_theta = cos(feedback_angle * M_PI/180);
vx = input.vx * cos_theta - input.vy * sin_theta; //input.vx和input.vx为输入的x,y轴速度
vy = input.vx * sin_theta + input.vy * cos_theta;
vt_lf = vx + vy ;
vt_rf = vx - vy ;
vt_lb = -vx + vy ;
vt_rb = -vx - vy ;
这里提个小点:
为什么用弧度?
在使用数学库里的旋转矩阵公式里的cosα、 sinα ,默认 α 都是弧度。
如果你直接代 30°、45°、90° 进去算,就是错的。需要将角度转化为弧度制:
角度转弧度:弧度 = 角度 × π / 180
弧度转角度:角度 = 弧度 × 180 / π
四、底盘旋转移动过程如何确定方向
待更新...
全向轮姿态解算
一、全向轮简介
二、全向轮运动学解算
三、坐标系变换
更多推荐
所有评论(0)