zoukankan      html  css  js  c++  java
  • 对飞控的理解(一)

    以主函数为纲,逐个研究各个函数的作用。(备忘:roll翻滚角,pitch俯仰角,yow偏航角)

    首先要明确,我们这个程序是在稳定飞行的基础上,进行定高,用到了mpu6050,hmc5883数字罗盘,ms5611气压计,气压定高。

    mpu6050获取飞机当前重力加速度与各个轴的角度和角速度,先对加速度计和陀螺仪进行零偏校正,然后对原始数据进行加权平均滤波,消除部分震动影响,供内环pid使用。

    为了增加飞机的稳定性,进行角度/角速度的串级pid滤波,内环角速度,外环角度,然后得出需要的四路pwm驱动电机,纠正姿态。

    我的理解就是pid建立了一个mcu和电机之间的循环,mcu不断读取四轴的姿态,其中由于电机的震动,包含了大量的噪声,甚至覆盖了真实信息,但是

    经过pid的滤波处理,得到相对精确的当前姿态坐标,与期望姿态(r,p,y=0)对比,得出电机需要的pwm波。在输出需要的pwm波之前,进行限幅处理,防止输出错误。

    在main中,首先是各个定时器和传感器的初始化,电机使能,中断配置,四元数初始化,pid参数初始化,然后是while循环

    在死循环里,loop.cnt_10ms那个没看懂,理解应该是当系统循环一次之后,标志清零,保证程序一直循环下去。

    在ms5611文件里,采用软件i2c读取传感器寄存器的值,气压和温度,利用温度对气压数据进行温度补偿,在采集五次气压值的数据进行卡尔曼滤波。得出精确的气压值,return baroAlt。

    在定高上面,还是利用pid在传感器得出的数据与电机之间建立一个循环,使飞机保持在一个高度不变,也就是气压不变,利用pid使气压保持在一个范围内。

    但是就程序来看,我没有在程序中找到自动定高的值,我猜想他可能是由遥控器起飞,当飞机达到想要的高度时,由遥控器给定信号(油门回中),使飞机保持在当前高度不动。虽然也是定高,

    但是与比赛的定高有所不同,所以这方面还是需要改进。我的想法是,比如我们想要定高一米,那么就要提前计算出一米高度的气压值,设定在主函数里,当检测到气压值等于这个值时,保持当前高度。

    也就是还是利用pid在传感器获取的高度与期望高度之间建立循环。当低于期望高度时,电机稳定输出,匀速上升。当高于期望高度时,电机减速,缓慢下降。

  • 相关阅读:
    iOS开发之Masonry框架源码解析
    iOS开发针对对Masonry下的FPS优化讨论
    React-native Android环境搭建
    Android中ListView使用总结
    Android开发布局方式
    轮播图
    大文件断点下载
    基于第三方库FMDB的数据库的二次封装
    md5加密
    AssignToObject文件(字典转模型、字典数组转模型数组)
  • 原文地址:https://www.cnblogs.com/qsyll0916/p/6561998.html
Copyright © 2011-2022 走看看