匿名无人机代码FlightCtrl简单分析

2023-05-16

这个flightCtrl文件,是真的很长又很难。。。各种标志位啊,判断啊,开关啊,逻辑判断啊什么的,趁通宵把代码梳理一遍。

这个文件里的函数虽不算最多,但引用的头文件相当多,也就是说这个东西跟整个系统各个部分都有关系,难度也就最大。。。不过仔细看应该还是能看懂的,就是费点时间。

1、pid初始化:

void All_PID_Init(void)
{

	Att_1level_PID_Init();

	Att_2level_PID_Init();

	Alt_1level_PID_Init();	

	Alt_2level_PID_Init();

	Loc_1level_PID_Init();
	
}

正好一共五个环。。。

2、控制参数改变任务:

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);
	}
}

如果这个东西是这个,flag.auto_take_off_land ==AUTO_TAKE_OFF,那么就这样,否则就那样。。。仍然是调参,不知怎么用。

3、有关一键起飞

    static u16 one_key_taof_start;
               //主要功能为延时
    void one_key_take_off_task(u16 dt_ms)
    {
    	if(one_key_taof_start != 0)
    	{
    		one_key_taof_start += dt_ms;
    		
    		
    		if(one_key_taof_start > 1400 && flag.motor_preparation == 1)
    		{
    			one_key_taof_start = 0;
    				if(flag.auto_take_off_land == AUTO_TAKE_OFF_NULL)
    				{
					flag.auto_take_off_land = AUTO_TAKE_OFF;
					//解锁、起飞
    
    					flag.taking_off = 1;
    				}
    			
    		}
    	}
    	//reset
    	if(flag.unlock_sta == 0)
    	{
    		one_key_taof_start = 0;
    	}
    
    }
  //一键起飞
    void one_key_take_off()
    {
    	if(flag.unlock_err == 0)
    	{	
    		if(flag.auto_take_off_land == AUTO_TAKE_OFF_NULL && one_key_taof_start == 0)
    		{
    			one_key_taof_start = 1;
    			flag.unlock_cmd = 1;
    		}
    	}
    }

有关一键起飞的内容,具体来讲是这样的:
1、在高度控制环void Alt_2level_Ctrl(float dT_s)中,
会自动调用自动起飞降落任务:void Auto_Take_Off_Land_Task(u8 dT_ms)

2、这个任务又会调用一键起飞任务:one_key_take_off_task(dT_ms),同时如果此时flag.unlock_sta置位、flag.taking_off置位、flag.auto_take_off_land == AUTO_TAKE_OFF_NULL状态为起飞无效,那么就把auto_take_off_land设置为起飞,再后面会判断这个auto_take_off_land,如果是起飞,就赋值一个速度让它起飞,并且定时退出。
3、那么什么时候这些标志位会符合条件呢?就在它调用的one_key_take_off_task(dT_ms)里。在这个任务里,如果one_key_taof_start为1,那么就延时一段时间,然后使得
flag.taking_off = 1;flag.auto_take_off_land = AUTO_TAKE_OFF;
也就满足了刚刚的条件,也就可以起飞。
4、又是什么时候one_key_taof_start为1?就由我们来控制了。我们调用void one_key_take_off(),就可以了。。。

确实有点复杂。。。

4、降落判别:

void land_discriminat(s16 dT_ms)

也就是说判断什么时候该降落的函数。

if((fs.speed_set_h_norm[Z] < 0.1f) || flag.auto_take_off_land == AUTO_LAND)
{
	if(ld_delay_cnt>0)
	{
		ld_delay_cnt -= dT_ms;
	}
}
else
{
	ld_delay_cnt = 200;
}

如果油门值持续小于0.1,或者启动了自动降落,那么就计数。

if(ld_delay_cnt <= 0 && (flag.thr_low || flag.auto_take_off_land == AUTO_LAND) )
{
	
	if(mc.ct_val_thr<250 && flag.unlock_sta == 1 && flag.locking != 2)//ABS(wz_spe_f1.out <20 ) 
	{
		if(landing_cnt<1500)
		{
			landing_cnt += dT_ms;
		}
		else
		{

			flying_cnt = 0;
			flag.taking_off = 0;
			
				landing_cnt =0;	
				flag.unlock_cmd =0;				

			flag.flying = 0;

		}
	}
	else
	{
		landing_cnt = 0;
	}

}

计数完成后,且油门为低或者启动了自动降落,那么如果此时状态为:油门小于250,且解锁了,且并未在上锁的过程中,那么这个状态持续1.5s后:
flag.taking_off = 0;起飞标志位清零
flag.unlock_cmd =0; 锁定命令有效

5、void Flight_State_Task(u8 dT_ms,s16 *CH_N)
这个会在主函数里轮询。

    s16 thr_deadzone;
    static float max_speed_lim,vel_z_tmp[2];
        //设置油门摇杆量
    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.5f *(fs.speed_set_h_norm[Z] - fs.speed_set_h_norm_lpf[Z]);

得到代表遥控油门的数据。

if(flag.unlock_sta)
{	
	if(fs.speed_set_h_norm[Z]>0.01f && flag.motor_preparation == 1) // 0-1
	{
		flag.taking_off = 1;
	}	
}		

如果解锁了,那么有摇杆量、且电机准备好了的时候,taking_off,表示起飞了。

if(flag.taking_off)
{
		
	if(flying_cnt<1000)//800ms
	{
		flying_cnt += dT_ms;
	}
	else
	{
		flag.flying = 1;  
	}
	
	if(fs.speed_set_h_norm[Z]>0)
	{	
		vel_z_tmp[0] = (fs.speed_set_h_norm_lpf[Z] *MAX_Z_SPEED_UP);
	}
	else
	{
		vel_z_tmp[0] = (fs.speed_set_h_norm_lpf[Z] *MAX_Z_SPEED_DW);
	}

	vel_z_tmp[1] = vel_z_tmp[0] + program_ctrl.vel_cmps_h[Z] + pc_user.vel_cmps_set_z;
	//
	vel_z_tmp[1] = LIMIT(vel_z_tmp[1],fc_stv.vel_limit_z_n,fc_stv.vel_limit_z_p);
	//
	fs.speed_set_h[Z] += LIMIT((vel_z_tmp[1] - fs.speed_set_h[Z]),-0.8f,0.8f);//ÏÞÖÆÔöÁ¿·ù¶È
}

如果已经起飞了,那么等待一秒,并将flying置一,表示已经在飞了。
如果油门值大于0,就是上升,设置上升速度,否则设置下降速度。
总的速度相加,赋值给vel_z_tmp[1],并限幅。
最后赋值给fs.speed_set_h[Z],作为系统给的最终的z轴速度。
如果没有起飞,fs.speed_set_h[Z]直接0.

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;

取遥控器的XY速度,赋值给这些东西、滤波。。

speed_set_tmp[X] = fc_stv.vel_limit_xy *fs.speed_set_h_norm_lpf[X] + program_ctrl.vel_cmps_h[X] + pc_user.vel_cmps_set_h[X];
speed_set_tmp[Y] = fc_stv.vel_limit_xy *fs.speed_set_h_norm_lpf[Y] + program_ctrl.vel_cmps_h[Y] + pc_user.vel_cmps_set_h[Y];

length_limit(&speed_set_tmp[X],&speed_set_tmp[Y],fc_stv.vel_limit_xy,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];	

同样,XY的速度等于这些相加,最后赋值给fs.这个东西。。

land_discriminat(dT_ms);

if(rolling_flag.rolling_step == ROLL_END)
{
	if(imu_data.z_vec[Z]<0.25f)
	{
	flag.unlock_cmd = 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_imu_ok = 0;
	LED_STA.rst_imu = 1;
	WCZ_Data_Reset(); 
}
else if(imu_state.G_reset == 0)
{	
	if(flag.sensor_imu_ok == 0)
	{
		flag.sensor_imu_ok = 1;
		LED_STA.rst_imu = 0;
		ANO_DT_SendString("IMU OK!");
	}
}

检测imu,并改变标志位sensor_imu_ok

	if(flag.unlock_sta == 0)
	{
		flag.flying = 0;
		landing_cnt = 0;
		flag.taking_off = 0;
		flying_cnt = 0;
		
		
		flag.rc_loss_back_home = 0;
		
		if(flag.taking_off == 0)
		{
		}
	}

如果解锁位位0,也就锁定状态,那么flag.taking_off = 0;flag.flying = 0;
flag.rc_loss_back_home = 0;(???)

没了,大体来讲,这个函数就是判断状态、改变标志位、赋值速度等等。。。

6、void Swtich_State_Task(u8 dT_ms)
开关状态任务。
大致的意思就是根据各个模块的状态来看是否打开开关。
1、气压计默认打开
2、光流:需要高度、光的质量达到要求、并且飞机处于LOC_HOLD模式,光流开关才会打开。激光模块一直是关的(?)
3、uwb不知道啥东西,但也只在定位模式才会有用
4、openmv也只会在定位的时打开。。。(这里有点疑惑,追踪和循迹都不是定位模式把,但需要用到openmv啊)

7、void Flight_Mode_Set(u8 dT_ms):飞行模式设置
也会被轮询

if(CH_N[AUX1] <-100 && CH_N[AUX1]>-200)
{
	flag.chn_failsafe = 1;
}

接收机失控,此时需要降落保护

else
{
	flag.chn_failsafe = 0;
	
	if(CH_N[AUX1]<-300)
	{
		flag.flight_mode = ATT_STAB;
	}
	else if(CH_N[AUX1]<200)
	{
		flag.flight_mode = LOC_HOLD;
	}
	else
	{
		flag.flight_mode = RETURN_HOME;
	}
}

可以看出CH_N[AUX1]是更改模式的,可以失控、自稳、定位、回家

if(flight_mode_old != flag.flight_mode) 
{
	flight_mode_old = flag.flight_mode;
	
	flag.rc_loss_back_home = 0;

}

如果状态改变,就把新值保存。flag.rc_loss_back_home = 0;是降落回家信号,但似乎没有用上过,因为要配合gps才能回家。。。

大概看完了。。。挺琐碎的,就当做个记录,最后跟工程一起总结把。。。

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

匿名无人机代码FlightCtrl简单分析 的相关文章

  • LoRa关键参数 1、扩频因子(SF) 2、编码率(CR) 3、信号带宽(BW) 4、LoRa信号带宽BW、符号速率Rs和数据速率DR的关系 5、

    LoRa 学习 xff1a LoRa 关键参数 xff08 扩频因子 xff0c 编码率 xff0c 带宽 xff09 的设定及解释 1 扩频因子 xff08 SF xff09 2 编码率 xff08 CR xff09 3 信号带宽 xff
  • MarkDown的语法

    使用MarkDoown时应该注意些什么呢 目录 一 添加标题 二 引用代码块 三 嵌入图片 1 本地图片 2 互联网图片 四 快捷键使用 五 分界线的使用 一 添加标题 在文字前加入相应数量的 一级标题 二级标题 三级标题 四级标题 五级标
  • python试爬李毅吧贴子标题,爬虫最初级

    注 xff1a 以下所有python代码均运行于2 7 0 最近想抓点数据存起来 xff0c 开始捣鼓python 爬虫技术以前没接触过 xff0c 这一回就当练手 xff0c 从零开始 xff0c 从最原始的方式开始 先定个小目标 xff
  • Activity的生命周期

    图来自百度百科 onCreate 启动activity时被调用 xff0c 用于进行初始化操作 xff08 加载布局 绑定事件等 xff09 xff0c 不应在onCreate 中做过多的不必要操作 xff0c 避免造成打开activity
  • Activity的启动模式

    以下为读书笔记 xff1a 实际项目中 xff0c 我们要通过特定的需求 xff0c 为每个活动指定恰当的启动模式 Android一共有4种启动模式 xff1a standard singleTop singleTask singleIns
  • PID参数 Ziegler-Nichols基于时域响应曲线的整定 反应曲线法

    PID控制器是工业过程控制中广泛采用的一种控制器 xff0c 其中 xff0c P I D分别为比例 xff08 Proportion xff09 积分 xff08 Integral xff09 微分 xff08 Differential
  • 郑学坚《微型计算机原理及应用》考点精讲 36讲

    链接 xff1a https pan baidu com s 12 vGBRrjOd UtO8P4e9bow 提取码 xff1a tqmp 当初考研时买的网课 xff0c 现在也用不着了 xff0c 赠与有缘人 书籍记录着别人多年时光总结出
  • 几种常用排序算法

    排序算法代码如下 xff1a void Sort Algorithm Bubble Sort int amp nums const int len bool haschange 61 true for int i 61 0 i lt len
  • 四旋翼姿态解算

    代码思路如下 xff1a 姿态解算 void IMU update float dT imu state st state float gyr VEC XYZ s32 acc VEC XYZ s16 mag val VEC XYZ imu
  • 树莓派4B-基于MCP2515的CAN通信过程记录篇

    本文主要记录使用树莓派4B xff0c 通过外接MCP2515模块来实现CAN通信 xff0c 使用基于Can utils实现CAN消息的收发 准备工作 xff1a 树莓派MCP2515模块杜邦线若干 知乎上一篇较为详细的参考 xff0c
  • nuxt踩坑集

    目录结构 assets 资源文件 用于组织未编译的静态资源如 LESS SASS或 JavaScript components 组件 layouts page 模板页面 xff0c 默认为 default vue可以在这个目录下创建全局页面
  • 记录个人在安装D435i驱动时出现的问题及解决方案

    目录 1 驱动安装 xff1a 2 启动Intel RealSense Viewer后报错No Frames Recevied 3 Record时报错Error opening file 1 驱动安装 xff1a 参考这篇博客 xff1a
  • 深度学习常见的优化算法

    文章目录 1 梯度下降算法 xff08 batch gradient descent BGD 2 随机梯度下降法 xff08 Stochastic gradient descent SGD 3 小批量梯度下降 Mini batch grad
  • vscode如何链接github

    1 首先安装配置好vscode xff1a https code visualstudio com download 然后下载git xff1a https git scm com download 根据自己的电脑选择相应的版本的下载就好了
  • 串口(uart)开发流程

    UART概述 UART全称 xff0c Universal Asynchronous Receiver and Transmitter UART xff0c 一般是每个单片机或开发板必备的一个功能模块 xff0c 可以用来调试 xff0c
  • *33.硬中断和软中断是什么?区别?

    1 硬中断 硬件中断 像磁盘 xff0c 网卡 xff0c 键盘 xff0c 时钟等 2 软中断 软件中断 进程产生 区别 xff1a xff08 产生机制 处理顺序 可否屏蔽 中断信号由来 xff09 1 软中断的发生的时间是由程序控制的
  • gazebo学习时遇到的问题(PX4篇)

    最近在研究如何使用UAV xff0c 由于是初学者 xff0c 不好直接上手实体无人机 xff0c 因此考虑通过在gazebo中模拟的方式进行一下无人机的简单使用模拟 xff0c 于是了解到了PX4这个东西 xff0c 他不仅支持固件写入
  • 阿里云服务器的搭建和部署(小白教程)

    阿里云服务器的搭建和部署 xff08 小白教程 xff09 一 购买服务器二 管理云服务器三 环境配置1 JDK的配置与下载2 tomcat的配置与下载3 MySQL的安装与配置 四 外网访问服务器 个人推荐阿里云 因为里面有一个大学生的云
  • 一篇带你搞懂Python3 中的 def __init__

    在学习python 100 days时 xff0c 在面向对象编程基础的那一块 xff0c 封装一个class时 xff0c 突然出现def init 的方法 xff0c 刚开始时 xff0c 对他的理解很模糊 xff0c 为什么定义一个类
  • 时间序列异常检测综述

    1 Introduction 时序异常检测几个可以运用的点 xff1a 1 欺诈检测 2 工业数据检测 简介一下 xff1a 异常检测很久之前就有了 最早可以追溯到 J Fox 1972 Outliers in Time Series Jo

随机推荐

  • Linux基础----Makefile(1)

    前言 刚开始学习Linux xff0c 这些那真的是新知识 xff0c 由于感觉将来FPGA的学习会越来越靠近软件的方向发展 xff0c 所以觉得有必要好好地学习一下嵌入式的东西 xff0c 因此有必要把学习的过程记录下来 xff0c 方便
  • 【OpenCV】ChArUco标定板角点的检测Detection of ChArUco Corners

    opencv3 4 15源文档链接 link ChArUco标定板角点的检测 GoalSource codeCharuco板创建ChArUco板检测ChArUco姿势估计 ArUco标记和板的快速检测和多功能性是非常有用的 然而 xff0c
  • 错误 MSB3721

    错误 MSB3721 命令 C Program Files NVIDIA GPU Computing Toolkit CUDA v10 2 bin nvcc exe gencode 61 arch 61 compute 30 code 61
  • 倒立摆状态反馈控制——分析、建模与仿真(matlab)

    倒立摆状态反馈控制 引言 倒立摆是机器人学中一个非常重要的模型 xff0c 火箭 导弹 独轮车 双足机器人 四足机器人 xff0c 基本都是倒立摆的变形 问题描述 关于倒立摆的问题描述如下 xff1a 如图所示的倒立摆系统 摆的关节连接在一
  • docker pull rabbitmq:management 怎样指定版本

    docker pull rabbitmq 3 8 1 management
  • git 命令学习

    git 命令学习 git clone https github com zhaji01 notes git 克隆远程仓库 git status 本地仓库状态 git add lt file gt 把修改 xff08 包括创建 修改 删除 解
  • 【实例记录】在ubuntu上运行python实现与单片机多线程串口通信

    文章目录 工具步骤 工具 工具 xff1a 自己电脑双系统的ubuntu18 04 单片机esp8266 一个usb转ttl模块 xff0c ubuntu上已经下载了python的3 6和pip xff0c 还需要pip install s
  • 【过程记录 】windows和ubuntu两台电脑局域网进行socket通信收发数据和传输文件

    实验图片和前期准备 xff1a ubuntu作为服务端 xff0c windows客户端传输数据和文件 xff1a windows作为服务端 xff0c ubuntu作为客户端 xff1a 实验图片和前期准备 xff1a 服务端发送和接受i
  • 过程记录 yolov3目标检测输出目标坐标和原图物体像素坐标比较

    设备 xff1a jetsonnano B01 一个usb广角摄像头 语言为python 库为opencv 框架pytorch 大家都知道yolov3的坐标变换过程比较复杂 xff0c 大概要经过图片缩放 xff0c 对数空间变换等等 xf
  • Rt-Thread学习笔记-----信号量(五)

    线程间同步 1 什么是线程间同步 xff1f 同步是指按预定的先后次序进行运行 xff0c 线程同步是指多个线程通过特定的机制来控制线程之间的执行顺序 xff0c 也可以说是在线程之间通过同步建立起执行顺序的关系 xff0c 如果没有同步
  • C++类和对象——空指针访问成员函数

    C 43 43 中空指针也是可以访问成员函数的 xff0c 但是也要注意有没有用到this指针 xff1b 如果用到this指针 xff0c 需要加以判断保证代码的健壮性 span class token macro property sp
  • nodejs实现简单的自动化部署

    如题 xff0c nodejs通过码云提供的web hooks实现简单的服务器自动部署 大致流程 xff1a 1 通过码云提供的web hooks xff0c 创建一个request通过后的回调接口 xff08 说白了就是配置一个码云审批通
  • 2022届春招实习面经(CV岗)——offer经

    已拿offer公司 xff1a 腾讯 ponyai vivo研究院 华为 字节 面了一面就没继续面了 xff1a 海康威视 虎牙 京东 本科211 xff0c 硕士985 二区在投论文 43 顶会下的top5比赛 43 小厂三个月实习经历
  • LeetCode刷题笔记 --- python

    目录 一 python交换两个变量的值1 1 使用tuple1 2 使用临时变量temp 二 python中 和 区别三 python列表的使用3 1 列表的基本操作3 2 列表实现栈操作3 3 列表实现排序3 4 列表的算法效率 四 py
  • 无人机高度控制

    这个第一次看就完全没看懂 xff0c 现在再看还是没看懂orz xff0c 而且定高还是重要的功能和考点 xff0c 详细分析一下程序吧 首先是表示高度信息的结构体 xff1a 数据结构声明 typedef struct float Z S
  • ssh_exchange_identification: Connection closed by remote host

    ssh exchange identification Connection closed by remote host 导致这个问题的原因有很多 xff0c 笔者是因为在ssh中设置了代理 xff0c 这个可以作为阅读者排查问题的一个点
  • 匿名无人机飞控代码整理5

    先跳过高度部分 xff0c 这里看location部分 可以看出来这部分也是直接与我们的循迹 追踪任务相关的 所以这部分的掌握应该很重要把 前面有很多暂时不需要看 xff0c flyctrl那个巨长 所以就先看速度环控制部分了 if swi
  • 匿名无人机飞控代码整理

    看了半天 xff0c 各部分都看得都很零散 xff0c 写的也很简略 xff0c 但目前为止还是无法对系统各部分做具体一点的整合 xff0c 今天试试看 1 先从主函数起 xff0c 进入主轮询函数 Main Task 这个主函数的调用就在
  • 一直没看的无人机定高

    除了定高的部分 xff0c 其他没看的还有一些控制函数 定高的原理的话 xff0c 也是利用了两级pid xff0c 按照原本的理解 xff0c 从外环开始看的话 xff0c 反馈高度比较容易获得 xff0c 就是激光测距得到的高度 期望高
  • 匿名无人机代码FlightCtrl简单分析

    这个flightCtrl文件 xff0c 是真的很长又很难 各种标志位啊 xff0c 判断啊 xff0c 开关啊 xff0c 逻辑判断啊什么的 xff0c 趁通宵把代码梳理一遍 这个文件里的函数虽不算最多 xff0c 但引用的头文件相当多