From 943aa3d70ec4b78043315406a7c8afca5026b9db Mon Sep 17 00:00:00 2001 From: nicoboy Date: Sun, 21 Jun 2026 17:20:39 +0200 Subject: [PATCH] fix: lire le mode de vol via pymavlink (custom_mode ArduCopter) au lieu de MAVSDK MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- wireclaw_core.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/wireclaw_core.py b/wireclaw_core.py index 6f60952..6f5a7ce 100644 --- a/wireclaw_core.py +++ b/wireclaw_core.py @@ -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