Skip to content

飞行任务

飞行任务飞行模式 中用于提供特定的运动行为,例如跟随模式或飞行平滑功能。

综述

飞行任务是飞行任务框架中的一个类,它继承自基类 FlightTask。其目标是根据任意输入数据为控制器生成设定点,每个任务针对特定模式实现所需的飞行器行为。

程序员通常会重写 activate()update() 虚方法,通过调用基类任务的最小实现并扩展所需行为的实现。activate() 方法在切换到该任务时被调用,用于初始化任务状态,并从先前任务刚刚应用的传递设定点平稳接管。

update() 方法在执行期间的每次循环迭代时被调用,包含生成设定点的核心行为实现。

按照惯例,任务包含在 PX4 - Autopilot/src/modules/flight_mode_manager/tasks 的一个以任务名称命名的子文件夹中,源文件以 "FlightTask" 为前缀命名。

INFO

以下提供了 PX4 开发者峰会的视频概述

创建飞行任务

以下说明可用于创建一个名为 MyTask 的任务:

  1. PX4 - Autopilot/src/modules/flight_mode_manager/tasks 中为新的飞行任务创建一个目录。按照惯例,该目录以任务名称命名,因此我们将其命名为 /MyTask

    sh
    mkdir PX4-Autopilot/src/modules/flight_mode_manager/tasks/MyTask
  2. MyTask 目录中使用前缀 "FlightTask" 为新的飞行任务创建空的源代码和 cmake 文件:

    • CMakeLists.txt
    • FlightTaskMyTask.hpp
    • FlightTaskMyTask.cpp
  3. 更新新任务的 CMakeLists.txt

    • 复制另一个任务的 CMakeLists.txt 内容,例如 Orbit/CMakeLists.txt

    • 将版权信息更新为当前年份

      cmake
      ############################################################################
      #
      #   Copyright (c) 2021 PX4 Development Team. All rights reserved.
      #
    • 修改代码以反映新任务,例如将 FlightTaskOrbit 替换为 FlightTaskMyTask。代码将类似于以下内容:

      cmake
      px4_add_library(FlightTaskMyTask
          FlightTaskMyTask.cpp
      )
      
      target_link_libraries(FlightTaskMyTask PUBLIC FlightTask)
      target_include_directories(FlightTaskMyTask PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
  4. 更新头文件(在本例中为 FlightTaskMyTask.hpp): 大多数任务会重新实现虚方法 activate()update(),在这个例子中我们还有一个私有变量。

    cpp
    #pragma once
    
    #include "FlightTask.hpp"
    
    class FlightTaskMyTask : public FlightTask
    {
    public:
      FlightTaskMyTask() = default;
      virtual ~FlightTaskMyTask() = default;
    
      bool update();
      bool activate(const trajectory_setpoint_s &last_setpoint) override;
    
    private:
      float _origin_z{0.f};
    };
  5. 适当地更新 cpp 文件。 这个例子提供了一个简单的 FlightTaskMyTask.cpp 实现,仅表明任务方法被调用。

    cpp
    #include "FlightTaskMyTask.hpp"
    
    bool FlightTaskMyTask::activate(const trajectory_setpoint_s &last_setpoint)
    {
      bool ret = FlightTask::activate(last_setpoint);
      PX4_INFO("FlightTaskMyTask activate was called! ret: %d", ret); // 报告激活是否成功
      return ret;
    }
    
    bool FlightTaskMyTask::update()
    {
      PX4_INFO("FlightTaskMyTask update was called!"); // 报告更新
      return true;
    }
  6. 将新任务添加到 PX4 - Autopilot/src/modules/flight_mode_manager/CMakeLists.txt 中要构建的任务列表中。

    cmake
    ...
     list(APPEND flight_tasks_all
       Auto
       Descend
       ...
       ManualPositionSmoothVel
       Transition
       MyTask
     )
    ...

    TIP

    上面添加的任务将在所有板上构建,包括像 Pixhawk FMUv2 这样闪存受限的板。如果你的任务不打算用于闪存受限的板,应该将其添加到下面所示的条件块中(如下所示)。

    cmake
    ...
    if(NOT px4_constrained_flash_build)
       list(APPEND flight_tasks_all
         AutoFollowTarget
         Orbit
         MyTask
       )
     endif()
    ...
  7. 更新飞行模式以确保调用该任务。 通常使用一个参数来选择何时应使用特定的飞行任务。

    例如,要在多旋翼飞行器的位置模式中启用我们的新 MyTask

    • 更新 MPC_POS_MODE (multicopter_position_mode_params.c),如果参数有一个以前未使用的值(如 5),则添加一个选择 "MyTask" 的选项:

      c
      ...
       * @value 0 Direct velocity
       * @value 3 Smoothed velocity
       * @value 4 Acceleration based
       * @value 5 My task
       * @group Multicopter Position Control
       */
      PARAM_DEFINE_INT32(MPC_POS_MODE, 5);
    • 在 [FlightModeManager.cpp](https://github.com/PX4/PX4-Autopilot/blob/main/src/modules/flight_mode_manager/FlightModeManager.cpp#L266 - L285) 中参数的开关语句中为新选项添加一个 case,以便当 _param_mpc_pos_mode 具有正确的值时启用该任务。

      cpp
      ...
      // 手动位置控制
      ...
      switch (_param_mpc_pos_mode.get()) {
        ...
        case 3:
           error = switchTask(FlightTaskIndex::ManualPositionSmoothVel);
           break;
        case 5: // 为新任务添加 case: MyTask
           error = switchTask(FlightTaskIndex::MyTask);
           break;
      case 4:
      ....
      ...

测试新飞行任务

要测试飞行任务,需要在启用该任务的情况下运行飞行器。对于上述示例,这意味着将参数 MPC_POS_MODE 设置为 5,起飞并将飞行器切换到 位置模式

INFO

上面定义的任务应该仅在模拟器上进行测试。代码实际上并没有创建设定点,因此飞行器将无法飞行。

构建 SITL 仿真(gazebo - classic)

sh
make px4_sitl gazebo-classic

打开 QGroundControl(如果未打开,将不会打印消息信息)。在控制台中,起飞并切换到位置模式:

sh
pxh> commander takeoff
pxh> commander mode posctl

控制台将持续显示:INFO [FlightTaskMyTask] FlightTaskMyTask update was called!。如果你想切换到另一个飞行模式,可以输入命令更改模式,例如 commander mode altctl

视频

以下视频提供了 PX4 中飞行任务的概述。第一个视频涵盖了 PX4 v1.9 中飞行任务框架的状态。第二个视频是更新内容,涵盖了 PX4 v1.11 中的更改。

PX4 飞行任务架构概述(PX4 开发者峰会 2019)

介绍 PX4 v1.9 中飞行模式的工作原理(Dennis Mannhart,Matthias Grob)。

多旋翼飞行器从传感器到电机的控制概述(PX4 开发者峰会虚拟会议 2020)

此视频的相关部分是在 9 分 20 秒处对 PX4 v11.1 中飞行任务的更新。幻灯片可在此处找到(PDF) - 第 9 页和第 12 页相关。