路虎新增驾驶模式¶
本页介绍了如何创建新驾驶模式(相当于手动、转向等)的基本知识。添加新飞行模式的实际示例可参见 该承诺 首次增加了 ACRO 模式。
作为参考,下图提供了 Rover 架构的高层视图。
为新模式取一个名称(如 "NEW_MODE"),并将其添加到以下模式枚举中 mode.h 作为 "NEW_MODE "添加在下面。
// 载具 飞行员 模式 // ---------------- 枚举 模式 { 手册 = 0, ACRO = 1, 转向 = 3, 保持 = 4, 新模式 = 5, 自动 = 10, RTL = 11, 指导 = 15, 初始化 = 16 };
在 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(); }
根据类似模式创建一个新模式_<新飞行模式>.cpp 文件,例如 mode_acro.cpp 或 mode_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); 计算节流阀(目标速度, 错误);
在 Rover.h 搜索 "ModeAcro",然后在下面某个地方添加新模式。
模式初始化 模式初始化; 模式保持 模式保持; 手动模式 手动模式; 模式 模式; 模式引导 引导模式; 自动模式 自动模式; 转向模式 转向模式; ModeRTL rtl 模式;
此外,在 Rover.h 的顶部,将新模式添加为 "好友",允许该模式访问 Rover 类的内部变量和函数。
类 无人车UGV : 公 AP_HAL::哈拉尔::回调 { 公: <;一些 线条 省略>; 朋友 类 模式; 朋友 类 模式; 朋友 类 自动模式; 朋友 类 模式引导; 朋友 类 模式保持; 朋友 类 转向模式; 朋友 类 手动模式; 朋友 类 ModeRTL;
在 mode.cpp 将新模式添加到
mode_from_mode_num()
函数来创建模式编号和类实例之间的映射。模式 *无人车UGV::从编号开始的控制模式(缢 枚举 模式 木) { 模式 *重新 = nullptr; 开关 (木) { 个案 手册: 重新 = 及样品;手动模式; 断裂; 个案 ACRO: 重新 = 及样品;模式; 断裂; 个案 转向: 重新 = 及样品;转向模式; 断裂;
将新飞行模式添加到有效飞行模式列表中
@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 个高级控制器:
L1 控制器将起点和终点(分别用纬度和经度表示)转换成横向加速度,使载具沿着从起点到终点的路径行驶。然后将横向加速度传递给转向控制器。
转向控制器可将所需的横向加速度、角度误差或所需的转弯率转换为转向输出指令(以 -4500 至 +4500 范围内的数字表示),并将其输入电机库(参见 "电机库")。 AR_MotorsUGV.h)
节流控制器可将所需速度转换为节流指令(用 -100 至 +100 之间的数字表示),并将其输入电机库(参见 "节流控制器")。 AR_MotorsUGV.h)