全志XR806基于FreeRTOS下部署竞技机器人先进模糊控制器
前言
- 很荣幸参与到由“极术社区和全志在线联合组织”举办的XR806开发板试用活动。
- 本人热衷于各种的开发板的开发,同时更愿意将其实现到具体项目中。
- 秉承以上原则,发现大家的重心都放在开发中的环境构建过程,缺少了不少实际应用场景的运用,虽然环境搭建确实痛苦。本文主要使用XR806的FreeRTOS到实际的机器人控制应用中,并实现部署模糊控制器。
- 环境搭建本文简要略写,大家可以看社区其它优秀的文章。
- 文章中应用到的无线控制和多维状态机两个重要的开发应用,会在后面的文章中陆续更新。
使用环境
1.本人使用window10+VMware+ubuntu 18.04 这里不多阐述
2.按照官方文档移植XR806的FreeRTOS
项目介绍
基于XR806——FreeRTOS为项目主控,部署先进模糊控制器,实现对于竞技机器人的机构控制和定位控制等。
软硬件框架
控制部署
继电推理
在封装好电机驱动电流环时,实现对电机的控制,相当于建立了一种
继电特性的非线性控制,此时使用继电整定法的Z-N临界比例度法去建立模糊域。
根据以下临界系数表,整定求出模糊域。
控制器类型 | KP | Tn | Tv | Ki | Kd |
---|---|---|---|---|---|
P | 0.5*Kμ | — | — | — | — |
PD | 0.8*Kμ | — | 0.12*Tμ | — | KP*Tn |
PI | 0.45*Kμ | 0.85*Tμ | — | KP/Tn | — |
PID | 0.6*Kμ | 0.5*Tμ | 0.12*Tμ | KP/ Tn | KP*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; elseTc = (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
以上,就是本文分享的全部内容了,感谢各位
相关文章:

全志XR806基于FreeRTOS下部署竞技机器人先进模糊控制器
前言 很荣幸参与到由“极术社区和全志在线联合组织”举办的XR806开发板试用活动。本人热衷于各种的开发板的开发,同时更愿意将其实现到具体项目中。秉承以上原则,发现大家的重心都放在开发中的环境构建过程,缺少了不少实际应用场景的运用&am…...

python动态加载内容抓取问题的解决实例
问题背景 在网页抓取过程中,动态加载的内容通常无法通过传统的爬虫工具直接获取,这给爬虫程序的编写带来了一定的技术挑战。腾讯新闻(https://news.qq.com/)作为一个典型的动态网页,展现了这一挑战。 问题分析 动态…...
系列二十三、将一个第三方的类配置成bean的方式
一、将一个第三方的类配置成bean的方式 1.1、概述 日常的JavaEE开发中,难免不会遇到需要使用第三方的类的情况,比如:MyBatisPlus、RedisTemplate、DruidDataSource...,这些外部组件是不同的组织或个人提供的,我们为什…...

【长文干货】Python可视化教程
文章目录 数据介绍Matplotlib散点图折线图柱形图直方图 Seaborn散点图折线图柱形图直方图 Bokeh散点图折线条形图交互式 Plotly基本组合优化:定制化下拉菜单 总结 数据介绍 在这个小费数据集中,我们记录了20世纪90年代初期餐厅顾客在两个半月内给出的小…...

软件工程--需求工程--学习笔记(超详细)
软件需求工程是软件开发周期的第一个阶段,也是关系到软件开发成败最关键阶段,本章讲解需求的基础知识和需求工程的关键活动。这些知识对于结构化方法、面向对象方法、面向服务方法等都是适用的 本文参考教材:沈备军老师的《软件工程原理》 目…...
TemplateHit中提取query和hit比对上序列索引的映射字典
template_hits(Sequence[TemplateHit]数据格式)来自结构数据库搜索结果 python运行hhsearch二进制命令的包装器类 映射索引计算:TemplateHit 中含有 indices_query,需要换算成在原始query序列中的index,hit 中indices_hit 需要减去最小index…...

富必达API:一站式无代码开发集成电商平台、CRM和营销系统
一站式无代码开发的连接解决方案 电子商务、客户服务系统以及其它商业应用,是现代企业运营的重要部分。然而,将这些系统进行有效的整合往往需要复杂的API开发,这对很多企业来说是一个巨大的挑战。富必达API以其一站式的无代码开发解决方案&a…...
聊聊接口最大并发处理数
文章目录 前言并发和并行并发(Concurrency)并行(Parallelism)思考一下 前言 生活在 2023 年的互联网时代下,又是在国内互联网越发内卷的背景下,相信大家面试找工作、网上学习查资料时都了解过互联网系统设…...

6.如何利用LIO-SAM生成可用于机器人/无人机导航的二维/三维栅格地图--以octomap为例
目录 1 octomap的安装 2 二维导航节点的建立及栅格地图的构建 3 三维栅格地图的建立 1 octomap的安装 这里采用命令安装: sudo apt install ros-melodic-octomap-msgs ros-melodic-octomap-ros ros-melodic-octomap-rviz-plugins ros-melodic-octomap-server 这样…...

【多传感器融合】BEVFusion: 激光雷达和视觉融合框架 NeurIPS 2022
前言 BEVFusion其实有两篇, 【1】BEVFusion: A Simple and Robust LiDAR-Camera Fusion Framework. NeurIPS 2022 | 北大&阿里提出 【2】BEVFusion: Multi-Task Multi-Sensor Fusion with Unified Bird’s-Eye View Representation 2022 | MIT提出 本文先分…...

kafka中的常见问题处理
文章目录 1. 如何防⽌消息丢失2. 如何防⽌重复消费3. 如何做到消息的顺序消费4. 如何解决消息积压问题4.1 消息积压问题的出现4.2 消息积压的解决⽅案 5. 实现延时队列的效果5.1 应用场景5.2 具体方案 1. 如何防⽌消息丢失 ⽣产者:1)使⽤同步发送 2&…...
HarmonyOS(八)——@Styles装饰器:定义组件重用样式
前言 在前面我们介绍过Builder装饰器和BuilderParam装饰器。今天我们继续介绍另外一个装饰器——Styles装饰器:定义组件重用样式。 如果每个组件的样式都需要单独设置,在开发过程中会出现大量代码在进行重复样式设置,虽然可以复制粘贴&…...

手写VUE后台管理系统5 - 整合状态管理组件pinia
整合状态管理组件 安装整合创建实例挂载使用 pinia 是一个拥有组合式 API 的 Vue 状态管理库。 pinia 官方文档:https://pinia.vuejs.org/zh/introduction.html 安装 yarn add pinia整合 所有与状态相关的文件都放置于项目 src/store 目录下,方便管理 在…...

解决webpack打包生成gz格式css/js文件没法在nginx使用的问题--全网唯一正确
本文绝对是全网解决这个问题唯一正确的文章,没有之一! 很多人都说开启nginx gzip压缩,这些人完全是胡说八道!你们到底懂不懂叫gzip压缩啊?! 不信你就试试,如果css/js只有gz文件,ng…...

传统算法: Pygame 实现快速排序
使用 Pygame 模块实现了快速排序的动画演示。首先,它生成一个包含随机整数的数组,并通过 Pygame 在屏幕上绘制这个数组的条形图。接着,通过快速排序算法对数组进行排序,动画效果可视化每一步的排序过程。在排序的过程中,程序选择一个基准元素(pivot),将数组分成两部分,…...

HarmonyOS入门开发(三) 持久化存储Preferences
接入鸿蒙几天以来,发现各种和Android不一样的地方,今天来看一下Preferences存储 在Android中比如有ShardPreferences、Mmkv这些持久化存储方式,开发起来很方便,读取速度也很快,在鸿蒙里面也提供了对应的持久化存储方案…...

类和对象——(3)再识对象
归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言📝 你说那里有你的梦想,…...

【UGUI】实现背包的常用操作
1. 添加物品 首先,你需要一个包含物品信息的类,比如 InventoryItem: using UnityEngine;[CreateAssetMenu(fileName "NewInventoryItem", menuName "Inventory/Item")] public class InventoryItem : ScriptableObje…...

单机zk安装与zk四字命令
一、下载 Apache ZooKeeper可以在 Linux 系统中使用 wget 命令直接下载,官网地址 Apache ZooKeeper 二、解压 tar -zxvf apache-zookeeper-3.8.3-bin.tar.gz 进去解压的目录中, 进入到 zk 解压目录的 conf 目录,复制 zoo_sample.cfg 文件&a…...
matlab导入excel数据两种常见的方法
在MATLAB中导入Excel数据,你可以使用几种不同的方法。下面是两种常见的方法: 方法一:使用readtable函数 readtable函数允许你导入Excel文件中的数据,并将其存储为表格。 % 指定文件路径 filename C:\your\path\to\file.xlsx;%…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...