Moduł 8 — Programowanie kontrolera lotu
Moment, w którym stos przestaje być czarną skrzynką: budujesz firmware ze źródeł, skryptujesz autopilota i mówisz jego protokołami.
🟢 Fundamenty. Trzy „powierzchnie" programowania, od łagodnej do głębokiej:
- Skrypty aparatury — Lua w EdgeTX: własne ekrany telemetrii, ostrzeżenia, logika modelu.
- Skrypty autopilota — Lua na pokładzie ArduPilota: reakcje na stan lotu, sterowanie serwami/LED-ami, mikromisje — bez żadnego toolchaina.
- Sam firmware — C/C++: Betaflight, INAV, ArduPilot, PX4 to otwarte repozytoria czekające na Twoje commity.
Postaw uniwersalny toolchain raz: Git, kompilator skrośny ARM GCC i system budowania projektu; zbuduj niezmodyfikowany firmware i wgraj go. Ta jedna pętla (edytuj → buduj → flashuj → loguj) to 80 % pracy embedded.
🟡 Praktyk. Poznaj dwa protokoły, którymi mówi wszystko. MSP (MultiWii Serial Protocol) — tak konfiguratory rozmawiają z Betaflightem. MAVLink to lingua franca ArduPilota/PX4: ramki z system-ID, component-ID i message-ID (HEARTBEAT, ATTITUDE, COMMAND_LONG…). Z Pythona:
# pip install pymavlink — najpierw na SITL, nigdy na żywym quadzie ze śmigłami!
from pymavlink import mavutil
link = mavutil.mavlink_connection('udp:127.0.0.1:14550')
link.wait_heartbeat()
print("Połączono: sys", link.target_system)
link.arducopter_arm()
link.mav.command_long_send(
link.target_system, link.target_component,
mavutil.mavlink.MAV_CMD_NAV_TAKEOFF, 0,
0, 0, 0, 0, 0, 0, 10) # start na 10 m
A na pokładzie — Lua ArduPilota (plik .lua na kartę SD):
-- scripts/alt_report.lua : melduj wysokość co sekundę
function update()
local pos = ahrs:get_relative_position_NED_home()
if pos then
gcs:send_text(6, string.format("Wys: %.1f m", -pos:z()))
end
return update, 1000
end
return update()
SITL (software-in-the-loop) pozwala rozbić symulowanego quada tysiąc razy za darmo — uczyń go swoim domyślnym celem.
🔴 Zaawansowany. Czytaj architekturę prawdziwego firmware: src/main/flight/ Betaflighta (PID, mikser) vs drivers/; podział ArduPilota na pojazdy/libraries/ i jego HAL. Piśmienność embedded-C: przerwania, DMA, volatile, fixed-point vs float, czemu printf w ISR wywraca system, testy jednostkowe kodu lotu na nagranych logach. Zrób pierwszy prawdziwy wkład: odtwórz buga, napisz poprawkę, przejdź CI, przeżyj code review.
⚫ Mistrz. Piszesz minimalny kontroler lotu od zera (sterownik żyroskopu → filtr komplementarny → PID rate → mikser → DShot) jako projekt edukacyjny, spinasz ArduPilota z ROS 2 / MAVSDK dla autonomii na komputerze pokładowym i projektujesz własne komunikaty MAVLink dla niestandardowych ładunków — jak gimbal sterowany ruchem głowy z działu projektów tej strony.
Lista mistrzowska
- Zbuduj Betaflighta i ArduPilota ze źródeł i wgraj własne binarki.
- Napisz skrypt Lua zmieniający zachowanie w locie (np. auto-pochylenie gimbala od prędkości).
- Wyjaśnij ramkę MAVLink COMMAND_LONG bajt po bajcie.
🖼️ Pomysły na zdjęcia: zrzut własnej sesji SITL + Mission Plannera; wyjście terminala z budowania (Twoje zrzuty = Twoje prawa).
📚 Darmowe źródła: wiki deweloperskie ArduPilota (Lua i budowanie); dokumentacja deweloperska Betaflighta; MAVLink developer guide; repozytorium przykładów pymavlink.