最简洁的麦克纳姆轮控制原理
1.物理原理
1.1两种轮
对于四轮小车来说,一套麦克纳姆轮至少因含有两种不同的*,民间叫法右很多,百度上将他们称为:“麦克纳姆轮左和麦克纳姆轮右”
下面简称左轮和右轮
左轮:正转可以向左前方运动,反转向右前方的轮
右轮:正转向右前方运动,反转向左前方的轮
你可以尝试着进行受力分析,不是很复杂,但是——
只需知道麦轮这些基本的物理特性就足够控制麦轮了。
1.2一种可行的安装方式
对于四轮小车来说;一般来说的安装方式是:
图为一辆麦轮小车的俯视图,其中左前方和右后方的轮为左轮,其余两个为右轮
以下的讲解均以此安装方式为例,其他的控制方式可以以相同的方式分析。
2.控制
2.1.1前进/后退
以上述方式安装的麦轮同时正转时,前部两个轮与后方两个轮的侧方的力都可以抵消,只剩下向前方的力。小车就可以向前运动
后退反转即可,分析同理
2.1.2左右平移
原理是将小车同一侧的两个麦轮以相反的方向旋转,这样沿前后方的力就会抵消,而横向的力有恰好是同一方向。
例如向左移动就所有右轮全反转,左轮全正转。
2.1.3自旋
原理就是一侧的*向后,另一侧的*向前;这样对于同一侧的两个*来说,横向的力还是可以抵消
如左侧两个*正转,右侧两个*反转就可以使小车顺势针旋转,反之则逆时针
以上这几种运动方式需要注意的是,四个*虽然转的方向不同,但是转速需要严格相同,不然四个*所受摩擦力的功率就不再一样,运动就会不精准。
2.1.4转弯
这个对于可以做到全向移动的麦轮小车不是很有必要,不过原理不麻烦,和普通的车轮一样,就是让一侧的速度大于另一侧就行了,因为同侧的两个*速度是相同的,所以横向(向心)的力还是可以抵消,只是原来的直线力/速度变成了切线而已。
2.2代码示例
(还在更新中。。。)
void CM_Control(void)
{
//对遥控器数据进行处理
states=rcdata.rc.s1;//拨杆1是控制运动模式
switch(rcdata.rc.s2)//拨杆2控制油门/刹车
{
case 0 : ab_v++;
case 1 : ;
case 2 : ab_v--;
}
//vw1为左前轮,vw2为左后轮,vw3为右前轮,vw4为右后轮
//稳定速度//暂时用不到
// vw1 = filter1Process(&brake_filter_s1,vw1);
// vw2 = filter1Process(&brake_filter_s2,vw2);
// vw3 = filter1Process(&brake_filter_s3,vw3);
// vw4 = filter1Process(&brake_filter_s4,vw4);
//保持四个*速度一致
// ab_v=(fabs(vw1)+fabs(vw2)+fabs(vw3)+fabs(vw4))/4;
if(ab_v>500) ab_v=500;//限速
if(states==0)//前后
{
vw1 = ab_v;
vw2 = ab_v;
vw3 = ab_v;
vw4 = ab_v;
}
else
if(states==1)//左右
{
vw1 = ab_v;
vw2 = -ab_v;
vw3 = ab_v;
vw4 = -ab_v;
}
else
if(states==2)//旋转
{
vw1 = ab_v;
vw2 = ab_v;
vw3 = -ab_v;
vw4 = -ab_v;
}
output_current1 = pidProcess(&s1_speed, vw1, m3508.m1.speed);
output_current2 = pidProcess(&s2_speed, vw2, m3508.m2.speed);
output_current3 = pidProcess(&s3_speed, vw3, m3508.m3.speed);
output_current4 = pidProcess(&s4_speed, vw4, m3508.m4.speed);
//通过can来控制电机
ctrl.pack = M3508_PACK_1_4;
ctrl.setcur[0] = (int16_t)output_current1;
ctrl.setcur[1] = (int16_t)output_current2;
ctrl.setcur[2] = (int16_t)output_current3;
ctrl.setcur[3] = (int16_t)output_current4;
m3508SetCurrent(&ctrl, &CAN1Handle);
control_on++;
}