믹서 레퍼런스
스틱과 자이로에서 선 위의 µs까지: 선택 가능한 모든 믹서의 완전한 기하 — 날개 축, 러더 블렌드, 엘레본, 트림과 클램프.
이 페이지는 src/lib/Ornithopter/Ornithopter.cpp의 믹서 계층과 OrnithopterConfig.h의 프로파일 시스템을 문서화합니다. 주변 아키텍처는
아키텍처 문서
; 펄스 타이밍과 트림 범위는
서보 커널
문서를 참조하세요.
서보 기능 태그
모든 믹서의 모든 출력은 ServoFunc 태그로 인덱싱된 _f[]에 기록되는 µs 값입니다. 태그는 운송 수단 — 신호가 무엇을 의미하는지 말하지 어디에 배선되는지는 말하지 않습니다:
| 태그 | 이름 | 의미 |
|---|---|---|
0
|
SF_NONE
|
예약됨 — 기능 없음(첫 PWM 슬롯은 BOOT와 I2C용으로 비어 있음) |
1 / 2
|
SF_LEFT_WING / SF_RIGHT_WING
|
전방 플래핑 날개(파형 커널) |
3
|
SF_RUDDER
|
헤드/크레스트 러더(파형) 또는 핀 러더(기어박스) — 요 + 롤 블렌드 |
4
|
SF_MOTOR
|
브러시리스 ESC 스로틀(기어박스 커널 전용) |
5 / 6
|
SF_VTAIL_LEFT / SF_VTAIL_RIGHT
|
V-테일 면, 엘레본 혼합(기어박스 커널) |
7
|
SF_ELEVATOR
|
전통적인 별도 엘리베이터(기어박스 프로파일 6/7) |
8 / 9
|
SF_BACK_LEFT_WING / SF_BACK_RIGHT_WING
|
4-날개 기체의 후방 날개 쌍(전방 쌍의 미러, 자체 트림) |
런타임 프로파일이 funcMap을 제공합니다: PWM 출력 인덱스 → ServoFunc을 매핑하는 배열. 처음 세 슬롯(PWM 1…3)은 항상 SF_NONE — BOOT 스트랩과 I2C 버스에 속하므로 — 실제 서보 함수는 PWM 인덱스 3에서 시작합니다(펌웨어 주석이 명시: 인덱스 3 = CH4, 4 = CH5, 5 = CH6).
여덟 가지 믹서 프로필
8개의 믹서 프로파일이 있습니다. 프로파일 0–2는 파형 커널(플래핑 날개)을, 프로파일 3–7은 기어박스 커널(모터 + 테일)을 구동합니다:
| # | 프로파일 | 커널 | 서보 | funcMap (PWM 3 · 4 · 5) |
|---|---|---|---|---|
0
|
SERVO_2WING
|
파형 | 2 | 왼쪽 날개 · 오른쪽 날개 · — |
1
|
SERVO_2WING_1RUD
|
파형 | 3 | 왼쪽 날개 · 오른쪽 날개 · 러더 |
2
|
SERVO_4WING
|
파형 | 4(후방 오른쪽이 후방 왼쪽 미러를 공유) | 왼쪽 날개 · 오른쪽 날개 · 후방 왼쪽 날개 |
3
|
GEARBOX_2VTAIL_1RUD
|
기어박스 | 3 | 러더 · V-테일 좌 · V-테일 우 |
4
|
GEARBOX_1MOT_2VTAIL
|
기어박스 | 3 | 모터 · V-테일 좌 · V-테일 우 |
5
|
GEARBOX_1MOT_2VTAIL_1RUD
|
기어박스 | 4(V-테일 오른쪽이 왼쪽 미러를 공유) | 러더 · 모터 · V-테일 좌 |
6
|
GEARBOX_1ELE_1RUD
|
기어박스 | 2 | 러더 · 엘리베이터 · — |
7
|
GEARBOX_1MOT_1ELE_1RUD
|
기어박스 | 3 | 러더 · 모터 · 엘리베이터 |
선택: 빌드 플래그 MIXER_PROFILE(레거시 ORNITHOPTER_GEARBOX=1 → 프로파일 5), 이후 WebUI로 런타임 재정의(setOrnithopterProfile). 커널 검사는 단순히 activeProfile ≥ GEARBOX_2VTAIL_1RUD.
날개 축 믹싱 (파형 커널)
모든 채널 값은 정규화되어 믹서에 들어갑니다: _crsfToNorm이 원시 172…1811 창을 −1…+1로 선형 매핑합니다. 조향 명령은 이후 프로파일별 권위 슬라이더(aileronScale, elevatorScale, 0–100%)× ±60°(ORNI_STEER_MAX_DEG)로 스케일됩니다.
미러 기하. 날개 서보는 미러 장착되어 공통 모드와 차동 항의 의미가 뒤바뀝니다. 따라서 코드는 에일러론(롤)을 공통으로 취급 — 양 날개에 더해져 물리적 차동 편향이 됨 — 하고 엘리베이터(피치)는 코드에서 차동으로 취급하여 물리적 공통 편향이 됩니다. 각도 방정식은 ORNI_NEUTRAL_ANGLE_DEG = 100°와 편차 항에만 적용되는 2× 승수로:
angleLeft = NEUTRAL + (aileron + elevator + flapCentre − degL) · 2
angleRight = NEUTRAL + (aileron − elevator − flapCentre + degR) · 2
flapping: degL/R = amplitudeL/R · shapedWave(rawPhase, ferocityL/R, …)
glide: degL = degR = 0 → static glide offset takes over
degL/degR은 왼쪽·오른쪽 날개의 순간 스트로크 편향으로, 각각 자신의 진폭과 격렬도-형성 파의 곱입니다. 엘리베이터 업은 다운스트로크를, 다운은 업스트로크를 강화합니다(비대칭 격렬도). 요는 날개를 두 보완 방식으로 나눕니다:
- 격렬도 차동(
rudderFerocityRange): 왼쪽은+격렬도, 오른쪽은−격렬도— 두 날개가 다르게 드웰하지만 공유 반전 위상(limiarShared)을 유지하므로 선회는 순수 롤 토크이지 결코 비동기가 아닙니다. - 진폭 차동(
rudderAmplitudeDifferential): 왼쪽 진폭 ×(1+Δ), 오른쪽 ×(1−Δ) — 스로틀 설정 스트로크 중심의 대칭 발산.
각도는 0…180°로 클램프되고 구성 가능한 엔벨로프 servoMinUs…servoMaxUs(기본 988…2012)로 펄스 변환됩니다: µs = min + 각도·(max−min)/180, 함수별 트림 추가. 글라이드/플랩 중심 오프셋(glideAngleDeg, flappingAngleDeg, ±15°)은 각 분기에 정적 항으로 들어갑니다 — 따라서 글라이드와 플랩 중심을 프로파일별로 독립 조정할 수 있습니다.
러더 믹싱 (두 커널 모두)
러더 믹서는 두 커널이 그대로 공유합니다 — 하나의 방정식, 두 기체:
mix = rudderNorm · rudderYawWeight + aileronNorm · rudderRollWeight
mix = clamp(mix, −1 … +1)
µs = 1500 + mix · 500 (rudder centre ± 500 µs)
+ gyroRudderCorrection (Zephyrus, when enabled)
+ servoTrimUs[SF_RUDDER]
기본값: rudderYawWeight = 65%, rudderRollWeight = 35%(WebUI에서 런타임 조정, 백업별 저장). 러더의 롤 커플링 덕분에 날개가 무거운 프테로사우루스가 요스트링 곡예 없이 협조 선회를 유지합니다. 헤드 러더가 롤에서 너무 공격적이면 롤 가중치를 줄이세요.
기어박스 꼬리·엘레본 믹싱
기어박스 커널은 매 틱 무상태로 실행됩니다. 세 하위 믹서:
- 모터 —
SF_MOTOR: 아밍 시 스로틀 0…1이 1000…2000 µs로 매핑; 디스암 또는 링크 다운 시 최소 강제(모터 정지). - 러더 — 위 섹션과 동일한 방정식.
- 테일 — 두 패밀리. 고전 프로파일(6/7)은 별도 엘리베이터 구동:
µs = 1500 + elevatorNorm·500 + pitchPID + trim. V-테일 프로파일(3/4/5)은 두 채널을 두 테일 서보에 엘레본 혼합:
VtailLeft = 1500 + (aileron + elevator)·scale + rollPID + pitchPID + trimL
VtailRight = 1500 + (aileron − elevator)·scale − rollPID + pitchPID + trimR
scale = 500 µs; both aileron/elevator sums clamped to −1…+1 first
기어박스 커널에서 Zephyrus는 롤과 피치 둘 다 PID 보정을 테일 서보에 주입합니다(롤 역위상, 피치 공통 모드), 각각 ±250 µs(ZEPHYR_GEARBOX_CLAMP_US)로 하드 클램프. 따라서 자이로 글리치는 테일 서보를 흔들 수는 있어도 절대 멈추게 하지 못합니다.
제피로스 주입, 트림·페일세이프
커널과 축에 따라 세 가지 주입 지점이 있습니다:
| 축 | 파형 커널 | 기어박스 커널 |
|---|---|---|
| 러더 / 요 | 크레스트 러더 µs에 gyroRudderCorrection 추가 |
핀 러더 µs에 gyroRudderCorrection 추가 |
| 롤(에일러론) | —(파형 날개는 롤 PID 없음) | gyroAileronCorrection, V-테일에서 역위상, ±250 µs 클램프 |
| 피치(엘리베이터) | —(Zephyrus 계층에서 파 변조로 주입) | gyroElevatorCorrection, 공통 모드, ±250 µs 클램프 |
트림과 한계. 모든 함수에는 부호 있는 서보별 트림(servoTrimUs[tag], 기본 0, ±300 µs)이 마지막에 더해지고, 모든 값은 _clampServo — 모든 것을 능가하는 절대 500…2500 µs 안전 클램프 — 를 통과합니다. 페일세이프나 링크 다운 시 모든 함수는 1500 µs로, 기어박스 모터는 최소로 돌아가므로 모델은 항상 중립으로 글라이드합니다.
실전 계층으로 갈 준비가 되셨나요? 파형 튜닝 튜토리얼은 이 수치들이 스틱에서 어떻게 느껴지는지 보여주고, 아키텍처 문서는 각 믹서가 파이프라인 어디에 있는지 보여줍니다.