全志XR806基于FreeRTOS下部署竞技机器人先进模糊控制器

news2025/1/9 21:37:09

前言

  • 很荣幸参与到由“极术社区和全志在线联合组织”举办的XR806开发板试用活动。
  • 本人热衷于各种的开发板的开发,同时更愿意将其实现到具体项目中。
  • 秉承以上原则,发现大家的重心都放在开发中的环境构建过程,缺少了不少实际应用场景的运用,虽然环境搭建确实痛苦。本文主要使用XR806的FreeRTOS到实际的机器人控制应用中,并实现部署模糊控制器。
  • 环境搭建本文简要略写,大家可以看社区其它优秀的文章。
  • 文章中应用到的无线控制和多维状态机两个重要的开发应用,会在后面的文章中陆续更新。

使用环境

1.本人使用window10+VMware+ubuntu 18.04 这里不多阐述
2.按照官方文档移植XR806的FreeRTOS

项目介绍

基于XR806——FreeRTOS为项目主控,部署先进模糊控制器,实现对于竞技机器人的机构控制和定位控制等。

在这里插入图片描述
在这里插入图片描述

软硬件框架

在这里插入图片描述

控制部署

继电推理

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

控制器类型KPTnTvKiKd
P0.5*Kμ
PD0.8*Kμ0.12*TμKP*Tn
PI0.45*Kμ0.85*TμKP/Tn
PID0.6*Kμ0.5*Tμ0.12*TμKP/ TnKP*Tn

模糊推理

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

清晰化

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

在这里插入图片描述

FOC控制

在这里插入图片描述

仿真效果

在这里插入图片描述

在这里插入图片描述

代码实现

以下提供部分代码:

自动整定
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;
		}		
	}
	
	/*****************开始计算强行振荡的周期****************************/	
	if((pid.Zero_Across_Cnt == 2)&&(start_cnt == 0))
	{
		start_cnt = pid.Autotune_Cnt;
		printf("start_time = %d\r\n", start_cnt);
	}else if((pid.Zero_Across_Cnt == 4)&&(end_cnt == 0))
	{
		end_cnt = pid.Autotune_Cnt;
		printf("start_time = %d\r\n", end_cnt);
	}
		
	if(pid.Zero_Across_Cnt == 4)
	{	
		/*计算一个震荡周期的时间*/
		if(start_cnt > end_cnt)
			Tc = (start_cnt-end_cnt)/2;  
		else
			Tc = (end_cnt-start_cnt)/2;  
		
		/*计算Kp,Ti和Td*/
		pid.Kp = 0.6*pid.Kp;
		pid.Ti = Tc*0.5;   
		pid.Td = Tc*0.12;  
		
		/*PID参数整定完成,将各项数据清0*/
		heat_cnt 	= 0;
		cool_cnt 	= 0;	
		pid.Autotune_Cnt = 0;
		start_cnt	= 0;
		end_cnt		= 0;	
		pid.SEk   = 0;
		
		pid.Zero_Across_Cnt 			= 0;					
		pid.AutoRegurating_EN 		= OFF;
		pid.AutoRegurating_Status = OVER; //开始运行使用新的参数后的PID算法

		pid.Sv   = pid.BKSv;    
	}
}	
模糊控制
/*模糊规则表*/
int KpRule[7][7]= {  
	  /*NB, NM,  NS, ZO, PS, PM, PB -EC*/
		{1,   1,   1,  1,  1,  1,  1}, //NB 0~-10
		{0,   0,   0,  1,  2,  3,  4}, //NM 0~10
		{0,   0,   0,  1,  2,  3,  4}, //NS 10~20   
		{0,   0,   1,  1,  2,  3,  4}, //20~30
		{1,   1,   1,  1,  2,  3,  4}, //30~40
		{1,   1,   1,  1,  2,  3,  4}, //40 ~50
    {6,   6,   6,  6,  6,  6,  6}, //50~60       
};
static float fuzzy_kp(float err, float errchange) 
{                 
  volatile float Kp_calcu;  
  volatile uint8_t num,pe,pec;   
 
  volatile float eFuzzy[2]={0.0,0.0};      //隶属于误差E的隶属程度  
  volatile float ecFuzzy[2]={0.0,0.0};     //隶属于误差变化率EC的隶属程度  
 
  float KpFuzzy[7]={0.0,0.0,0.0,0.0,0.0,0.0,0.0}; //隶属于Kp的隶属程度  
	
  /*****误差E隶属函数描述*****/ 
  if(err<eRule[0])         
  {   
		eFuzzy[0] =1.0;    
		pe = 0;  
  }  
  else if(eRule[0]<=err && err<eRule[1])  
  {   
		eFuzzy[0] = (eRule[1]-err)/(eRule[1]-eRule[0]);   
		pe = 0;  
  }  
  else if(eRule[1]<=err && err<eRule[2])  
  {   
		eFuzzy[0] = (eRule[2] -err)/(eRule[2]-eRule[1]);   
		pe = 1;  
  }  
  else if(eRule[2]<=err && err<eRule[3])  
  { 
		eFuzzy[0] = (eRule[3] -err)/(eRule[3]-eRule[2]);   
		pe = 2;  
  }     
  else if(eRule[3]<=err && err<eRule[4])     
  {   
		eFuzzy[0] = (eRule[4]-err)/(eRule[4]-eRule[3]);         
		pe = 3;     
  }  
  else if(eRule[4]<=err && err<eRule[5])  
  {   
		eFuzzy[0] = (eRule[5]-err)/(eRule[5]-eRule[4]);   
		pe = 4;  
  }  
  else if(eRule[5]<=err && err<eRule[6])  
  {   
			eFuzzy[0] = (eRule[6]-err)/(eRule[6]-eRule[5]);   
			pe = 5;  
  }  
  else  
  {   
		eFuzzy[0] =	0.0;   
		pe =	6;  
  }    
  eFuzzy[1] =1.0 - eFuzzy[0];  
  /*****误差变化率EC隶属函数描述*****/       
  if(errchange<ecRule[0])         
  {   
    ecFuzzy[0] =1.0;   
		pec = 0;  
  }  
  else if(ecRule[0]<=errchange && errchange<ecRule[1])  
  {   
		ecFuzzy[0] = (ecRule[1] - errchange)/(ecRule[1]-ecRule[0]);   
		pec = 0 ;  
  }  
  else if(ecRule[1]<=errchange && errchange<ecRule[2])  
  {   
		ecFuzzy[0] = (ecRule[2] - errchange)/(ecRule[2]-ecRule[1]);   
		pec = 1;  
  }  
  else if(ecRule[2]<=errchange && errchange<ecRule[3])  
  {   
		ecFuzzy[0] = (ecRule[3] - errchange)/(ecRule[3]-ecRule[2]);   
		pec = 2 ;  
  } 
  else if(ecRule[3]<=errchange && errchange<ecRule[4])     
  {   
		ecFuzzy[0] = (ecRule[4]-errchange)/(ecRule[4]-ecRule[3]);         
		pec=3;     
  }  
  else if(ecRule[4]<=errchange && errchange<ecRule[5])     
  {   
		ecFuzzy[0] = (ecRule[5]-errchange)/(ecRule[5]-ecRule[4]);         
		pec=4;     
  }  
  else if(ecRule[5]<=errchange && errchange<ecRule[6])     
  {   
		ecFuzzy[0] = (ecRule[6]-errchange)/(ecRule[6]-ecRule[5]);         
		pec=5;     
  }  
  else  
  {   
		ecFuzzy[0] =0.0;   
		pec = 5;  
  }  
  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\r\n", err, errchange, pe, pec, Kp_calcu);
  return(Kp_calcu); 
} 

实物展示

无刷电机控制

https://www.bilibili.com/video/BV1FN4y1C7fY/?aid=874778769&cid=1302701130&page=null

整体定位控制

https://www.bilibili.com/video/BV1NN411t7Fy/?aid=492262076&cid=1302702003&page=null

以上,就是本文分享的全部内容了,感谢各位

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1275099.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

postman参数为D:\\audio\\test.mp3请求报错

报错信息 报错 java.lang.IllegalArgumentException: Invalid character found in the request target [/v1/audio/transcriptions?audioPathD:\\audio\\test.mp3 ]. The valid characters are defined in RFC 7230 and RFC 3986 解决方式 yml文件上放行指定字符 relaxed-pa…

外包搞了6年,技术退步明显......

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

Python+Requests模块session处理和SSL证书处理关闭警告

session处理 部分接口需要先登录网址&#xff0c;才能有权限进行调用&#xff0c;这时可以使用到session&#xff0c;具体操作是&#xff1a;先使用网站 的登录api进行登录&#xff0c;得到session后&#xff0c;然后用该session来请求其它的接口。 示例代码&#xff1a; se…

[1] AR Tag 在ros中的使用

1.定义 AR Tag 是一种用于增强现实&#xff08;AR&#xff09;应用中的视觉标记&#xff0c;用于跟踪和定位虚拟物体在现实世界中的位置。 AR Tag由黑白正方形图像表示&#xff0c;图像内部有黑色边框中的某些图案。它与我们经常用到的二维码长得类似&#xff0c;原理其实也一…

百元挂耳式蓝牙耳机推荐,几款性价比高的开放式蓝牙耳机

在百元价位段&#xff0c;挂耳式蓝牙耳机是备受消费者追捧&#xff0c;提供了出色的音质、便携性和无拘束的使用体验&#xff0c;无论您是追求音乐品质&#xff0c;还是需要在办公或运动中保持通讯畅通&#xff0c;基本上都是离不开耳机的身影&#xff0c;今天小编为大家推荐几…

Leetcode-二叉树oj题

1.二叉树的前序遍历 144. 二叉树的前序遍历https://leetcode.cn/problems/binary-tree-preorder-traversal/这个题目在遍历的基础上还要求返回数组&#xff0c;数组里面按前序存放二叉树节点的值。 既然要返回数组&#xff0c;就必然要malloc一块空间&#xff0c;那么我们需…

temu货不对板哪里修改图片

在Temu这个跨境电商平台上&#xff0c;如果您需要修改商品图片&#xff0c;通常需要在卖家中心进行操作。下面是一般的步骤&#xff0c;但请注意&#xff0c;不同平台的操作可能略有不同&#xff0c;具体请参考Temu官方的帮助文档或联系客服。 先给大家推荐一款拼多多/temu运营…

数据结构 / 队列 / 循环队列

1. 定义 为充分利用向量空间&#xff0c;克服假溢出现象的方法是&#xff1a;将向量空间想象为一个首尾相接的圆环&#xff0c;并称这种向量为循环向量。存储在其中的队列称为循环队列&#xff08;Circular Queue&#xff09;。循环队列是把顺序队列首尾相连&#xff0c;把存储…

【Java8系列07】Java8日期处理

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【电路笔记】-并联电阻

并联电阻 文章目录 并联电阻1、概述2、并联电阻示例13、并联电阻示例24、并联电阻电路中的电流5、并联电阻器示例36、总结 当电阻器的两个端子分别连接到另一个或多个电阻器的每个端子时&#xff0c;电阻器被称为并联连接在一起。 1、概述 与之前的串联电阻电路不同&#xff0…

「Qt Widget中文示例指南」如何创建一个计算器?(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 本文将展示如何使用…

visual Studio MFC 平台实现图像增强中Gray-level slicing,Bit-plane slicing,对比度拉伸三种方法

MFC 实现图像增强–分段式变换 本文使用visual Studio MFC 平台实现图像增强中的第三大类分段式变换中的三种方法&#xff0c;包括Gray-level slicing&#xff0c;Bit-plane slicing&#xff0c;对比度拉伸&#xff0e; 关于其他MFC单文档工程可参考 01-Visual Studio 使用MFC …

ES-深入理解倒排索引

倒排索引 idproductdesc1新版 小米 至尊-纪念版手机1小米 NFC 手机3NFC手机4小米 耳机5华为 耳机6扫地机器人7华为 Mata………………term_indexterm dictionaryposting list------------------------------------小米1……100W华为6,7,9NFC76,90耳机5352红米643,98机器人645,9…

【开源】基于JAVA语言的考研专业课程管理系统

项目编号&#xff1a; S 035 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S035&#xff0c;文末获取源码。} 项目编号&#xff1a;S035&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高…

SSM项目实战-POJO设计

1、schedule_db.sql CREATE DATABASE schedule_db CHARACTER SET utf8 ;USE schedule_db;CREATE TABLE sys_schedule (sid int NOT NULL AUTO_INCREMENT COMMENT 日程id,uid int DEFAULT NULL COMMENT 用户id,title varchar(50) DEFAULT NULL COMMENT 标题,completed int DEFAU…

浅学指针(4)函数指针数组和qsort的使用

系列文章目录 文章目录 系列文章目录前言1.函数指针数组的⽤途作用&#xff1a;可以让代码更简洁&#xff0c;逻辑更清晰 2. 回调函数回调函数就是⼀个通过函数指针调⽤的函数 3 . qsort函数qsort函数可以排序所有数据类型解释如图&#xff1a;![在这里插入图片描述](https://i…

CAP概念和三种情况、Redis和分布式事务的权衡

借鉴&#xff1a;https://cloud.tencent.com/developer/article/1840206 https://www.cnblogs.com/huanghuanghui/p/9592016.html 一&#xff1a;CAP概念和三种情况 1.概念&#xff1a; C全称Consistency&#xff08;一致性&#xff09;&#xff1a;这个表示所有节点返回的数…

基于SpringBoot高校心理教育辅导设计与实现

摘 要 随着Internet技术的发展&#xff0c;心理教育辅导系统应运而生&#xff0c;心理教育辅导系统为用户提供了一个更为便利的心理测试咨询平台。所以&#xff0c;为了充分满足高校学生心理教育辅导的需求&#xff0c;特开发了本高校心理教育辅导系统。 本高校心理教育辅导系统…

喜报 | 通付盾WAAP解决方案入选国家工业信息安全发展研究中心“2023年数字化转型自主创新解决方案优选案例”

为提升自主创新产品质量和技术创新能力&#xff0c;助力重点行业自主可控基础设施建设&#xff0c;加速重点行业数字化转型工作进程&#xff0c;促进重点行业产业链数字化升级&#xff0c;推动重点行业数字化、网络化、智能化发展。国家工业信息安全发展研究中心联合中国交通建…

CentOS系统环境搭建(二十二)——Git进阶

centos系统环境搭建专栏&#x1f517;点击跳转 文章目录 Git进阶1.更新代码2.只拉取Git仓库的部分目录内容2.1初始化空白仓库2.2配置git仓库2.3开启稀疏检出属性2.4设置指定拉取的目录2.5 更新代码 Git进阶 1.更新代码 基于上一篇文章CentOS系统环境搭建&#xff08;二十一&…