无名小哥对无名飞控中的问题回答总结

2023-05-16

文章目录

      • IIR二阶数字低通
      • 陀螺仪数据噪声
      • 传感器矫正
      • 姿态解算
      • 惯性导航
      • 控制
      • 滤波性能
      • 系统响应
      • 巴特沃斯滤波器的截止频率如何取
      • 累计漂移
      • 姿态估计精度误差大
      • 控制周期
      • 时间
      • 保证传感器数据不丢帧

IIR二阶数字低通

对于IIR而言,阶次越高,阻带衰减越快,但是数据相延为越大,所以一般用2~4阶即可,数字低通滤波器解决的是控制器所需的反馈信号,传感器输出的原始信号会参杂有不同频率的信号,单纯对于加速度计而言,会由机体、桨振动引入高频噪声,需要设计合适的截止频率,来把这部分噪声尽可能的剔除,把原始加计数据发送Matlab做FFT变换,分析在悬停油门附近频谱图,可以知道噪声的频率范围,通用来讲,把加计截止频率设置成30hz基本就可以。

陀螺仪数据噪声

一般的飞控在初始化设置的时候,开启了陀螺仪内部低通,从而使得输出的数据已经低通过了,通常是42hz,一般在开源控里面,就没有对陀螺仪再次进行低通,无名飞控里面,对陀螺仪内部不设置低通,只在飞控里面对原始数据进行低通处理,所以有看到对陀螺仪也进行了低通处理。

传感器矫正

加速度计低通2Hz采集用作加计六面矫正是为了避免手抖造成矫正误差。

姿态解算

主体传感器是陀螺仪,所以我们希望输入姿态解算的陀螺仪数据的实时性尽可能大,同时陀螺仪噪声要在合理范围内(静态能保证收敛、精度要满足要求),这就需要相对加计而言,截止频率要尽可能的大一点。姿态解算观测传感器:加计、磁力计为辅助传感器,实时性要求不高,只需要保证姿态收敛、动态精度等即可,我们不希望因为观测传感器的噪声,给姿态解算的精度带来负担,在姿态解算里面,对加速度计、磁力计的截止频率设的相对较低,这里就会涉及一个时间同步问题,在姿态解算里面,主体传感器陀螺仪与观测传感器加计、磁力计因为采样、低通等造成的时间不同步问题,需要做延时修正补偿,提高姿态解算的实时性。

惯性导航

主体传感器为加计,观测传感器为气压计、GPS、TOF、VIO等,同样对于加计我们希望数据在合理噪声范围内实时性要尽可能的高,所以这里用于做惯导的加计和用作姿态解算观测传感器的加计,截止频率前者要大一点,注意一点,惯性导航载体三轴加计到导航系运动加速度,需要有载体到导航系的旋转矩阵,因此旋转矩阵(姿态解算)的实时性直接影响惯导的实时性,做惯导的前提是拥有一套精度高、实时性好的姿态解算。同理,在惯导里面也有时间同步问题。

控制

对于加速度环来讲,相比位置、速度、姿态控制(加计作为观测传感器、惯导融合等),加速度计是直接作为反馈量,加速度计反馈信号的噪声会直接引入到控制器里面,造成控制器输出异常,引起油门输出失控炸鸡,所以在APM飞控里面,在加速度控制器里面,对偏差进行低通后,然后参与PID运算,这里对偏差低通,而不是只对微分低通,是因为输入与反馈同样存在噪声,而且这里APM截止频率用的是2Hz,这是一个相当恐怖低通,牺牲了数据的实时性,就是为了避免加计噪声造成失控,实际如果加过减震后,加速度计反馈用15Hz也没问题。

滤波性能

姿态解算中,主体为陀螺仪,加速度计滤波性能直接决定了姿态估计的精度,惯性导航中加速度计为主体,滤波性能决定位置、速度估计得实时性、动态精度,在姿态、惯导数据得到的姿态数据、位置、速度数据用于控制时中,加速度计的噪声间接参与PID运算,而在高度控制加速度反馈时,加速度是直接参与PID运算,前两者直接对比频谱即可,加速度反馈需要综合考虑:比如飞控受到撞击时,加速度计输出噪声异常,最直观的是落地、起飞时震动惯导易发散,加速度用于反馈时,容易导致油门输出异常,早期APM返航着陆落地时会在地面弹几下才进入怠速,后面把截止频率改到2hz之后,就解决了此问题。

系统响应

单姿态自稳时,姿态输入的期望角度,来源于遥控器解码,标准遥控器PPM(PWM)周期为20ms,Sbus会快一点大概7.5ms,加了位置、速度控制,如果速度控制器的输出,给定期望姿态角很频繁,这对姿态环带宽要求很高,执行机构很难做到这么快的响应(3~5个周期跟踪到期望输入),所以你的姿态外环(位置、速度)给的再快,系统也跟不上,给的太快最直观反作用是会使得内环角速度微分容易突变(会频繁的加入外层回路位置、速度、角度的噪声),就发现飞机高频、小舵量,颠颤,所以对于位置、速度环控制器执行周期可以相对大一点,一般超过10ms就可以。

巴特沃斯滤波器的截止频率如何取

可以参考下最新的1.7.3版本的代码里面的计算公式,二阶IIR滤波器会根据品质因素、截止频率,采样频率等来确定滤波参数,实际在Matlab里面也是这么计算的,你可以对比下Matlab计算出来的参数和飞控计算出来的参数,是一致的,差别只在于小数点后6位之后的数据,这个是由单片机计算精度决定的。

累计漂移

很大可能是初始陀螺仪标定未标定或者标定的零点漂移不是真实值,较大的陀螺仪静差,这个时候加速度修正也是无能为力的,小的静差在互补滤波里面将叉乘得到的角度误差项通过比例、积分运算去修正陀螺仪漂移,对于小的静差,正常来讲积分项可以抵消这部分小静差+bias漂移。

姿态估计精度误差大

加计噪声比较大,或者加计融合权重太大,可以尝试低通滤波处理下原始数据、减小加计融合权重;如果由于陀螺仪初始零偏标定错误造成比较大的静差,较大的陀螺仪零偏静差+bias漂移,再优秀的融合算法,用加速度修正是无能为力。

控制周期

飞控系统传感器采样、姿态解算、惯导融合、控制器等调度周期需要保证,但是因为程序会存在抢占式中断,导致调度时间不能严格等周期,在实际处理时,只要保障在每个调度周期内,能把这些事情全部干完即可,需要用到间隔时间的地方,用实测调度周期就可以,比如姿态、惯导更新周期,控制器积分时间等。
这里需要注意的是,保证主要任务在每个调度周期内都能执行完毕,需要主任务的执行时间之和小于等于任务调度周期,设计时需要对每个任务的时间开销进行测试,合计安排优先级和调度周期。

时间

飞控里面的每个任务时间开销都有实际测试,程序里面用了一个高优先级的定时器,测量精度可以到us级,测最大任务开销有两如下两种办法:
方法1、直接在主任务调度定时器的开头与结尾各运行一次测时函数,将两个测时函数的得到的结构体时间做差,就可以得到所有任务的总开销Delta_T,由于不同子任务里面也存在调度、每次单个子任务时间开销不一、存在串口中断、外部中断打断等,所以这个Delta_T是变化的,其最小值对应总任务的调度最小时间开销,最大值即为总任务的调度最大时间开销,这里注意一点,串口中断、外部中断里面处理的任务时间开销很小,基本是几个us级别的,主要的开销还是定时器里面的各个子任务开销。
方法2、对主任务调度器里面的各个子任务分别测量开销,测量方法为在该子任务的开头和结尾依次运行测时函数,两个结构体的时间做差即可得到子任务的运行开销delta_n,这个delta_n对于某些子任务其运行时间仍然是变化的,记录其最大值即可,依次测量每个子任务的时间开销,包括串口中断、外部中断的时间开销,把所有的子任务时间开销delta做和即可得到总任务的最大、最小时间开销。
目前总任务最大运行时间接近4ms左右,主任务调度器为5ms,留了充足的裕量给客户二次开发,用户在自行编写、移植飞控代码时,需要实际测试这部分在对应处理器上的时间开销,确保飞控系统稳健运行。

飞控里面传感器采样、滤波、姿态解算、惯导融合、控制这些对时间有严格要求。

保证传感器数据不丢帧

首先这里需要明白一点,串口通讯波特率与数据传输时间的关系,以无名飞控GPS解析为例,正常工作时,GPS工作以波特率921600,8个数据位,一个起始位,一个停止位。921600bps/(8+1+1)bit=传输92160字节/s,故串口传输一个字节用时1000000us/92160≈10.85us,这里可以简单计算一下,飞控接受pvt语句开销92数据位+2检验位=94,94*10.85约等于1.02ms,与飞控实际测试时间基本一致,实际也可以测试115200、38400通讯时开销分别为8.53ms、25.6ms,接受单个字节耗时分别为86.8us、264.4us。
以GPS解析为说明串口传输时间后,再来考虑中断问题,首先为保障数据不丢帧,当只存在一个串口中断时,该串口中断内部函数执行时间,务必要小于该串口的传输一个直接所需的时间,以波特率115200的串口1为例,串口1的中断函数执行时间务必小于86.8us,即串口1的下一个字节传输来之前,上一个字节的串口中断处理函数务必运行完成,否则数据就会丢帧。
所以一般来讲,串口中断函数里面都不会去执行大段时间开销的任务,目的就是确保不丢帧,常用的办法是在串口中断里面采用环形队列缓冲区存储数据,数据解析用低优先级的任务去处理。
环形队列缓冲区存储函数的执行时间在STM32F1里面大概2us不到,在STM32F4里面不足1us,所以当串口中断函数里面只运行环形对接缓冲区存储函数时,即使以波特图921600(传输一个字节10.85us)通讯,数据也不会丢帧。
当存在多个串口接受函数时,此时以STM32F1为例,假设环形队列缓冲区存储函数的执行时间在STM32F1里面为2us,此时存在6个串口中断以波特率921600同时运行,各中断彼此之间不能打断,但是存在子优先顺序,同一时刻6个中断全部挂起,这个时候系统首先响应子优先级第一的串口中断接受函数耗时2us,接着依次响应子优先级23456,当第6个串口中断函数刚开始执行时是第10us,在10—12us时系统正在执行第6个串口中断函数,在10.85us时刻,下一次串口中断又来了,此时便发生了数据丢帧。可以可以想一下,此时在不丢帧情况下,系统能设计的最大串口中断数为5个。
上面是以很极端的例子说明了丢帧在实际系统中是怎么发生的,一般串口通讯波特率不会到921600这么大,并且不是每个串口都必须工作在同一波特率,当工作波特率为115200时,串口接收单个字节为86.8us,此情况下系统能够执行足够多的串口中断函数,仍然能确保不丢帧。所以当系统所需串口中断很多时,可以通讯把波特率降下来,来确保不数据丢帧。
以上只考虑了串口中断彼此之间开销,当系统存在比串口中断接收优先级更好的中断任务时,比如利用外部中断的ppm接收、超声波测距等,为了确保串口不丢帧,需要优先级高于串口中断的任务最大执行时间+串口中断函数执行时间,务必小于串口接收单个字节所需的时间,才能确保不丢帧。
总结:
1、多个串口通讯时,串口通讯波特率可以降低一点。
2、合计设计优先级,当存在不同波特率通讯时,通讯波特率高的串口中断优先级要高于波特率低的。
3、存在优先级高于串口中断的其它中断任务时,其它中断任务的总的最大时间开销也要考虑。

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

无名小哥对无名飞控中的问题回答总结 的相关文章

随机推荐

  • C++学习之路之(变量命名规则)

    简单变量 变量的命名规则 变量名中只能用字母 abc 数字 0123456789 和下划线 名称的第一个字符不能是数字区分大小写不能将C 43 43 关键字用作名称尽量避免以下划线开头 系统头文件里将宏名 变量名 内部函数名用 开头就是为了
  • ROS2学习笔记(八)-- ROS2参数应用实现道路识别调试

    简介 xff1a 参数也是ROS2系统中很重要的一项功能 xff0c 主要是用来对节点进行配置 xff0c 一般用在调试过程中 xff0c 通过命令行的方式修改节点的一些配置 xff0c 用以辅助调试 xff0c 另外节点参数也支持导入和导
  • 删除docker容器和镜像的命令

    在删除docker容器的时候需要先停止docker xff0c 先删docker容器然后再删除镜像 然后docker rm docker容器的名字 xff08 docker rm mysql xff09 docker rmi 镜像的id
  • 精通SOA:基于服务总线的Struts+EJB+WebService整合应用开发(网上书店系统 - SOA实施)

    目前全球最大的软件服务商IBM 在实施SOA 方面一直处于领先地位 xff0c 因此通过介绍如何用IBM 的服务总线产品来构建SOA 架构更能使开发人员把握SOA 的精髓 服务总线是实现SOA 架构最核心的部分 xff0c 它将对系统内部或
  • 离散LQR:原理,求解与拓展

    该文档用以总结离散LQR的基本原理 xff0c 反馈控制率的求解和一些拓展 xff08 时变系统 xff0c 跟踪命题等 xff09 主要参考的是Stanford的课程EE363 Linear Dynamical Systems的部分课件
  • CMake添加不同目录文件的方法

    三种使用CMake构建工程添加子目录的方法 文件目录结构 span class token punctuation span CMakeLists span class token punctuation span txt inc ansi
  • 使用readdir函数读取一个文件夹的子文件,打印并统计个数

    readdir一般与opendir结合使用 readdir包含的头文件 xff1a include lt dirent h gt readdir函数的原型 xff1a struct dirent readdir DIR dirp 函数的作用
  • ModelSim 仿真常见问题及解决办法

    下面介绍一下使用ModelSim仿真时经常出现的一些问题的解决方法 xff1a 1 Can 39 t launch the ModelSim Altera software 这是由于Quartus II 软件中与 Modelsim 关联设置
  • 蓝牙协议栈

    蓝牙协议栈 蓝牙技术规范的目的是使符合该规范的各种应用之间能够实现互操作 互操作的远端设备需要使用相同的协议栈 xff0c 不同的应用需要不同的协议栈 但是 xff0c 所有的应用都要使用蓝牙技术规范中的数据链路层和物理层 完整的蓝牙协议栈
  • vscode 结合git基础操作之代码冲突解决

    在branch demo 1上面提交一个var d 61 xxx xff0c 假设不是我提交的 既然不是我提交的 xff0c 我在本地的代码并没有git pull 把最新的代码拉下来 xff0c 我就写了一个var f 61 xxx xff
  • Nextcloud使用手册

    1 用户登陆 访问地址 xff1a http 127 0 0 1 8080 管理员用户名 xff1a admin 密码 xff1a 2 面板介绍 边就是分享的链接 收藏 地址 xff0c 中间就是我们上传的图片 文档 程序等了 xff0c
  • 布谷鸟算法(cuckoo_search)可能会遇到的问题

    1 布谷鸟算法是先进行在pa的判断 xff0c 然后决定是进行Levy飞行还是做出相应毁坏蛋的行为 xff0c 再所有的粒子一起输出 2 布谷鸟算法里面的gamma函数在有的地方可能不能使用 xff0c 比如S Function xff0c
  • protues仿真常见问题解决方案

    目录 1 如何确定自己的仿真版本 2 仿真软件破解 3 仿真工程格式 4 未加载HEX文件 5 缺失元件模型 6 低版本无法打开高版本问题 7 仿真结果异常问题 8 仿真图打开失败 9 仿真运行过程中闪退 10 缺失 SDF文件 仿真出问题
  • 第20章 USART—串口通讯—零死角玩转STM32-F429系列

    第20章 USART 串口通讯 全套 200 集视频教程和 1000 页 PDF 教程请到秉火论坛下载 xff1a www firebbs cn 野火视频教程优酷观看网址 xff1a http i youku com firege 本章参考
  • UC/OS-II 源码下载【资源】

    目录 1 前序 2 官网下载源代码 3 STM32F1示例代码 1 前序 你是不是也在学习ucos相关知识 xff0c 想要去网上下载源码 xff0c 但是又不知道去哪里下载 xff0c 网上冲浪大半天也没找到源码 xff0c 结果键盘无故
  • 文件系统编译进内核

    1 利用busybox制作根文件目录 需要有init 和 linuxrc 2 makemenuconfig 在general setup 中设置 initial ram filesystem and RAM disk 后指定文件系统源文件路
  • 零基础制作平衡小车【连载】13---平衡小车代码讲解(附源码)

    前言 今天聊一聊代码 xff0c 只有直立功能的代码 代码总体思路 给定一个目标值 xff0c 单片机通过IIC和mpu6050通信 xff0c 得知数据后 xff0c 根据角度环计算出一个PWM值给电机驱动器 xff0c 从而控制单机转动
  • NRF51822---开发板介绍(连载1)

    无线遥控器项目先放一放吧 xff0c 要学习的东西太多了 xff0c 一开始以为很简单 xff0c 结果坑越挖越深 还保持采用NRF51822的方案做手柄 xff0c 在做之前先把51822这个骨头啃下来 我又重新开了一个专题 xff0c
  • nrf51822+rfx2401c系统板(开源原理图、PCB)

    快过年了 xff0c 没啥东西可送的 xff0c 就把刚做的射频板子开源了吧 原理图 3D图 板子还有点毛病 xff0c 不过问题不大 把PCB隔断 xff0c 飞根线就行了 xff0c 等你拿到手就能看到了 下图中画黑色圈的两个过孔把信号
  • 无名小哥对无名飞控中的问题回答总结

    文章目录 IIR二阶数字低通陀螺仪数据噪声传感器矫正姿态解算惯性导航控制滤波性能系统响应巴特沃斯滤波器的截止频率如何取累计漂移姿态估计精度误差大控制周期时间保证传感器数据不丢帧 IIR二阶数字低通 对于IIR而言 xff0c 阶次越高 xf