代码解读三 文件名“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” 的相关文章

  • PID算法,计算的是差值,是差值

    typedef struct float Kp 比例系数Proportional float Ki 积分系数Integral float Kd 微分系数Derivative float Ek 当前误差 float Ek1 前一次误差 e k
  • 关于ARM_math数学库的使用

    关于ARM math数学库的使用 ARM math好强大的好吧 话不多说 请看截图 各种数学库看到没有 好强大的说 其实使用这些写函数 最快上手的方法就是看官方手册 话不多说 上官方链接arm math库的官网 举个栗子 一般步骤 1 首先
  • 工程实践---ZN法整定PID

    工程实践 ZN法整定PID 知乎 zhihu com
  • FPGA实现电机转速PID控制

    通过纯RTL实现电机转速PID控制 包括电机编码器值读取 电机速度 正反转控制 PID算法 卡尔曼滤波 最终实现对电机速度进行控制 使其能够渐近设定的编码器目标值 一 设计思路 前面通过SOPC之NIOS 实现电机转速PID控制 调用中断函
  • PID控制原理解释

    PID控制原理解释 文章目录 PID控制原理解释 0 前言 1 控制原理图解释 2 算法分析 3 PID数学模型解释 4 调参技巧说明 0 前言 参考网址 http blog gkong com liaochangchu 117560 as
  • 端口被占用怎么办?关闭占用端口的进程

    当你发现某个端口被占用时 但不知道是哪一个进程占用了端口 需要关闭占用该端口的进程 1 启动系统命令行 windows系统 win r 2 输入命令 netstat ano 可查看所有端口的使用情况 netstat aon findstr
  • 1_simulink简单入门_simulink仿真PID控制

    1 simulink简单入门 simulink仿真PID控制 2 simulink搭建RCL 电阻电感电容模块 毕业前想去做物联网还是或者linux 结果玩了一年多的电机控制 早就深知matlab simulink绕不过的 拖到现在 下班晚
  • 【平衡小车制作】(一)硬件原理图讲解(超详解)

    大家好 我是小政 之后的一系列文章我将介绍我玩平衡小车的过程以及遇到的一些问题 将这些内容记录下来分享给大家 也让大家少走一些弯路 接下来我将从硬件框架选择 软件编程 PID算法 PID调参 蓝牙遥控这五个部分向大家讲解平衡小车的制作过程
  • 在 Unix 环境中检测过时的 pid 文件

    在 Unix 环境中检测陈旧 pid 文件的标准 跨平台方法是什么 假设我想终止应用程序的旧实例 但如果该应用程序已经退出 我当然不想破坏具有相同 PID 的不相关进程 现在我找到了一种在我的 Ubuntu 也可能是其他基于 GNU Lin
  • 在Qt中fork后获取进程的PID

    我正在创建一个成功分叉的 Qt C 控制台应用程序 当我在 fork 之前调用 QCoreApplication applicationPid 然后在 fork 之后 在子进程中 调用 QCoreApplication applicatio
  • 什么是 .pid 文件以及它包含什么?

    我最近遇到了一个扩展名为 pid 的文件 并查看了它的内部 但没有找到太多内容 这文档 says Pid 文件是包含进程标识号 pid 的文件 该文件存储在文件系统的明确定义位置 从而允许其他程序找到正在运行的脚本的 pid 任何人都可以对
  • 将手柄传递到管道中

    说我有 node foo js node bar js 有没有办法将 foo 的标准输入句柄传递给 bar js 我有一个罕见的情况 我想在管道中进行向后通信 至少我知道我可以发送node bar js的pidnode foo js 鉴于
  • 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
  • os.kill 没有引发 OSError,但是我没有看到给定的 pid 正在运行

    在我的 ubuntu 服务器上运行以下命令 python c import os os kill 5555 0 这样做是为了查看 pid 5555 是否正在运行 根据我的理解 如果 pid 没有运行 这应该会引发 OSError 这不会对我
  • 确定监听某个端口的进程pid

    正如标题所示 我正在运行多个游戏服务器 并且每个服务器都有相同的name但不同PID和port数字 我想匹配PID正在监听某个端口的服务器 然后我想终止这个进程 我需要它来完成我的 bash 脚本 这可能吗 因为在网上还没有找到解决方案 您
  • fork()返回0,但是子进程getpid()!=0。为什么?

    这是测试 fork 系统调用的 C 代码 include
  • Process.start() 启动的进程返回错误的进程 ID?

    我正在使用以下代码启动可执行文件 Process proc new Process proc StartInfo FileName executablePath proc Start proc WaitForInputIdle 在这次通话之
  • 如何在bash中列出所有后台pid

    要么我无法正确表达我的搜索 要么答案不容易找到 但我正在尝试找出如何列出我的所有后台任务 PID 例如 到目前为止 我发现要列出我们使用的最后一个 PID 但现在我想列出之前任务的 PID 如果存在 但我找不到如何做到这一点 最终我想列出我

随机推荐

  • 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