m基于simulink的麦克纳姆轮Back-Stepping控制系统仿真

Posted 51matlab

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了m基于simulink的麦克纳姆轮Back-Stepping控制系统仿真相关的知识,希望对你有一定的参考价值。

1.算法仿真效果

matlab2022a仿真结果如下:

 

 

 

 

 

 

 

 

2.算法涉及理论知识概要

2.1概述

       所谓万向移动是指移动机构在二维平面上从当前位置向任意方向运动的能力。运动系统具有平面内的三个自由度,可同时独立的在前后、左右及原地旋转三个方向上运动,在不改变自身位姿的情况下向任意方向进行运动的运动特性。它比非全方位机构有着明显的优势。

 

        目前,移动机构开发的种类已相当繁多,仅就平面移动而言,移动机构就有车轮式、履带式、腿足式等形式。各种移动机构可谓各有千秋,适应了各种工作环境的不同要求。但车轮式移动机构显得尤其突出,与步行式移动机构相比,它的优点很多:能高速稳定地移动、能源利用率高、机构简单、控制方便、能借鉴至今已很成熟的汽车技术和经验等等,它的缺点是移动场所限于平面。但是,目前机器人工作的场所几乎都是人工建造的平地,并且即使有台阶,只要以车轮式移动机构为基础再附加几个自由度便不难解决。因而,轮式移动机构在机器人技术中得到广泛应用,目前已成为移动机器人运动机构的最主要形式。其优点有运动效率高,承载能力强,驱动控制相对简单,运动方式机动灵活在机械结构方面具有可满足大部分环境使用要求的丰富结构形式,运动速度也较高。

 

        轮式移动机构的类型很多,对于一般的轮式移动机构,都不可能进行任意的定位和定向,而全方位移动机构或称万向移动机构则可以利用车轮所具有的定位和定向功能,实现平面上的自由运动。当前万向移动机构的主要形式有:(1)全轮转向式(2)正交轮式(3)球轮驱动式(4)麦克纳姆(Mecanum)全方位轮。由于万向轮移动机构具有一般的轮式移动机构无法取代的独特特性,因而成为机器人移动机构的发展趋势。因此对移动机器人万向轮式移动机构的研究具有重要惫义,目前国内的相关研究还处于起步阶段,本课题将对万向轮移动机构的结构和运动设计进行分析和研究。

 

2.2麦克纳姆轮

       麦克纳姆轮是瑞典麦克纳姆公司的专利,它的圆周上安装了许多小辊子,从外形上看麦克那姆轮与斜齿轮较相似,但是与斜齿轮不同的是若干个经特殊设计的鼓形辊子。这些辊子的轴线与轮毂的轴线成一角度,在运动是这些辊子可绕通过自身轴线的长轴自由转动。若干个辊子的外轮廓面包络成一个圆柱面。由于这样的特殊结构使得麦克纳姆轮具备了3个自由度,(1)绕轮子轴心转动(2)绕棍子轴心转动(3)绕轮子和地面的接触点转动。这样,驱动轮在一个方向上具有主动移动能力的同时,另外一个方向也具有自由移动的运动特性。当电机驱动车轮转动时,车轮以普通方式沿着垂直于驱动轴的方向前进同时车轮周边的棍子沿着各自轴线自由转动。

 

        对于现在广泛使用的麦克纳姆轮也仍然有待改进的方面。由于麦克纳姆轮的棍子是斜向分布,轮子受力方向与前进方向不一致,轮缘上的棍子受力不好,轴向受力很大,且由于结构上的限制,棍子直径一般很小,很难装上合适的轴承,通常只能用滚针轴承代替,所以小棍子很容易损坏,并且轮子正常运动时小棍子一般有滑动而并非滚动,容易磨损,承载力不够强,限制了Mecanum轮的进一步的发展。同时,这也使得怎样提高其运动精度和承载能力成为当前麦克纳姆轮研究的热点。移动机构是移动机器人的根本。移动机构设计的优劣直接关系到机器人执行任务的好坏。面对复杂的工作环境,在选择移动方式和设计移动机构时,不仅要保证完成任务的高效性和彻底性,还要保证机器人运动的高速稳定性和运动控制的便捷性等,同时还必须兼顾体积的紧凑性和能源利用的高效性。如何提高全方位轮的工作效率、承载能力、组合运动时的移动精度及算法等等,对促进机器人事业的发展具有重要的作用。

 

       麦克纳姆轮(Mecanum)轮由瑞士Mecamum AB公司首先提出,应用于四轮全方位移动机器人上。在麦克纳姆轮的轮毂上分布着许多小辊子,它们同样具备了3个自由度,(1)绕轮子轴心转动(2)绕辊子轴心转动(3)绕轮子和地面的接触点转动。这样,驱动轮在一个方向上具有主动移动能力的同时,另外一个方向也具有自由移动的运动特性。轮子结构如图1所示。

 

 

 

       当电机驱动车轮转动时,车轮以普通方式沿着垂直于驱动轴的方向前进同时车轮周边的棍子沿着各自轴线自 由转动。这些成角度的周边辊子,包络为一个圆柱面,把一部分机轮转向力转化到一个机轮法向力上,对各自机轮的方向和速度进行合成,其合力向量保证了这个平台在所要求的任意方向上自由的移动。

 

 

 

2.3运动分析

       对于四轮系统,为了使系统制造经济合理,所Mecanum 轮的辊子偏置角iα 取相同的数值,且将轮结构对称设计,安装时只要采用正反安装法,就可得到实际上的大小相等而方向相反的两种辊子偏置角±α 。另外,为实现各轮的载荷均匀,系统的支撑结构稳定,一般常采取四个轮子关于车体几何中心(坐标系xoy )对称布置的轮结构布局形式,因而有:

 

 

 

 

 

 

        轮中的小斜线表示与地面接触的辊子的轴线方向。每个全方位轮都由一只直流电机独立驱动,通过四个全方位轮转速转向适当组合,可以实现车体在平面上三自由度的全方位移动。      

 

2.4 Back-Stepping控制算法

        非线性反演设计法与反馈线性化密切相关。反馈线性化方法删除系统中所有的非线性项,而反演法可以利用系统有利的非线性项,也可以增加非线性阻尼来控制不利的非线性项,从而获得更好的鲁棒性。Back-Stepping控制算法主要针对非线性系统存在的参数不确定性,对控制器进行系统的设计,通过逐步修正算法,设计镇定的控制器,从而实现系统的全局调节或跟踪。在每一步,把状态坐标的变化、不确定参数的自适应调节函数和一个已知的Lyapunov函数的虚拟控制系统的镇定函数联系起来,它适用于可状态线性化或参数严反馈的不确定系统,本质上是一种右前向后递推的设计方法。将复杂的非线性系统分解成不超过系统阶数的子系统,然后为每个子系统设计部分Lyapunov函数(V函数)和中间虚拟控制,一直后退到整个系统,将它们集成起来完成整个控制率的设计。其基本方法是从一个高阶系统的内核开始(通常是系统输出量满足的动态方程),设计虚拟控制律保证内核系统的某种性能,如稳定性、无源性等;然后对得到的虚拟控制律逐步修正算法,但应保证V函数的既定性能,进而设计出真正的镇定控制器,实现系统的全局调节或跟踪,使系统达到期望的性能指标。在Back-Stepping方法中,引进的虚拟控制本质上是一种静态补偿思想,即位于前面的子系统必须通过后面的子系统的虚拟控制才能镇定,因此,设计中一般都会要求系统结构满足严参数反馈或者能够通过变换转化为满足严参数反馈的非线性系统。Back-Stepping方法在改善过渡过程品质方面表现出较大潜力,现已被广泛应用于非线性系统稳定控制器的设计中。

 

 

 

 

 

3.MATLAB核心程序

 

function [w10,w20,w30,w40]  = fcn(vyi,vxi,wi)
 
r=0.050;
l1=0.376/2;
l2=0.376/2;
 
A=20*[1 1 -(l1+l2);1 -1 (l1+l2);1 -1 -(l1+l2);1 1 (l1+l2)];
a=0.003*[vyi, vxi, wi]\'
w=A*a;
w10=w(1);
w20=w(2);
w30=w(3);
w40=w(4);
08_026_m

 

  

 

基于L298N驱动的麦克纳姆轮小车 代码与逻辑以及上位机控制

基于L298N驱动的麦克纳姆轮小车(二) 代码与逻辑以及上位机控制


实现的功能为,通过串口发送指令,进行小车的前进,后退,左平移,右平移,左转和右转。在驱动小车的时候应该与麦克纳姆轮的物理特性紧密结合。

一、代码

int LB_IN1=2;    //左上电机
int LB_IN2=4;
int LB_EN=3;

int LU_IN1=6;     //左下电机
int LU_IN2=7;
int LU_EN=5;

int RU_IN1=8;       //右下电机
int RU_IN2=9;
int RU_EN=10;

int RB_IN1=12;      //右上电机
int RB_IN2=14;
int RB_EN=11 ;
int val;
//char msg;

void Stop()
   digitalWrite(LB_IN1,LOW);
   digitalWrite(LB_IN2,LOW);
   digitalWrite(LU_IN1,LOW);
   digitalWrite(LU_IN2,LOW);
   digitalWrite(RB_IN1,LOW);
   digitalWrite(RB_IN2,LOW);
   digitalWrite(RU_IN1,LOW);
   digitalWrite(RU_IN2,LOW);//停止
  
void Up()
   digitalWrite(LB_IN1,LOW);
   digitalWrite(LB_IN2,HIGH);
   digitalWrite(LU_IN1,LOW);
   digitalWrite(LU_IN2,HIGH);
   digitalWrite(RB_IN1,LOW);
   digitalWrite(RB_IN2,HIGH);
   digitalWrite(RU_IN1,LOW);
   digitalWrite(RU_IN2,HIGH);//前进
  
void Back()
   digitalWrite(LB_IN1,HIGH);
   digitalWrite(LB_IN2,LOW);
   digitalWrite(LU_IN1,HIGH);
   digitalWrite(LU_IN2,LOW);
   digitalWrite(RB_IN1,HIGH);
   digitalWrite(RB_IN2,LOW);
   digitalWrite(RU_IN1,HIGH);
   digitalWrite(RU_IN2,LOW);//后退
  

void TurnRight()
   digitalWrite(LB_IN1,LOW);
   digitalWrite(LB_IN2,HIGH);
   digitalWrite(LU_IN1,LOW);
   digitalWrite(LU_IN2,HIGH);
   digitalWrite(RB_IN1,HIGH);
   digitalWrite(RB_IN2,LOW);
   digitalWrite(RU_IN1,HIGH);
   digitalWrite(RU_IN2,LOW);//右转
  

void TurnLeft()
   digitalWrite(LB_IN1,HIGH);
   digitalWrite(LB_IN2,LOW);
   digitalWrite(LU_IN1,HIGH);
   digitalWrite(LU_IN2,LOW);
   digitalWrite(RB_IN1,LOW);
   digitalWrite(RB_IN2,HIGH);
   digitalWrite(RU_IN1,LOW);
   digitalWrite(RU_IN2,HIGH);//左转
  

void RightLine()
   digitalWrite(LB_IN1,HIGH);      
   digitalWrite(LB_IN2,LOW);
   digitalWrite(LU_IN1,LOW);        
   digitalWrite(LU_IN2,HIGH);
   digitalWrite(RB_IN1,LOW);        
   digitalWrite(RB_IN2,HIGH);
   digitalWrite(RU_IN1,HIGH);       
   digitalWrite(RU_IN2,LOW);//右平移
  

void LeftLine()
   digitalWrite(LB_IN1,LOW);
   digitalWrite(LB_IN2,HIGH);
   digitalWrite(LU_IN1,HIGH);
   digitalWrite(LU_IN2,LOW);
   digitalWrite(RB_IN1,HIGH);
   digitalWrite(RB_IN2,LOW);
   digitalWrite(RU_IN1,LOW);
   digitalWrite(RU_IN2,HIGH);//左平移
  


void setup() 
	Serial.begin(57600);
  pinMode(LB_IN1,OUTPUT);
  pinMode(LB_IN2,OUTPUT);
  pinMode(LB_EN,OUTPUT);
  pinMode(LU_IN1,OUTPUT);
  pinMode(LU_IN2,OUTPUT);
  pinMode(LU_EN,OUTPUT);
  pinMode(RU_IN1,OUTPUT);
  pinMode(RU_IN2,OUTPUT);
  pinMode(RU_EN,OUTPUT);
  pinMode(RB_IN1,OUTPUT);
  pinMode(RB_IN2,OUTPUT);
  pinMode(RB_EN,OUTPUT);
  //最开始设置制动模式
  Stop();
  val=map(150,0,1023,0,255);//映射一下
  analogWrite(LB_EN,val);
  analogWrite(LU_EN,val);
  analogWrite(RU_EN,val);
  analogWrite(RB_EN,val);


void loop() 

 if(Serial.available()>0)
 
  switch (Serial.read())
  
    case 'U':
      Up();
      break;
    case 'B':
      Back();
      break;
    case 'R':
      TurnRight();
      break;
    case 'L':
      TurnLeft();
      break;
    case 'D':
      RightLine();
   
      break;
    case 'A':
      LeftLine();
      break;
   
 


其实麦克娜姆的运动原理很简单,一张图来点清楚麦克娜姆轮的运动原理。

通过发送不同的指令,最终实现了每个字符对应的控制小车。

二、上位机部分

之前的文章中涉及到了自定义协议,有想法的小伙伴可以通过这个项目再来深入的了解一番。这其实不过是调用终端来实现小车的操控。烧录好程序以后,打开终端。(没有python的小伙伴可以看我之前的博客《python制作上位机控制Arduino下位机(自定义协议)》)

//打开python的环境
python
>>> import serial        //导入串口的库
>>>ser = serial.Serial("COM3",57600)   //连接串口
>>>ser.write(‘U’.encode('ascii'))		//前进
>>>ser.write(‘D’.encode('ascii')) 		//右平移
>>>ser.write(‘A’.encode('ascii'))		//左平移
>>>ser.write(‘L’.encode('ascii'))		//左转
>>>ser.write(‘R’.encode('ascii'))		//右转
>>>ser.write(‘B’.encode('ascii'))		//后退
>>>ser.write(‘S’.encode('ascii'))		//停止

下阶段

当然,完整的小车成品怎么能带有线的呢?下一阶段,进阶无线设备控制,打算采用rnf24l0模块。同时,推荐一名python的博主,袁六加。本博主刷着她的博客学到了不少东西,感觉和本博主一样,不断的踩坑,试水,最终达到实现功能的目的。同时,袁博主的博客内容确实干货,对树莓派和python有兴趣的可以去刷刷看看(~ ̄▽ ̄)~ 。

以上是关于m基于simulink的麦克纳姆轮Back-Stepping控制系统仿真的主要内容,如果未能解决你的问题,请参考以下文章

基于L298N驱动的麦克纳姆轮小车 代码与逻辑以及上位机控制

基于L298N驱动的麦克纳姆轮小车 代码与逻辑以及上位机控制

基于L298N驱动的麦克纳姆轮的小车组装与驱动电机介绍

基于L298N驱动的麦克纳姆轮的小车组装与驱动电机介绍

nrf24L01的通讯控制 基于L298N驱动的麦克纳姆轮的小车

nrf24L01的通讯控制 基于L298N驱动的麦克纳姆轮的小车