BetaFlight模块设计之二十二:地面测距任务分析

Posted lida2003

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BetaFlight模块设计之二十二:地面测距任务分析相关的知识,希望对你有一定的参考价值。

BetaFlight模块设计之二十二:地面测距任务分析

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

地面测距任务

描述:主要使用超声波或者雷达感知FC与地面之间的距离。

 ├──> 初始化
 │   ├──> [v]硬件初始化hcsr04Detect/lidarTFminiDetect/lidarTF02Detect
 │   └──> [v]业务初始化rangefinderInit
 ├──> 任务
 │   ├──> [x]实时任务
 │   ├──> [x]事件任务
 │   └──> [v]时间任务[TASK_RANGEFINDER] = DEFINE_TASK("RANGEFINDER", NULL, NULL, taskUpdateRangefinder, TASK_PERIOD_HZ(10), TASK_PRIORITY_LOWEST),
 ├──> 驱动
 │   ├──> [v]查询hcsr04_update/lidarTFUpdate
 │   └──> [v]中断hcsr04_extiHandler
 └──> 接口
     ├──> 支持HC-SR04声呐和Benewake TF02/TF03 lidar
     ├──> int32_t rangefinderGetLatestAltitude(void)
     ├──> bool rangefinderIsHealthy(void)
     └──> bool isSurfaceAltitudeValid()

硬件配置

kakute F7 AIO模型未配置上述距离感知模块,所以在目标板配置文件里面没有以下参数定义。

USE_RANGEFINDER_HCSR04  //超声波传感
USE_RANGEFINDER_TF      //雷达测距

超声波测距模型

./src/main/target/OMNIBUS/target.h:57://#define USE_RANGEFINDER_HCSR04
./src/main/target/NUCLEOH743/target.h:246:#define USE_RANGEFINDER_HCSR04
./src/main/target/OMNIBUSF7/target.h:216:#define USE_RANGEFINDER_HCSR04
./src/main/target/ISHAPEDF3/target.h:55:#define USE_RANGEFINDER_HCSR04
./src/main/target/OMNINXT/target.h:181:#define USE_RANGEFINDER_HCSR04
./src/main/target/AG3X/target.h:157:#define USE_RANGEFINDER_HCSR04
./src/main/target/MULTIFLITEPICO/target.h:65:#define USE_RANGEFINDER_HCSR04
./src/main/target/OMNIBUSF4/target.h:280:#define USE_RANGEFINDER_HCSR04
./src/main/target/NUCLEOH723ZG/target.h:232:#define USE_RANGEFINDER_HCSR04
./src/main/target/CC3D/target.h:98://#define USE_RANGEFINDER_HCSR04
./src/main/target/CC3D/target.h:108:#undef USE_RANGEFINDER_HCSR04
./src/main/target/NAZE/target.h:117://#define USE_RANGEFINDER_HCSR04
./src/main/target/NUCLEOF103RG/target.h:115://#define USE_RANGEFINDER_HCSR04
./src/main/target/NUCLEOH7A3ZI/target.h:232:#define USE_RANGEFINDER_HCSR04
./src/main/target/SPRACINGF3EVO/target.h:79://#define USE_RANGEFINDER_HCSR04
./src/main/target/STM32F3DISCOVERY/target.h:180:#define USE_RANGEFINDER_HCSR04
./src/main/target/RCEXPLORERF3/target.h:60:#define USE_RANGEFINDER_HCSR04
./src/main/target/STM32_UNIFIED/target.h:342:#define USE_RANGEFINDER_HCSR04
./src/main/target/SPRACINGF3/target.h:103:#define USE_RANGEFINDER_HCSR04
./src/main/target/SPRACINGF3/target.h:114:#define USE_RANGEFINDER_HCSR04
./src/main/target/NUCLEOH725ZG/target.h:241:#define USE_RANGEFINDER_HCSR04
./src/main/target/SPRACINGF3MINI/target.h:79://#define USE_RANGEFINDER_HCSR04
./src/main/target/NUCLEOF303RE/target.h:62://#define USE_RANGEFINDER_HCSR04
./src/main/target/SPARKY/target.h:95://#define USE_RANGEFINDER_HCSR04

雷达测距

./src/main/target/NUCLEOH743/target.h:247:#define USE_RANGEFINDER_TF
./src/main/target/OMNINXT/target.h:182:#define USE_RANGEFINDER_TF
./src/main/target/AG3X/target.h:158://#define USE_RANGEFINDER_TF
./src/main/target/OMNIBUSF4/target.h:283:#define USE_RANGEFINDER_TF
./src/main/target/NUCLEOH723ZG/target.h:233:#define USE_RANGEFINDER_TF
./src/main/target/NUCLEOH7A3ZI/target.h:233:#define USE_RANGEFINDER_TF
./src/main/target/STM32_UNIFIED/target.h:343:#define USE_RANGEFINDER_TF
./src/main/target/NUCLEOH725ZG/target.h:242:#define USE_RANGEFINDER_TF

软件配置

代码还是存在一定的耦合度,没有从驱动API上解耦,而是直接在代码层面采用了枚举。

\\src\\main\\sensors\\rangefinder.h
typedef enum 
    RANGEFINDER_NONE        = 0,
    RANGEFINDER_HCSR04      = 1,
    RANGEFINDER_TFMINI      = 2,
    RANGEFINDER_TF02        = 3,
 rangefinderType_e;

主要函数分析

taskUpdateRangefinder

任务函数判断没有测距模块情况直接反馈,其他情况执行后续数据更新和距离计算。

taskUpdateRangefinder
 ├──> <!sensors(SENSOR_RANGEFINDER)>
 │   └──> return
 ├──> rangefinderUpdate
 └──> rangefinderProcess(getCosTiltAngle());

rangefinderUpdate

调用驱动API触发测量动作。

rangefinderUpdate
 └──> <rangefinder.dev.update>
     └──> rangefinder.dev.update(&rangefinder.dev);

rangefinderProcess

获取测量数据,并数据分析和计算当前距离地面高度。

rangefinderProcess
 ├──> <!rangefinder.dev.read> // Bad configuration
 │   └──> rangefinder.rawAltitude = RANGEFINDER_OUT_OF_RANGE;
 ├──> <rangefinder.dev.read>
 │   ├──> const int32_t distance = rangefinder.dev.read(&rangefinder.dev);
 │   ├──> <distance == RANGEFINDER_NO_NEW_DATA>
 │   │   └──> return false
 │   ├──> <distance >= 0>
 │   │   ├──> rangefinder.lastValidResponseTimeMs = millis();
 │   │   └──> rangefinder.rawAltitude = applyMedianFilter(distance);  //中位数据过滤
 │   ├──> <distance == RANGEFINDER_OUT_OF_RANGE>
 │   │   ├──> rangefinder.lastValidResponseTimeMs = millis();
 │   │   └──> rangefinder.rawAltitude = RANGEFINDER_OUT_OF_RANGE;
 │   ├──> <else>
 │   │   └──> rangefinder.rawAltitude = RANGEFINDER_HARDWARE_FAILURE;
 │   ├──> rangefinder.snr = computePseudoSnr(distance);
 │   └──> <rangefinder.snrThresholdReached == false && rangefinder.rawAltitude > 0>
 │       ├──> <rangefinder.snr < RANGEFINDER_DYNAMIC_THRESHOLD && rangefinder.dynamicDistanceThreshold < rangefinder.rawAltitude>
 │       │   └──> rangefinder.dynamicDistanceThreshold = rangefinder.rawAltitude * RANGEFINDER_DYNAMIC_FACTOR / 100;
 │       └──> <rangefinder.snr >= RANGEFINDER_DYNAMIC_THRESHOLD>
 │           └──> rangefinder.snrThresholdReached = true;
 ├──> <cosTiltAngle < rangefinder.maxTiltCos || rangefinder.rawAltitude < 0>
 │   └──> rangefinder.calculatedAltitude = RANGEFINDER_OUT_OF_RANGE;
 ├──> <!(cosTiltAngle < rangefinder.maxTiltCos || rangefinder.rawAltitude < 0)>
 │   └──> rangefinder.calculatedAltitude = rangefinder.rawAltitude * cosTiltAngle; //垂直距离计算
 └──> return true

以上是关于BetaFlight模块设计之二十二:地面测距任务分析的主要内容,如果未能解决你的问题,请参考以下文章

BetaFlight模块设计之二十七:姿态更新任务分析

BetaFlight模块设计之二十六:接收机任务分析

BetaFlight模块设计之二十一:dashboard任务分析

BetaFlight模块设计之二十五:dispatch任务分析

BetaFlight模块设计之二十四:transponder任务分析

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