为旋翼飞行器添加新的飞行模式¶
本节将介绍如何创建新的高级飞行模式(相当于稳定、着陆等模式)的基本知识。
下图提供了 Copter 架构的高层视图,以供参考。
为新模式取一个名称,并将其添加到 "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, // 您的 新 飞行 模式 };
在 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() 缢 否决 { 返回 错误; }
根据类似模式创建一个新模式_<新飞行模式>.cpp 文件,例如 mode_stabilize.cpp 或 mode_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.节流阀/电门);
在 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
在 mode.cpp 将新模式添加到
mode_from_mode_num()
函数来创建模式编号和类实例之间的映射。// 返回 的 天电 控制器 反对 相应 至 供应 模式 模式 *旋翼飞行器::从模式数到模式数(缢 模式::数量 模式) { 模式 *重新 = nullptr; 开关 (模式) { 个案 ACRO: 重新 = 及样品;模式; 断裂; 个案 稳定: 重新 = 及样品;稳定模式; 断裂;
将新飞行模式添加到有效飞行模式列表中
@Values
为FLTMODE1 ~ 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),
您也可以选择将飞行模式添加到
COPTER_MODE
枚举中的 mavlink/ardupilotmega.xml 因为有些地面站可能会使用它来自动填充可用飞行模式列表。