代码解读三 文件名“Ano_Pid.c”

2023-05-16

关于PID这部分匿名代码里面有很多,此文件是最基础的即单级PID的实现,后面的关于速度和角速度环的串级PID及高度和高度速度环的串级PID都是以此为基础的,所以此文件内容务必搞懂。

/******************** (C) COPYRIGHT 2016 ANO Tech ***************************
 * 作者		 :匿名科创
 * 文件名  :ANO_PID.c
 * 描述    :PID函数
 * 官网    :www.anotc.com
 * 淘宝    :anotc.taobao.com
 * 技术Q群 :190169595
*****************************************************************************/
#include "Ano_Pid.h"
#include "Ano_Math.h"
#include "Ano_Filter.h"

/*

不难看出匿名使用的并不是大家推崇的增量式PID,而是位置式PID
至于为什么我也不是很清楚


简单列下关于位置式PID和增量式PID的公式

//位置式PID(匿名使用)
ux = kp * ex + ki * ex_sum + kd * (ex - ex_prior);



//增量式PID
dux = kp(ex - ex_prior) + ki * ex + kd * (ex - 2 * ex_prior + ex_prior_prior);

ux = dux + ux;


*/




float PID_calculate( 
										float dT_s,            				//周期(单位:秒)
										float in_ff,						//前馈值
										float expect,						//期望值(设定值)
										float feedback,						//反馈值()
										_PID_arg_st *pid_arg, 				//PID参数结构体
										_PID_val_st *pid_val,				//PID数据结构体
										float inte_d_lim,					//积分误差限幅大小(代码中有+-作为上下限)
										float inte_lim						//总积分限幅大小(代码中有+-作为上下限)									
										 )	
{
	float differential,hz;
	
	//由周期求得频率,干嘛用?
	//见下面介绍
	hz = safe_div(1.0f,dT_s,0);
	
//	pid_arg->k_inc_d_norm = LIMIT(pid_arg->k_inc_d_norm,0,1);
	
	//误差 = 期望 - 反馈
	pid_val->err = (expect - feedback);
	
	
	//下面感觉是求微分一样?骚操作
	/****************************************************************************************/
	//如何正确理解微分定义?  dx/dt = lim  [x(t+dt) - x(t)]/dt  (其中在lim下面还有条件 dt->0)
	//很明显,下面使用的就是微分定义,同时为了加快运算速度,乘法确实比除法运算速度快,所以把除以dt->乘以hz
	
	
	//期望微分 = (期望 - 上次期望) * 频率	 	 	其实就是下面的骚操作版
	//期望微分 = (期望 - 上次期望) / 周期 (其中周期要足够小才能表示微分的定义,事实上在其他地方代值都是0.001s,完全足够)
	pid_val->exp_d = (expect - pid_val->exp_old) *hz;
	
	//如果反馈微分模式为0(事实上翻遍了也没发现如何为1)
	if(pid_arg->fb_d_mode == 0)
	{
		//和上面的是不是有点像?
		//反馈微分 = (反馈 - 上次反馈) * 频率  
		pid_val->fb_d = (feedback - pid_val->feedback_old) *hz;
	}
	else
	{
		//事实上代码不可能走到这里
		pid_val->fb_d = pid_val->fb_d_ex;
	}	
	//事实上前面求那么多都是为了后面这一步,至于为什么这样做我也不是很清楚
	//微分 = 期望微分系数 * 期望微分值 - 反馈微分系数 * 反馈微分值
	//微分搞定
	differential = (pid_arg->kd_ex *pid_val->exp_d - pid_arg->kd_fb  *pid_val->fb_d);
	
	/****************************************************************************************/
	
//	if((s16)(100 *pid_arg->inc_hz)!=0)
//	{
//		LPF_1_(pid_arg->inc_hz,T,differential,pid_val->err_d_lpf );
//	}
//	else
//	{
//		pid_val->err_d_lpf = 0;
//	}
		
	//积分累加并进行积分限幅
	//pid_val->err_i 表示总积分
	//pid_val->err 表示误差 
	//最终得出积分 积分搞定
	pid_val->err_i += pid_arg->ki *LIMIT(pid_val->err ,-inte_d_lim,inte_d_lim )*dT_s;    //)*T;//+ differential/pid_arg->kp
	//pid_val->err_i += pid_arg->ki *(pid_val->err )*T;//)*T;//+ pid_arg->k_pre_d *pid_val->feedback_d
	pid_val->err_i = LIMIT(pid_val->err_i,-inte_lim,inte_lim);
	
	
	
	//PID主体计算,调整电机维持姿态全靠它了
	pid_val->out = 
			pid_arg->k_ff *in_ff 										//前馈比例*前馈值
	    +   pid_arg->kp *pid_val->err  									//比例
		+	differential												//微分
//	    + 	pid_arg->k_inc_d_norm *pid_val->err_d_lpf + (1.0f-pid_arg->k_inc_d_norm) *differential
    	+ 	pid_val->err_i;												//积分
	
	//保存副本
	pid_val->feedback_old = feedback;
	pid_val->exp_old = expect;
	
	//最重要的就是得出这个输出值
	return (pid_val->out);
}


/******************* (C) COPYRIGHT 2016 ANO TECH *****END OF FILE************/



经过以上代码分析不难得出匿名代码还是对经典PID做了不少优化,也就是我经常称之为的骚操作,我们大可不必对所有代码所有细节都把握的细致入微,因为根本不可能啊,匿名的代码风格实在是令人不敢恭维,各种变量根本分析不出来到底是什么意思,所以只能先从模块上入手,最后从整体上把握,这就是我分析匿名代码的方法,因此上面大致还算是能分析出来,但还是很多情况下对于为什么这么做一无头绪,但是千万记住啊,万变不离其宗,他离不开最基本的PID公式,位置式也好,增量式也好,匿名的代码都是以此为基础的,所以如果匿名的代码看不懂的或者新手的,不妨就替换成你理解的经典PID代码,如果以ADT的思想来处理,把中间各种实现细节拿个黑盒子装起来,只暴露接口,那么只要能实现同样的功能,至于里面是什么还重要吗?

最后,有兴趣比较匿名代码较之经典PID算法优化多少的不妨实现看看,至少不应该比其差吧?

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

代码解读三 文件名“Ano_Pid.c” 的相关文章

随机推荐

  • Ubuntu 20.04.05安装ceres-1.14.0

    1 安装Ceres1 14 0 链接 Ubuntu20 04安装Ceres1 14 0 3 cmake编译ceres遇到的问题 xff08 1 xff09 TBB 问题描述 xff1a Did not find Intel TBB libr
  • ubuntu18.04 安装编译ceres-solver-1.14.0 编译错误

    在Ubuntu18 04 安装Ceres solver 1 14 0 xff0c make时出现了98 Built target bundle adjuster xff0c ecipe for target examples CMakeFi
  • ls-remote -h -t git://github.com/adobe-webplatform/eve.git

    npm WARN deprecated bfj node4 64 5 3 1 Switch to the bfj package for fixes and new features npm WARN deprecated nomnom 6
  • 数据可视化图表插件调研:Echarts、Highcharts、G2、D3

    目前常用于前端网页数据可视化实现的图表插件主要有四款 xff1a Echarts Highcharts G2 D3 xff0c 开发一些产品工具的时候可能会集成这些开源的可视化插件 xff08 这里Highcharts不开源 xff09 1
  • 31岁转行的我

    2011年从一所普通二本师范大学毕业后先后从事了两年的教育工作 xff0c 但都没有挣到钱 xff0c 12年从深圳回到西安 xff0c 参加了几次公务员和事业单位的招考 xff0c 几次因0 1分的微小差距与国家饭碗擦肩而过 后来决定不再
  • git submodule 如何同步更新

    摘要 xff1a git submodule 更新之后 xff0c 如果在父仓库里直接调用 git submodule update init recursive 会发现 子模块的代码不会更新 初学者会很迷惑 xff0c 怎么能把子模块更新
  • egret 入门 初试

    整理的文章 白鹭引擎入门 趁着今天周六 xff0c 把苹果放下一边先 今天早上一醒来就装上了js编辑神器Webstorm xff0c 最近也开始关注了一些移动方面的 js 前端框架 如 谷歌的Angularjs 和 fackbook 的Re
  • Ubuntu 18之vnc连接不上问题(已解决)

    在配置vnc时所以的准备动作已经准备好了 xff0c 该配的文件也配好了 xff0c 但就是一直连接不上 在主机端报time out的错误 xff0c 后来查百度得知vncserver xff1a 1对应5901端口 xff0c 2就是59
  • Matlab R2019a Win64位 迅雷下载链接

    鉴于百度云和PanDownload各种限速 xff0c 所以我特意寻了迅雷磁力链接供大家下载 实在是因为百度云下载只有50 k s xff0c 而迅雷下载5 m s啊 Matlab R2019a Win64位 链接内容包括Matlab和Ca
  • 力扣K神图解算法数据结构解析08

    力扣K神图解算法数据结构点这里 八 位运算 剑指15 xff0c 二进制中1的个数 class Solution public int hammingWeight uint32 t n int cnt 61 0 for int i 61 0
  • 吴军老师《给中学生/大学生的书单》----Yohao整理

    2018 7 27记录 span class hljs code 给中学生的书单 span 一 文学类 18本 span class hljs code 1 金庸和琼瑶各一本 长篇的比短篇的好 span span class hljs co
  • 北航2系921 2021考研历年真题及参考答案(2020-2004)

    需要自取 百度网盘 提取码 xff1a iwbg 关于2020北航921试题 相信大家都听说了 xff0c 2020年的921试题整体难度较2019年小 2019考完后 xff0c 群里面怨声载道 xff0c 信号10年没考电路题了怎么就今
  • 姿态解算

    姿态解算全过程 关于这方面 xff0c 姿态计算的理解大致需要经过以下几个步骤 1 秦永元的 惯性导航 xff0c 不但十分基础而且写的也十分好 xff0c 适合入门 但是并不是所有章节都是需要看的 xff0c 其中1 2节 9 2节和9
  • 匿名飞控代码解读汇总

    由于本人临近毕业 xff0c 所做的毕设是有关无人机方面的 xff0c 所使用的也是匿名的飞控 lt 资料包 20171217 gt xff0c 所以首先需要读懂匿名代码然后才能增加自己的功能 xff0c 临近毕业还有两个月左右 xff0c
  • 融合磁力计的Mahony互补滤波算法

    https blog csdn net qq 21842557 article details 50993809 上面博客有关于磁力计的详细解释 xff0c 不过由于本人资质愚钝 xff0c 至今还不是完全理解 不过思想大致和加速度计差不多
  • 代码解读一 文件名“ANO_Imu.c”

    我把这个文件的所有代码贴上来了 xff0c 供大家参考 xff0c 由于本人水平有限 xff0c 且匿名代码注释比较少 xff0c 所以很多也不是很懂 xff0c 实在是一些莫名的定义太多了 xff0c 什么w x y z h之类的 xff
  • 每周学一点 egret(2): EgretConversion 工具转换ts

    今晚无聊试了一下wing的格式化和这个转换工具 开始的时候我尝试手写翻译 xff0c 发现这一款转换也比较简单 所以尝试做了一下转换 对于如果文件名是中文 要小心一点 总是出现怪怪的 转换后 xff0c 没有直接跳转到对于的目录去 如果加上
  • 代码解读二 文件名“Ano_Math.c”

    这里面都是一些关于数学函数的骚操作 xff0c 既然不使用math h xff0c 那么至少说明这里面的数学函数调用不应比math h里面的函数慢 下面贴出代码 xff0c 简要做了个注释 xff0c 看看就行 至于怎么做的 xff0c 有
  • 关于单级PID及串级PID

    简单记录下我在学习PID过程中遇到的困难及解决方法 xff0c 希望能对大家有所帮助 1 首先 xff0c 关于PID这块理论知识必须非常清楚 xff0c 能够自行推导公式 xff0c 包括位置式PID公式和增量式PID公式 2 实现位置式
  • 代码解读三 文件名“Ano_Pid.c”

    关于PID这部分匿名代码里面有很多 xff0c 此文件是最基础的即单级PID的实现 xff0c 后面的关于速度和角速度环的串级PID及高度和高度速度环的串级PID都是以此为基础的 xff0c 所以此文件内容务必搞懂 C COPYRIGHT