匿名无人机飞控代码整理

2023-05-16

看了半天,各部分都看得都很零散,写的也很简略,但目前为止还是无法对系统各部分做具体一点的整合,今天试试看。。。
1、先从主函数起,进入主轮询函数

Main_Task();

这个主函数的调用就在一个while里,循环没有设置延时。但是程序和任务的执行是需要时间的,我们通常是需要定时调用的,也就是说隔10ms,调用一次这个任务,就比如说是读取某个硬件的数据的任务,需要每10ms读一次数据,那就执行完这一次之后延时10ms,再执行下一次。
这里的进入函数后,会发现延时是在里面的。通过实时时钟,读取当前时间和上次执行时间,如果时间差大于某个时间差,就执行该任务,否则不执行,用这个方式进行延时执行管理其实也很有效。
但有一个比较特殊的部分:就是loop_task_0并不是按这种方式控制。

if(lt0_run_flag!=0)
{
	lt0_run_flag--;
	Loop_Task_0();
}

这个任务通过检测lt0_run_flag变量来判断是否应该执行。
loop_task_0比较特殊是因为它是负责硬件数据读取的任务:
在这里插入图片描述
既然是通过判断lt0_run_flag是否为零来决定该任务是否执行,那么lt0_run_flag是受谁控制?找了找发现是在icm20602的中断服务函数里lt0_run_flag++的,icm20602就是陀螺仪加速度计模块。
什么时候icm20602会发出中断请求?
查了一下datasheet,用六级飘过的英语水平也能读出,发出中断的场景之一就是在数据准备好的时候,也就是说每次数据准备好可以被读取时,向cpu发出中断请求。
在这里插入图片描述
其实很容易理解,因为其他任务都是一些计算等等,数据就在寄存器里,定时调用计算、更新结果就可以。但这个任务涉及到对硬件的读取,不是什么时候想读就能读的,要等到硬件给出准备好可以被读取的信号时,才能开启读取任务。

其他几个任务的作用也列一下:
Loop_Task_1:姿态角的角速度环控制+电机输出控制
Loop_Task_2:获取姿态角(不是读取,而是根据读取的数据解算出姿态信息)+姿态角的角控制环
Loop_Task_5:这个就比较复杂,包括:遥控器数据处理+飞行模式设置+高度数据融合+高度速度环控制+高度环控制+灯光控制
Loop_Task_8:罗盘数据处理(对罗盘数据进行解算得到当前航向信息)+程序指令控制(还不知道是干嘛的,知道了回来加)+位置速度环控制+openmv检测和色块追踪任务
Loop_Task_9:看不懂。。。
后面还会有循迹任务。

2、总的执行流程就这么简单:不停读数据、不停计算、得出输出量、然后输出
但是实际的控制过程仍然不清楚,想要实现对飞机的控制,还需要对过程了解的足够详细。

无人机的运动状态主要有上升下降、前进后退、左右移动、转向、姿态自稳、高度自稳、定位(位就是位置location)。

我们要做的也就是能够有效的对这几个状态进行控制,因为理论上这些状态的组合可以实现大部分我们想要的功能。

而具体想要实现这些功能,我们需要控制的量为:
上升下降:油门增减,油门对应加速度,
前进后退:pitch角变化,根据所需的速度不同,pitch角变化幅度也不同
左右移动:roll角变化,规律同上
转向:pitch角变化,规律大概同上?
姿态自稳:通过三个角的目标量和测量量,利用pid计算出油门量实现自稳
高度自稳:利用测得的当前速度和高度,控制油门量
定位:就是利用光流传感的数据得到自身运动状态,通过控制前后左右运动进行抑制

接下来就详细分析一下各个控制过程,他们的测量值和期望值的来源,控制量的计算过程,然后得到想实现特定的控制要如何对程序修改。

3、根据上面的思路,我们先对姿态部分做分析
姿态数据主要是从icm20602中读取,当然还需要磁力计。
在这里插入图片描述
读取到的数据放在这个什么什么original里面,代表原始的未被处理的数据。
然后在此基础上除去偏置、滤波、得到角加速度。
再之后,求出角加速度的目的是对加速度计的结果进行修正。最终得到角速度、加速度:
在这里插入图片描述
这些准备好之后,就是姿态的解算了,这里的数学原理实在理解不了的话,可以先放过,总之就是根据角速度和加速度计的修正得到了当前的姿态,暂时以四元数形式保存。保存的位置是一个结构体:
在这里插入图片描述

仔细看的话可以看出这个结构体很全的涵盖了有关无人机运动状态的各种数据。
姿态解算完了,有关角度的控制才刚刚开始。尽管一般对串级pid的调节都是先整定内环再外环,但从方便理解的角度,肯定先从外环开始讲起。

外环也就是角度环,通过期望角度和反馈角度得到应有的角速度。

期望角度来自定位环的输出,也就是loc_ctrl_1.out[Y]和loc_ctrl_1.out[X]。因为我们的期望角,实质上就是我们希望无人机保持什么样的状态,比如倾斜一定角度以达到前进的目的,或者不倾斜到达稳定的目的。(如果目的是自稳要积分先行,因为有偏差的话肯定稳不了)

总之得到了roll和pitch的期望角度,对于yaw角:

set_yaw_av_tmp = (s32)(0.0023f *my_deadzone(CH_N[CH_YAW],0,65) *max_yaw_speed) + (-program_ctrl.yaw_pal_dps) + pc_user.pal_dps_set;

可见是三个量的叠加。这三个量相加的式子看过很多次,很关键,但我没看懂。(。。。)

att_1l_ct.set_yaw_speed += LIMIT((set_yaw_av_tmp - att_1l_ct.set_yaw_speed),-30,30);

att_2l_ct.exp_yaw += att_1l_ct.set_yaw_speed *dT_s;

这里是设置期望航偏角yaw,采用积分的方式。很精髓,跟高度环很像。

对于角度反馈值,直接读imu_data。

然后开始pid,就得到了三个角的期望角速度。

接下来就是内环,也就是角速度控制环。刚刚外环得到了期望角速度,那么根据测量得到的角速度,我们就能得到需要的角加速度,也就是应该输出的油门值的大小。
这个过程就很明了,直接就算出来三个输出,然后乘以电机输出比例系数,得到要输出的油门量:

mc.ct_val_rol =                   FINAL_P *ct_val[ROL];
mc.ct_val_pit = X_PROPORTION_X_Y *FINAL_P *ct_val[PIT];
mc.ct_val_yaw =                   FINAL_P *ct_val[YAW];

其中mc就是专门管油门的结构体:

typedef struct
{
	s32 ct_val_rol;
	s32 ct_val_pit;
	s32 ct_val_yaw; 
	s32 ct_val_thr;
} _mc_st;
extern _mc_st mc;

可以看出,三个角的和总的,一共四个。

分析工程代码一个很难的地方就在于,所定义的变量和结构体的作用不明确,虽然命名肯定提供了信息,有的变量和结构体比较简单的话也能很快看懂,但仍然有很多看不懂的地方,有时结合上下代码也无法推断,常常瓶颈也是因此出现。
这里的mc也是现在才明白,应该是motor control的意思。

到此姿态部分就完成了。总结一下的话,后面的流程都是固定的,想要控制飞机,重点在于最开始,也就是外环的期望角度,它决定了飞机的运动状态,由定位环输出,另一方面,只要有了这个期望速度,通过两个角度环,加上观测量,最终就可以
得到电机的输出。
也就是说,我们要实现控制飞机的飞行状态,就要从定位环入手。

4、定位环分析

刚刚说过了,定位是位置固定的意思,也就是这个函数(巨长无比):

Loc_1level_Ctrl(20,CH_N);

虽然长,而且判断语句多,但实际上由于没有gps和uwb,我们需要阅读的只有一部分。通过对判断语句的分析,五个代码块我们只需要看一个。

另外光流这点也需要理清概念(因为以前一直没有理清),比如代码里哪部分是光流模块传感、哪部分是openmv的光流,光流如何接收以及接收到什么数据,得到的数据如何处理和使用,等等。

先处理下面光流的问题。阅读匿名的光流模块带的pdf,可以发现这个光流模块集成了很多附加的功能。有提供高度数据的激光测距(tof)、光流数据、以及ium也集成在了上面。同时还集成了计算模块,类似于mpu6050的dmp,可以直接输出滤波后甚至解算好的数据。(虽然还不是很清楚,但在飞控程序中有滤波和解算等步骤,暂且认为我们并没有用这些计算模块,而是处理了原始数据,或者只是简单滤波)

接下来开始直接对定位任务进行分析(仅有光流的情况):

loc_ctrl_1.exp[X] = fs.speed_set_h[X];
loc_ctrl_1.exp[Y] = fs.speed_set_h[Y];

这里的fs,是flight state的意思,命名加h,暂时认为是物坐标系的意思。这里的期望值是fs.speed_set_h,也就是说,通过对这个变量进行调节,比如让它等于0,或者等于某个速度值,我们就可以让飞机保持静止,或者以某个速度移动。

然后再利用光流测得的实际速度值,pid之后就得到了所需要的输出。

那么这个期望值fs.speed_set_h怎么得到的呢?一步一步回退,又发现这个式子:

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];

详细看了一遍代码之后,姑且得到的结论是:
第一项是遥控器对运动状态的控制
第二项是上位机对飞机的控制(?)
第三项是用户调用可以调用函数来实现对运动状态的控制,色块追踪任务就调用了这个
因此我们想要编写程序对飞机进行控制,那就是利用第三项。

具体怎么控制,怎么编写控制函数。。。明天继续

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

匿名无人机飞控代码整理 的相关文章

  • 什么是SDK和API?

    SDK xff1a 在搭建环境的时候知道的sdk xff0c 但并不知道有什么用 SDK Software Development Kit 翻译成中文就是 34 软体开发工具组 34 是用来帮一个 产品 或 平台 开发应用程式的工具组 xf
  • 华为开发者大会总结——个人总结

    方舟编译器 xff08 开源 xff09 xff1a 干掉Java虚拟机 将java代码直接编译成机器码 xff0c 静态语义好编译 xff0c 核心是静态编译出动态语义 xff08 通过华为编译实验室的核心专利 xff09 xff0c 代
  • 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 这个主函数的调用就在