# 비행 작업

비행 작업비행 모드에서 정해진 이동 동작(예: 사람 추적, 비행 평활화)을 수행합니다.

# 개요

비행 작업은 기본 클래스 FlightTask (opens new window)에서 파생된 비행 작업 프레임워크의 클래스입니다. 목표는 각 작업이 특정 모드의 기체 동작을 구현하는 임의의 입력 데이터에서 콘트롤러에 대한 설정값을 생성하는 것입니다. 프로그래머는 일반적으로 기본 작업의 최소 구현을 호출하고 원하는 동작의 구현으로 확장하여 activate()update() 가상 메서드를 재정의합니다. activate() 메서드는 작업 전환시에 호출되며, 상태를 초기화하고 이전 작업이 방금 적용한 전달된 설정점에서 부드럽게 인계되도록 합니다.

update()는 실행 중 모든 루프 반복에서 호출되며, 설정값을 생성하는 핵심 기능을 구현합니다.

규칙에 따라 작업은 작업 이름을 따서 명명된 PX4-Autopilot/src/modules/flight_mode_manager/tasks (opens new window)의 하위 폴더에 포함되며, 소스 파일에는 접두사 "FlightTask"로 이름이 지정됩니다.

PX4 개발자 회의의 비디오 개요는 [아래에서](#video) 제공합니다.

# 비행 작업 생성

아래 지침을 사용하여 MyTask라는 작업을 만들 수 있습니다.

  1. PX4-Autopilot/src/modules/flight_mode_manager/tasks (opens new window)에 새 비행 작업에 대한 디렉터리를 생성합니다. 규칙에 따라 디렉토리 이름은 작업 이름을 따서 지정되므로 /MyTask라고 합니다.

    mkdir PX4-Autopilot/src/lib/flight_tasks/tasks/MyTask
    
  2. "FlightTask" 접두사를 사용하여 MyTask 디렉토리에 새 비행 작업에 대한 빈 소스 코드 및 cmake 파일을 만듭니다.

    • CMakeLists.txt
    • FlightTaskMyTask.hpp
    • FlightTaskMyTask.cpp
  3. 새 작업을 위해 CMakeLists.txt 업데이트 합니다.

    • 다른 작업(예: Orbit/CMakeLists.txt (opens new window))을 위해 CMakeLists.txt의 내용을 복사합니다.
    • 현재 연도로 저작권을 업데이트 합니다.
      ############################################################################
      #
      #   Copyright (c) 2021 PX4 Development Team. All rights reserved.
      #
      
    • 새 작업을 반영하도록 코드를 수정하십시오. 예: FlightTaskOrbitFlightTaskMyTask로 변경합니다. 코드는 아래와 같습니다.
      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()를 다시 구현하며, 이 예에서는 개인 변수도 있습니다.

    #pragma once
    
    #include "FlightTask.hpp"
    
    class FlightTaskMyTask : public FlightTask
    {
    public:
      FlightTaskMyTask() = default;
      virtual ~FlightTaskMyTask() = default;
    
      bool update();
      bool activate(vehicle_local_position_setpoint_s last_setpoint);
    
    private:
      float _origin_z{0.f};
    };
    
  5. cpp 파일을 적절하게 업데이트 합니다. 이 예는 단순히 작업 메서드가 호출되었음을 나타내는 FlightTaskMyTask.cpp의 간단한 구현을 제공합니다.

    #include "FlightTaskMyTask.hpp"
    
    bool FlightTaskMyTask::activate(vehicle_local_position_setpoint_s last_setpoint)
    {
      bool ret = FlightTask::activate(last_setpoint);
      PX4_INFO("FlightTaskMyTask activate was called! ret: %d", ret); // report if activation was successful
      return ret;
    }
    
    bool FlightTaskMyTask::update()
    {
      PX4_INFO("FlightTaskMyTask update was called!"); // report update
      return true;
    }
    
  6. PX4-Autopilot/src/modules/flight_mode_manager/CMakeLists.txt (opens new window)에 새 작업을 빌드할 작업 목록에 추가합니다.

    list(APPEND flight_tasks_to_add
       Orbit
       MyTask
    )
    )
    
  7. 작업이 호출되도록 비행 모드를 업데이트합니다. 일반적으로, 매개변수는 특정 비행 작업을 사용해야 하는 시기를 선택합니다.

    예를 들어, 멀티콥터 위치 모드에서 새로운 MyTask를 활성화하려면:

    • 매개변수에 5와 같이 이전에 사용하지 않은 값이 있는 경우 "MyTask"를 선택하는 옵션을 추가하려면 MPC_POS_MODE(mc_pos_control_params.c (opens new window))를 업데이트 하십시오.
      ...
      * @value 4 Acceleration based input
      * @value 5 MyTask position mode implementation
      * @group Multicopter Position Control
      */
      PARAM_DEFINE_INT32(MPC_POS_MODE, 4);
      
    • _param_mpc_pos_mode에 올바른 값이 있을 때 작업을 활성화하려면 FlightModeManager.cpp (opens new window) 매개변수의 스위치에 새 옵션에 대한 사례를 추가하십시오.
      ...
      // manual position control
      ...
      switch (_param_mpc_pos_mode.get()) {
        ...
        case 3:
           error = switchTask(FlightTaskIndex::ManualPositionSmoothVel);
           break;
        case 5: // Add case for new task: MyTask
           error =  _flight_tasks.switchTask(FlightTaskIndex::MyTask);
           break;
      

    case 4: .... ...

    
    
    

# 신규 비행 작업 테스트

비행 작업을 테스트하려면, 작업이 활성화된 상태에서 기체를 실행하여야 합니다. 위의 예에서 이것은 매개변수 MPC_POS_MODE를 5로 설정하고 이륙하고 차량을 위치 모드로 전환하는 것을 의미합니다.

Note

위에 정의된 작업은 시뮬레이터에서만 테스트하여야 합니다. 코드는 실제로 설정값을 생성하지 않으므로 기체는 비행하지 않습니다.

# 비디오

다음 비디오는 PX4의 비행 작업에 대한 개요를 제공합니다. 첫 번째는 PX4 v1.9의 비행 작업 프레임워크 상태를 다룹니다. 두 번째는 PX4 v1.11의 변경 사항을 다루는 업데이트입니다.

# PX4 Flight Task Architecture 개요(PX4 개발자 회의 2019)

PX4 v1.9의 비행 모드 작동 방식 설명(Dennis Mannhart, Matthias Grob).

@유투브 (opens new window)

# 센서에서 모터에 이르는 멀티콥터 제어 개요(PX4 가상 개발자 회의 2020)

@유투브 (opens new window)

The relevant section of this video is an update of flight tasks in PX4 v11.1 at (9min 20sec). 슬라이드는 이 PDF을 참고하십시오. (opens new window) - 슬라이드 9와 12가 관련이 있습니다.