麦克纳姆安装及计算Word格式.docx

上传人:b****1 文档编号:1005144 上传时间:2023-04-30 格式:DOCX 页数:27 大小:4MB
下载 相关 举报
麦克纳姆安装及计算Word格式.docx_第1页
第1页 / 共27页
麦克纳姆安装及计算Word格式.docx_第2页
第2页 / 共27页
麦克纳姆安装及计算Word格式.docx_第3页
第3页 / 共27页
麦克纳姆安装及计算Word格式.docx_第4页
第4页 / 共27页
麦克纳姆安装及计算Word格式.docx_第5页
第5页 / 共27页
麦克纳姆安装及计算Word格式.docx_第6页
第6页 / 共27页
麦克纳姆安装及计算Word格式.docx_第7页
第7页 / 共27页
麦克纳姆安装及计算Word格式.docx_第8页
第8页 / 共27页
麦克纳姆安装及计算Word格式.docx_第9页
第9页 / 共27页
麦克纳姆安装及计算Word格式.docx_第10页
第10页 / 共27页
麦克纳姆安装及计算Word格式.docx_第11页
第11页 / 共27页
麦克纳姆安装及计算Word格式.docx_第12页
第12页 / 共27页
麦克纳姆安装及计算Word格式.docx_第13页
第13页 / 共27页
麦克纳姆安装及计算Word格式.docx_第14页
第14页 / 共27页
麦克纳姆安装及计算Word格式.docx_第15页
第15页 / 共27页
麦克纳姆安装及计算Word格式.docx_第16页
第16页 / 共27页
麦克纳姆安装及计算Word格式.docx_第17页
第17页 / 共27页
麦克纳姆安装及计算Word格式.docx_第18页
第18页 / 共27页
麦克纳姆安装及计算Word格式.docx_第19页
第19页 / 共27页
麦克纳姆安装及计算Word格式.docx_第20页
第20页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

麦克纳姆安装及计算Word格式.docx

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

麦克纳姆安装及计算Word格式.docx

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

麦轮的安装方法

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

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

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

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<

Wire.h>

SoftwareSerial.h>

#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线试一下。

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;

case4:

linearSpeed-=5;

if(linearSpeed<

minLinearSpeed)

linearSpeed=minLinearSpeed;

case8:

angularSpeed-=5;

if(angularSpeed<

minAngularSpeed)

angularSpeed=minAngularSpeed;

default:

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);

switch(buf[4])

case0:

mecanumRun(0,linearSpeed,0);

mecanumRun(0,-linearSpeed,0);

case6:

mecanumRun(-linearSpeed,0,0);

mecanumRun(linearSpeed,0,0);

case7:

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

case5:

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

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

case3:

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

mecanumRun(0,0,0);

voidmecanumRun(floatxSpeed,floatySpeed,floataSpeed)

floatspeed1=ySpeed-xSpeed+aSpeed;

floatspeed2=ySpeed+xSpeed-aSpeed;

floatspeed3=ySpeed-xSpeed-aSpeed;

floatspeed4=ySpeed+xSpeed+aSpeed;

floatmax=speed1;

if(max<

speed2)max=speed2;

speed3)max=speed3;

speed4)max=speed4;

if(max>

speed1=speed1/max*maxLinearSpeed;

speed2=speed2/max*maxLinearSpeed;

speed3=speed3/max*maxLinearSpeed;

speed4=speed4/max*maxLinearSpeed;

setEachMotorSpeed(speed1,speed2,speed3,speed4);

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

当前位置:首页 > 临时分类 > 批量上传

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2