代码解读八 文件名“Ano_FlightCtrl.c”

2023-05-16

这个文件代码有点乱啊,反正没怎么看懂,涉及到一键起飞和降落,以及关于不同任务对应不同的灯光的切换。而且注释也还可以,凑活着看下呗,其实这个并不是什么关键文件,看不懂就算了呗,下一个

#include "Ano_FlightCtrl.h"
#include "Ano_Imu.h"
#include "Drv_icm20602.h"
#include "Ano_MagProcess.h"
#include "Drv_spl06.h"
#include "Ano_MotionCal.h"
#include "Ano_AttCtrl.h"
#include "Ano_LocCtrl.h"
#include "Ano_AltCtrl.h"
#include "Ano_MotorCtrl.h"
#include "Drv_led.h"
#include "Ano_RC.h"
#include "Drv_vl53l0x.h"
#include "Ano_OF.h"



/*PID参数初始化*/
void All_PID_Init(void)
{

	/*姿态控制,角速度PID初始化*/
	Att_1level_PID_Init();
	
	/*姿态控制,角度PID初始化*/
	Att_2level_PID_Init();
	
	/*高度控制,高度速度PID初始化*/
	Alt_1level_PID_Init();	
	
	/*高度控制,高度PID初始化*/
	Alt_2level_PID_Init();
	
	
	/*位置速度控制PID初始化*/
	Loc_1level_PID_Init();
	
}

/*控制参数改变任务*/
//也不知道单独设置外环和内环的KI有什么用

void ctrl_parameter_change_task()
{

	
	if(0)
	{
		Set_Att_2level_Ki(0);
		
	}
	else
	{
		if(flag.auto_take_off_land ==AUTO_TAKE_OFF)
		{

			Set_Att_1level_Ki(2);
		}
		else
		{

			Set_Att_1level_Ki(1);
		}
		
		Set_Att_2level_Ki(1);
	}
}


/************************************************************************************************************
*************************************************************************************************************
*************************************************************************************************************
*************************************************************************************************************
*************************************************************************************************************/


/*一键翻滚(暂无)*/
void one_key_roll()
{

			if(flag.flying && flag.auto_take_off_land == AUTO_TAKE_OFF_FINISH)
			{	
				if(rolling_flag.roll_mode==0)
				{
					rolling_flag.roll_mode = 1;
					
				}
			}
}

static u16 one_key_taof_start;									//感觉像是一个CNT和FLAG

/*一键起飞任务(主要功能为延迟)*/
void one_key_take_off_task(u16 dt_ms)
{
	if(one_key_taof_start != 0)									//如过不为0那么必然是解锁了,见下面一键起飞函数
	{
		one_key_taof_start += dt_ms;							//延迟,等待至大于1400
		
		
		if(one_key_taof_start > 1400 && flag.motor_preparation == 1)
		{														//如果大于1400且电机准备好
			one_key_taof_start = 0;								//清0
				if(flag.auto_take_off_land == AUTO_TAKE_OFF_NULL)		
																//如果还尚未执行自动启飞任务
				{
					flag.auto_take_off_land = AUTO_TAKE_OFF;					
																//执行自动启飞任务
																//解锁、起飞

					flag.taking_off = 1;						//起飞
				}
			
		}
	}
	

}

//下面两个函数被上面函数调用
/*一键起飞*/
void one_key_take_off()
{
	if(flag.unlock_en)
	{	
		one_key_taof_start = 1;
		flag.fly_ready = 1;
	}
}
/*一键降落*/
void one_key_land()
{
	flag.auto_take_off_land = AUTO_LAND;
}



/************************************************************************************************************
*************************************************************************************************************
*************************************************************************************************************
*************************************************************************************************************
*************************************************************************************************************/





_flight_state_st fs;

s16 flying_cnt,landing_cnt;

extern s32 ref_height_get;

float stop_baro_hpf;

/*降落检测*/

static s16 ld_delay_cnt ;
void land_discriminat(s16 dT_ms)
{
//	static s16 acc_delta,acc_old;
	
//	acc_delta = imu_data.w_acc[Z]- acc_old;
//	acc_old = imu_data.w_acc[Z];
	
	/*油门归一值小于0.1并且垂直方向加速度小于阈值  或者启动自动降落*/
	if((fs.speed_set_h_norm[Z] < 0.1f && imu_data.w_acc[Z]<200) || flag.auto_take_off_land == AUTO_LAND)
	{
		if(ld_delay_cnt>0)
		{
			ld_delay_cnt -= dT_ms;
		}
	}
	else
	{
		ld_delay_cnt = 200;
	}
	
	/*意义是:如果向上推了油门,就需要等垂直方向加速度小于200cm/s2 保持200ms才开始检测*/	
	if(ld_delay_cnt <= 0 && (flag.thr_low || flag.auto_take_off_land == AUTO_LAND) )
	{
		/*油门最终输出量小于250并且没有在手动解锁上锁过程中,持续1秒,认为着陆,然后上锁*/
		if(mc.ct_val_thr<250 && flag.fly_ready == 1 && flag.locking != 2)//ABS(wz_spe_f1.out <20 ) //还应当 与上速度条件,速度小于正20厘米每秒。
		{
			if(landing_cnt<1500)
			{
				landing_cnt += dT_ms;
			}
			else
			{

				flying_cnt = 0;
				flag.taking_off = 0;
				///
					landing_cnt =0;	
					flag.fly_ready =0;				

				flag.flying = 0;

			}
		}
		else
		{
			landing_cnt = 0;
		}
			
		
	}
	else
	{
		landing_cnt  = 0;
	}

}


/*飞行状态任务*/

void Flight_State_Task(u8 dT_ms,s16 *CH_N)
{
	s16 thr_deadzone;
	static float max_speed_lim;
	/*设置油门摇杆量*/
	thr_deadzone = (flag.wifi_ch_en != 0) ? 0 : 50;
	fs.speed_set_h_norm[Z] = my_deadzone(CH_N[CH_THR],0,thr_deadzone) *0.0023f;
	fs.speed_set_h_norm_lpf[Z] += 0.2f *(fs.speed_set_h_norm[Z] - fs.speed_set_h_norm_lpf[Z]);
	
	/*推油门起飞*/
	if(flag.fly_ready)
	{	
		if(fs.speed_set_h_norm[Z]>0.01f && flag.motor_preparation == 1) // 0-1
		{
			flag.taking_off = 1;
		}	
	}		
	
	if(flag.taking_off)
	{
			
		if(flying_cnt<1000)//800ms
		{
			flying_cnt += dT_ms;
		}
		else
		{
			/*起飞后1秒,认为已经在飞行*/
			flag.flying = 1;  
		}
		
		if(fs.speed_set_h_norm[Z]>0)
		{
			/*设置上升速度*/
			fs.speed_set_h[Z] = fs.speed_set_h_norm_lpf[Z] *MAX_Z_SPEED_UP;
		}
		else
		{
			/*设置下降速度*/
			fs.speed_set_h[Z]  = fs.speed_set_h_norm_lpf[Z] *MAX_Z_SPEED_DW;
		}
	}
	else
	{
		fs.speed_set_h[Z] = 0 ;
	}
	float speed_set_tmp[2];
	/*速度设定量,正负参考ANO坐标参考方向*/
	fs.speed_set_h_norm[X] = (my_deadzone(+CH_N[CH_PIT],0,50) *0.0022f);
	fs.speed_set_h_norm[Y] = (my_deadzone(-CH_N[CH_ROL],0,50) *0.0022f);
		
	LPF_1_(3.0f,dT_ms*1e-3f,fs.speed_set_h_norm[X],fs.speed_set_h_norm_lpf[X]);
	LPF_1_(3.0f,dT_ms*1e-3f,fs.speed_set_h_norm[Y],fs.speed_set_h_norm_lpf[Y]);
	
	max_speed_lim = MAX_SPEED;
	
	if(switchs.of_flow_on)
	{
		max_speed_lim = 1.5f *wcz_hei_fus.out;
		max_speed_lim = LIMIT(max_speed_lim,50,150);
	}	
	
	speed_set_tmp[X] = max_speed_lim *fs.speed_set_h_norm_lpf[X];
	speed_set_tmp[Y] = max_speed_lim *fs.speed_set_h_norm_lpf[Y];
	

	
	length_limit(&speed_set_tmp[X],&speed_set_tmp[Y],max_speed_lim,fs.speed_set_h_cms);

	fs.speed_set_h[X] = fs.speed_set_h_cms[X];
	fs.speed_set_h[Y] = fs.speed_set_h_cms[Y];	
	
	/*调用检测着陆的函数*/
	land_discriminat(dT_ms);
	
	/*倾斜过大上锁*/
	if(rolling_flag.rolling_step == ROLL_END)
	{
		if(imu_data.z_vec[Z]<0.25f)//75度  *************************** 倾斜过大上锁,慎用。
		{

			flag.fly_ready = 0;
		}

	}	
		//
	/*校准中,复位重力方向*/
	if(sensor.gyr_CALIBRATE != 0 || sensor.acc_CALIBRATE != 0 ||sensor.acc_z_auto_CALIBRATE)
	{
		imu_state.G_reset = 1;
	}
	
	/*复位重力方向时,认为传感器失效*/
	if(imu_state.G_reset == 1)
	{
		flag.sensor_ok = 0;
		WCZ_Data_Reset(); //复位高度数据融合
	}
	else if(imu_state.G_reset == 0)
	{	
		if(flag.sensor_ok == 0)
		{
			flag.sensor_ok = 1;
			ANO_DT_SendString("IMU OK!",sizeof("IMU OK!"));
		}
	}
	
	/*飞行状态复位*/
	if(flag.fly_ready == 0)
	{
		flag.flying = 0;
		landing_cnt = 0;
		flag.taking_off = 0;
		flying_cnt = 0;
		
		//复位融合
		if(flag.taking_off == 0)
		{
//			wxyz_fusion_reset();
		}
	}
	

}


/*********************************************************************************************
**********************************************************************************************
*********************************************************************************************/

//不同飞行模式对应不同的灯光
static void LED_Switch()
{
	if( (LED_state != 0 && LED_state <= 115) )
	{
		return;
	}
	//姿态稳定
	if(flag.flight_mode == ATT_STAB)
	{
		if(flag.fly_ready)
		{
			LED_state = 131;
		}
		else
		{
			LED_state = 121;
		}
	}
	//位置保持
	else if(flag.flight_mode == LOC_HOLD)
	{
		if(flag.fly_ready)
		{
			LED_state = 132;
		}
		else
		{
			LED_state = 122;
		}		
	}
	//回航
	else if(flag.flight_mode == RETURN_HOME)
	{
		if(flag.fly_ready)
		{
			LED_state = 133;
		}
		else
		{
			LED_state = 123;
		}	
	}

}

/*********************************************************************************************
**********************************************************************************************
*********************************************************************************************/


static u8 of_light_ok;
static u16 of_light_delay;

//状态任务切换函数 与光流有关
//通过识别状态标志位来切换灯光
void Swtich_State_Task(u8 dT_ms)
{
	switchs.baro_on = 1;
	

	if(sens_hd_check.of_ok)//光流模块
	{
		if(OF_LIGHT>20 || flag.flying == 0) //光流亮度大于20或者在飞行之前,认为光流可用,判定可用延迟时间为1秒
		{
			if(of_light_delay<1000)
			{
				of_light_delay += dT_ms;
			}
			else
			{
				of_light_ok = 1;
			}
		}
		else
		{
			of_light_delay =0;
			of_light_ok = 0;
		}
		
		if(OF_ALT<1900 && flag.flight_mode == LOC_HOLD)
		{		
			if(of_light_ok)
			{
				if(switchs.of_flow_on == 0)
				{
					LED_state = 13 ;//切换指示触发1下(1闪蓝)
				}
				switchs.of_flow_on = 1;
			}
			else
			{
				if(switchs.of_flow_on )
				{
					LED_state = 23 ;//切换指示触发1下(1闪红)
				}
				switchs.of_flow_on = 0;
			}
			
			if(switchs.of_tof_on == 0)
			{
				LED_state = 14 ;//切换指示触发1下(2闪蓝)
			}
			switchs.of_tof_on = 1;
		}
		else
		{
			if(switchs.of_tof_on )
			{
				LED_state =  24 ;//切换指示触发1下(2闪红)
			}
			switchs.of_tof_on = 0;
			
			
			switchs.of_flow_on = 0;
		}			
	}
	
	if(sens_hd_check.tof_ok)//激光模块
	{
		if(tof_height_mm<1900)
		{
			if(switchs.tof_on == 0)
			{
				LED_state = 14 ;//切换指示触发1下(2闪蓝)
			}
			switchs.tof_on = 1;
		}
		else
		{
			if(switchs.tof_on )
			{
				LED_state = 24 ;//切换指示触发1下(2闪红)
			}
			switchs.tof_on = 0;
		}
	}

}



/*********************************************************************************************
**********************************************************************************************
*********************************************************************************************/


static void Speed_Mode_Switch()
{
//	if( ubx_user_data.s_acc_cms > 60)// || ubx_user_data.svs_used < 6)
//	{
//		flag.speed_mode = 0;
//	}
//	else
//	{
//		flag.speed_mode = 1;
//	}

}

u8 speed_mode_old = 255;
u8 flight_mode_old = 255;


void Flight_Mode_Set(u8 dT_ms)
{
	LED_Switch();
	Speed_Mode_Switch();

	
	if(speed_mode_old != flag.speed_mode) //状态改变
	{
		speed_mode_old = flag.speed_mode;
		
		if(flag.speed_mode == 1)
		{
			LED_state = 13;
		}
		else if(flag.speed_mode == 2)
		{
			LED_state = 14;
		}
		else
		{
			LED_state = 15;
		}
		
		//xy_speed_pid_init(flag.speed_mode);
	}

///
	
	//涉及到五通道,即一键起飞/降落
	if(CH_N[AUX1]<-200)
	{
		flag.flight_mode = ATT_STAB;
	}
	else if(CH_N[AUX1]<200)
	{
		flag.flight_mode = LOC_HOLD;
	}
	else
	{
		flag.flight_mode = LOC_HOLD;
	}
	
	
	if(flight_mode_old != flag.flight_mode) //状态改变
	{
		flight_mode_old = flag.flight_mode;
		


	}
}


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

代码解读八 文件名“Ano_FlightCtrl.c” 的相关文章

  • 直线型一阶倒立摆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
  • 代码解读五 文件名“Ano_LocCtrl.c”

    关于这个位置速度环我还不是很理解 xff0c 因为单凭这一个文件确实看不出来什么东西 xff0c 这并不像角度环和角速度环一样有丰富的理论支撑 xff0c 至少我现在还没看到 xff0c 可能是我水平不够额 xff0c 但这并不妨碍我们继续
  • 代码解读七 文件名“Ano_MotorCtrl.c

    本文件比较简单 xff0c 代码比较少 xff0c 主要涉及解锁后四个电机依次1 2 3 4转动 xff0c 然后四轴也不会飞 xff0c 只是在原地轻微转动 xff0c 随后需要逐渐加油门至50 到达临界点 xff0c 稍微往上推一点 x
  • 代码解读八 文件名“Ano_FlightCtrl.c”

    这个文件代码有点乱啊 xff0c 反正没怎么看懂 xff0c 涉及到一键起飞和降落 xff0c 以及关于不同任务对应不同的灯光的切换 而且注释也还可以 xff0c 凑活着看下呗 xff0c 其实这个并不是什么关键文件 xff0c 看不懂就算