BetaFlight模块设计之十三:Gyro过滤任务分析
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过滤任务分析相关推荐
- BetaFlight模块设计之三十三:Pid模块分析
BetaFlight模块设计之三十三:Pid模块分析 Pid模块 1. Pid_audio子模块 2. Pid_init子模块 3. Pid算法子模块 3.1 TPA模式 3.2 飞行模式 3.3 L ...
- BetaFlight模块设计之二:SERIAL任务分析
BetaFlight模块设计之二:SERIAL任务分析 SERIAL任务 1.总体情况 2.主要函数分析 2.1 taskHandleSerial任务 2.2 命令行处理函数cliProcess 2. ...
- BetaFlight模块设计之十:磁力计任务分析
BetaFlight模块设计之十:磁力计任务分析 磁力计任务 taskUpdateMag函数分析 compassUpdate函数分析 磁力计配置 基于BetaFlight开源代码框架简介的框架设计,逐 ...
- BetaFlight模块设计之九:气压计任务分析
BetaFlight模块设计之九:气压计任务分析 气压计任务 taskUpdateBaro气压计任务函数 baroUpdate气压计数据更新函数 气压计配置 基于BetaFlight开源代码框架简介的 ...
- BetaFlight模块设计之十七:pinioBox任务分析
BetaFlight模块设计之十七:pinioBox任务分析 pinioBox任务 业务配置 硬件配置 pinioBoxUpdate任务分析 基于BetaFlight开源代码框架简介的框架设计,逐步分 ...
- BetaFlight模块设计之二十九:滤波模块分析
BetaFlight模块设计之二十九:滤波模块分析 滤波模块 滤波类型 1. slewFilter 2. simpleLowpassFilter 3. laggedMovingAverage 4. p ...
- BetaFlight模块设计之三十:Cli模块分析
BetaFlight模块设计之三十:Cli模块分析 Cli模块 Cli接口 Cli框架 Cli命令结构 主要函数分析 cliProcess函数 processCharacterInteractive函 ...
- BetaFlight模块设计之十二:电传任务分析
BetaFlight模块设计之十二:电传任务分析 电传任务 taskTelemetry任务分析 subTaskTelemetryPollSensors函数分析 telemetryProcess函数分析 ...
- BetaFlight模块设计之八:GPS任务分析
BetaFlight模块设计之八:GPS任务分析 GPS任务 gpsUpdate函数分析 gpsNewData函数分析 gpsNewFrame函数分析 onGpsNewData 函数分析 基于Beta ...
- BetaFlight模块设计之七:LEDSTRIP任务分析
BetaFlight模块设计之七:LEDSTRIP任务分析 1. LEDSTRIP任务 2. ledStripUpdate函数分析 2.1 StatusProfile 2.2 SimpleProfil ...
最新文章
- python 学习 之 第二章(条件、循环和其他语句)
- node第三方登陆github(express)
- Cmder集成到VS Code (新旧版设置不同)
- 【渝粤教育】 国家开放大学2020年春季 2773特种动物养殖 参考试题
- hough变换检测圆周_一文解读经典霍夫变换(Hough Transform)
- 打包windows 和 linux caffe 版本的人脸识别 人脸年龄估计 人脸性别模型的总结
- mysql 字段加减_MySQL数据库开发常见问题及优化(续)
- 电大 计算机网络 网考,2018-2019年最新电大《计算机网络(本)》网络核心课形考网考作业答案.docx...
- matlab高斯窗函数,Matlab的窗函数,矩形窗,三角窗,汉明窗,汉宁窗,布莱克曼窗
- (转)以太坊(Ethereum)全零地址(0x000000...)揭秘
- 唯品会 Dragonfly 日志系统的 Elasticsearch 实践
- 100+份项目管理模板和工具免费下载,包含项目管理各个流程都该用到哪些工具和方法!
- 51单片机中断地址表
- Typora自动上传图床配置
- django 注册登录邮箱验证功能
- 扫描工具-Arachni
- BZOJ3510 首都
- 自适应流媒体传输-fmp4
- 服务器操作系统应该选择 Debian/Ubuntu 还是 CentOS?
- 英语 | Day3、4 x 句句真研每日一句