21.8.4.1.1. 페이로드 투하 명령을 위한 param1 ~ param7 포맷팅 및 타겟 시스템/컴포넌트 ID 주입 로직
앞서 MAVLink 7개 파라미터의 엄격한 철학(항상 NAN 매우기)을 배웠다. 이제 진짜 픽스호크의 AUX 단자(보조 핀)에 연결된 페이로드 서보 모터를 열고 닫는 완벽한 패키징 실전 코드를 작성해 볼 것이다.
MAVLink 표준에서 액추에이터(서보 모터나 릴레이)를 직접 조작하는 구체적인 명령어는 VEHICLE_CMD_DO_SET_ACTUATOR (명령어 번호 256) 이다.
1. 타겟 시스템/컴포넌트 식별자 부여
우리의 모듈이 내지르는 소리(vehicle_command)를 아무나 주워듣고 행동하면 안 된다. “내 드론(System ID)에 붙어있는 내 컨트롤러(Component ID)야, 움직여라!” 라고 수신자를 명확히 지목해야 한다.
PX4에서는 이 수신자 정보를 vehicle_status 토픽에서 쉽게 복사해 올 수 있다.
// 1. 빈 명령서 발행체 준비
vehicle_command_s vcmd{};
// 2. 수신자 지정 (필수!)
// 내가 속한 드론(통상 1번)과 픽스호크 메인 보드(통상 1번)를 타겟팅함.
vcmd.target_system = _vehicle_status.system_id;
vcmd.target_component = _vehicle_status.component_id;
[꿀팁] 시스템 ID 브로드캐스팅: 만약
target_system에0을 넣으면 “이 네트워크에 묶여있는 모든 드론들은 당장 문을 열어라!” 라는 무시무시한 전체 방송(Broadcast)이 되어버리니 주의해야 한다.
2. DO_SET_ACTUATOR 파라미터 매핑 기법
이제 VEHICLE_CMD_DO_SET_ACTUATOR 명세서를 펴보면 다음과 같이 파라미터 칸이 지정되어 있다.
- param1: Actuator 1의 값 (주로 -1.0 ~ 1.0)
- param2: Actuator 2의 값
- …
- param6: Actuator 6의 값
- param7: 인덱스(Index) 옵션 (잘 안 쓰임)
드론에 따라 방제 밸브가 AUX 1번 핀에 꽂혀 있을 수도 있고, AUX 3번에 꽂혀있을 수도 있다. 이를 QGC 파라미터(SENS_PAYLOAD_PIN 등)로 받아서 동적으로 매핑할 수도 있지만, 교육의 목적상 ’AUX 3번 핀’을 페이로드 밸브라고 가정해 보자.
AUX 3번 핀은 파라미터 배정 상 Actuator 3 칸(즉, param3)에 매핑되어 있다.
// 3. 명령어 종류 지정
vcmd.command = vehicle_command_s::VEHICLE_CMD_DO_SET_ACTUATOR;
// 4. [핵심] MAVLink 7 Param Formatting
// 밸브를 열 때는 PWM 신호를 가득 주어 모터를 연다. (-1.0은 닫힘 정방향, 1.0은 열림 역방향)
vcmd.param1 = NAN; // Actuator 1 (상관없음)
vcmd.param2 = NAN; // Actuator 2 (상관없음)
vcmd.param3 = 1.0f; // [!] Actuator 3 (페이로드 모터 최대 각도)
vcmd.param4 = NAN;
vcmd.param5 = NAN;
vcmd.param6 = NAN;
vcmd.param7 = NAN; // Index 옵션 안 씀
// 5. 발송 도장(Timestamp) 찍기
// 이 시간이 명령어의 '유효기간'을 결정하는 중요한 단서가 된다.
vcmd.timestamp = hrt_absolute_time();
// 6. 투하! (Publish)
_vehicle_command_pub.publish(vcmd);
이 섬세한 포맷팅 덕분에, 메인 커맨더는 param1, 2, 4, 5, 6에 물려있는 다른 중요한 서보 모터(예: 카메라 짐벌이나 랜딩기어)들을 일절 건드리지 않고, 오직 param3의 밸브 모터만을 1.0의 파워로 안전하게 열어젖힐 것이다.
자, 이제 문을 열라고 소리쳤다. 하지만 우주선을 쏘아 올리는 관제 센터처럼 “명령 하달 완료, 카피 댓(Copy that)” 이라는 확실한 응답(ACK)을 받아야만 FSM을 안전하게 닫을 수 있다.
내가 던진 vehicle_command 트랜잭션을 깔끔하게 종료시키는 vehicle_command_ack_s 구독 처리 기법을 다음 21.8.4.2장에서 파헤쳐보자.