路虎新增驾驶模式

本页介绍了如何创建新驾驶模式(相当于手动、转向等)的基本知识。添加新飞行模式的实际示例可参见 该承诺 首次增加了 ACRO 模式。

作为参考,下图提供了 Rover 架构的高层视图。

./_images/rover_architecture.png
  1. 为新模式取一个名称(如 "NEW_MODE"),并将其添加到以下模式枚举中 mode.h 作为 "NEW_MODE "添加在下面。

    // 载具 飞行员 模式
    // ----------------
    枚举 模式 {
        手册       = 0,
        ACRO         = 1,
        转向     = 3,
        保持         = 4,
        新模式     = 5,
        自动         = 10,
        RTL          = 11,
        指导       = 15,
        初始化 = 16
    };
    
  2. mode.h最简单的方法可能是复制一个类似的现有模式类定义,然后更改类名(例如,复制并重命名 "class ModeAcro "为 "class ModeNewMode")。新类必须实现 模式编号(), name4()更新() 方法。

    uint32_t 模式编号()  否决 { 返回 新模式; }
     烧焦 *名称4()  否决 { 返回 "NEWM";; }
    空白 更新() 否决;
    

    您可能还需要执行受保护的 _enter() 方法来执行载具进入模式时所需的任何初始化(即在用户命令载具切换到新模式时启动位置控制器)或 _exit() 在载具离开模式时进行任何清理:

    受保护的:
    
    bool 进入() 否决;
    空白 退出() 否决;
    

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

    // 返回 如果  -手册 模式 : 自动, 指导, RTL
    虚拟 bool is_autopilot_mode()  { 返回 错误; }
    
    // 回报  如果 策导  直接 受控  RC
    虚拟 bool 手动转向()  { 返回 错误; }
    
    // 回报  如果  throttle  受控 自然而然
    虚拟 bool 自动节流() { 返回 is_autopilot_mode(); }
    
  3. 根据类似模式创建一个新模式_<新飞行模式>.cpp 文件,例如 mode_acro.cppmode_steering.cpp.这个新文件应该执行 更新() 方法,该方法每秒将被调用 50 次。该函数的主要职责是解码用户输入,创建新的航向和转向目标,然后调用转向和油门控制器。

    以下是以下内容的节选 mode_acro.cpp 演示了如何将飞行员的输入转化为目标速度(米/秒)和目标转弯率。

    // 转化 试验 棍子 输入  所愿 策导  throttle
    浮动 所需的转向, 所需油门;
    获取飞行员所需的转向和油门(所需的转向, 所需油门);
    
    // 转化 试验 throttle 输入  所愿 速度 (向上  两倍  巡航 速度)
    浮动 目标速度 = 所需油门 * 0.01f * 最大计算速度(g.巡航速度, g.节流阀_巡航 * 0.01f);
    
    // 转化 试验 策导 输入  所愿 转捩 费率  弧度/秒钟
    浮动 目标转弯速度 = (所需的转向 / 4500.0f) * 弧度(g2.回转速度);
    

    接近底部 mode_acro.cpp 您将看到这些目标是如何发送到转向控制器和油门控制器的。转向和油门控制器接口可在 APM_Control/AR_AttitudeControl 库.父模式类还提供了一些导航方法,这些方法在 mode.h (搜索 "导航方法")。

    // 运行 策导 转捩 费率 控制器  throttle 控制器
    浮动 转向输出 = 态度控制.获取转向输出率(目标转弯速度, g2.电机.有防滑转向装置(), g2.电机.限额.左转向, g2.电机.限额.向右转, 反面);
    g2.电机.设置转向(转向输出 * 4500.0f);
    计算节流阀(目标速度, 错误);
    
  4. Rover.h 搜索 "ModeAcro",然后在下面某个地方添加新模式。

    模式初始化 模式初始化;
    模式保持 模式保持;
    手动模式 手动模式;
    模式 模式;
    模式引导 引导模式;
    自动模式 自动模式;
    转向模式 转向模式;
    ModeRTL rtl 模式;
    

    此外,在 Rover.h 的顶部,将新模式添加为 "好友",允许该模式访问 Rover 类的内部变量和函数。

     无人车UGV :  AP_HAL::哈拉尔::回调 {
    :
        <;一些 线条 省略>;
        朋友  模式;
        朋友  模式;
        朋友  自动模式;
        朋友  模式引导;
        朋友  模式保持;
        朋友  转向模式;
        朋友  手动模式;
        朋友  ModeRTL;
    
  5. mode.cpp 将新模式添加到 mode_from_mode_num() 函数来创建模式编号和类实例之间的映射。

    模式 *无人车UGV::从编号开始的控制模式( 枚举 模式 )
    {
        模式 *重新 = nullptr;
        开关 () {
        个案 手册:
            重新 = 及样品;手动模式;
            断裂;
        个案 ACRO:
            重新 = 及样品;模式;
            断裂;
        个案 转向:
            重新 = 及样品;转向模式;
            断裂;
    
  6. 将新飞行模式添加到有效飞行模式列表中 @Values模式 1 ~ 模式 6 中的参数 参数.cpp (搜索 "MODE1")。一旦提交至主站,新模式将出现在地面站的有效模式列表中。请注意,即使在提交至主站之前,用户也可以通过直接将 MODE1(或 MODE2 等)参数设置为新模式的编号来设置新的飞行模式,以便通过发射机的飞行模式开关激活。

    // @Param: 模式 1
    // @DisplayName: 模式1
    // @ 价值: 0:手册,1:Acro,3:转向系统,4:保持,10:载具,11:RTL,15:指导
    // @ 用户: 标准
    // @描述: 驾驶 模式 对于 开关 位置 1 (910  1230  以上 2049)
    GSCALAR(模式1,           "MODE1";,         手册),
    
    // @Param: 模式 2
    // @DisplayName: 模式2
    // @描述: 驾驶 模式 对于 开关 位置 2 (1231  1360)
    // @ 价值: 0:手册,1:Acro,3:转向系统,4:保持,10:载具,11:RTL,15:指导
    // @ 用户: 标准
    GSCALAR(模式2, "MODE2";, 手册),
    

顺便提一下,UGV无人车有 3 个高级控制器:

./_images/rover_controllers.png
  • L1 控制器将起点和终点(分别用纬度和经度表示)转换成横向加速度,使载具沿着从起点到终点的路径行驶。然后将横向加速度传递给转向控制器。

  • 转向控制器可将所需的横向加速度、角度误差或所需的转弯率转换为转向输出指令(以 -4500 至 +4500 范围内的数字表示),并将其输入电机库(参见 "电机库")。 AR_MotorsUGV.h)

  • 节流控制器可将所需速度转换为节流指令(用 -100 至 +100 之间的数字表示),并将其输入电机库(参见 "节流控制器")。 AR_MotorsUGV.h)