Kerloud飞控系列教程(9):PX4飞控开发基础之飞行模式

PX4飞控开发基础-飞行模式

工具准备

关于飞行模式

在PX4软件堆栈中,飞行模式指的是无人机在飞行时所处的不同操作状态。每种飞行模式都定义了无人机的行为和控制逻辑,例如如何响应用户的输入、如何自动导航以及如何处理各种传感器数据。飞行模式使得操作员可以根据当前的飞行需求和环境条件选择最合适的控制方式。

以下是一些PX4中常见的飞行模式的例子和解释:

  • 手动模式(Manual Mode):在这种模式下,操作员完全控制无人机的运动,没有自动稳定辅助。这要求操作员具有较高的飞行技能。

  • 稳定模式(Stabilized Mode):在这种模式下,无人机会自动维持水平姿态,但操作员仍然控制飞行方向和速度。这是新手学习和控制无人机的常用模式。

  • 定高模式(Altitude Mode):无人机会自动保持当前的高度,而操作员则控制其它运动,如前进、后退、左转和右转。

  • 定点模式(Position Mode):无人机不仅会保持高度,还会保持当前位置,直到接收到操作员的新指令。这种模式适合拍摄静态视频或照片。

  • 自动模式(Auto Mode):无人机完全根据预设的飞行计划自动飞行,包括起飞、导航至不同的航点、执行特定任务和降落。操作员通常可以通过遥控器或地面控制站进行干预。

  • 返航模式(Return to Home, RTH):当启动这个模式时,无人机会自动返回起飞点并降落。这个模式通常在遥控信号丢失或电池电量低时自动启动,以确保无人机的安全。

每种飞行模式都设计用于不同的飞行条件和任务要求,为操作员提供灵活性和安全性。选择合适的飞行模式对于确保无人机安全运行至关重要。

如何增加新的飞行模式

在PX4软件堆栈中添加新的飞行模式是一个复杂的过程,涉及多个步骤,触及代码库的不同部分。以下是此过程的高级概述:

(1)规划您的飞行模式:
定义行为:清楚地定义您的新飞行模式应该做什么。它的目标、行为是什么,以及它与现有模式有何不同?
确定基类:决定您的新飞行模式将扩展现有飞行模式类还是完全新的。

(2)更新配置和枚举:
更新飞行模式枚举:在PX4代码库中,飞行模式通常在px4fmu_modes.h或类似文件中枚举。为您的飞行模式添加一个新枚举。
更新参数:如果您的飞行模式需要新参数,请在适当的位置定义它们,通常与其他飞行模式参数一起。

(3)实施飞行模式:

  • 飞行模式类:为您的飞行模式创建一个新类。如果它是一个手动飞行模式,这可能在FlightTasks库中;如果它是自动模式,则可能在其他地方。
  • 实现定义飞行模式行为的逻辑。这可能涉及设置飞行器姿态、位置目标或其他状态机逻辑。
  • 状态转换逻辑:修改状态转换逻辑以包括您的新飞行模式。这涉及编辑处理模式更改的状态机。

(4)与现有系统集成:
模式切换:确保系统可以正确地切换到您的新飞行模式并退出。这可能涉及到修改RC(遥控)处理或MAVLink命令处理,这取决于如何激活模式。
日志和遥测:添加任何特定于您的飞行模式的新日志消息或遥测数据,以便于调试和分析。

(5)测试您的飞行模式:

  • 软件在环(SITL)模拟:在真实硬件测试之前,使用SITL来模拟飞行模式并确保它按预期行为。
  • 硬件在环(HITL)模拟:通过SITL测试后,如果您的设置支持,可以进行HITL测试。
  • 现实世界测试:在安全的环境中进行彻底测试。从低风险场景开始,逐渐增加复杂性。

(6)文档和拉取请求(Pull Request):

  • 记录您的飞行模式:编写关于您的飞行模式的文档,描述其功能、参数和使用方法。
  • 为PX4做贡献:考虑将您的飞行模式回馈给PX4社区。创建一个拉取请求到PX4仓库,附上您的更改。

注意事项:

  • 熟悉PX4开发者指南和编码标准。
  • 在过程早期就与PX4社区接触,特别是如果您计划将模式回馈给项目。他们可以提供指导并帮助审查您的设计和代码。
  • 在测试新飞行模式时,尤其是在现实世界测试中,始终将安全放在首位。

案例指引

假设新的飞行模式称为“CUSTOM_MODE”。这是您为新模式命名的占位符。

(1) 在枚举中定义飞行模式

首先,确保在适当的枚举中定义了您的新飞行模式。通常,这将在px4fmu_modes.h或飞行模式被枚举的地方:

enum PX4_MODE {

PX4_MODE_CUSTOM = ‘X’, // 假设 ‘X’ 没有被其他模式使用

};

(2) 更新模式切换逻辑

模式切换逻辑是PX4软件根据各种输入(例如,来自遥控器、MAVLink命令等)决定进入哪个飞行模式的地方。您需要找到实现此逻辑的地方,并为您的新飞行模式添加一个案例。

这通常在与指挥官或模式管理器相关的文件中处理。以下是如何为切换到您的自定义模式添加一个案例:

switch (user_input) {

case USER_INPUT_CUSTOM_MODE:
if (can_enter_custom_mode()) {
main_state_transition(status, MAIN_STATE_CUSTOM, sub_state, &status_flags);
if (status.main_state == MAIN_STATE_CUSTOM) {
print_mode_changed(“自定义模式”);
}
}
break;

}

(3) 实现过渡逻辑

您需要确保有逻辑来处理过渡到您的新飞行模式。这涉及设置进入模式的条件以及过渡发生时应该发生的事情。

例如,在state_machine_helper.cpp或类似文件中:

bool can_enter_custom_mode() {
    // 在这里实现检查
    // 例如,检查飞行器是否已解锁,某些传感器是否可用等。
    return true; // 简化了,您应该有实际的检查
}

void main_state_transition(vehicle_status_s &status, main_state_t new_main_state, sub_state_t new_sub_state, status_flags_s &status_flags) {
    ...
    if (new_main_state == MAIN_STATE_CUSTOM) {
        // 为进入您的自定义模式设置特定事项
        // 例如,重置某些变量,配置设置等。
    }
    ...
}

(4) 处理模式逻辑

最后,在处理飞行模式的飞行堆栈部分,添加在飞行器处于您的自定义模式时应该发生的逻辑。

这可能在类似FlightTasks.cpp的文件中:

void FlightTasks::update() {
    ...
    switch (_current_task) {
        ...
        case TaskIndex::CUSTOM_MODE:
            // 在这里实现您的自定义飞行模式的逻辑
            break;
        ...
    }
}

(5) 测试

在尝试任何现实世界的飞行测试之前,首先在像SITL(软件在环)这样的仿真环境中广泛测试您的新飞行模式。这确保了安全,并有助于在受控环境中识别任何问题。

这个示例提供了添加新模式切换案例的简化视图。根据您的自定义飞行模式的具体细节和PX4固件版本,实际实现可能会有所不同。始终参考最新的PX4文档和源代码,以获得最准确和最新的信息。

回到教程目录Kerloud飞控系列教程(1):目录 - #4