fix: lire le mode de vol via pymavlink (custom_mode ArduCopter) au lieu de MAVSDK

MAVSDK flight_mode() retourne UNKNOWN pour les modes ArduCopter non
mappés dans son enum PX4. Lecture directe du champ custom_mode depuis
les HEARTBEAT pymavlink avec dictionnaire de mapping ArduCopter complet.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
nicoboy
2026-06-21 17:20:39 +02:00
parent 8ce340a573
commit 943aa3d70e

View File

@ -32,6 +32,16 @@ Nord = lat+, Sud = lat-, Est = lon+, Ouest = lon-
1 degre lat = 111320m, 1 degre lon = 111320*cos(lat)m
"""
ARDUCOPTER_MODES = {
0: "STABILIZE", 1: "ACRO", 2: "ALT_HOLD", 3: "AUTO",
4: "GUIDED", 5: "LOITER", 6: "RTL", 7: "CIRCLE",
9: "LAND", 11: "DRIFT", 13: "SPORT", 14: "FLIP",
15: "AUTOTUNE", 16: "POSHOLD", 17: "BRAKE", 18: "THROW",
19: "AVOID_ADSB", 20: "GUIDED_NOGPS", 21: "SMART_RTL",
22: "FLOWHOLD", 23: "FOLLOW", 24: "ZIGZAG", 25: "SYSTEMID",
26: "AUTOROTATE", 27: "AUTO_RTL"
}
drone_armed = False
current_pos = {"lat": BASE_LAT, "lon": BASE_LON, "alt": 0, "abs_alt": 584}
telemetry_cache = {"battery": -1.0, "mode": "UNKNOWN", "gps_fix": "UNKNOWN", "gps_sats": 0}
@ -81,9 +91,9 @@ async def monitor_telemetry(drone):
raw = bat.remaining_percent
telemetry_cache["battery"] = abs(raw) * 100 if abs(raw) <= 1 else abs(raw)
break
async for fm in drone.telemetry.flight_mode():
telemetry_cache["mode"] = str(fm)
break
hb = mav.recv_match(type='HEARTBEAT', blocking=False)
if hb:
telemetry_cache["mode"] = ARDUCOPTER_MODES.get(hb.custom_mode, f"UNKNOWN({hb.custom_mode})")
async for gps in drone.telemetry.gps_info():
telemetry_cache["gps_fix"] = str(gps.fix_type)
telemetry_cache["gps_sats"] = gps.num_satellites