个人总结:板球控制系统之串级PID整定方法,速度环与位置环,40S任务10S完成

2023-05-16

其实单环我们先出了所有题目,但是效果显然没有串级PID的效果好,有人需要的话可以把程序包发出来,板球运行视屏也有
另外:天下舵机参差不齐(哪怕型号相同),想要好的效果就多写两行程序:X,Y轴两套PID参数,当然,一套参数也能出结果


单环-位置环

能做题,但一般的机械结构都需要最后做一些补偿,这里就不赘述了。贴两行控制程序

//PID函数
double PID_Realize(double roll,double SetAngle,PID_Date *pid)
{
	 double incrementSpeed;
	 pid->SetSpeed = SetAngle;
	 pid->ActualSpeed= roll;
	 pid->err=pid->SetSpeed-pid->ActualSpeed;
	 incrementSpeed=pid->Kp*pid->err+pid->Ki*pid->sum+pid->Kd*(pid->err-pid->err_next);
	 pid->err_last=pid->err_next;
	 pid->err_next=pid->err;
	 pid->sum+=pid->err;
	
	 return incrementSpeed;
}
	
   PWM_X = PID_Realize(now_x_position,X_Angle,&pid_x);	//X轴舵机输出PWM
   PWM_Y = PID_Realize(now_y_position,Y_Angle,&pid_y);	//Y轴舵机输出PWM

   /**********************************************************************************************
   最终可以完成任务,但系统总体的鲁棒性很差,稍微有些外界干扰,最后小球的位置
   都可能有所偏差
   ***********************************************************************************************/

串级PID-速度环作为内环

程序贴在下方,大概描述一下PID调节过程
我们采用两种方式做出了串级

  • 内环PI 外环PD
  • 内环PD 外环PI

第一种不需要积分限幅,而第二种我们最后做了积分分离

由于第二种更容易理论解释,所以本文中讲述的是第二种方式

pid_x
pid_y 为外环两组PID结构体

pid_spe_x
pid_spe_y 为外环两组PID结构体

SX_PWM为X轴舵机速度期望
SY_PWM为Y轴舵机速度期望

  1. 第一步速度期望SX_PWM,SY_PWM都设置为零,只给速度环PID的KP,在一定范围内,可以达到效果:动一下小球,小球快速停下来,在我的系统里参数为60~80,最终我给了X方向上速度环KP65,Y方向上速度环KP是75。

  2. 速度限幅,调内环KD,下面程序限幅为±1.6(一次中断的时间小球最多走1.6像素点距离)。在幅值内任意给几个速度,我们测试了0.8,1.6,-1.6,通过现象来整定内环KD。小球在板子上基本匀速即可,不要有太大震荡。

  3. 内环速度已经稳定了,现在可以把外环输出给内环做期望速度了,SY_PWM = Kalman4(PID_Realize(now_y_position,set_goal_y,&pid_y));然后开始调节外环KP。

  4. 外环KP直接从内环KP/100开始向上调。set_goal_y给定为板子上九点某一点。差不多小球停在期望坐标周围就可以了。当然优秀的机械结构,这道题目基本算是做完了。

  5. 在上一条,我们达到了小球在目标点附近的效果,此时加入分段积分,即外环KI,判断当小球在目标点附近时加入积分。让小球进入最终死区。别忘了把积分效果清零哦。

整个串级处理程序:放在了定时中断里

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	static u8 times=0;
	static double data_cloud_xy[2][3]={0};
	if(htim==(&TIM4_Handler))
    	{
		  image_binarize(rgb_data_buf);		//二值化处理程序,用时2.17ms
		  Find_Nine_Point();					//找到九个点坐标,0.90ms
		  if(((int)now_x_position+(int)now_y_position)==0)			//找不到球重新找球
		   find_ball();
		  else
		   find_next_ball(data_cloud_xy[0][times],data_cloud_xy[1][times]); 
		  times=(times+1)%2;
		  data_cloud_xy[0][times] = ball_start.x;
		  data_cloud_xy[1][times] = ball_start.y;
		  
		  if(times==0){
		   
		   now_x_position = Kalman1(0.95*data_cloud_xy[0][0]+0.05*data_cloud_xy[0][1]);//+0.05*data_cloud[0][1];
		   now_y_position = Kalman2(0.95*data_cloud_xy[1][0]+0.05*data_cloud_xy[1][1]);//+0.05*data_cloud[1][1];
		   
		   
		   
		   spe_x = now_x_position - data_cloud_xy[0][2];		//X轴方向速度			一次中断运行的距离
		   spe_y = now_y_position - data_cloud_xy[1][2];		//Y轴方向速度
		   
		//   if(fabs(spe_x)<0.3)spe_x=0;					//用来做速度为0的速度环 测试
		//   if(fabs(spe_y)<0.3)spe_y=0;
		   
		   data_cloud_xy[0][2] = now_x_position;
		   data_cloud_xy[1][2] = now_y_position;
		 
		 										//速度限幅
		   if(Kalman3(PID_Realize(now_x_position,set_goal_x,&pid_x))>=1.6)
		   {
		   	 SX_PWM = 1.6;
		   }
		   else if(Kalman3(PID_Realize(now_x_position,set_goal_x,&pid_x))<=-1.6)
		   {
		   	 SX_PWM = -1.6;
		   }
		   else{ SX_PWM = Kalman3(PID_Realize(now_x_position,set_goal_x,&pid_x));}
		   
		   
		   if(Kalman4(PID_Realize(now_y_position,set_goal_y,&pid_y))>1.6)
		   {
		   	 SY_PWM = 1.6;
		   }
		   else if(Kalman4(PID_Realize(now_y_position,set_goal_y,&pid_y))<-1.6)
		   {
		   	 SY_PWM = -1.6;
		   }
		   else{ SY_PWM = Kalman4(PID_Realize(now_y_position,set_goal_y,&pid_y));}
		   
		   									
		   PWM_X = PID_Realize(spe_x,SX_PWM,&pid_spe_x);	//X,Y舵机输出
		   PWM_Y = PID_Realize(spe_y,SY_PWM,&pid_spe_y);
		   
		   if(system_flag==1)
		   {
		  	 Motor_Contor(PWM_X,PWM_Y);
		   }
		   else{							//消除历史积分
			    Motor_Stop();
			    pid_x.sum = 0;
			    pid_y.sum = 0;
			    pid_spe_x.sum = 0;
			    pid_spe_y.sum = 0;
			    
			    pid_x.err_next = 0;
			    pid_y.err_next = 0;
			    pid_x.err_last = 0;
			    pid_y.err_last = 0;
			    
			    pid_spe_x.err_next = 0;
			    pid_spe_y.err_next = 0;
			    pid_spe_x.err_last = 0;
			    pid_spe_y.err_last = 0;
			   } 	
			 //Repoter_XY(now_x_position*10,PWM_X,set_goal_x*10,now_y_position*10,PWM_Y,set_goal_y*10);	//回传参数,用于观察PID曲线效果
		 f=ov_frame;
		 ov_frame=0;
		 }
	}
}

预祝大家的串级PID顺利调好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

个人总结:板球控制系统之串级PID整定方法,速度环与位置环,40S任务10S完成 的相关文章

  • 基于MATLAB的模糊pi控制器的设计

    基于MATLAB的模糊pi控制器的设计 模糊规则隶属函数的建立 a newfis fuzzypid 添加第一个输入变量e a addvar a input e 1 1 a addmf a input 1 N zmf 1 1 3 a addm
  • PID自控理论(频域bode图理论分析)

    PID 迟后超前矫正 临界比例度法整定PID 在低频区 主要是PI控制器起作用 用以提高系统型别消除或减小稳态误差 在中 高频区 主要是PD控制器起作用 用以增大幅值穿越频率和相位裕度 提高系统的响应速度 因此 PID控制器可以全面地提高系
  • 支付宝小程序中网络请求 my.request({}) 的用法

    支付宝小程序网络请求官方文档 https docs alipay com mini api network Page data name 支付宝小程序 onLoad query 页面加载 在这里请求接口 console info Page
  • TSI系统测量参数之:转速和零转速

    一 TSI系统测量参数 1 轴向位移 2 盖振或瓦振 3 偏心 4 键相 5 零转速 6 轴向振动 7 相对热膨胀 胀差 8 绝对热膨胀 缸胀 二 各参数作用 1 零转速与转速 1 零转速 主要用在汽机转速到零时投盘车的连锁以及对大机转速的
  • 解决VS安装无法联网下载问题

    离线安装VC 14 0 build tools的解决方案 在能正常通过visualcppbuildtools full exe 联网获取安装文件的电脑上 在系统自带的cmd exe中在对应目录下执行 visualcppbuildtools
  • 第三节课总结之关于this指向,变量提升以及跨域的解决方案

    this 变量提升 关于继承 跨域解决方法 gt gt this指向 Js是静态作用域 是在定义阶段就决定好了的 而不是在执行阶段才决定的 参考资料 https developer mozilla org en US docs Web Ja
  • Spring学习总结【二】---IoC(控制反转)

    文章目录 IoC理论推导 IoC本质 工作原理 IoC创建对象的方式 IoC理论推导 在我们之前的业务中 用户的需求可能会影响我们原来的代码 我们需要根据用户的需求去修改原代码 如果程序代码量十分大 修改一次的成本代价十分昂贵 之前 程序是
  • 【平衡小车制作】(一)硬件原理图讲解(超详解)

    大家好 我是小政 之后的一系列文章我将介绍我玩平衡小车的过程以及遇到的一些问题 将这些内容记录下来分享给大家 也让大家少走一些弯路 接下来我将从硬件框架选择 软件编程 PID算法 PID调参 蓝牙遥控这五个部分向大家讲解平衡小车的制作过程
  • 学网络安全都是一群什么人?

    大家好呀 我是知了姐 又是一期学员故事栏目 3月下旬知了堂信安方向开新班 知了姐跟着去采访 了解到新学员们的求学故事 嘿你别说 虽然大家出身专业不同 经历背景不同 如今却在同一个地点相遇 加入到知了堂这个大家庭 不同专业 年龄的他们 为什么
  • 如何在Python中检查是否存在给定pid的进程?

    有没有办法检查 pid 是否对应于有效进程 我从其他来源获取 pid 而不是os getpid 我需要检查机器上是否不存在具有该 pid 的进程 我需要它在 Unix 和 Windows 中可用 我还在检查 PID 是否未被使用 如果 pi
  • docker和主机之间的PID映射

    docker 命名空间与主机命名空间有何不同以及 pid 如何在这两者之间映射 谁能给我一个想法 有助于使用源代码在主机和 docker 之间映射 pid 的简单方法 您可以在中找到映射 proc PID status文件 它包含这样一行
  • copy_from_user() 的任何示例吗?内核和用户空间

    我正在寻找将 PID 值从用户空间复制到内核空间 这是我的代码快照 内核模块 include
  • 在Qt中fork后获取进程的PID

    我正在创建一个成功分叉的 Qt C 控制台应用程序 当我在 fork 之前调用 QCoreApplication applicationPid 然后在 fork 之后 在子进程中 调用 QCoreApplication applicatio
  • C - 获取用popen打开的进程的PID

    我有一个用 C 编写的程序 它使用 popen 打开另一个程序 我想获取该程序的 pid 或某种处理程序 以便在一定时间限制后 或者在它超出某些 ram 和 stdout 限制时杀死它 我认为这必须用ptrace来完成 它需要PID 但我不
  • 以编程方式获取另一个进程的父进程pid?

    我尝试谷歌 但发现getppid 它获取的父pidcurrent过程 我需要类似的东西getppid some other pid 有这样的事吗 基本上获取某个进程的 pid 并返回父进程的 pid 我认为最简单的事情是打开 proc 并解
  • Ubuntu Java:查找特定程序的 pid 并终止该程序

    我正在尝试创建一个应用程序来检查此特定应用程序是否正在运行 然后在指定的时间后终止该应用程序 我打算获取应用程序的 pid 如何获取应用程序的 pid Thanks 你可以尝试ps aux grep foobar获取 pid 然后发出kil
  • IIS应用程序池PID

    有谁熟悉获取与进程 ID 关联的应用程序池的方法吗 我正在使用 Win32 Process 查询 W3WP 服务并返回 PID 现在我正在尝试获取与其关联的应用程序池 在 Windows Server 2008 上 情况发生了变化 in s
  • Bash:是否可以阻止 PID 被重复使用?

    是否可以阻止 PID 被重复使用 例如 如果我运行一份工作myjob在背景中myjob 并使用获取PIDPID 是否可以阻止 linux 系统重新使用该 PID 直到我检查该 PID 不再存在 进程已完成 换句话说 我想做类似的事情 myj
  • 有没有办法链接linux的线程TID和pthread_t“线程ID”

    在 Linux 上 线程由pthread t或 TID 我正在寻找这两种线程 id 之间的桥梁 given a pthread t我可以得到它吗TID 显然 https stackoverflow com questions 558469
  • 如何使用 bash 锁定文件

    我有一个任务从远程服务器同步目录 rsync av email protected cdn cgi l email protection srv data srv data 为了使其定期运行并避免脚本 reEnter 问题 我使用 rsyn

随机推荐

  • 中缀表达式转前缀和后缀表达式

    之前笔试中国电信IT研发中心的时候 xff0c 遇到了几个前 中 后缀表达式的相互转换 xff0c 当时忘得差不多了 xff0c 今天好好把该方面的知识好好复习 xff0c 并把相关代码和思路自己缕了一遍 xff1a 将中缀表达式转换为前缀
  • java prometheus 自定义exporter开发,以及实现多个接口返回metrics

    普罗 自定义exporter开发 exporter的作用是采集需要监控的数据 xff0c 并将采集到的数据转换成prometheus所需要的数据格式 xff0c 将这些转换后的数据返回 xff0c 供给prometheus 使用 java
  • 双系统重装Ubuntu经验分享

    真的很喜欢ubuntu 但又没有恒心把它学通透 xff0c 毕竟不是相关专业 第一次重装是因为没多少经验 xff0c 安装qqforlinux的时候多了两个东西 xff0c 还自己生成了快捷方式 xff0c 就想点开看看是啥 xff0c 结
  • 还在迷茫不知Dashboard是什么?答案在文中揭晓

    Dashboard的中文翻译是 仪表盘 xff0c 与汽车的仪表盘相同 一种反映车辆各系统工作状况的装置 xff0c 有车速里程表 转速表 燃油表等 司机可以很方便地从汽车仪表盘中获得汽车整体状况 而Dashboard沿袭了汽车仪表盘理念
  • 问题:UPDATE 失败,因为下列 SET 选项的设置不正确: 'ARITHABORT'。

    解决方案 1 你可以在TSQL前Set ARITHABORT ON 代码如下 Set ARITHABORT ON GO INSERT INTO ta 2 在ADO NET中 你可以这样来写 C 代码 MyConnection Execute
  • 智能制造:三体智能革命

    赵敏 宁振波 郭朝晖是走向智能研究院资深专家 xff0c 三体智能革命 编委会中三位重要作者 他们从去年5月起多次参加了中国工程院主持的 中国智能制造发展战略研究报告 的研讨 评审与修订工作 xff0c 对该报告的形成过程 研究主旨和详细内
  • 小觅相机SDK samples安装Link error: cannot find -lvtkproj4

    Link error cannot find lvtkproj4 error ld returned 1 exit status 找不到相关动态库文件 设置软链接 xff1a ln s usr lib x86 64 linux gnu li
  • 年度回忆录(2011.12----2012.09)

    前几天刚刚参加了提高班十期的开学典礼 xff0c 最近师院的新生也陆 陆续 续的开始报道了 每年到这个时候都会感慨 年年岁岁花相似 xff0c 年年岁岁人不同 啊 对于提高班来说每年都有新的血液注入进来 xff0c 提高班的队伍在不断的扩大
  • python函数(变量,参数)

    函数的变量 1 xff0c 全局变量 定义在最外层的变量 xff0c 对于所有的内函数都能调用 2 xff0c 局部变量 定义在函数内的变量叫做局部变量 xff0c 在函数外是不能访问局部变量 注 xff1a 全局变量不能直接在函数内部进行
  • 程序员读书和练习的方法(个人观点)

    lt 传送门 gt 针对本文的交流探讨 gt 总宗旨 xff1a 打好计算机通用理论基础 通用实战能力 xff0c 便于需要时对各领域的无障碍深钻 时间宝贵 xff0c 不要为了学习而学习 计算机通用理论基础 xff1a 计算机各领域理论基
  • 从零开始的Ubuntu 16.04下PX4编译环境的搭建

    近来入手了一块pixhawk xff0c 想进行一些基于已有代码的二次加工 xff0c 于是到官网https dev px4 io 上看教程 官网上的教程是分为中文 英文以及韩文的版本 很多人肯定第一反应就是看中文的版本 但是这样做弊端真的
  • 驱动程序开发:SPI设备驱动

    目录 Linux下SPI驱动简介SPI架构概述SPI适配器 xff08 控制器 xff09 SPI设备驱动spi driver注册示例SPI 设备和驱动匹配过程编写imc20608六轴传感器SPI驱动设备树编写操作具体的imc20608驱动
  • 操作系统知识点(二)

    文章目录 内存管理程序执行过程内存保护 连续分配非连续分配基本分页存储管理方式基本分段存储管理方式段页式存储管理方式 虚拟内存局部性原理请求分页存储管理 内存管理 内存管理 Memory Management 是操作系统设计中最重要和最复杂
  • VR行业发展的前景和现状?

    标题 VR行业发展的前景和现状 xff1f 1 一个新事物的产生 xff0c 总是伴随着看好和唱衰两种声音 这两种态度自然有其可以理解的地方 xff0c 因为摆在我们面前的是未知 xff0c 而坐在餐桌前的两拨人 xff0c 站在不同的角度
  • 头文件与库的区别

    昨天突然问了一下什么是头文件 xff0c 我一听就傻了 xff0c 虽然上课的时候老师在讲编译的四个过程的时候说了一下 xff0c 但是还是不太理解 xff0c 我们知道编译过程中的预处理阶段会进行头文件展开 xff0c 宏替换以及条件编译
  • 进程、线程

    线程 xff08 thread xff09 线程其实是操作系统能够进行运算调度的最小单位 它是被包含在进程之中的 xff0c 是进程中的实际运作单位 一条线程指的是进程中一个单一顺序的控制流 xff0c 一个进程中可以并发多个线程 xff0
  • 基于Zynq7020双千兆以太网的数字信号处理板设计

    一 背景 背景 Xilinx公司在2010年发布了可扩展的处理器平台Zynq7000系列 xff0c 它采用了28nm工艺 xff0c 将FPGA与ARM cortex A9集成在一颗芯片上 xff0c 实现了高性能 高集成度 低功耗 Zy
  • 深入理解JS中的变量作用域

    在 JS 当中一个变量的作用域 xff08 scope xff09 是程序中定义这个变量的区域 变量分为两类 xff1a 全局 xff08 global xff09 的和局部的 其中全局变量的作用域是全局性的 xff0c 即在 JavaSc
  • 硬件工程师,从零开始无人机开发。

    毕业已经五年了 xff0c 一直在杭州某大厂 xff0c 做无人机硬件开发 无人机这块 xff0c 我进去的时候大厂刚开始 做 xff0c 有幸参与到整个无人机的硬件开发 我这个刚毕业的技术小白 xff0c 在这五年间成长了很多 无奈 今年
  • 个人总结:板球控制系统之串级PID整定方法,速度环与位置环,40S任务10S完成

    其实单环我们先出了所有题目 xff0c 但是效果显然没有串级PID的效果好 xff0c 有人需要的话可以把程序包发出来 xff0c 板球运行视屏也有 另外 xff1a 天下舵机参差不齐 xff08 哪怕型号相同 xff09 xff0c 想要