代码解读六 文件名“Ano_AltCtrl.c”

2023-05-16

写了一大堆,也不知道对不对,贴上来让大家看看

#include "Ano_AltCtrl.h"			//高度控制	
#include "Ano_Imu.h"
#include "Drv_icm20602.h"
#include "Ano_MagProcess.h"
#include "Drv_spl06.h"
#include "Ano_MotionCal.h"			//运动计算
#include "Ano_FlightCtrl.h"			//飞行控制
#include "Ano_MotorCtrl.h"			//电机控制
#include "Ano_AttCtrl.h"			//姿态控制
#include "Ano_LocCtrl.h"			//位置控制

//自动起飞速度
static s16 auto_taking_off_speed;

#define AUTO_TAKE_OFF_KP 2.0f
extern _filter_1_st wz_spe_f1;



/**************************************************************************************************
***************************************************************************************************
**************************************************************************************************/
//硬生生没看懂这个一键起飞任务,只能盲目翻译了下
//自动启飞降落任务
void Auto_Take_Off_Land_Task(u8 dT_ms)
{
	static u16 take_off_ok_cnt;
	
	//执行一键起飞任务
	one_key_take_off_task(dT_ms);
	
	if(flag.fly_ready)				//如果已经准备好了
	{
		if(flag.taking_off)			//如果可以起飞
		{	
			if(flag.auto_take_off_land == AUTO_TAKE_OFF_NULL)	//如果尚未自动启飞
			{
				flag.auto_take_off_land = AUTO_TAKE_OFF;				//起飞
			}	
		}

	}
	else
	{
		auto_taking_off_speed = 0;	
		flag.auto_take_off_land = AUTO_TAKE_OFF_NULL;	
	}

	
	if(flag.auto_take_off_land ==AUTO_TAKE_OFF)						//接上,如果起飞,
	{

		take_off_ok_cnt += dT_ms;														//延迟等待至2500
		auto_taking_off_speed = AUTO_TAKE_OFF_KP *(Ano_Parame.set.auto_take_off_height - wcz_hei_fus.out);
		auto_taking_off_speed = LIMIT(auto_taking_off_speed,0,150);
																												//得到速度并进行限幅
		if(take_off_ok_cnt>=2500 || (Ano_Parame.set.auto_take_off_height - wcz_hei_fus.out <5))//(auto_ref_height>AUTO_TAKE_OFF_HEIGHT)
		{																										//如果cnt>2500或者是期望高度和实际高度误差在允许范围内
			flag.auto_take_off_land = AUTO_TAKE_OFF_FINISH;		//自动启飞完成
			
			
		}

		if(take_off_ok_cnt >1000 && ABS(fs.speed_set_h_norm[Z])>0.1f)// 一定已经taking_off
		{
			flag.auto_take_off_land = AUTO_TAKE_OFF_FINISH;		//自动启飞完成
		}
	
	}
	else 
	{
		take_off_ok_cnt = 0;
		
		if(flag.auto_take_off_land ==AUTO_TAKE_OFF_FINISH)	//接上 如果自动启飞完成
		{
			auto_taking_off_speed = 0;												//起飞速度为0
			
		}
		
	}

	
	if(flag.auto_take_off_land == AUTO_LAND)							//如果自动降落
	{
		auto_taking_off_speed = -60;												//减速

	}
}



/**************************************************************************************************
***************************************************************************************************
**************************************************************************************************/
	
//Altitude	高度
//Attitude	姿态
//区分清楚


//	2->外环高度环
//	1->内环高度速度环

/*此部分也是使用串级PID,外环是高度环,内环是高度速度环,和角度环和角速度环进行对比
很容易分析清楚,只不过那个是三个参数,这个只有一个参数。
很明显,这个串级PID对应的是油门 Thr,在上一篇中讲到过,四个通道应该分别对应一个PID
其中三个欧拉角每个对应一个通道,唯独缺了油门,于是乎,高度环与高度速度环补上了这个遗憾
*/





//同样是来自文件"Ano_Pid.h"中的结构体,一看到这里,基本上我们就可以确定后面必然有"Ano_Pid.c"
//中的PID函数,这个结构体定义为PID函数提供了两个入口参数,起到初始化作用,和上一篇介绍串级PID
//完全一个套路
_PID_arg_st alt_arg_2;
_PID_val_st alt_val_2;





/*高度环PID参数初始化*/
//为后面调用PID函数做铺垫
void Alt_2level_PID_Init()
{
	alt_arg_2.kp = Ano_Parame.set.pid_alt_2level[KP];
	alt_arg_2.ki = Ano_Parame.set.pid_alt_2level[KI];
	alt_arg_2.kd_ex = 0.00f;
	alt_arg_2.kd_fb = Ano_Parame.set.pid_alt_2level[KD];
	alt_arg_2.k_ff = 0.0f;

}


//先写外环,为什么呢?
//一个理由,外环的输出即为内环的输入





//外环高度环控制
//引用位置速度环中的loc_ctrl_2结构体
void Alt_2level_Ctrl(float dT_s)
{
	Auto_Take_Off_Land_Task(1000*dT_s);
	
	//这个速度 = ?速度 + 自动启飞速度
	fs.alt_ctrl_speed_set = fs.speed_set_h[Z] + auto_taking_off_speed;
	
	//wcz的输出给了外环反馈 wcz一直没看懂什么意思
	//这里使用了“Ano_LocCtrl.c”中提到的loc_ctrl_2 结构体,很重要啊,
	//因为此文件里面的期望和反馈都是来自“Ano_LocCtrl.c”文件中的loc_ctrl_2/loc_ctrl_1 结构体
	loc_ctrl_2.fb[Z] = wcz_hei_fus.out;
	
	//如果这个速度不为0,则认为还未到达期望的高度,则标志置0
	if(fs.alt_ctrl_speed_set != 0)
	{
		flag.ct_alt_hold = 0;
	}
	else
	{
		//如果期望与反馈的的数值之差限制在一定程度之内,那么我们就认为目的基本达到,
		//即认为现实高度已到达期望高度,标志置1
		if(ABS(loc_ctrl_1.exp[Z] - loc_ctrl_1.fb[Z])<20)
		{
			flag.ct_alt_hold = 1;
		}
	}

	//如果已经成功起飞
	if(flag.taking_off == 1)
	{
		//如果现实高度已到达期望高度,就执行PID函数
		if(flag.ct_alt_hold == 1)
		{
			
			//这个函数的期待和反馈都是来自文件“Ano_LocCtrl.c”中的,如上
			//参数结构体和数据结构体是来自上述介绍过的
			//期望值不再是之前说的遥控器的打杆值了,反馈值很可能就是气压计和加速度计
			//融合后测得的数据得来的
			PID_calculate( dT_s,          							    //周期(单位:秒)
						0,												//前馈值
						loc_ctrl_2.exp[Z],								//期望值(设定值)
						loc_ctrl_2.fb[Z],								//反馈值()
						&alt_arg_2, 									//PID参数结构体
						&alt_val_2,										//PID数据结构体
						100,											//积分误差限幅
						0												//integration limit,积分限幅									
						 );
		}
		else  
		{
			//如果高度未达到,期望=反馈+误差,不过这个有什么意思呢?
			//我们一般都是为了得出误差,这里求出期望?误差哪里来?
			loc_ctrl_2.exp[Z] = loc_ctrl_2.fb[Z] + alt_val_2.err;
		}
	}
	else 
	{
		//未成功起飞 期望=反馈 ? 误差为0? 这两个else到底是要干嘛?
		loc_ctrl_2.exp[Z] = loc_ctrl_2.fb[Z];
		alt_val_2.out = 0;
		
	}
	//输出限幅,最终还不是为了得出外环输出,以便做内环输入
	alt_val_2.out  = LIMIT(alt_val_2.out,-150,150);
}



//结构体,如上
_PID_arg_st alt_arg_1;
_PID_val_st alt_val_1;


//内环参数初始化,为下面PID函数做准备
/*高度速度环PID参数初始化*/
void Alt_1level_PID_Init()
{
	alt_arg_1.kp = Ano_Parame.set.pid_alt_1level[KP];
	alt_arg_1.ki = Ano_Parame.set.pid_alt_1level[KI];
	alt_arg_1.kd_ex = 0.00f;
	alt_arg_1.kd_fb = Ano_Parame.set.pid_alt_1level[KD];
	alt_arg_1.k_ff = 0.0f;

}

//static u8 thr_start_ok;
static float err_i_comp;


//重要
//内环高度速度环控制
//引用位置速度环中的loc_ctrl_1变结构体
void Alt_1level_Ctrl(float dT_s)
{
	u8 out_en;
	
	//标志位,成功起飞就输出使能
	out_en = (flag.taking_off != 0) ? 1 : 0;
	
	//油门模式为自动
	flag.thr_mode = THR_AUTO;//THR_MANUAL;
	
	//内环的期望 = 这个速度 + 外环的输出
	loc_ctrl_1.exp[Z] = fs.alt_ctrl_speed_set + alt_val_2.out;
	
	if(0) //(flag.thr_mode == THR_MANUAL)
	{
		loc_ctrl_1.fb[Z] = 0;
	}
	else
	{		
		
		//这个wcz一直没看懂什么意思,但是这里获取到了反馈值用作内环反馈
		loc_ctrl_1.fb[Z] = wcz_spe_fus.out;
	}
	
	//调用PID函数,内环期望值和反馈值都是来自“Ano_LocCtrl.c”中的,如上
	//同样引用上述结构体
	//内环期望值很明显,外环输出已经作用,内环反馈如上外环反馈,原理应该都差不多
	PID_calculate( dT_s,            								//周期(单位:秒)
					0,												//前馈值
					loc_ctrl_1.exp[Z],								//期望值(设定值)
					loc_ctrl_1.fb[Z] ,								//反馈值()
					&alt_arg_1, 									//PID参数结构体
					&alt_val_1,										//PID数据结构体
					100,											//积分误差限幅
					(THR_INTE_LIM *10 - err_i_comp)*out_en			//integration limit,积分限幅									
					 );
	
	//如果起飞就进行低通滤波
	if(flag.taking_off == 1)
	{
		LPF_1_(1.0f,dT_s,THR_START *10,err_i_comp);//err_i_comp = THR_START *10;			
	}
	else
	{
		err_i_comp = 0;
	}
	//高度内环输出进行限幅
	alt_val_1.out = LIMIT(alt_val_1.out,-err_i_comp,MAX_THR *10);
	
	//高度内环输出最终转化为位置速度环的输出
	loc_ctrl_1.out[Z] = out_en *FINAL_P *(alt_val_1.out + err_i_comp - 0.2f *imu_data.w_acc[Z]);
	
	//最后转化为油门控制量
	mc.ct_val_thr = loc_ctrl_1.out[Z];
}


整个流程也还算是比较清晰,高度环和高度速度环,外环是高度,内环是高度速度,高度和高度速度可以通过融合气压计和加速度计的数据得到,因此不难画出其串级PID图,类似角速度和角加速度一样。只是代码实现的有点曲折,期望的得到也没那么直接,油门只能靠增量而无法像三个欧拉角一样,可以靠打杆的多少实现绝对的运动,总不能说我飞行的总高度是一定的吧,打杆打多少就飞到空中多少,之前一直不是很理解因而一直炸鸡。
总结下,高度环期望和反馈都是来自位置速度环,外环输出作为内环输入,同时内环反馈也是来自位置速度环,最后内环输出又给了位置速度环的输出,最后转化为油门控制量。
先写这么多吧,有点心累…

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

代码解读六 文件名“Ano_AltCtrl.c” 的相关文章

  • 导出TensorBoard中的所有数据并平滑处理

    点击此处 tensorboard平滑曲线代码
  • RL论文数据图绘制

    rl plotter 强化学习论文里的训练曲线是用什么画的 xff1f 如何计算相关变量
  • 强化学习之美

    强化学习作为一门灵感来源于心理学中的行为主义理论的学科 xff0c 其内容涉及概率论 统计学 逼近论 凸分析 计算复杂性理论 运筹学等多学科知识 xff0c 难度之大 xff0c 门槛之高 xff0c 导致其发展速度特别缓慢 随着近年来以
  • 直线型一阶倒立摆2---建模

    三 直线型一阶倒立摆模型建立 一级倒立摆系统是一个不稳定的系统 xff0c 需要对其进行机理建模 在研究过程中 xff0c 应忽略空气摩擦 等 xff0c 而后可将倒立摆系统进行抽象化 xff0c 认为其由小车和匀质刚性杆两部分组成并对这两
  • 可用性和可靠性的区别

    首先 xff0c 这两个属性都是质量 xff08 可维护性 xff09 的一部分 按照书上的定义 xff0c 可靠性 xff08 reliability xff09 xff1a 在规格时间间隔内和规定条件下 xff0c 系统或部件执行所要求
  • 直线型一阶倒立摆3---控制器设计

    四 控制器设计 如前文所述 xff0c 倒立摆状态空间方程表明系统能够被控制 被观测 倒立摆或者其它受控系统达到受控稳定状态 xff0c 其实质上是指系统的各状态量收敛至一目标稳定值 对于状态空间描述而言 xff0c 系统矩阵A的特征值为负
  • Centos7 关闭防火墙

    Centos7 关闭防火墙 CentOS 7 0默认使用的是firewall作为防火墙 xff0c 使用iptables必须重新设置一下 1 直接关闭防火墙 systemctl stop firewalld service 停止firewa
  • 485无线通信/数传模块_zigbee模块_RS485转ZigBee_顺舟智能

    一 概述 顺舟智能 SZ02系列 ZigBee无线串口通信设备 xff08 485无线通信 数传设备 xff09 xff0c 采用了加强型的ZigBee无线技术 xff0c 集成了符合 ZIGBEE协议的射频收发器和微处理器 xff0c 符
  • 华清远见嵌入式学院学员实践项目案例介绍一

    基于GPRS的远程安防监控系统 1 项目背景 随着现代电力电子技术和微电子技术的迅猛发展 xff0c 自动化 xff0c 智能化程度的不断的提高 xff0c 家居安防技术正在不断发展 传统的家居安防系统已经越来越不能满足现代人的需求 消费者
  • 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
  • 代码解读四 文件名“Ano_AttCtrl.c”

    这部分是关于匿名串级PID的 xff0c 我觉得有需要的同学可以直接移植 xff0c 不需要自己写了 xff0c 确实有点麻烦 xff0c 基本上代码里面都注释的很清楚了 xff0c 且由于本人水平有限 xff0c 所以也不是都很懂 xff
  • 代码解读六 文件名“Ano_AltCtrl.c”

    写了一大堆 xff0c 也不知道对不对 xff0c 贴上来让大家看看 include 34 Ano AltCtrl h 34 高度控制 include 34 Ano Imu h 34 include 34 Drv icm20602 h 34