最简洁的麦克纳姆轮控制原理

最简洁的麦克纳姆轮控制原理

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++;
	
}
上一篇:MySQL数据库管理


下一篇:在 《数学问题,连接两个点的曲线旋转所成曲面中,面积最小的曲线是什么?》 里 的 讨论