飞行任务
飞行任务 在 飞行模式 中用于提供特定的运动行为,例如跟随模式或飞行平滑功能。
综述
飞行任务是飞行任务框架中的一个类,它继承自基类 FlightTask。其目标是根据任意输入数据为控制器生成设定点,每个任务针对特定模式实现所需的飞行器行为。
程序员通常会重写 activate()
和 update()
虚方法,通过调用基类任务的最小实现并扩展所需行为的实现。activate()
方法在切换到该任务时被调用,用于初始化任务状态,并从先前任务刚刚应用的传递设定点平稳接管。
update()
方法在执行期间的每次循环迭代时被调用,包含生成设定点的核心行为实现。
按照惯例,任务包含在 PX4 - Autopilot/src/modules/flight_mode_manager/tasks 的一个以任务名称命名的子文件夹中,源文件以 "FlightTask" 为前缀命名。
INFO
以下提供了 PX4 开发者峰会的视频概述。
创建飞行任务
以下说明可用于创建一个名为 MyTask 的任务:
在 PX4 - Autopilot/src/modules/flight_mode_manager/tasks 中为新的飞行任务创建一个目录。按照惯例,该目录以任务名称命名,因此我们将其命名为 /MyTask。
shmkdir PX4-Autopilot/src/modules/flight_mode_manager/tasks/MyTask
在 MyTask 目录中使用前缀 "FlightTask" 为新的飞行任务创建空的源代码和 cmake 文件:
- CMakeLists.txt
- FlightTaskMyTask.hpp
- FlightTaskMyTask.cpp
更新新任务的 CMakeLists.txt
复制另一个任务的 CMakeLists.txt 内容,例如 Orbit/CMakeLists.txt。
将版权信息更新为当前年份
cmake############################################################################ # # Copyright (c) 2021 PX4 Development Team. All rights reserved. #
修改代码以反映新任务,例如将
FlightTaskOrbit
替换为FlightTaskMyTask
。代码将类似于以下内容:cmakepx4_add_library(FlightTaskMyTask FlightTaskMyTask.cpp ) target_link_libraries(FlightTaskMyTask PUBLIC FlightTask) target_include_directories(FlightTaskMyTask PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
更新头文件(在本例中为 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}; };
适当地更新 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; }
将新任务添加到 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() ...
更新飞行模式以确保调用该任务。 通常使用一个参数来选择何时应使用特定的飞行任务。
例如,要在多旋翼飞行器的位置模式中启用我们的新
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)
make px4_sitl gazebo-classic
打开 QGroundControl(如果未打开,将不会打印消息信息)。在控制台中,起飞并切换到位置模式:
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 页相关。