From 47ef5c5373adc4741e4f55d3cc2e26828324d119 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=80=E5=96=B5?= Date: Fri, 31 Jul 2026 11:19:37 +0800 Subject: [PATCH] =?UTF-8?q?2026.7.29=E6=97=A5=E5=BF=97=E8=BE=93=E5=87=BA?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drone_controller/mission_manager.py | 12 ++++++------ drone_controller/router_proxy.py | 16 +++++++++++++--- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/drone_controller/mission_manager.py b/drone_controller/mission_manager.py index c0c9938..081a103 100644 --- a/drone_controller/mission_manager.py +++ b/drone_controller/mission_manager.py @@ -242,11 +242,7 @@ class MissionManager: if self.state not in (MissionState.INIT, MissionState.FINISHED): if state is not None: if not self.proxy.is_state_fresh(state): - age_us, _ = self.proxy.get_state_freshness(state) - age_s = (age_us or 0) / 1_000_000 - self._throttle_log("stale_state", 5.0, - "⚠️ STATE 严重过期 (age=%.2fs)," - "本轮保守跳过", age_s, level=logging.WARNING) + # 过期警告已由 is_state_fresh 内部输出,此处不重复打印 return else: logger.warning("⚠️ 尚未收到 STATE,跳过本轮处理") @@ -267,7 +263,11 @@ class MissionManager: mode = state["drone"].get("mode", "") # 飞控切到 AUTO.LAND 或 AUTO.RTL → 自动让渡控制权 if mode in ("AUTO.LAND", "AUTO.RTL"): - logger.warning(f"⚠️ 飞控切换到 {mode},Python 端主动让渡控制权") + # 去重:同一 mode 只在首次出现时打印,避免每帧刷屏 + self._throttle_log_on_change( + "yield_mode", mode, + "⚠️ 飞控切换到 %s,Python 端主动让渡控制权", mode, + level=logging.WARNING) # 根据模式决定切换到的状态 if mode == "AUTO.LAND": self.state = MissionState.LANDING diff --git a/drone_controller/router_proxy.py b/drone_controller/router_proxy.py index d44685e..0725641 100644 --- a/drone_controller/router_proxy.py +++ b/drone_controller/router_proxy.py @@ -113,6 +113,9 @@ class RouterProxy: self._last_stale_warn_time = 0.0 # 上次 "STATE 过期" 日志时间 self._last_severe_warn_time = 0.0 # 上次 "STATE 严重过期" 日志时间 + # ---- 日志节流:PX4_ACK 按 (cmd, result) 去重 ---- + self._last_ack_log_time = {} # {(cmd, result): 上次打印时间} + # ================================================================ # 内部工具 # ================================================================ @@ -354,7 +357,8 @@ class RouterProxy: # 日志节流:间隔 ≥ THROTTLE_INTERVAL 秒才打印一次 now = time.time() if age_us >= self.STALE_THRESHOLD_WARN_US: - if now - self._last_severe_warn_time >= 5.0: + # 严重过期(长时断流)30 秒提示一次即可,避免持续刷屏 + if now - self._last_severe_warn_time >= 30.0: self._last_severe_warn_time = now logger.warning("STATE 严重过期: age=%.2fs(阈值=%.0fms)", age_us / 1e6, stale_threshold_us / 1000) @@ -469,8 +473,14 @@ class RouterProxy: logger.error("ALERT 回调异常: %s", e) elif msg_type == "PX4_ACK": - logger.info("PX4_ACK: cmd=%s result=%s", - data.get("ref_cmd"), data.get("result")) + # 节流:相同 (cmd, result) 30 秒内只打印一次,新组合立即可见 + ack_key = (data.get("ref_cmd"), data.get("result")) + now = time.time() + last = self._last_ack_log_time.get(ack_key, 0) + if now - last >= 30.0: + self._last_ack_log_time[ack_key] = now + logger.info("PX4_ACK: cmd=%s result=%s", + data.get("ref_cmd"), data.get("result")) elif msg_type == "QGC_WAYPOINTS": logger.info("📥 收到 QGC_WAYPOINTS: count=%d", data.get("count", 0))