BetaFlight模块设计之十三:Gyro过滤任务分析

  • Gyro过滤任务
  • taskFiltering任务分析
  • gyroFiltering函数分析
  • filterGyro函数分析
  • dynamic notch filter
  • downsampling概念

基于BetaFlight开源代码框架简介的框架设计,逐步分析内部模块功能设计。

Gyro过滤任务

描述:主要是对Gyro数据的过滤处理。

 ├──> 初始化│   ├──> [x]硬件初始化│   └──> [v]业务初始化gyroInitFilters├──> 任务│   ├──> [v]实时任务[TASK_FILTER] = DEFINE_TASK("FILTER", NULL, NULL, taskFiltering, TASK_GYROPID_DESIRED_PERIOD, TASK_PRIORITY_REALTIME),│   ├──> [x]事件任务│   └──> [x]时间任务├──> 驱动│   ├──> [x]查询│   └──> [x]中断└──> 接口└──> TBD

taskFiltering任务分析

没什么看头,外面是一个过滤任务,里面实质是gyro的过滤函数。
估计最初考虑很多数据平滑或者过滤都在这里处理。而实际上这个和飞控姿态相关的数据过滤函数调用频率非常高,而其他传感数据并非需要类似高的频率。

taskFiltering└──> gyroFiltering

gyroFiltering函数分析

gyroFiltering├──> GYRO_FILTER_FUNCTION_NAME()├──> <USE_DYN_NOTCH_FILTER><isDynNotchActive()>│   └──> dynNotchUpdate├──> <gyro.useDualGyroDebugging>│   ├──> <GYRO_CONFIG_USE_GYRO_1>[debug数据更新]│   ├──> <GYRO_CONFIG_USE_GYRO_2>[debug数据更新]│   └──> <GYRO_CONFIG_USE_GYRO_BOTH>[debug数据更新]├──> <USE_GYRO_OVERFLOW_CHECK><gyroConfig()->checkOverflow && !gyro.gyroHasOverflowProtection>│   └──> checkForOverflow├──> <USE_YAW_SPIN_RECOVERY><yawSpinRecoveryEnabled>│   └──> checkForYawSpin└──> <!overflowDetected> // integrate using trapezium rule to avoid bias├──> accumulatedMeasurements[axis] += 0.5f * (gyroPrevious[axis] + gyro.gyroADCf[axis]) * gyro.targetLooptime;├──> gyroPrevious[axis] = gyro.gyroADCf[axis];└──> accumulatedMeasurementCount++;

filterGyro函数分析

这个函数有两个变种:filterGyro和filterGyroDebug;主要问题是是否需要debug一些数据,filterGyroDebug函数以下宏定义来数据的记录。

#define DEBUG_SET(mode, index, value) do { if (debugMode == (mode)) { debug[(index)] = (value); } } while (0)
#define GYRO_FILTER_AXIS_DEBUG_SET(axis, mode, index, value) if (axis == (int)gyro.gyroDebugAxis) DEBUG_SET(mode, index, value)

详见:\src\main\sensors\gyro.c

#define GYRO_FILTER_FUNCTION_NAME filterGyro
#define GYRO_FILTER_DEBUG_SET(mode, index, value) do { UNUSED(mode); UNUSED(index); UNUSED(value); } while (0)
#define GYRO_FILTER_AXIS_DEBUG_SET(axis, mode, index, value) do { UNUSED(axis); UNUSED(mode); UNUSED(index); UNUSED(value); } while (0)
#include "gyro_filter_impl.c"
#undef GYRO_FILTER_FUNCTION_NAME
#undef GYRO_FILTER_DEBUG_SET
#undef GYRO_FILTER_AXIS_DEBUG_SET#define GYRO_FILTER_FUNCTION_NAME filterGyroDebug
#define GYRO_FILTER_DEBUG_SET DEBUG_SET
#define GYRO_FILTER_AXIS_DEBUG_SET(axis, mode, index, value) if (axis == (int)gyro.gyroDebugAxis) DEBUG_SET(mode, index, value)
#include "gyro_filter_impl.c"
#undef GYRO_FILTER_FUNCTION_NAME

实际运行或者发布的代码还是使用filterGyro,这里分析的时候直接使用了GYRO_FILTER_FUNCTION_NAME。

GYRO_FILTER_FUNCTION_NAME├──> <loop axis> // downsample the individual gyro samples│   ├──> <gyro.downsampleFilterEnabled> // using gyro lowpass 2 filter for downsampling│   │   └──> gyroADCf = gyro.sampleSum[axis];│   ├──> <!gyro.downsampleFilterEnabled> // using simple average for downsampling│   │   └──> gyroADCf = gyro.sampleSum[axis] / gyro.sampleCount;│   ├──> <USE_RPM_FILTER>│   │   └──> rpmFilterGyro│   ├──> // apply static notch filters and software lowpass filters│   │   ├──> gyroADCf = gyro.notchFilter1ApplyFn((filter_t *)&gyro.notchFilter1[axis], gyroADCf);│   │   ├──> gyroADCf = gyro.notchFilter2ApplyFn((filter_t *)&gyro.notchFilter2[axis], gyroADCf);│   │   └──> gyroADCf = gyro.lowpassFilterApplyFn((filter_t *)&gyro.lowpassFilter[axis], gyroADCf);│   ├──> <USE_DYN_NOTCH_FILTER><isDynNotchActive()>│   │   ├──> dynNotchPush(axis, gyroADCf);│   │   ├──> gyroADCf = dynNotchFilter(axis, gyroADCf);│   └──> gyro.gyroADCf[axis] = gyroADCf;└──> gyro.sampleCount = 0;

dynamic notch filter

关于dynamic notch filter我们有时间再专门针对滤波这个作为一个模块进行分析,详见:\src\main\flight\dyn_notch_filter.c。

注:BetaFlight模块设计之二十九:滤波模块分析

downsampling概念

这里是关于数据采集以及downsampling/upsampling数据处理的算法问题,暂不做展开,有兴趣的,这里有个链接可以简单了解下。

BetaFlight模块设计之十三:Gyro过滤任务分析相关推荐

  1. BetaFlight模块设计之三十三:Pid模块分析

    BetaFlight模块设计之三十三:Pid模块分析 Pid模块 1. Pid_audio子模块 2. Pid_init子模块 3. Pid算法子模块 3.1 TPA模式 3.2 飞行模式 3.3 L ...

  2. BetaFlight模块设计之二:SERIAL任务分析

    BetaFlight模块设计之二:SERIAL任务分析 SERIAL任务 1.总体情况 2.主要函数分析 2.1 taskHandleSerial任务 2.2 命令行处理函数cliProcess 2. ...

  3. BetaFlight模块设计之十:磁力计任务分析

    BetaFlight模块设计之十:磁力计任务分析 磁力计任务 taskUpdateMag函数分析 compassUpdate函数分析 磁力计配置 基于BetaFlight开源代码框架简介的框架设计,逐 ...

  4. BetaFlight模块设计之九:气压计任务分析

    BetaFlight模块设计之九:气压计任务分析 气压计任务 taskUpdateBaro气压计任务函数 baroUpdate气压计数据更新函数 气压计配置 基于BetaFlight开源代码框架简介的 ...

  5. BetaFlight模块设计之十七:pinioBox任务分析

    BetaFlight模块设计之十七:pinioBox任务分析 pinioBox任务 业务配置 硬件配置 pinioBoxUpdate任务分析 基于BetaFlight开源代码框架简介的框架设计,逐步分 ...

  6. BetaFlight模块设计之二十九:滤波模块分析

    BetaFlight模块设计之二十九:滤波模块分析 滤波模块 滤波类型 1. slewFilter 2. simpleLowpassFilter 3. laggedMovingAverage 4. p ...

  7. BetaFlight模块设计之三十:Cli模块分析

    BetaFlight模块设计之三十:Cli模块分析 Cli模块 Cli接口 Cli框架 Cli命令结构 主要函数分析 cliProcess函数 processCharacterInteractive函 ...

  8. BetaFlight模块设计之十二:电传任务分析

    BetaFlight模块设计之十二:电传任务分析 电传任务 taskTelemetry任务分析 subTaskTelemetryPollSensors函数分析 telemetryProcess函数分析 ...

  9. BetaFlight模块设计之八:GPS任务分析

    BetaFlight模块设计之八:GPS任务分析 GPS任务 gpsUpdate函数分析 gpsNewData函数分析 gpsNewFrame函数分析 onGpsNewData 函数分析 基于Beta ...

  10. BetaFlight模块设计之七:LEDSTRIP任务分析

    BetaFlight模块设计之七:LEDSTRIP任务分析 1. LEDSTRIP任务 2. ledStripUpdate函数分析 2.1 StatusProfile 2.2 SimpleProfil ...

最新文章

  1. python 学习 之 第二章(条件、循环和其他语句)
  2. node第三方登陆github(express)
  3. Cmder集成到VS Code (新旧版设置不同)
  4. 【渝粤教育】 国家开放大学2020年春季 2773特种动物养殖 参考试题
  5. hough变换检测圆周_一文解读经典霍夫变换(Hough Transform)
  6. 打包windows 和 linux caffe 版本的人脸识别 人脸年龄估计 人脸性别模型的总结
  7. mysql 字段加减_MySQL数据库开发常见问题及优化(续)
  8. 电大 计算机网络 网考,2018-2019年最新电大《计算机网络(本)》网络核心课形考网考作业答案.docx...
  9. matlab高斯窗函数,Matlab的窗函数,矩形窗,三角窗,汉明窗,汉宁窗,布莱克曼窗
  10. (转)以太坊(Ethereum)全零地址(0x000000...)揭秘
  11. 唯品会 Dragonfly 日志系统的 Elasticsearch 实践
  12. 100+份项目管理模板和工具免费下载,包含项目管理各个流程都该用到哪些工具和方法!
  13. 51单片机中断地址表
  14. Typora自动上传图床配置
  15. django 注册登录邮箱验证功能
  16. 扫描工具-Arachni
  17. BZOJ3510 首都
  18. 自适应流媒体传输-fmp4
  19. 服务器操作系统应该选择 Debian/Ubuntu 还是 CentOS?
  20. 英语 | Day3、4 x 句句真研每日一句

热门文章

  1. SM2 椭圆曲线公钥密码算法,完整c代码,前人栽树,后人乘凉
  2. 自反ACL实验(GNS3)
  3. linux安装git lfs
  4. android webview支持webgl,Android WebView支持WebGL
  5. tomcat如何知道WebRoot是web根目录?
  6. 压力传感器的封装形式
  7. NCS初探--基于nRF5340的blinky
  8. 【Tomcat】Tomcat 介绍及使用教程
  9. Java interviewee-基础知识《一》
  10. 激光雷达简介及物体检测(一)