麦克纳姆安装和计算.docx
- 文档编号:12901489
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:14
- 大小:19.74KB
麦克纳姆安装和计算.docx
《麦克纳姆安装和计算.docx》由会员分享,可在线阅读,更多相关《麦克纳姆安装和计算.docx(14页珍藏版)》请在冰豆网上搜索。
麦克纳姆安装和计算
麦克纳姆轮浅谈
什么是麦克纳姆轮
在竞赛机器人和特殊工种机器人中,全向移动经常是一个必需的功能。
「全向移动」意味着可以在平面内做出任意方向平移同时自转的动作。
为了实现全向移动,一般机器人会使用「全向轮」(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)将得到一系列公式,让我们可以
通过四个轮子的速度,计算出底盘的运动状态;而逆运动学模型(inverse
kinematicmodel)得到的公式则是可以根据底盘的运动状态解算出四个
轮子的速度。
需要注意的是,底盘的运动可以用三个独立变量来描述:
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'tworkifyouconnect
totheMakeblockOrion.
//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文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 麦克 安装 计算