关于电子设计大赛无人机题的学习笔记(2)飞控代码分析和高精度IMU传感器的使用

2023-05-16

飞控代码分析和高精度IMU传感器的使用

最近着急备赛很多文档只是处于零零散散状态没办法细节的整理出来专门放一份,等比赛结束会统一整理,现在只能先放一些研发过程中的技术文档上来了
目前我们的调试进度是,稳定完成了无人机通过openmv视觉识别跟随小车的任务,这也同时是我们对今年赛题的简单预判,我们还做了很多其他的准备。
文档现在是接着上次的继续往下写,很多东西还没写到,最近因为觉得mpu6050数据抖动太严重我们通过JTAG去仔细看了确实问题很大于是更换了更贵更好的传感器,但是在这一趟旅途中出现了好多好多的问题,不得不说是一次极限挑战,从IIC协议调不通到解算失败再到数据拟合度不够,出现问题就解决问题,最终还算是收获了比较好的结果,但是整整花了超过三天的时间,时间开销比预计打了两倍,这部分文档有点多,后续慢慢发上来。

飞控主程序研究关于姿态控制和运动学解算部分的主体逻辑框架

飞控主程序框架中首先在之前的状态机决策模型上分析得到,在理解开源代码和重构的过程中,我选择了自顶层下下的方法,一层一层分析了多个字程序间的调用关系,并且基于全局变量的架构过程 和通过Debug过程中重设追踪式breakpoint的方法追踪了变量的更改逻辑捕捉到它在内存中的读写操作,通过该技术工具甚至可以确认当前追踪的变量在总体程序执行的时序过程中被多少个变量进行了改动。如图
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

飞机的姿态控制来源于三个维度的数据,

​ 第一个维度是光流模组,这一模组包含了超声波传感器,光流传感器,具体的解算程序作为黑盒由匿名科创公司提供,这一部分的程序产生的数据包括了绝对高度信息和xy两个轴向的对地速度速度在光流信息解耦后和iMU数据进行融合后获取了相对稳定数据输出,能够较好的表述出飞机当前的对地运动情况进而可以进行稳定的悬停,但是由于超声波传感器的测量会受到飞机的气流和噪声影响我们正在考虑进行跟换,目前已经在openmv模组上加入了tof激光测距模组,在之后会考虑在单片机的系统中再多挂载激光面阵雷达和更多tof来进行精准的定位,因为目前飞机的姿态控制并不能完全达到理想的状态。

在这里插入图片描述

​ 第二个维度是IMU系统,该系统中目前包括了mpu6050模组,模组通过IIC总线提供了如图所示的可接受控制范围内的数据输出,这些数据包括了六轴上的信息,六轴分别为xyz加速度,角速度,来源分别为MPU6050中的加速度计和陀螺仪,对其进行数据融合,可以计算出当前飞机的四元数得出欧拉角,进而获得飞机的自身姿态,算法具体细节在下一段中讲解,这里只讲宏观框架。

​ 第三个维度是控制系统,控制系统在飞控系统中是最为重要的部分,一般FMU指的也是飞控系统单元,这部分在飞行器的程序中好比是飞行器程序的骨架,他将传感器控制算法优化算法集合在一起形成了对飞行器电机的控制使得它能够完成各种必要的任务,在我们的程序中控制部分主要采用了前面提到的两个维度作为其PID控制器的参数,期望值被设定为遥控器值和自动控制程序的结合体,这一部分是程序中最为关键的部分,当后面由于稳定性问题不得不更换传感器的时候在这里遇到了相当头疼的问题。
在这里插入图片描述
我们还通过上位机写了利用数传回传数据进行姿态仿真建模的unity3d程序
在这里插入图片描述

飞控主程序的程序来源之MPU6050的数据采集逻辑

飞控主程序分析之MPU6050的数据采集方法,MPU的数据分析主要包括了两部分,一部分是基础数据校准,另一部分是IMU对于MPU6050数据解析部分。

该函数中包含了基本读取方法
该函数包含了姿态解算的基本能力
该函数包含了Z轴速度估算方法
SysTick_Handler-主时钟中断句柄
GET_MPU6050
ATT_UPdate
WZ_Est_Calcu
其他维度的数据

在这里插入图片描述

Wz_Est_Calcu是对齐东北天坐标系的z轴计算方法,其内含方法可以理解为是进行了一次z轴对加速度的积分获得速度,再对速度积分获得位移量,但是这种算法的效果相对误差较大,所以也进行了诸多的传感器的数据融合使得最终的数据可信度更高,飞行也能够更稳定。但是还是不太好用,比起真正的东北天坐标系传感器的基于磁场的计算效果要差很多不过也效果相当对得起价位了。我们的设备为了节省经费在传感器方面选用的确实比较廉价。

接下来主要讨论MPU6050数据的获取逻辑

首先MPU必须进行的工作是自检,链接是否正常,这直接关系到安全,所以这一项检查也相对繁琐,首先是寄存器收发写入功能正常

    uint8_t check = 0;

    check = I2C_Read_Byte(MPU6050_ADDRESS, 0x75);  //判断g_MPUManager地址
    
    if(check != MPU6050_PRODUCT_ID) //如果地址不正确
    {
        g_MPUManager.Check = false;
        return false;
    }
    else{...}

然后通过复位采样设置时钟源设置低通滤波器标定单位操作确定传感器的输出值是我们期望的,其中最重要的,必须要在初始化完成后计算补偿值我们称其为offest值,offest值在控制实现这个值得过程中每一次进入都要根据上一次的情况进行修正

 memset(g_MPUManager.Offset, 0, 12);
    g_MPUManager.Offset[2] = 2048;   //根据手册量程设定加速度标定值 

    //丢弃前300个数据
    for(int i = 0;i < 300;i++)
    {   
        Delay_ms(2);
        GetMPU6050Data();
    }

其他的一系列确认包含了确认飞机的平放,是否已经稳定,均值滑动滤波等操作,具体以后有机会细说

接着是MPU6050GETDAtA的工作,这个相对简单只是做了buffer的数据存放拼接低通滤波也放在一起做了,代码如下

void GetMPU6050Data(void) 
{
    static float mpu_filter[2][6];
    int16_t mpu_filter_tmp[6];
    uint8_t buffer[12];

    //读取加速度计数据和陀螺仪数据
    Acc_Read();
    Gyro_Read();

    
    for(int i = 0; i < 6; i++)
    {
        //拼接读取到的原始数据
        mpu_filter_tmp[i] = (((int16_t)buffer[i << 1] << 8) | buffer[(i << 1) + 1])
                - g_MPUManager.Offset[i];

        //原始数据LPF
        mpu_filter[0][i] += 0.3f *(mpu_filter_tmp[i] - mpu_filter[0][i]);
        mpu_filter[1][i] += 0.3f *(mpu_filter[0][i]  - mpu_filter[1][i]);

        //赋值到结构体
        pMpu[i] = (int16_t)mpu_filter[1][i];
    }
}

飞控主程序IMU数据解算的对接和目前的数据融合逻辑

飞控的IMU数据解算主要使用的是AHRS解算算法,这个算法的流程大概展示如下

ACCxyz_GROYxyz
归一后可化为单位向量下方向分量
向量叉乘
角速度融合加速度比例补偿值与
上面三句共同形成了PI补偿得到矫正后的角速度值
一阶龙格库塔法
跟新四元数
对矫正后的角
速度进行积分
积分迭代
计算Z方向积分制
跟新欧拉角
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于电子设计大赛无人机题的学习笔记(2)飞控代码分析和高精度IMU传感器的使用 的相关文章

  • c++中函数只声明,不定义(不调用该函数)可以通过编译并运行

    c 43 43 中函数只声明 xff0c 不定义 xff0c 代码中也没有该函数的调用 xff0c 可以编译并运行 xff08 vs2015 xff09 Author gtkiller Date 2018 03 19 include lt
  • RMI的基础原理

    背景 上世纪90年代 焦点转移到跨平台通信 一台计算机可以通过某种类型网络在另一台计算机上发起一个动作 CORBA DCOM Java RMI 技术等等 xff0c 到现在的grpc等 Hello span class token keyw
  • 一次因修改Python编码规范而引起的“血案“

    简单来说就是因为如下代码 导致了ZipOutputPath的一个函数异常 导致zip包不能正确下载 有如下报错 UnboundLocalError local variable 39 val 39 referenced before ass
  • Python之禅(The Zen of Python)源码分析

    简介 非常高兴大家能够订阅这个专栏 在这里我将会给大家分享一些Python相关源码的剖析 在接下来的这段日子里 我会一同带各位pythonista探索Python的奥秘 该从什么开始 思来想去 我觉得作为一个Python初学者还是Pytho
  • Linux常用命令速查表

    目录即文件 dev null 等价于只写文件 所有写入它的内容都会永远丢失 而尝试从它那儿读取内容则什么也读不到 禁止标准输出 cat filename gt dev null 文件内容丢失 xff0c 而不会输出到标准输出 禁止标准错误
  • git常用命令速查表

    这是一些比较常用的命令 大家可以复制后用typora做成pdf格式 xff0c 方便快速查询 后续不定期更新 官方文档 官方文档 https git scm com docs 本地文档 file D cmder vendor git for
  • python开发中的常用命令

    这是一些比较常用的命令 大家可以复制后用typora做成pdf格式 xff0c 方便快速查询 后续不定期更新 pip升级 pip package installer for python use pip to install package
  • Python手写一个Base64编解码工具

    这里我们只实现标准的base64 补充位用 61 填充 编码 下面是base64字符的对照表 因为base64编码是将6bit表示成8bit 所以在原来的基础上会增长1 3 另外2 6 61 64 xff0c 这也是为什么这个表会有64个索
  • Python彩蛋源码分析(二)

    简介 非常高兴大家能够订阅这个专栏 在这里我将会给大家分享一些Python相关源码的剖析 在接下来的这段日子里 我会一同带各位pythonista探索Python的奥秘 hello world hello world hello pytho
  • Python源码剖析专栏总览

    简介 非常高兴大家能够订阅这个专栏 在这里我将会给大家分享一些Python相关源码的剖析 在接下来的这段日子里 我会一同带各位pythonista探索Python的奥秘 将会分析一些源码的构思设计以及这些工具的使用方法 彩蛋篇 Easter
  • maven笔记小抄

    settings xml settings xml位置 标签指定本地下载的依赖在本地的保存位置 user home m2 repository表示C Users username m2 settings xml idea中File Sett
  • linux 下 tcpdump 详解 后篇(自己实现抓包过滤)

    一 概述 在了解了tcpdump的原理后 xff0c 你有没有想过自己去实现抓包过滤 xff1f 可能你脑子里有个大概的思路 xff0c 但是知道了理论知识 xff0c 其实并不能代表你完全的理解 只要运用后 xff0c 你才知道哪些点需要
  • Python字节码分析(一)

    简介 非常高兴大家能够订阅这个专栏 在这里我将会给大家分享一些Python相关源码的剖析 在接下来的这段日子里 我会一同带各位pythonista探索Python的奥秘 Pyc文件 简介 当在文件被当成模块导入时才会生成pyc文件 pyc文
  • Python基本类型(一)

    简介 非常高兴大家能够订阅这个专栏 在这里我将会给大家分享一些Python相关源码的剖析 在接下来的这段日子里 我会一同带各位pythonista探索Python的奥秘 basic data types in python Python中的
  • xmlrpc源码解读(一)

    简介 非常高兴大家能够订阅这个专栏 在这里我将会给大家分享一些Python相关源码的剖析 在接下来的这段日子里 我会一同带各位pythonista探索Python的奥秘 将会分析一些源码的构思设计以及这些工具的使用方法 一个简单的RPC实例
  • Python代码整洁之道勘误

    简介 本博文是对 lt Python代码整洁之道 gt 一书的一些错误进行矫正 这本书英文名字是 lt Clean Python Elegant Coding int Python gt 这本书的作者是Sunil Kapil 这本书错误非常
  • 自己动手写strcat函数

    char catstr char a char b char x 61 a while a 61 39 0 39 a 43 43 while b 61 39 0 39 a 61 b a 43 43 b 43 43 a 61 39 0 39
  • 为什么C++开发不需要安装STL库

    如果交叉编译工具链的路径已经添加到path变量中的话 xff0c 可以直接使用 v即可查看 xff0c 比如我的是arm linux gnueabihf g 43 43 那么直接arm linux gnueabihf g 43 43 v或者
  • 为什么要内存对齐

    为什么要内存对齐 xff1f 很多CPU是从对齐的地址开始加载数据 xff0c 外部总线从内存一次获取的数据往往不是1比特 xff0c 而是4比特或8比特或更多 xff0c 与数据总线带宽有关 比如有一个int数据类型 xff0c 其分配的
  • marlin2.0.x 固件相关配置文档说明

    主要目的 了解对应参数的作用 xff0c 以优化3D打印机的打印效果 具体分析 配置文件有两个 Configuration h 包含硬件核心 语言和控制器的设置 xff0c 以及最常见的功能和组件的设置 xff0c 主要配置的地方 Conf

随机推荐

  • c++容器--vector deque list set map stack queue特性及其选取准则

    1 vector xff08 连续的空间存储 可以使用 操作符 xff09 快速的访问随机的元素 xff0c 快速的在末尾插入元素 xff0c 但是在序列中间岁间的插入 xff0c 删除元素要慢 xff0c 而且如果一开始分配的空间不够的话
  • 网络、串口之应用层通讯协议编订

    一种二进制通信协议 消息长度 BYTES 结构描述Header4SyncBytes格式 xff1a 0x09 0x6f 0x01 0x01 xff0c 表示不同设备之间的交互Header4FullMessageLength数据总长度 xff
  • STM32基于串口接收缓存非空中断(RXNE)和空闲中断的串口转发功能

    STM32基于串口接收缓存非空中断 xff08 RXNE xff09 和空闲中断的串口转发功能 0 实验背景 本实验的目的是实现串口的双向转发 xff0c 即向串口1写入数据后 xff0c 串口2及时输出串口1收到的数据 xff1b 向串口
  • Ubuntu16.04 中 搭建Janus Server

    Ubuntu16 04 局域网中搭建Janus Server janus简介 Janus是WebRTC 服务器端的开源项目 xff0c 官方对其定义是一个WebRTC服务器端 xff0c 支持的功能比较丰富 xff0c 通过core模块来支
  • 堆栈溢出一般是由什么原因导致

    背景 全局变量存放在静态存储区 位置是固定的 局部变量在栈空间 栈地址是不固定的 栈 xff1a 就是那些由编译器在需要的时候分配 xff0c 在不需要的时候自动清楚的变量的存储区 里面的变量通常是局部变量 函数参数等 堆 xff1a 就是
  • 简单明了的蓝牙服务及UUID介绍

    什么是蓝牙 蓝牙 xff0c 是一种支持设备短距离通信 xff08 一般10m内 xff09 的无线电技术 xff0c 能在包括移动电话 PDA 无线耳机 笔记本电脑 相关外设等众多设备之间进行无线信息交换 利用 蓝牙 技术 xff0c 能
  • 深入详细理解矩阵 (矩阵的加减乘、转置、共轭、共轭转置)

    简介 矩阵 英文名Matrix 在数学名词中 xff0c 矩阵用来表示统计数据等方面的各种有关联的数据 这个定义很好地解释了Matrix代码制造世界的数学逻辑基础 矩阵是数学中最重要的基本概念之一 xff0c 是代数学的一个主要研究对象 x
  • 无线模块的参数介绍和选型要点

    01 通信频点 通信频点 xff1a 无线模块在工作的时候向外辐射出去的电波频率 xff1b 无线串口模块常用的频点大致可以分为170MHz 230MHz 315MHz 433MHz 490MHz 780MHz 868MHz 915MHz
  • 使用freertos如何确定分配堆栈空间大小

    前言 运行freertos系统的大部分都是资源有限的MCU xff0c 所以对于ram我们都要考虑尽量的节省 xff0c 避免资源浪费 xff0c 从而也可以针对项目选择性价比更好的mcu 关系分析 首先要配置freertos的堆 heap
  • windows从零搭建googletest之c++测试工程

    简介 googletest xff08 也称gtest xff09 是由Google测试技术团队开发的测试框架 为c c 43 43 代码提供了一套优秀的单元测试解决方案 本文介绍使用googletest在windows下从零搭建自己的单元
  • c++ 常用转换vector<uint8_t> 转string

    std span class token double colon punctuation span vector span class token operator lt span span class token keyword uin
  • c语言解析协议常用套路

    简介 协议定义username len value while 读取 2个switch case解析 读取value 代码示例 span class token keyword struct span span class token cl
  • c++模板 --- 模板的嵌套

    简介 明白类型是什么即可 xff0c 可以适当运用using语法起别名 简化代码 一 函数模板嵌套 span class token keyword template span span class token operator lt sp
  • DWA算法详解

    首先在V m V d的范围内采样速度 xff1a allowable v 61 generateWindow robotV robotModel
  • C++OpenCV实现YOLO算法对目标进行检测实战

    基本概念 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 加载darknet框架的YoloV4模型做目标检测 OpenCV DNN模块支持常见深度学习框架如TensorFlowCaffe Darknet等 对
  • 使用GooSeeker软件进行爬虫

    一 使用GooSeeker软件进行爬虫 xff0c 它是进行读取大量数据的 xff0c 都出来的数据是xml格式的 xff0c 可以通过office excel将xml格式转化成表格形式 1 爬虫取数据 xff1a 1 xff09 先要在网
  • 51单片机--堆栈

    堆栈的作用是用在调用子程序或中断程序时保护现场 xff0c 因为51单片机的寄存器是十分有限的 xff0c 而相对来说普通数据存储器更充足 xff0c 通过入栈将寄存器中的内容临时保存到堆栈中 xff08 普通数据存储器 xff09 xff
  • Git-命令行-使用 Tag 标记你的代码

    前言 正文开始之前 xff0c 我想我们需要弄明白几个问题 xff1a tag 是什么 xff1f 使用tag 的好处 xff1f tag 和 branch 的区别以及使用场景 xff1f tag 是什么 xff1f tag 翻译过来是标签
  • 光流Zoom In and Out开发记录

    简介 2018年7月 xff0c 合作伙伴提出了一个想法 使用光流算法估计相机前后移动 经典的光流算法 xff08 Lukas Kanade算法 xff09 适用于相机左右和上下移动 xff0c 但是在相机前后移动时 xff0c 虽然各个像
  • 关于电子设计大赛无人机题的学习笔记(2)飞控代码分析和高精度IMU传感器的使用

    飞控代码分析和高精度IMU传感器的使用 最近着急备赛很多文档只是处于零零散散状态没办法细节的整理出来专门放一份 xff0c 等比赛结束会统一整理 xff0c 现在只能先放一些研发过程中的技术文档上来了 目前我们的调试进度是 xff0c 稳定