28.1.1.2.1. `manual_control_setpoint` uORB 토픽의 구조와 물리적 의미

28.1.1.2.1. manual_control_setpoint uORB 토픽의 구조와 물리적 의미

조종기(Radio Controller)의 복잡한 아날로그 물리 세계와 PX4 펌웨어 제어 스택의 순수 수학적 이데아 세계를 이어주는 유일한 관문이 바로 manual_control_setpoint uORB 토픽이다. 이 메시지 구조체는 다양한 하드웨어 장치(수많은 브랜드의 RC 수신기, GCS 화면 조이스틱, ROS2 VIO 인터페이스 등)에서 발생한 모든 형태의 1차원 파편적 사용자 입력(User Intent) 데이터들을 단일한 규격의 실수형 행렬(Floating-point Matrix)로 재조립하여 정규화한 결정체라 할 수 있다.

1. 메시지 데이터 구조체(Message Definition) 심층 분석

PX4 소스 코드 트리의 msg/manual_control_setpoint.msg 토픽 정의 파일을 열어보면, 물리 레벨에서 사용되는 하드웨어 타이머 틱(예: 1520us PWM 값)이나 수신기 채널 번호(Channel 1~16) 같은 저수준 텔레메트리 흔적은 완벽하게 배제되어 소멸해 있다. 오직 비례 제어에 직관적인 파라미터인 -1.0에서 1.0 사이의 물리 함수 변수들로만 치환되어 구성된다.

# manual_control_setpoint.msg 파일 내부

uint64 timestamp        # 시스템 부팅 후 경과된 시간 (마이크로초 - 데이터 유효성 검증용)
uint64 timestamp_sample # 데이터가 수신기의 아날로그 변환기(ADC)에서 최초 샘플링된 실제 시간

float32 roll            # 우측 스틱 좌우 (Y축 방향 타각): -1.0 (최대 왼쪽 타각) ~ 1.0 (최대 오른쪽 타각)
float32 pitch           # 우측 스틱 상하 (X축 방향 타각): -1.0 (기체 전진을 위한 하향 타각) ~ 1.0 (기체 후진을 위한 상향 타각)
float32 yaw             # 좌측 스틱 좌우 (Z축 회전율): -1.0 (좌측 스핀 회전율) ~ 1.0 (우측 스핀 회전율)
float32 throttle        # 좌측 스틱 상하 (Z축 추력 매니폴드): -1.0 (최소 추력 및 하강) ~ 1.0 (최대 추력 및 상승). 
                        # * 단, 고도 유지 알고리즘 모드가 활성화된 상태라면 스틱 중앙점 텐션 텐트가 0.0을 마킹한다.

float32 aux1            # 보조 토글/노브 채널 1 (예: 포인팅 카메라 짐벌 롤 앵글 제어용) [-1.0, 1.0]
...
float32 aux6            # 보조 토글/노브 채널 6

uint8 sticks_moving     # 스틱이 사용자에 의해 데드존을 벗어나 물리적으로 움직이고 있는지 여부를 나타내는 비트마스크(Bitmask) Flag Boolean

1.1 시계계(Coordinate System)의 물리적 일치성 원리와 네거티브 맵(Negative Map)

이 메시지 구조의 가장 독창적인 특징은 기체 동역학의 뼈대인 Aircraft-Body NED (North-East-Down) 시계 좌표계 철학을 조종사의 스프링 텐션 스틱 방향 변수에도 그대로 수리적으로 투영하고 있다는 점이다.

  • Pitch 변수 방향성의 예: 일반적인 관성의 프로그래머라면 조종기 오른쪽 스틱을 ’위’로 밀었을 때 값의 증가 단위가 “양수(+)” 시그널이 되어 파라미터가 1.0으로 커져야 한다고 역산하기 쉽다. 하지만 PX4 제어 체계에서 기체를 “전진“시키기 위해 스틱을 밀어내는 행위는, NED 좌표계 기준에서 기체 코(Nose) 방향을 “아래(Down 방향성, 즉 양의 Z축 수치 증가)“로 숙이는 동작, 수학적으로 구체화하면 음수 피치(Negative Pitch Angle Range)를 유발해야만 성립한다. 이 때문에 조종자가 스틱을 위로 끝까지 밀어 올리는 100% 한계치 동작 시, 파싱된 Pitch 값은 **-1.0**이라는 네거티브 부호로 맵핑되어 변환 저장된다.
  • 이러한 축(Axis) 의존적 네이밍과 물리량의 엄격한 방향성 일치는, 하위 C++ 런타임의 FlightTask 모듈 제어기가 코드를 전개할 때 불필요한 부호 반전 회전 변환 행렬 연산을 방지하고, 제어 알고리즘 설계자의 뇌과학적 혼동을 원천적으로 차단하는 핵심 핀포인트 장치다.

1.2 제로 데드밴드(Zero Deadband) 필터 공간과 동적 트리거(sticks_moving 플래그)

단순 각도나 추력 퍼센티지 제어뿐만 아니라, manual_control_setpoint 내부 패킷 끝자락에는 sticks_moving이라는 매우 중요한 불리언 상태 머신 인터럽트 변수가 상주한다.

비행 중 돌풍이나 구조적 진동에 의해 조종사의 핑거 팁이 미세하게 떨리거나, 저가의 조종기 아날로그 센서 짐벌 드리프트(Drift) 마모 오차가 시스템에 개입할 수 있다. PX4 시스템의 원시 파서는 사전에 설정된 일정 임계 마진 구간(Deadband Parameter, 예컨대 전체 범위의 5% 내부) 내부에 스틱 변화 값이 가만히 맴돌고 있다면, 사용자가 “스틱에서 완전히 손을 뗀 것“으로 간주 처리하고 해당 sticks_moving 플래그를 정지(False/Off) 탈피 상태로 강제 전환시킨다.

이 상태 변환 트리거는 Flight Mode 시스템 내에서 엄청난 동역학적 파급력을 발휘한다.
Position 또는 Altitude 오토 호버링 서포트 모드 상태에서 이 sticks_moving 비트가 false로 꺾이는 순간, 비행 모드 관리자 객체는 **현재 진행하던 가속도를 멈추고 기체가 위치한 X, Y, Z 우주 공간 좌표를 락 온(Lock-on 타게팅)**하고, 기체를 허공의 헥토파스칼 좌표에 못 박은 듯이 정지 고정하는 강력한 브레이킹(Kinematic Braking) 및 위치 고수(Hovering) 홀드 수식 로직을 즉각적으로 트리거 발동하게 되는 것이다.

2. 시스템적 결론 요약

결론적으로 manual_control_setpoint 토픽 계층은 천차만별인 물리적 하드웨어의 파편화를 지우는 단순한 스케일링(Scaling) 렌즈 필터를 넘어선다. 사용자(User) 조종사가 능동적으로 기체를 “움직이려 피드포워드 의지를 행사하고 있는지(Dynamic User Transition)” 아니면 기체의 “통제권을 로봇 자동화 PID 루프에 완전히 양도 및 빙의(Hold in steady state Position)하고 싶어 하는지“에 대한 가장 직관적인 의도(Intent) 판단 기준 분기점 토픽으로서의 묵묵한 판사 지위를 점하고 있다.

오직 이 정제된 토픽이 깨끗이 생산된 직후 프레임에 진입해야만, 우산 계층의 비행 모드 관리자(Flight Mode Manager)는 각 비행 모드의 고유 동역학 방정식 특성에 맞추어 이 실수형 배열 제어 지시 파라미터들을 본격적인 기체 목적지 추방 궤적 데이터(trajectory_setpoint)로 온전하게 2차 가공해 낼 수 있는 기반을 다지게 된다.