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 页相关。