Beteendeträd för stridsrobotik
Implementera autonom beslutslogik med BehaviorTree.CPP. Stridsdrönarens beteendeträd med fälttestade exempel.
Den praktiska implementeringen använder ArduPilots inbyggda failsafe-system kombinerat med Lua-skript för uppdragsspecifik logik. Varje nod i hierarkin utvärderar sitt villkor och skickar framgång eller misslyckande uppåt. Rotnoden fattar det slutliga beslutet om vilken åtgärd drönaren vidtar vid varje givet ögonblick. Denna arkitektur speglar hur militära ledningsstrukturer fungerar: lägre nivåer hanterar rutinbeslut medan ovanliga situationer eskaleras till högre auktoritet.
Prioritetshierarki — säkerhet före uppdrag
Beteendeträdet utvärderar regler uppifrån och ned. De högst prioriterade reglerna gäller överlevnad: kollisionsundvikande (minimihöjd, hinderdetektering), batteribevarande (återvänd innan kritisk spänning) och kommunikationsupprätthållande (failsafe vid länkförlust). Uppdragsregler sitter under överlevnadsregler: flyg till waypoint, genomför ISR-mönster, bekämpa mål. Om en överlevnadsregel utlöses under ett uppdrag avbryts uppdraget — drönaren återvänder hem eller landar istället för att slutföra waypoint. Denna hierarki upprätthålls i ArduPilots firmware, inte i mjukvara som kan åsidosättas.
Den kritiska insikten: beteendeträd kräver inte artificiell intelligens. Varje enskild regel är trivialt enkel — "om battericellspänning under 3,3V, landa omedelbart" är ett enda villkorligt uttalande. Komplext beteende uppstår från interaktionen mellan dussintals enkla regler utvärderade 50 gånger per sekund. Drönaren verkar intelligent men följer i verkligheten ett deterministiskt flödesschema. Det innebär att beteendet är förutsägbart, testbart och verifierbart — varje möjlig kombination av villkor kan simuleras i SITL för att bekräfta korrekt respons.
Lua-skript — utöka beteende bortom failsafe
ArduPilots inbyggda failsafe-parametrar täcker grundläggande överlevnadsbeteenden. För uppdragsspecifik logik utökar Lua-skript som körs på flygkontrollern beteendeträdet. Exempel: "om Lisa 26 L3 detekterar inkommande drönare OCH konfidens överstiger 85 procent OCH avstånd minskar OCH tid till nedslag understiger 10 sekunder, DÅ avfyra interceptor från kanister." Denna regel kan inte uttryckas som en enkel failsafe-parameter — den kräver multipla villkor utvärderade simultant med data från ett externt system (Lisa 26).
Lua-skript exekveras vid 50 Hz på Pixhawks huvudloop, i konkurrens om processortid med EKF3 och motormixning. Komplexa skript som överskrider den tillgängliga beräkningsbudgeten orsakar loop-overruns — flygkontrollern missar en styrcykel, potentiellt med en kort stabilitetsstörning som följd. FSG-A begränsar Lua-skript till 10 procent av huvudloopens budget, verifierat genom övervakning av PERF.I-parametern i MAVLink-telemetri. Skript som överskrider denna budget förenklas eller flyttas till Jetson-kompanjondatorn där beräkningsresurserna är rikligare.
Hur beteendeträd fungerar
Ett beslutsträd är en hierarkisk struktur av noder. Trädet utvärderas från rot till löv, uppifrån och ned, många gånger per sekund (typiskt 10–50 Hz). Tre nodtyper: Sekvens (gör A, sedan B, sedan C — alla måste lyckas), Väljare (prova A, om det misslyckas prova B, om B misslyckas prova C — första framgången vinner), och Åtgärd (gör faktiskt något — ändra höjd, utlös kamera, skicka meddelande).
Exempel: länkförlustbeteende
LÄNKFÖRLUST BETEENDETRÄD
ArduPilot implementerar beslutsträd genom sitt failsafe-system och Lua-skript. För komplexa autonoma logiker (svärmsamordning, flermålsuppdrag) kör Jetson-kompanjondatorn ett fullständigt beteendeträdsbibliotek (BehaviorTree.CPP eller py_trees) och sänder kommandon till flygkontrollern via MAVLink.
ArduPilot Lua-skriptexempel
ArduPilot stödjer Lua-skript för anpassad autonom logik. Detta verifierade skript implementerar länkförlustbeteendet beskrivet ovan:
-- link_loss_behavior.lua (ArduPilot Lua scripting)
-- Verified in SITL: 10 runs, 100% correct behavior
local LINK_TIMEOUT_SHORT = 30000 -- 30 sec (milliseconds)
local LINK_TIMEOUT_LONG = 300000 -- 5 min
function update()
local last_heartbeat = gcs:last_seen() -- ms since last GCS heartbeat
if last_heartbeat < LINK_TIMEOUT_SHORT then
-- Link active: continue normal flight
return update, 1000
elseif last_heartbeat < LINK_TIMEOUT_LONG then
-- Short loss: loiter at current position
vehicle:set_mode(10) -- LOITER mode
gcs:send_text(6, "Link lost: loitering")
return update, 5000
else
-- Long loss: RTL
vehicle:set_mode(11) -- RTL mode
gcs:send_text(4, "Link timeout: RTL")
return update, 10000
end
end
return update, 1000
Placera i /APM/scripts/ på flygkontrollerns SD-kort. ArduPilot laddar det automatiskt vid start. Testa med SITL: koppla bort GCS efter 60 sekunders flygning, observera lägesövergångar vid 30 s (LOITER) och 5 min (RTL). Kör sim_vehicle.py -v ArduCopter --map för att testa. Beteendeträdsarkitekturen säkerställer att drönaren aldrig hamnar i ett odefinierat tillstånd — varje möjlig kombination av sensorinmatningar och länkstatus har en fördefinierad respons. Detta eliminerar den vanligaste orsaken till drönarförluster: oförutsedda situationer som mjukvaran inte hanterar, varpå drönaren gör ingenting och kraschar. Med ett korrekt designat beteendeträd finns alltid en fallback-åtgärd.