基于XR806实现竞技机器人先进模糊控制器

描述

机器人的模糊控制是一种基于模糊逻辑理论的计算机控制方法,它通过模拟人类思维和决策过程来实现对机器人行为的控制。

本文中所介绍使用的竞技机器人先进模糊控制器是在FreeRTOS环境下基于XR806为项目主控,给机器人部署先进模糊控制器,它通过将机器人的输入信号转化为模糊变量,并根据模糊规则对这些变量进行处理,实现对于竞技机器人的结构控制和定位控制等功能。

 项目介绍

开发环境使用window10+VMware+ubuntu 18.04,并基于XR806——FreeRTOS为项目主控,部署先进模糊控制器,实现对于竞技机器人的结构控制和定位控制等。

竞技机器人的无线控制器选择上使用可以实现多维状态机功能的XR806作为主控,并通过USART进行CAN转换来向电机发送信息,收到信息后电机驱动对机器人做出控制,此时机器人通过模糊控制器来反馈定位器、雷达等传感器传来的数据实现信息交互。

FreeRTOS


 

控制部署

在封装好电机驱动电流环时,实现对电机的控制,相当于建立了一种继电特性的非线性控制,此时使用继电整定法的Z-N临界比例度法去建立模糊域。


根据以下临界系数表,整定求出模糊域。

FreeRTOS


 

模糊推理及清晰化

模糊推理的核心就是计算出E和EC的隶属度。同时把E和EC分为多种子集情况:负最大NB,负中NM,负小NS,零ZO,正小PS,正中PM,正大PB等七种情况。然后计算E/EC种子集的隶属度。

进行模糊推理后,可以根据计算的隶属度,建立模糊规则表,实现对输出值的清晰化。对应到应用层的输出函数,实现控制输出。

FreeRTOS

FOC控制及仿真效果

FreeRTOS

FOC控制逻辑

FreeRTOSFreeRTOS

仿真效果

代码实现

自动整定部分核心代码:

 

void PID_AutoTune_Task(void)
{
        
    if(pid.AutoRegurating_Status != START) return;


    /*定义临界Tc*/
    float Tc = 0.0;
    
    static int start_cnt;  //记录最大值出现的时间
    static int end_cnt;    //记录周期结束时的时间值 


        
    static uint16_t cool_cnt = 0; 
    static uint16_t heat_cnt = 0;
        
//    pid.Autotune_Cnt ++; //计数
    
    
    if((pid.Pv_position == UP) && (pid.Pv < pid.Sv)) 
    {
        cool_cnt ++;
        if(cool_cnt >= 3) //连续三次都越过,则说明真的越过了
        {
            pid.Pv_position = DOWN; //标记当前在下方了
            pid.Zero_Across_Cnt ++;    //标记穿越一次
            cool_cnt = 0;
        }
    }
    else if((pid.Pv_position == DOWN)&&(pid.Pv > pid.Sv))//刚才在下方,现在在上方
    {
        heat_cnt++;
        if(heat_cnt >= 3) //连续三次都越过,则说明真的越过了
        {
            pid.Pv_position = UP;   //标记当前在下方了
            pid.Zero_Across_Cnt ++;    //标记穿越一次
            heat_cnt = 0;
        }        
    }
    

 

实现模糊控制的核心代码:

 

  ecFuzzy[1] = 1.0 - ecFuzzy[0];   
  /*********查询模糊规则表*********/     
  num =    KpRule[pe][pec];  
  KpFuzzy[num] += (eFuzzy[0]*ecFuzzy[0]); 
  num =    KpRule[pe][pec+1];   
  KpFuzzy[num] += (eFuzzy[0]*ecFuzzy[1]);  
  num =KpRule[pe+1][pec];  
  KpFuzzy[num] += (eFuzzy[1]*ecFuzzy[0]);      
  num =    KpRule[pe+1][pec+1];  
  KpFuzzy[num] += (eFuzzy[1]*ecFuzzy[1]); 
  /*********加权平均法解模糊*********/    
  Kp_calcu    =    KpFuzzy[0]*kpRule[0] +KpFuzzy[1]*kpRule[1]+ 
                            KpFuzzy[2]*kpRule[2] +KpFuzzy[3]*kpRule[3]+ 
                            KpFuzzy[4]*kpRule[4] +KpFuzzy[5]*kpRule[5]+ 
                            +KpFuzzy[6]*kpRule[6];   


    printf(" %f,%f,%d,%d,kp = %f
", err, errchange, pe, pec, Kp_calcu);
  return(Kp_calcu);

 

实物展示

无刷电机控制:

FreeRTOS

整体定位控制:

FreeRTOS

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分