PX4를 이용하여 고정익 무인기를 이륙시키는 과정에서, 다양한 과정과 매개변수가 사용된다. 본 글은 핸드런치 방식을 사용하는 무인기에 대해서 해당 과정과 변수들을 절차에 맞추어 정리하고자 한다.
본 글은 22년 11월 27일에 PX4 1.13.0 버전을 기준으로 작성되었습니다.
오픈소스인만큼, 코드 구성에 차이가 발생할 수 있습니다.
이 점 유의하시기 바랍니다.
전체 이륙 절차에 관여하는 모듈은 다음과 같다.
1. FixedwingPositionControl::Run() : 전체 유도제어 상태를 실행시킨다. (최상위)
1.1 FixedwingPositionControl::set_control_mode_current() :
1.2. FixedwingPositionControl::control_auto_takeoff() : 자동 이륙 절차에 대한 유도제어 담당
1.2.1 LaunchDetector::update() : 이륙/비행 상태 확인
1.2.2 FixedwingPositionControl::tecs_update_pitch_throttle() : 종축 속력/고도 유도기
1.2.3 FixedwingPositionControl::_npfg() : 횡축 유도기, 비선형 경로추종 유도
1.2.4 FixedwingPositionControl::_l1_control() : 횡축 유도기, L1 유도
1.1 현재 비행 모드 설정 FixedwingPositionControl::set_control_mode_current()
1) 자동 비행이 가능한 상태(flag_control_auto_enabled)이면서 위치 제어가 가능한 상태(flag_control_position_enabled)
혹은 Offboard 제어가 가능한 상태 (flag_control_offboard_enabled)이면서 위치가 유효하면 (_position_setpoint_current_valid)
2) VTOL이 천이 상태가 아니라면,
현재 제어 모드 _control_mode_current를 FW_POSCTRL_MODE_AUTO_TAKEOFF 으로 변경한다.
그런데 위치 제어 명령을 으로 FW_POSCTRL_MODE_AUTO_TAKEOFF 인가한게 아니라면 이륙 감지는 넘어간다. 왜냐하면 이미 비행중일 것이기 때문이다.
그래서 현재 제어모드 _control_mode_current가 FW_POSCTRL_MODE_AUTO_TAKEOFF 이고 이륙 감지를 한다면 이륙 과정을 시작한다.
1.2 이륙 상태 LaunchDetector::state_
이륙 절차는 LaunchDetector::state_ 의 3가지 값에 따라서 결정된다.
LaunchDetector::state_ | 설명 |
launch_detection_status_s::STATE_WAITING_FOR_LAUNCH | 이륙 대기 중 |
launch_detection_status_s::STATE_LAUNCH_DETECTED_DISABLED_MOTOR | 이륙이 감지되었으나, FW_LAUN_MOT_DEL 초 동안 모터는 잠깐 끈다. |
launch_detection_status_s::STATE_FLYING | 비행 중 |
1.3 이륙 감지 절차 LaunchDetector
1. launch_detection_status_s::STATE_WAITING_FOR_LAUNCH 상태에서
기수 방향으로 가속도를 FW_LAUN_AC_THLD 이상으로 (default 30m/s2)
가속도를 받는 상태가 FW_LAUN_AC_T 초 이상으로 지속됐을 때 (default 0.05 sec)
모터를 안 끄면 (FW_LAUN_MOT_DEL == 0)
-> launch_detection_status_s::STATE_FLYING 으로 전환한다.
모터를 잠깐 끄면 (FW_LAUN_MOT_DEL != 0)
-> launch_detection_status_s::STATE_LAUNCH_DETECTED_DISABLED_MOTOR 으로 전환된다.
2.1 자동 이륙 절차 FixedwingPositionControl::control_auto_takeoff()
자동 이륙 절차는 이륙 대기 속력 명령을 설정한 후, 이륙 감지 절차의 상태 LaunchDetector::state_에 따라서 다르게 동작한다. Flap 과 Spoiler는 끈다.
상태는 크게 이륙 대기 상태 (STATE_WAITING_FOR_LAUNCH)와 이륙이 감지된 상태 (STATE_LAUNCH_DETECTED_DISABLED_MOTOR, STATE_FLYING) 으로 나뉜다.
1) 이륙 대기 상태
자세 제어기의 적분기를 초기화하고
롤 각 명령을 0도,
피치 각 명령을 FW_TKO_PITCH_MIN (default 10 deg)
쓰로틀 명령을 FW_THR_IDLE로 한다. (default 0%, 0)
2) 이륙이 감지된 상태
횡축 제어에 대해서,
비선형 경로추종 유도(_npfg())를 사용하면 롤 각 명령과 대기 속력 명령이 나온다.
L1 유도(_l1_control())를 사용하면 롤 각 명령이 나온다.
종축 제어에 대해서,
2.1) 이륙은 감지되었으나 모터를 끈 상태로 간다면 STATE_LAUNCH_DETECTED_DISABLED_MOTOR는 최대 이륙 쓰로틀 명령을 max_takeoff_throttle을 FW_THR_IDLE 로 한다. (default 0%, 0.0)
2.2) 비행 중 STATE_FLYING으로 전환된다면, 최대 이륙 추력 max_takeoff_throttle을 FW_THR_MAX 로 한다. (default 100%, 1.0)
그리고 나서 TECS(tecs_update_pitch_throttle())를 이용하여 피치 각 명령과 추력 명령이 나온다.
PX4 공식 문서에 따르면 FW_CLMBOUT_DIFF 라는 매개변수를 통해서 고도 오차가 이 매개변수 값 이내로 들어오면 전환한다고 되어있으나, 코드 상으로는 그렇지 않다. 공식 문서가 늦은 것 같다.
이륙 들어가는건 알겠는데, 이륙하고 어디서 왜 전환됨..?
관련 변수 정리
변수 명 | 기본 값 | 의미 |
FW_TKO_PITCH_MIN | 10 | 이륙 최소 피치각 |
FW_TKO_AIRSPD | -1.0 | 이륙 CAS 명령값 -1 이면 FW_AIRSPD_MIN을 따른다. |
FW_AIRSPD_MIN | 10 | 최소 CAS 명령값 |
FW_THR_MIN | 0.0 | 최소 쓰로틀 명령값 |
FW_THR_IDLE | 0.0 | 대기 쓰로틀 명령값 |
FW_THR_MAX | 1.0 | 최대 쓰로틀 명령값 |
'UAV > PX4' 카테고리의 다른 글
QGC에서 비행체 상태 업데이트 속도 조절하기 (0) | 2024.09.05 |
---|---|
[작성중] PX4 Mixer 설정을 이용하여 짐벌 제어하기 (0) | 2021.06.08 |
[PX4] ROS + AirSim with CV - 참고 (0) | 2020.12.07 |