麦克纳姆安装及计算.docx

上传人:b****6 文档编号:5878772 上传时间:2023-01-01 格式:DOCX 页数:25 大小:4MB
下载 相关 举报
麦克纳姆安装及计算.docx_第1页
第1页 / 共25页
麦克纳姆安装及计算.docx_第2页
第2页 / 共25页
麦克纳姆安装及计算.docx_第3页
第3页 / 共25页
麦克纳姆安装及计算.docx_第4页
第4页 / 共25页
麦克纳姆安装及计算.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

麦克纳姆安装及计算.docx

《麦克纳姆安装及计算.docx》由会员分享,可在线阅读,更多相关《麦克纳姆安装及计算.docx(25页珍藏版)》请在冰豆网上搜索。

麦克纳姆安装及计算.docx

麦克纳姆安装及计算

麦克纳姆轮浅谈

什么是麦克纳姆轮

在竞赛机器人和特殊工种机器人中,全向移动经常是一个必需的功能。

「全向移动」意味着可以在平面内做出任意方向平移同时自转的动作。

为了实现全向移动,一般机器人会使用「全向轮」(OmniWheel)或「麦克纳姆轮」(MecanumWheel)这两种特殊轮子。

全向轮:

麦克纳姆轮

全向轮与麦克纳姆轮的共同点在于他们都由两大部分组成:

轮毂和辊子(roller)。

轮毂是整个轮子的主体支架,辊子则是安装在轮毂上的鼓状物。

全向轮的轮毂轴与辊子转轴相互垂直,而麦克纳姆轮的轮毂轴与辊子转轴呈45°角。

理论上,这个夹角可以是任意值,根据不同的夹角可以制作出不同的轮子,但最常用的还是这两种。

全向轮与麦克纳姆轮(以下简称「麦轮」)在结构、力学特性、运动学特性上都有差异,其本质原因是轮毂轴与辊子转轴的角度不同。

经过分析,二者的运动学和力学特性区别可以通过以下表格来体现。

计算过程如下,供参考,学霸可点开大图验算:

近年来,麦轮的应用逐渐增多,特别是在Robocon、FRC等机器人赛事上。

这是因为麦克纳姆轮可以像传统轮子一样,安装在相互平行的轴上。

而若想使用全向轮完成类似的功能,几个轮毂轴之间的角度就必须是60°,90°或120°等角度,这样的角度生产和制造起来比较麻烦。

所以许多工业全向移动平台都是使用麦克纳姆轮而不是全向轮,比如这个国产的叉车:

 全向移动平台麦克纳姆轮叉车美科斯叉车

另外一个原因,可能是麦轮的造型比全向轮要酷炫得多,看起来有一种不明觉厉的感觉……

的确,第一次看到麦轮运转起来,不少人都会惊叹。

以下视频直观地说明了麦轮底盘在平移和旋转时的轮子旋转方向。

 

麦轮的安装方法

麦轮一般是四个一组使用,两个左旋轮,两个右旋轮。

左旋轮和右旋轮呈手性对称,区别如下图。

安装方式有多种,主要分为:

X-正方形(X-square)、X-长方形(X-rectangle)、O-正方形(O-square)、O-长方形(O-rectangle)。

其中X和O表示的是与四个轮子地面接触的辊子所形成的图形;正方形与长方形指的是四个轮子与地面接触点所围成的形状。

∙X-正方形:

轮子转动产生的力矩会经过同一个点,所以yaw轴无法主动旋转,也无法主动保持yaw轴的角度。

一般几乎不会使用这种安装方式。

∙X-长方形:

轮子转动可以产生yaw轴转动力矩,但转动力矩的力臂一般会比较短。

这种安装方式也不多见。

∙O-正方形:

四个轮子位于正方形的四个顶点,平移和旋转都没有任何问题。

受限于机器人底盘的形状、尺寸等因素,这种安装方式虽然理想,但可遇而不可求。

∙O-长方形:

轮子转动可以产生yaw轴转动力矩,而且转动力矩的力臂也比较长。

是最常见的安装方式。

麦轮底盘的正逆运动学模型

以O-长方形的安装方式为例,四个轮子的着地点形成一个矩形。

正运动学模型(forwardkinematicmodel)将得到一系列公式,让我们可以通过四个轮子的速度,计算出底盘的运动状态;而逆运动学模型(inversekinematicmodel)得到的公式则是可以根据底盘的运动状态解算出四个轮子的速度。

需要注意的是,底盘的运动可以用三个独立变量来描述:

X轴平动、Y轴平动、yaw轴自转;而四个麦轮的速度也是由四个独立的电机提供的。

所以四个麦轮的合理速度是存在某种约束关系的,逆运动学可以得到唯一解,而正运动学中不符合这个约束关系的方程将无解。

先试图构建逆运动学模型,由于麦轮底盘的数学模型比较复杂,我们在此分四步进行:

①将底盘的运动分解为三个独立变量来描述;

②根据第一步的结果,计算出每个轮子轴心位置的速度;

③根据第二步的结果,计算出每个轮子与地面接触的辊子的速度;

④根据第三部的结果,计算出轮子的真实转速。

一、底盘运动的分解

我们知道,刚体在平面内的运动可以分解为三个独立分量:

X轴平动、Y轴平动、yaw轴自转。

如下图所示,底盘的运动也可以分解为三个量:

 表示X轴运动的速度,即左右方向,定义向右为正;

 表示Y轴运动的速度,即前后方向,定义向前为正;

 表示yaw轴自转的角速度,定义逆时针为正。

以上三个量一般都视为四个轮子的几何中心(矩形的对角线交点)的速度。

二、计算出轮子轴心位置的速度

定义:

 为从几何中心指向轮子轴心的矢量;

 为轮子轴心的运动速度矢量;

 为轮子轴心沿垂直于  的方向(即切线方向)的速度分量;

那么可以计算出:

分别计算X、Y轴的分量为:

同理可以算出其他三个轮子轴心的速度。

三、计算辊子的速度

根据轮子轴心的速度,可以分解出沿辊子方向的速度  和垂直于辊子方向的速度  。

其中 是可以无视的(思考题:

为什么垂直方向的速度可以无视?

),而

其中  是沿辊子方向的单位矢量。

四、计算轮子的速度

从辊子速度到轮子转速的计算比较简单:

 

以上方程组就是O-长方形麦轮底盘的逆运动学模型,而正运动学模型可以直接根据逆运动学模型中的三个方程解出来,此处不再赘述。

另一种计算方式

「传统」的推导过程虽然严谨,但还是比较繁琐的。

这里介绍一种简单的逆运动学计算方式。

我们知道,全向移动底盘是一个纯线性系统,而刚体运动又可以线性分解为三个分量。

那么只需要计算出麦轮底盘在「沿X轴平移」、「沿Y轴平移」、「绕几何中心自转」时,四个轮子的速度,就可以通过简单的加法,计算出这三种简单运动所合成的「平动+旋转」运动时所需要的四个轮子的转速。

而这三种简单运动时,四个轮子的速度可以通过简单的测试,或是推动底盘观察现象得出。

当底盘沿着X轴平移时:

当底盘沿着Y轴平移时:

当底盘绕几何中心自转时:

将以上三个方程组相加,得到的恰好是根据「传统」方法计算出的结果。

这种计算方式不仅适用于O-长方形的麦轮底盘,也适用于任何一种全向移动的机器人底盘。

Makeblock麦轮底盘的组装

理论分析完成,可以开始尝试将其付诸实践了。

第一步,组装矩形框架。

第二步,组装电机模块。

由于麦轮底盘的四个轮子速度有约束关系,必须精确地控制每个轮子的速度,否则将会导致辊子与地面发生滑动摩擦,不仅会让底盘运动异常,还会让麦轮的寿命减少。

所以必须使用编码电机。

第三步,将电机模块安装到框架上。

第四步,将麦轮安装到框架上。

第五步,安装电路板并接线。

编码电机必须配上相应的驱动板才能正常工作。

这里使用的Makeblock编码电机驱动板,每一块板可以驱动两个电机。

接线顺序在下文中会提及,也可以随意接上,在代码中定义好对应的顺序即可。

第六步,装上电池。

至此,一个能独立运行的麦轮底盘就完成了。

控制程序

根据麦轮的底盘的运动学模型,要完全控制它的运动,需要有三个控制量:

X轴速度、Y轴速度、自转角速度。

要产生这三个控制量,有很多种方法,本文将使用一个USB游戏手柄,左边的摇杆产生平移速度,右边的摇杆产生角速度。

首先将一个 USBHost模块连接到 Orion主板的3口。

然后插上一个无线USB游戏手柄。

然后再添加其他细节,就大功告成啦!

其他细节:

#include

#include

#include"MeOrion.h"

MeUSBHostjoypad(PORT_3);

//手柄代码(红灯亮模式)

//默认:

128-127-128-127-15-0-0-128

//左一:

128-127-128-127-15-1-0-128

//右一:

128-127-128-127-15-2-0-128

//左二:

128-127-128-127-15-4-0-128

//右二:

128-127-128-127-15-8-0-128

//三角:

128-127-128-127-31-0-0-128(00011111)

//方形:

128-127-128-127-143-0-0-128(10001111)

//叉号:

128-127-128-127-79-0-0-128(01001111)

//圆圈:

128-127-128-127-47-0-0-128(00101111)

//向上:

128-127-128-127-0-0-0-128(00000000)

//向下:

128-127-128-127-4-0-0-128(00000100)

//向左:

128-127-128-127-6-0-0-128(00000110)

//向右:

128-127-128-127-2-0-0-128(00000010)

//左上:

128-127-128-127-7-0-0-128(00000111)

//左下:

128-127-128-127-5-0-0-128(00000101)

//右上:

128-127-128-127-1-0-0-128(00000001)

//右下:

128-127-128-127-3-0-0-128(00000011)

//选择:

128-127-128-127-15-16-0-128

//开始:

128-127-128-127-15-32-0-128

//摇杆:

右X-右Y-左X-左Y-15-0-0-128

 

MeEncoderMotormotor1(0x02,SLOT2);

MeEncoderMotormotor2(0x02,SLOT1);

MeEncoderMotormotor3(0x0A,SLOT2);

MeEncoderMotormotor4(0x0A,SLOT1);

//底盘:

a=130mm,b=120mm

floatlinearSpeed=100;

floatangularSpeed=100;

floatmaxLinearSpeed=200;

floatmaxAngularSpeed=200;

floatminLinearSpeed=30;

floatminAngularSpeed=30;

voidsetup()

{

//要上电才能工作,不能只是插上USB线来调试。

motor1.begin();

motor2.begin();

motor3.begin();

motor4.begin();

Serial.begin(57600);

joypad.init(USB1_0);

}

voidloop()

{

Serial.println("loop:

");

//setEachMotorSpeed(100,50,50,100);

if(!

joypad.device_online)

{

//若一直输出离线状态,重新拔插USBHost的RJ25线试一下。

Serial.println("Deviceoffline.");

joypad.probeDevice();

delay(1000);

}

else

{

intlen=joypad.host_recv();

parseJoystick(joypad.RECV_BUFFER);

delay(5);

}

//delay(500);

}

 

voidsetEachMotorSpeed(floatspeed1,floatspeed2,floatspeed3,floatspeed4)

{

motor1.runSpeed(speed1);

motor2.runSpeed(-speed2);

motor3.runSpeed(-speed3);

motor4.runSpeed(-speed4);

}

voidparseJoystick(unsignedchar*buf)//Analyticfunction,print8bytesfromUSBHost

{

//输出手柄的数据,调试用

//inti=0;

//for(i=0;i<7;i++)

//{

//Serial.print(buf[i]);//Itwon'tworkifyouconnecttotheMakeblockOrion.

//Serial.print('-');

//}

//Serial.println(buf[7]);

//delay(10);

//速度增减

switch(buf[5])

{

case1:

linearSpeed+=5;

if(linearSpeed>maxLinearSpeed)

{

linearSpeed=maxLinearSpeed;

}

break;

case2:

angularSpeed+=5;

if(angularSpeed>maxAngularSpeed)

{

angularSpeed=maxAngularSpeed;

}

break;

case4:

linearSpeed-=5;

if(linearSpeed

{

linearSpeed=minLinearSpeed;

}

break;

case8:

angularSpeed-=5;

if(angularSpeed

{

angularSpeed=minAngularSpeed;

}

break;

default:

break;

}

 

if((128!

=buf[0])||(127!

=buf[1])||(128!

=buf[2])||(127!

=buf[3]))

{

//处理摇杆

floatx=((float)(buf[2])-127)/128;

floaty=(127-(float)(buf[3]))/128;

floata=(127-(float)(buf[0]))/128;

mecanumRun(x*linearSpeed,y*linearSpeed,a*angularSpeed);

}

else

{

switch(buf[4])

{

case0:

mecanumRun(0,linearSpeed,0);

break;

case4:

mecanumRun(0,-linearSpeed,0);

break;

case6:

mecanumRun(-linearSpeed,0,0);

break;

case2:

mecanumRun(linearSpeed,0,0);

break;

case7:

mecanumRun(-linearSpeed/2,linearSpeed/2,0);

break;

case5:

mecanumRun(-linearSpeed/2,-linearSpeed/2,0);

break;

case1:

mecanumRun(linearSpeed/2,linearSpeed/2,0);

break;

case3:

mecanumRun(linearSpeed/2,-linearSpeed/2,0);

break;

default:

mecanumRun(0,0,0);

break;

}

}

}

voidmecanumRun(floatxSpeed,floatySpeed,floataSpeed)

{

floatspeed1=ySpeed-xSpeed+aSpeed;

floatspeed2=ySpeed+xSpeed-aSpeed;

floatspeed3=ySpeed-xSpeed-aSpeed;

floatspeed4=ySpeed+xSpeed+aSpeed;

floatmax=speed1;

if(max

if(max

if(max

if(max>maxLinearSpeed)

{

speed1=speed1/max*maxLinearSpeed;

speed2=speed2/max*maxLinearSpeed;

speed3=speed3/max*maxLinearSpeed;

speed4=speed4/max*maxLinearSpeed;

}

setEachMotorSpeed(speed1,speed2,speed3,speed4);

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 动态背景

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1