为旋翼飞行器添加新的飞行模式

本节将介绍如何创建新的高级飞行模式(相当于稳定、着陆等模式)的基本知识。

下图提供了 Copter 架构的高层视图,以供参考。

../_images/copter-architecture.png
  1. 为新模式取一个名称,并将其添加到 "control_mode_t "枚举的底部。 mode.h 就像下面添加的 "NEW_MODE "一样。

    // 载具 飞行员 模式 枚举
    枚举  数量 {
        稳定 =     0,  // 手册 机身 观点  手册 throttle
        ACRO =          1,  // 手册 机构-画框 角度 费率  手册 throttle
        ALT_HOLD =      2,  // 手册 机身 观点  自动 throttle
        自动 =          3,  // 充分地 自动 航点 控制权 使用 使命 指令
        指导 =        4,  // 充分地 自动 苍蝇  统筹  苍蝇  速度/方向 使用 GCS 直接 指令
        莱特 =        5,  // 自动 水平 加速度  自动 throttle
        RTL =           6,  // 自动 返回  启动 
        圆圈 =        7,  // 自动 通报 飞行  自动 throttle
        土地 =          9,  // 自动 着陆  水平 位置 控制权
        运行 =        11,  // 半自动-自动 位置, 打呵欠  throttle 控制权
        运动 =        13,  // 手册 地球-画框 角度 费率 控制权  手册 throttle
        翻转 =         14,  // 自然而然 不严肃的  载具 关于  滚动 轴线
        自动飞行稳定调整 =     15,  // 自然而然 曲调  载具滚动和俯仰增益
        POSHOLD =      16,  // 自动 位置 持有  手册 否决,  自动 throttle
        制动器 =        17,  // 全部-制动器 使用 惯量/全球定位系统 系统, 没有 试验 输入
        投掷 =        18,  //   启动 模式 使用 惯量/全球定位系统 系统, 没有 试验 输入
        AVOID_ADSB =   19,  // 自动 避免  障碍   宏观 比例尺 - e.g. 全部-大小 飞机
        指导_NOGPS = 20,  // 导游 模式  只是 接受 态度  高度
        SMART_RTL =    21,  // SMART_RTL 回报  首页  追溯 它的 步骤
        流量保持  =    22,  // 流量保持 持有 位置  光纤 流动 不带 测距仪
        关注    =    23,  // 遵循 尝试  遵循 另一个 载具  地面 火车站
        ZIGZAG    =    24,  // ZIGZAG 模式  能够  苍蝇  a 之字形 风格  预定义  A   B
        系统标识  =    25,  // 系统 身份证 模式 生产 自动化 系统 识别 讯号   控制器
        自动运行 =   26,  // 自主 自动旋转
        新模式 =     27,  // 您的  飞行 模式
    };
    
  2. mode.h最简单的方法可能是复制类似的现有模式类定义,然后更改类名(例如,复制并重命名 "class ModeStabilize "为 "class ModeNewMode")。新类应继承于模式类,并实现 运行(), 名称()name4() 并可选择 启动().

    :
       //  函数
       使用 模式::模式;
       bool 启动(bool 忽略检查) 否决;
       空白 运行() 否决;
    
    受保护的:
        烧焦 *名字()  否决 { 返回 "NEWMODE";; }
        烧焦 *名称4()  否决 { 返回 "NEWM";; }
    

    "这款" 名称()name4() 方法用于记录和显示。 启动() 将在载具首次切换到新模式时被调用,因此它应该执行所需的初始化。 运行() 将以 400 赫兹的频率被调用,并应执行任何试点输入解码,然后设置位置和姿态目标(见下文)。

    还有一些返回 true/false 的简单方法,您可能想覆盖这些方法来控制新模式下载具是否可以上膛等功能:

    bool requires_GPS()  否决 { 返回 错误; }
    bool 有手动油门()  否决 { 返回 ; }
    bool 允许上膛(bool 来自_gcs)  否决 { 返回 ; };
    bool is_autopilot()  否决 { 返回 错误; }
    
  3. 根据类似模式创建一个新模式_<新飞行模式>.cpp 文件,例如 mode_stabilize.cppmode_loiter.cpp.这个新文件可能应该执行 启动() 方法,该方法将在载具首次进入模式时被调用。如果载具可以进入模式,该函数应返回 true;如果不能进入模式,则返回 false。下面是 mode_rtl.cpp的 init 方法,该方法显示了载具如何在原点位置未设置的情况下无法进入 RTL 模式。

    // rtl_init - 初始化 rtl 控制器 bool ModeRTL::init(bool ignore_checks) { if (!ignore_checks) { if (!AP::ahrs().home_is_set()) { return false; }}// 初始化航点和样条线控制器 wp_nav->wp_and_spline_init(); _state = RTL_Starting; _state_complete = true; // 参见下面的 run() 方法 terrain_following_allowed = !copter.failsafe.terrain; return true; } }
    

    以下是以下内容的节选 mode_stabilize.cpp的运行方法(每秒调用 400 次)解码用户输入,然后向姿态控制器发送新目标。

    空白 模式稳定::运行()
    {
        // 转化 试验 输入  倾斜 角度
        浮动 target_roll, 目标间距;
        get_pilot_desired_lean_angles(target_roll, 目标间距, 旋翼飞行器.aparm.最大角度, 旋翼飞行器.aparm.最大角度);
    
        // 获取 试验所需的偏航率
        浮动 目标偏航率 = 获取飞行员期望偏航率(channel_yaw->;get_control_in());
    
        // 代码   发动机 阀芯  省略
    
        // 致电 态度 控制器
        态度控制->;输入_euler_angle_roll_pitch_euler_rate_yaw(偏航角度_roll_pitch_euler_rate_yaw)。(target_roll, 目标间距, 目标偏航率);
    
        // 产量 试验'节流阀/电门
        态度控制->;设置节流阀输出(获取飞行员所需的节流阀(), , g.节流阀/电门);
    
  4. Copter.h 搜索 "ModeAcro",然后在下面某个地方添加新模式。

        模式 *飞行模式;
    #if MODE_ACRO_ENABLED == ENABLED
    #if FRAME_CONFIG == HELI_FRAME
        模式 Acro_Heli 模式;
    #else
        模式 模式;
    #endif
    #endif
        ModeAltHold 阈值模式;
    #if MODE_AUTO_ENABLED == ENABLED
        自动模式 自动模式;
    #endif
    #if AUTOTUNE_ENABLED == ENABLED
        自动飞行稳定调整 自动调整;
        模式自动调整 自动调整模式;
    #endif
    
  5. mode.cpp 将新模式添加到 mode_from_mode_num() 函数来创建模式编号和类实例之间的映射。

    // 返回  天电 控制器 反对 相应  供应 模式
    模式 *旋翼飞行器::从模式数到模式数( 模式::数量 模式)
    {
        模式 *重新 = nullptr;
    
        开关 (模式) {
            个案 ACRO:
                重新 = 及样品;模式;
                断裂;
    
            个案 稳定:
                重新 = 及样品;稳定模式;
                断裂;
    
  6. 将新飞行模式添加到有效飞行模式列表中 @ValuesFLTMODE1 ~ FLTMODE6 中的参数 参数.cpp (搜索 "FLTMODE1")。一旦提交至主站,新模式将出现在地面站的有效模式列表中。请注意,即使在提交至主站之前,用户也可以通过直接将 FLTMODE1(或 FLTMODE2 等)参数设置为新模式的编号来设置新的飞行模式,以便通过发射机的飞行模式开关激活。

    // @Param: FLTMODE1
    // @DisplayName: 飞行 模式 1
    // @描述: 飞行 模式  频道 5 pwm  <= 1230
    // @ 价值: 0:稳定,1:Acro,2:AltHold,3:载具,4:指导,5:位置悬停,6:RTL,7:圆圈,9:土地,11:漂移,13:体育,14:翻转,15:自动飞行稳定调整,16:PosHold,17:制动器,18:投掷,19:避免_ADSB,20:导引_NoGPS,21:智能_RTL,22:流量保持,23:跟进,24:之字形
    // @ 用户: 标准
    GSCALAR(飞行模式1, "FLTMODE1";,               FLIGHT_MODE_1),
    
    // @Param: FLTMODE2
    // @DisplayName: 飞行 模式 2
    // @描述: 飞行 模式  频道 5 pwm  >;1230, <= 1360
    // @ 价值: 0:稳定,1:Acro,2:AltHold,3:载具,4:指导,5:位置悬停,6:RTL,7:圆圈,9:土地,11:漂移,13:体育,14:翻转,15:自动飞行稳定调整,16:PosHold,17:制动器,18:投掷,19:避免_ADSB,20:导引_NoGPS,21:智能_RTL,22:流量保持,23:跟进,24:之字形
    // @ 用户: 标准
    GSCALAR(飞行模式2, "FLTMODE2";,               飞行模式 2),
    
  7. 您也可以选择将飞行模式添加到 COPTER_MODE 枚举中的 mavlink/ardupilotmega.xml 因为有些地面站可能会使用它来自动填充可用飞行模式列表。