当前位置:   article > 正文

ardupilot/Ardupilot V4.3.4 源码解析:Plane.h(1)_arduplane 源代码

arduplane 源代码

/*

请贡献您的观点!请参阅 http://dev.ardupilot.com 了解更多详细资料

此程序是自由软件:请根据 GNU 通用公共许可证的规定重新发布或修改程序,

无论是版本 3 或更高版本(根据您的选择)。

此程序是基于 GNU 通用公共许可证的发布的,无任何保证。

您应该已经收到了一份 GNU 通用公共许可证的副本。

如果没有,请参阅 <http://www.gnu.org/licenses />。

 */

#pragma once

// Header includes 包含标头

#include <cmath>

#include <stdarg.h>

#include <stdio.h>

#include <AP_HAL/AP_HAL.h>                        // 硬件板卡信息库 它可能是最重要的库,因为它包含读取无线、写入电机、处理数字和模拟端口、串行通信、实时操作调度程序、将数据包写入 SD 存储器等所有命令。该库还具有其他类型的硬件平台的变体,例如 AVR 基础、 Linux 基础等。

#include <AP_Common/AP_Common.h>                  // 常用函数库,例如用于串行通信的高低部件转换器,角度测量系统之间的转换(弧度到角度)等。

#include <AP_Airspeed/AP_Airspeed.h>

#include <AP_Param/AP_Param.h>                    // 它包含用于在不同类型的变量之间进行转换和交互的函数。尽管最终用户直接使用此库并不常见,但是其余代码需要它正常运行,因此必不可少。

#include <StorageManager/StorageManager.h>

#include <AP_Math/AP_Math.h>                     // ArduPilot 向量/矩阵数学库  它包含用于矩阵和矢量运算、归一化、单位类型转换等专门的数学函数。

#include <AP_InertialSensor/AP_InertialSensor.h> // 惯性传感器库

#include <AP_AccelCal/AP_AccelCal.h>             // 加速度计校准的接口和运算库

#include <AP_AHRS/AP_AHRS.h>                     //  DCM矩阵转换库

#include <SRV_Channel/SRV_Channel.h>

#include <AP_RangeFinder/AP_RangeFinder.h>       // 距离测量仪库

#include <Filter/Filter.h>                       // 滤波器库

#include <AP_Camera/AP_Camera.h>                 // 照片和视频相机库

#include <AP_Terrain/AP_Terrain.h>

#include <AP_RPM/AP_RPM.h>

#include <AP_Stats/AP_Stats.h>                   // 统计库

#include <AP_Beacon/AP_Beacon.h>

#include <AP_AdvancedFailsafe/AP_AdvancedFailsafe.h>

#include <APM_Control/APM_Control.h>

#include <APM_Control/AP_AutoTune.h>

#include <GCS_MAVLink/GCS_MAVLink.h>               // MAVLink GCS定义

#include <AP_Mount/AP_Mount.h>                     // 相机/天线安装

#include <AP_Declination/AP_Declination.h>         // 磁偏角助手库

#include <AP_Logger/AP_Logger.h>

#include <AP_Scheduler/AP_Scheduler.h>            // 主循环调度程序

#include <AP_Scheduler/PerfInfo.h>                // 循环性能监控

#include <AP_Navigation/AP_Navigation.h>

#include <AP_L1_Control/AP_L1_Control.h>         // L1制导库 水平制导

#include <AP_RCMapper/AP_RCMapper.h>             // RC输入映射库

#include <AP_Vehicle/AP_Vehicle.h>

#include <AP_TECS/AP_TECS.h>                    // TECS制导律 高度制导

#include <AP_NavEKF2/AP_NavEKF2.h>

#include <AP_NavEKF3/AP_NavEKF3.h>

#include <AP_Mission/AP_Mission.h>               // 任务命令库

#include <AP_Soaring/AP_Soaring.h>

#include <AP_BattMonitor/AP_BattMonitor.h>     // 电池监控库

#include <AP_Arming/AP_Arming.h>

#include <AP_Frsky_Telem/AP_Frsky_Telem.h>

#include <AP_OSD/AP_OSD.h>

#include <AP_Rally/AP_Rally.h>

#include <AP_OpticalFlow/AP_OpticalFlow.h>     //  光流库

#include <AP_Parachute/AP_Parachute.h>

#include <AP_ADSB/AP_ADSB.h>

#include <AP_ICEngine/AP_ICEngine.h>

#include <AP_Gripper/AP_Gripper.h>

#include <AP_Landing/AP_Landing.h>

#include <AP_LandingGear/AP_LandingGear.h>     // 着陆装置库

#include <AP_Follow/AP_Follow.h>

#include "GCS_Mavlink.h"

#include "GCS_Plane.h"

#include "quadplane.h"

#include "tuning.h"

//  配置

#include "config.h"

#if ADVANCED_FAILSAFE == ENABLED

#include "afs_plane.h"

#endif

//  本地模块

#include "defines.h"

#include "mode.h"

#if AP_SCRIPTING_ENABLED

#include <AP_Scripting/AP_Scripting.h>

#endif

#include "RC_Channel.h"     //RC通道库

#include "Parameters.h"

#if HAL_ADSB_ENABLED

#include "avoidance_adsb.h"

#endif

#include "AP_Arming.h"

/*

   main APM:Plane类

 */

class Plane : public AP_Vehicle {

public:

    friend class GCS_MAVLINK_Plane;

    friend class Parameters;

    friend class ParametersG2;

    friend class AP_Arming_Plane;

    friend class QuadPlane;

    friend class QAutoTune;

    friend class AP_Tuning_Plane;

    friend class AP_AdvancedFailsafe_Plane;

    friend class AP_Avoidance_Plane;

    friend class GCS_Plane;

    friend class RC_Channel_Plane;

    friend class RC_Channels_Plane;

    friend class Tailsitter;

    friend class Tiltrotor;

    friend class SLT_Transition;

    friend class Tailsitter_Transition;

    friend class Mode;

    friend class ModeCircle;

    friend class ModeStabilize;

    friend class ModeTraining;

    friend class ModeAcro;

    friend class ModeFBWA;

    friend class ModeFBWB;

    friend class ModeCruise;

    friend class ModeAutoTune;

    friend class ModeAuto;

    friend class ModeRTL;

    friend class ModeLoiter;

    friend class ModeAvoidADSB;

    friend class ModeGuided;

    friend class ModeInitializing;

    friend class ModeManual;

    friend class ModeQStabilize;

    friend class ModeQHover;

    friend class ModeQLoiter;

    friend class ModeQLand;

    friend class ModeQRTL;

    friend class ModeQAcro;

    friend class ModeQAutotune;

    friend class ModeTakeoff;

    friend class ModeThermal;

    friend class ModeLoiterAltQLand;

    Plane(void);

private:

    // 多个库传递的关键飞行器参数

    AP_Vehicle::FixedWing aparm;

    // 全局参数都包含在 'g' 和 'g2' 类中

    Parameters g;

    ParametersG2 g2;

    // 输入通道映射

    RCMapper rcmap;

    // 主要输入通道

    RC_Channel *channel_roll;

    RC_Channel *channel_pitch;

    RC_Channel *channel_throttle;

    RC_Channel *channel_rudder;

    RC_Channel *channel_flap;

    RC_Channel *channel_airbrake;

    AP_Logger logger;

    // 基于俯仰角的缩放航向限制

    int32_t roll_limit_cd;

    int32_t pitch_limit_min_cd;

    // 便利数组,记录飞行模式

    AP_Int8 *flight_modes = &g.flight_mode1;

    AP_Vehicle::FixedWing::Rangefinder_State rangefinder_state;

    AP_RPM rpm_sensor;

    AP_TECS TECS_controller{ahrs, aparm, landing, MASK_LOG_TECS};

    AP_L1_Control L1_controller{ahrs, &TECS_controller};

    // 从姿态到伺服控制器

    AP_RollController rollController{aparm};

    AP_PitchController pitchController{aparm};

    AP_YawController yawController{aparm};

    AP_SteerController steerController{};

    // 训练模式

    bool training_manual_roll;  //  用户手动航向控制

    bool training_manual_pitch; //  用户手动俯仰控制


 

    /*

       在更新伺服之前保持舵机和方向舵控制分离,

      以允许独立的机轮舵机和方向舵舵机控制

    */

    struct {

        bool ground_steering; // 是否进行地面舵控?

        int16_t steering;     // 前轮/尾轮的值

        int16_t rudder;       // 方向舵的值

    } steering_control;

    // 是否应该在引导模式下透传油门?

    bool guided_throttle_passthru;


 

    // 我们是否正在进行校准?这用于在气压计和空速计校准期间使外部失效板的心跳正常。

    bool in_calibration;

    // GCS选择

    GCS_Plane _gcs; //避免使用此变量;使用gcs()替代

    GCS_Plane &gcs() { return _gcs; }

    // 选择的导航控制器

    AP_Navigation *nav_controller = &L1_controller;

    // 摄像头

#if CAMERA == ENABLED

    AP_Camera camera{MASK_LOG_CAMERA};

#endif

#if AP_OPTICALFLOW_ENABLED

    // 光流传感器

    AP_OpticalFlow optflow;

#endif

    // 集结点

    AP_Rally rally;

#if OSD_ENABLED || OSD_PARAM_ENABLED

    AP_OSD osd;

#endif

    ModeCircle mode_circle;

    ModeStabilize mode_stabilize;

    ModeTraining mode_training;

    ModeAcro mode_acro;

    ModeFBWA mode_fbwa;

    ModeFBWB mode_fbwb;

    ModeCruise mode_cruise;

    ModeAutoTune mode_autotune;

    ModeAuto mode_auto;

    ModeRTL mode_rtl;

    ModeLoiter mode_loiter;

#if HAL_ADSB_ENABLED

    ModeAvoidADSB mode_avoidADSB;

#endif

    ModeGuided mode_guided;

    ModeInitializing mode_initializing;

    ModeManual mode_manual;

#if HAL_QUADPLANE_ENABLED

    ModeQStabilize mode_qstabilize;

    ModeQHover mode_qhover;

    ModeQLoiter mode_qloiter;

    ModeQLand mode_qland;

    ModeQRTL mode_qrtl;

    ModeQAcro mode_qacro;

    ModeLoiterAltQLand mode_loiter_qland;

#if QAUTOTUNE_ENABLED

    ModeQAutotune mode_qautotune;

#endif  // QAUTOTUNE_ENABLED

#endif  // HAL_QUADPLANE_ENABLED

    ModeTakeoff mode_takeoff;

#if HAL_SOARING_ENABLED

    ModeThermal mode_thermal;

#endif


 

    // 飞行控制系统的状态

    // 定义了多个状态,例如手动、FBW-A和AUTO

    Mode *control_mode = &mode_initializing;

    Mode *previous_mode = &mode_initializing;

    // 上次模式更改的时间

    uint32_t last_mode_change_ms;

    // 用于保持之前控制开关位置的状态

    // 当我们需要重新读取开关时,将其设置为254

    uint8_t oldSwitchPosition = 254;

    // 用于启用倒飞功能

    bool inverted_flight;

    // 上次执行滚转/俯仰稳定器的时间

    uint32_t last_stabilize_ms;

    // 失控保护

    struct {

        // 用于判断通道3(油门)的值是否低于失效保护阈值

        // 当信号丢失时,RC接收机应输出低油门值

        bool rc_failsafe;

        // 如果发生与ADSB相关的失效安全,则为true

        bool adsb;

        // 保存的飞行模式

        enum Mode::Number saved_mode_number;

        // 用于跟踪当前活动的失效保护类型

        // 用于RC信号或GCS信号的失效保护

        int16_t state;

        // 低油门值的数量

        uint8_t throttle_counter;

        // A timer used to track how long we have been in a "short failsafe" condition due to loss of RC signal

        // 用于跟踪处于“短失效保护”状态的时间,由于接收机信号丢失

        uint32_t short_timer_ms;

        uint32_t last_valid_rc_ms;


 

        //跟踪最后一个有效的rc,与AFS系统相关

        //如果标准失效保护打开,则不计算rc输入是否有效

        uint32_t AFS_last_valid_rc_ms;

    } failsafe;

    enum Landing_ApproachStage {

        RTL,

        LOITER_TO_ALT,

        ENSURE_RADIUS,

        WAIT_FOR_BREAKOUT,

        APPROACH_LINE,

        VTOL_LANDING,

    };

#if HAL_QUADPLANE_ENABLED

    // Landing着陆

    struct {

        enum Landing_ApproachStage approach_stage;

        float approach_direction_deg;

    } vtol_approach_s;

#endif

    bool any_failsafe_triggered() {

        return failsafe.state != FAILSAFE_NONE || battery.has_failsafed() || failsafe.adsb;

    }

    // 用于倒计算GPS修复问题的计数器,以便GPS估计稳定之前记录我们的家位置(如果我们是通过空中启动引导的,则执行地面启动)

    uint8_t ground_start_count = 5;

    // 如果我们有AHRS的位置估计,则为true

    bool have_position;


 

    // 空速

    // 用于FBW-B的计算得出的空速。在定高模式中,也用于确保满足最小地速的要求。

    // 也用于舵翼展开的条件。单位:厘米/秒。

    int32_t target_airspeed_cm;

    int32_t new_airspeed_cm = -1;  //AUTO和GUIDED模式速度变化的临时变量。

    // 当前空速与期望空速之间的差值。在俯仰控制器中使用。单位:米/秒。

    float airspeed_error;

    // 在自动模式下,根据用户将油门摇杆定位在范围的上半部分增加的空速量。单位:厘米/秒

    int16_t airspeed_nudge_cm;

    // 类似于airspeed_nudge,但在没有空速传感器时使用。

    // 0-(油门最大值-巡航油门值):自动模式下使用油门行程的上半部分的油门扰动

    int16_t throttle_nudge;

    // 地速

    // 当前地速低于最小地速的量。单位:厘米/秒

    int32_t groundspeed_undershoot;

    // 当前高度与期望高度之间的差值。单位:厘米

    int32_t altitude_error_cm;

    // 控制面的速度缩放器,以10Hz更新

    float surface_speed_scaler = 1.0;

    // Battery Sensors电池传感器

    AP_BattMonitor battery{MASK_LOG_CURRENT,

                           FUNCTOR_BIND_MEMBER(&Plane::handle_battery_failsafe, void, const char*, const int8_t),

                           _failsafe_priorities};

    // ACRO控制器状态

    struct {

        bool locked_roll;

        bool locked_pitch;

        float locked_roll_err;

        int32_t locked_pitch_cd;

    } acro_state;

    struct {

        uint32_t last_tkoff_arm_time;

        uint32_t last_check_ms;

        uint32_t last_report_ms;

        bool launchTimerStarted;

        uint8_t accel_event_counter;

        uint32_t accel_event_ms;

        uint32_t start_time_ms;

    } takeoff_state;

    // 地面转向控制器状态

    struct {


 

        // 在起飞和着陆阶段保持的方向(百分之一度)

        // 值为-1表示未设置/不使用该航向,这是一个0到36000的值,或-1表示禁用

        int32_t hold_course_cd = -1;


 

        // 在稳定模式下使用的locked_course和locked_course_cd 在进行地面舵控时使用,并用于自动起飞的转向控制

        bool locked_course;

        float locked_course_err;

        uint32_t last_steer_ms;

    } steer_state;

    // 飞行模式特定

    struct {

        // 在自主模式下完成起飞命令的高度阈值,相对于home的高度(厘米)

        int32_t takeoff_altitude_rel_cm;

        // 由此高度开始,开始减小强制起飞俯仰角的最小高度,以减少/消除超调

        int32_t height_below_takeoff_to_level_off_cm;


 

        // 进入AUTO模式以来达到的最高空速。用于控制地面起飞

        float highest_airspeed;

        // 下一个航程的转弯角度

        float next_turn_angle {90};

        // 用于着陆的滤波下沉率

        float sink_rate;

        // 第一次超过最小GPS速度的时间

        uint32_t takeoff_speed_time_ms;

        // 到下一个航点的距离

        float wp_distance;

        // 到下一个航点的比例

        float wp_proportion;

        // is_flying()上次返回true的时间,单位:毫秒

        uint32_t last_flying_ms;

        // 在自动模式中开始飞行的时间戳,单位:毫秒

        uint32_t started_flying_in_auto_ms;

        // 起飞时的气压高度

        float baro_takeoff_alt;

        // 初始俯仰角。用于检测尾钩滑行时车头是否抬起

        int16_t initial_pitch_cd;

        // 执行起飞命令时要保持的最小俯仰角。百分之一度

        int16_t takeoff_pitch_cd;

        // 用于“摆动”舵机的阶段,以防止舵机在高高度处冻结

        uint8_t idle_wiggle_stage;

        // 是否使用GPS地面航向而不是INS偏航角。该参数在进行起飞命令时设置为false。

        bool takeoff_complete;

        // 我们是否前往着陆的航点?适用于任何导航类型

        bool wp_is_land_approach;

        // 是否倒飞?

        bool inverted_flight;

        // should we enable cross-tracking for the next waypoint?

        // 是否启用下一个航点的横向偏离?

        bool next_wp_crosstrack;

        // 是否启用这个航点的横向偏离?

        bool crosstrack;

        // 在FBWA尾轮起飞模式中

        bool fbwa_tdrag_takeoff_mode;

        // 是否检查过自动着陆?

        bool checked_for_autoland;


 

       

        /*在自主模式下完成起飞指令的高度阈值。单位:厘米。

       

        在自主模式下,完成起飞指令的高度阈值可能会因具体的自主系统及其配置而有所不同。这涉及到多种因素,例如飞行器的类型、重量、天气条件和安全规定。

       通常情况下,高度阈值的设定是为了确保飞行器在起飞时能够安全地升空和离地。它确保飞行器在过渡到下一个飞行阶段之前已经获得足够的高度,以避开任何障碍物,比如建筑物、树木或地形特征。

       自主系统通常包括算法和传感器来监测起飞时的高度。一旦飞行器达到预定的高度阈值,它会验证起飞条件是否已经满足,然后继续下一个阶段,比如转换到特定的飞行模式或任务。

       在自主模式下完成起飞指令的具体高度阈值可能会有所不同,操作人员可以进行配置,或者由制造商预先设置。为了准确了解与起飞相关的高度阈值和安全考虑事项,建议参阅具体自主系统或飞行器的文档和用户手册。

      */

        /* 是否处于待机状态?

        待机模式在发射中常被使用,以停止舵机运动直到达到特定高度。

        即无人机升到特定高度之前,舵机将停止运动。*/

   

        bool idle_mode;

        // 在AUTO模式下中是否处于VTOL模式?

        bool vtol_mode;

        // 是否在VTOL模式中进行悬停?

        bool vtol_loiter;

     

        // 我们对地形数据添加的校正量是多少

        float terrain_correction;

    } auto_state;

#if AP_SCRIPTING_ENABLED

    // 支持编写脚本导航命令,并进行验证

    struct {

        bool enabled;

        uint16_t id;

        float roll_rate_dps;

        float pitch_rate_dps;

        float yaw_rate_dps;

        float throttle_pct;

        uint32_t start_ms;

        uint32_t current_ms;

        bool done;

    } nav_scripting;

   

#endif

    struct {

        // 来自外部控制器的航向俯仰偏航(百分之一度)

        Vector3l forced_rpy_cd;

        // 上次从外部控制器接收到信号的时间

        Vector3l last_forced_rpy_ms;

        // 来自外部控制器的油门(百分比)

        float forced_throttle;

        uint32_t last_forced_throttle_ms;

#if OFFBOARD_GUIDED == ENABLED

        // airspeed adjustments空速调整

        float target_airspeed_cm = -1;  // 这里不要默认为0,因为0是有效速度。

        float target_airspeed_accel;

        uint32_t target_airspeed_time_ms;

        // 高度调整

        float target_alt = -1;    // 这里不要默认为0,因为0是有效高度。

        uint32_t last_target_alt = 0;

        float target_alt_accel;

        uint32_t target_alt_time_ms = 0;

        uint8_t target_alt_frame = 0;

        //航向轨迹

        float target_heading = -4;  // 这里不要默认为0或-1,因为都是有效的弧度

        float target_heading_accel_limit;

        uint32_t target_heading_time_ms;

        guided_heading_type_t target_heading_type;

        bool target_heading_limit_low;

        bool target_heading_limit_high;

#endif // OFFBOARD_GUIDED == ENABLED

    } guided_state;

#if LANDING_GEAR_ENABLED == ENABLED

    // 收放起落架状态

    struct {

        AP_Vehicle::FixedWing::FlightStage last_flight_stage;

    } gear;

#endif

    struct {

        // 仅检查一次硬着陆,在直接一次着陆后,以免在捡起飞行器时触发坠毁

        /*

         在硬着陆时,你可以在直接降落后只进行一次检查,这样可以避免在拾起飞行器时触发坠毁。

        当飞行器经历硬着陆或强烈冲击时,可能会引起一些损坏或故障。为了防止发生进一步的损坏或触发坠毁,

        可以在直接降落后进行一次全面的检查,以确保完整性和运行状况。

        这样可以确保在拾起飞行器之前,任何潜在的问题都得到解决或排除。

       具体的检查步骤和方法可能因飞行器的类型和设计而有所不同。

       可以查阅飞行器的用户手册、指南或与制造商进行交流,获取关于如何进行全面的着陆检查的详细指导。

       通常,应该注意检查结构的完整性、关键部件的连接和功能性,以及任何异常痕迹或损伤。

       请确保在拾起飞行器之前,已经满足了进行一次全面检查的要求,

       并遵循相关的指导和安全操作程序。

       这样可以确保飞行器的飞行安全性并避免进一步的损坏。*/

        bool checkedHardLanding;


 

        // 坠毁检测。当飞行器坠毁时为true

        /*坠毁检测是一种用于确定飞行器是否已经坠毁或碰撞的方法。

        当飞行器发生碰撞或坠毁时,可以将坠毁检测值设置为True,用于指示坠毁事件的发生。

       坠毁检测方法和实现取决于你使用的飞行器系统和传感器。通常,飞行器会配备各种传感器

       (如惯性测量单元、加速度计、陀螺仪等),用于监测飞行器的状态和运动。

       当传感器检测到异常的加速度、姿态变化或其他坠毁征兆时,可以判断飞行器已经坠毁或碰撞。

       要实现坠毁检测,请确保飞行器的坠毁检测系统已经正确配置和连接,

       并且传感器数据已经被正确解析和分析。根据所使用的飞行器平台和编程环境,

       可能需要编写相应的代码逻辑来判断坠毁检测值是否为True,并采取相应的措施。

       请注意,坠毁检测可能只是飞行器系统的一部分,

       它可能需要与其他系统和保护机制配合使用,以确保安全和防止损害。

       确保遵循相关的安全标准和指导,并与飞行器制造商或专业人员进行咨询,以获取准确的坠毁检测实现建议。*/

        bool is_crashed;

        // impact detection flag. Expires after a few seconds via impact_timer_ms

        // 碰撞检测标志。在几秒钟后过期,通过impact_timer_ms

        /*

        冲击检测标志(impact detection flag)是一种指示飞行器是否受到冲击的标志。

        根据你提供的信息,经过一段时间后,这个标志会通过一个影响计时器(impact_timer_ms)来自动失效。

        具体实现这个冲击检测标志以及计时器的方法可能取决于你所使用的飞行器平台和编程环境。

        一种常见的做法是,使用加速度传感器或惯性测量单元(IMU)来监测飞行器的运动和加速度变化。

        当传感器检测到超过预定阈值的冲击,可以将冲击检测标志设置为True。

       然后,使用影响计时器来控制这个冲击检测标志的有效期。该计时器可以设置为一定的毫秒数(impact_timer_ms),

       当计时器达到预设的时间后,冲击检测标志会自动失效(即重新设置为False),不再指示飞行器受到冲击。

      你可以根据你所使用的编程语言和平台,编写代码逻辑来实现这个冲击检测标志和影响计时器的功能。

      请确保在代码中正确配置传感器、计时器和标志的初始化、更新和检测过程,以及处理冲击检测标志失效的情况。

      请注意,具体的实现细节可能因飞行器系统和编程环境而有所不同。

      确保仔细阅读相关文档、指南和飞行器制造商提供的信息,

      并遵循相应的安全操作规程。对于具体的编码建议和细节,建议咨询专业人士或开发者社区以获取最准确的帮助。

      */

        bool impact_detected;

        /*

        Debounce timer(抗抖动计时器)是一种用于消除开关或传感器输入中的抖动效应的计时器。

        抖动是指在快速变化的信号中出现的短暂的不稳定或无规律的波动。通过使用抗抖动计时器,

        可以确保输入信号稳定并减少误触发或误判的情况。

        抗抖动计时器的原理是,在接收到输入信号变化时,启动一个定时器来延迟处理该信号的状态。

        如果在给定的时间窗口内,输入信号保持不变,那么可以确定该信号的状态是稳定的。

        具体实现抗抖动计时器的方法可能因你所使用的编程语言和平台而有所不同。

        一种常用的实现方式是在输入信号发生变化时,开始一个定时器计时。

        在定时器结束后,检查输入信号的状态是否保持不变。

        如果是,则可以确定信号的状态,否则可能需要等待更长的时间窗口或重新计时。

       为了进行抗抖动处理,你可以编写相应的代码逻辑,包括初始化抗抖动计时器、接收和处理输入信号的变化,

       以及在定时器结束后检查信号状态。根据你的需求和系统要求,可以调整定时器的时间窗口大小来适应特定的抖动情况。

        请注意,抗抖动计时器的实现可能因应用场景和具体设备而有所不同。

        在设计和调试过程中,你可能需要根据实际情况进行测试和调整,以确保抗抖动效果的有效性和稳定性。

        */

        uint32_t debounce_timer_ms;

        // 在抗抖动计数之前的延迟时间,单位:毫秒

        /*

        抗抖动计时器的延迟时间取决于特定的应用和设备需求。

        根据你的系统和输入信号的抖动特征,你可能需要选择适当的延迟时间,

        使抗抖动计时器能够准确地判断信号的稳定状态。

        延迟时间应该足够长,以确保在抖动过程中能够滤除瞬时的信号变化。

        一般而言,延迟时间应该比最长的抖动时间窗口稍长一些,以确保抖动期间的变化不会被错误地认为是稳定的信号。

        通常,延迟时间的选择需要进行实验和调试,观察信号的抖动特征以及系统的响应。

        一般来说,延迟时间取决于设备的硬件性能、信号的速度和抖动程度。

        对于快速变化的信号或高频率的抖动,可能需要较短的延迟时间。

        而对于较慢变化的信号或低频率的抖动,可以选择较长的延迟时间。

        建议通过实验和测试来确定合适的延迟时间。

        逐步增加或减小延迟时间,并观察输入信号的抖动情况以及系统的响应。

        根据观察结果,逐步调整延迟时间,直到在满足抖动过滤要求的同时,保持系统的稳定性和响应性。

       请记住,最佳的延迟时间取决于具体的应用场景和设备要求。确保在开发和测试过程中进行充分的验证和验证,以找到最适合你的系统的延迟时间设置。

        */

        uint32_t debounce_time_total_ms;

        // impact_detected 已为 True 的持续时间。在几秒钟后会超时。用于修正 isFlyingProbability

        uint32_t impact_timer_ms;

    } crash_state;

     // 这控制自动模式下的油门抑制

    bool throttle_suppressed;

    // 减小油门以消除电池过电流

    int8_t  throttle_watt_limit_max;

    int8_t  throttle_watt_limit_min; // 用于反推

    uint32_t throttle_watt_limit_timer_ms;

    AP_Vehicle::FixedWing::FlightStage flight_stage = AP_Vehicle::FixedWing::FLIGHT_NORMAL;


 

    // 飞机当前处于飞行状态的概率。范围从0到 1,其中1表示我们100%确定正在飞行

    float isFlyingProbability;

     // is_flying()的先前值

    bool previous_is_flying;


 

    // 开始飞行的时间,以毫秒为单位

    uint32_t started_flying_ms;


 

    // 当上锁和不飞行时,地面模式为true

    bool ground_mode;

   

    // 导航控制变量  当前所需的横滚角。百分之一度

    int32_t nav_roll_cd;

    // 当前所需的俯仰角。百分之一度

    int32_t nav_pitch_cd;


 

    // 气动载荷。这是根据未剪辑的要求

    // 横滚,使用1 / sqrt(cos(nav_roll))计算

    float aerodynamic_load_factor = 1.0f;

    // 平滑的空速估计值,用于限制横滚角度

    float smoothed_airspeed;

    // 发射检测引脚最后一次未处于触发状态的时刻,单位:毫秒(自带的中文)

    uint32_t launch_detector_pin_last_inactive_time_ms;

    // 任务库

    AP_Mission mission{

            FUNCTOR_BIND_MEMBER(&Plane::start_command_callback, bool, const AP_Mission::Mission_Command &),

            FUNCTOR_BIND_MEMBER(&Plane::verify_command_callback, bool, const AP_Mission::Mission_Command &),

            FUNCTOR_BIND_MEMBER(&Plane::exit_mission_callback, void)};


 

#if PARACHUTE == ENABLED

    AP_Parachute parachute{relay};

#endif

    // 地形补偿

#if AP_TERRAIN_AVAILABLE

    AP_Terrain terrain;

#endif

    AP_Landing landing{mission,ahrs,&TECS_controller,nav_controller,aparm,

            FUNCTOR_BIND_MEMBER(&Plane::set_target_altitude_proportion, void, const Location&, float),

            FUNCTOR_BIND_MEMBER(&Plane::constrain_target_altitude_location, void, const Location&, const Location&),

            FUNCTOR_BIND_MEMBER(&Plane::adjusted_altitude_cm, int32_t),

            FUNCTOR_BIND_MEMBER(&Plane::adjusted_relative_altitude_cm, int32_t),

            FUNCTOR_BIND_MEMBER(&Plane::disarm_if_autoland_complete, void),

            FUNCTOR_BIND_MEMBER(&Plane::update_flight_stage, void)};

#if HAL_ADSB_ENABLED

    AP_ADSB adsb;


 

    // 启用ADS-B,避免与的飞行器(通常是有人驾驶的飞行器)相遇。

    AP_Avoidance_Plane avoidance_adsb{adsb};

#endif

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/425742
推荐阅读
相关标签
  

闽ICP备14008679号