跳至内容

飞行任务

飞行任务 内使用 飞行模式 提供特定的运动行为:如跟随我或平滑飞行。

概述

飞行任务是飞行任务框架中的一个类,由基类 飞行任务.它的目标是根据任意输入数据为控制器生成设定点,其中每个任务都为特定模式实现所需的载具行为。程序员通常会覆盖 激活()更新() 通过调用基本任务的最小实现,并使用所需行为的实现来扩展虚拟方法。任务 激活() 方法在切换到任务时被调用,该方法允许初始化任务状态,并从上一个任务刚刚应用的已传递设定点中轻轻接管任务。

更新() 在执行过程中的每次循环迭代中都会被调用,其中包含产生设定点的核心行为执行。

按照惯例,任务包含在 PX4-Autopilot/src/modules/flight_mode_manager/tasks 以任务命名,源文件则以"FlightTask"前缀命名。

信息

PX4 开发人员峰会的视频概述如下 提供如下.

创建飞行任务

下面的说明可用于创建名为 我的任务:

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

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

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

    • 复制 CMakeLists.txt 用于另一项任务,例如 Orbit/CMakeLists.txt

    • 将版权更新为当年

      cmake
      ############################################################################
      #
      # 版权 (c) 2021 年 PX4 开发团队。保留所有权利。
      #
    • 修改代码以反映新任务,例如替换 飞行任务轨道FlightTaskMyTask.代码将如下所示:

      cmake
      px4_add_library(FlightTaskMyTask
          FlightTaskMyTask.cpp
      )
      
      目标链接库(飞行任务 公众 FlightTask)
      目标包含目录(飞行任务 公众 ${cmake_current_source_dir})
  4. 更新头文件(此处为 FlightTaskMyTask.hpp):大多数任务重新实现虚拟方法 激活()更新()在这个例子中,我们还有一个私有变量。

    cpp
    #pragma 一次
    
    #include "FlightTask.hpp";
    
     FlightTaskMyTask :  飞行任务
    {
    公众:
      FlightTaskMyTask() = 默认;
      虚拟 ~FlightTaskMyTask() = 默认;
    
      bool 更新();
      bool 启动( trajectory_setpoint_s 及样品;last_setpoint) 否决;
    
    私人
      浮动 _origin_z{0.f};
    };
  5. 适当更新 cpp 文件。本例提供了 FlightTaskMyTask.cpp 表示任务方法已被调用。

    cpp
    #include "FlightTaskMyTask.hpp";
    
    bool FlightTaskMyTask::启动( trajectory_setpoint_s 及样品;last_setpoint)
    {
      bool 重新 = 飞行任务::启动(最后一个设定点);
      PX4_INFO("FlightTaskMyTask 激活已调用!返回: %d";, ret); // 报告激活是否成功
      返回 保留;
    }
    
    bool FlightTaskMyTask::更新()
    {
      PX4_INFO(调用了 FlightTaskMyTask 更新!";); // 报告更新
      返回;
    }
  6. 将新任务添加到待建任务列表中 PX4-Autopilot/src/modules/flight_mode_manager/CMakeLists.txt:

    cmake
    ...
    如果(不是 px4_constrained_flash_build)
     清单(APPEND flight_tasks_all
      自动跟踪目标
      轨道
      我的任务
     )
    endif()
    ...
  7. 更新飞行模式,确保任务被调用。通常使用一个参数来选择何时使用特定的飞行任务。

    例如,为了使我们的新 我的任务 在多旋翼定位模式下:

    • 更新 MPC_POS_MODE (multicopter_position_mode_params.c) 添加一个选项,以便在参数有像 5 这样的未使用值时选择 "我的任务":

      c
      ...
       * @value 0 直接速度
       * @value 3 平滑速度
       * @value 4 基于加速度
       * @value 5 我的任务
       * @group 多旋翼飞行器定位控制
       */
      参数define_int32(MPC_POS_MODE、 5);
    • 在参数的开关中为新选项添加一个案例 FlightModeManager.cpp 时启用该任务 参数 MPC_pos_mode 具有正确的值。

      cpp
      ...
      // 手动位置控制
      ...
      开关 (_param_mPC_pos_mode。获取()) {
        ...
        个案 3:
           错误 = 切换任务(飞行任务索引::ManualPositionSmoothVel);
           断裂;
        个案 5: // 为新任务添加案例:我的任务
           错误 = 切换任务(飞行任务索引::MyTask);
           断裂;
      个案 4:
      ....
      ...

测试新飞行任务

要测试飞行任务,需要在启用任务后运行飞行器。在上面的例子中,这意味着设置参数 MPC_POS_MODE 到 5,起飞,并将载具切换到 位置模式.

信息

上述任务只能在模拟器上测试。代码不会实际创建设定点,因此载具不会飞行。

建立 SITL 仿真(gazebo-classic)

生产 px4_sitl 古董

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

pxh>; 司令员 起飞
pxh>; 司令员 模式 posctl

控制台将持续显示: INFO [FlightTaskMyTask] 已调用 FlightTaskMyTask 更新!.如果您想切换到另一种飞行模式,可以键入命令来更改模式,例如 指挥官模式 altctl.

视频

以下视频概述了 PX4 中的飞行任务。第一个视频介绍了 PX4 v1.9 中飞行任务框架的状态。第二个是更新版,涵盖了 PX4 v1.11 中的变化。

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

说明 PX4 v1.9 中飞行模式的工作原理(Dennis Mannhart、Matthias Grob)。

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

这段视频的相关部分是 PX4 v11.1 中飞行任务的更新(9 分 20 秒)。飞行任务 幻灯片请点击此处(PDF) - 幻灯片 9 和 12 与此相关。