Przeglądaj źródła

refactor(coordinator): 重构联动控制器实现及异步PTZ控制流程

- 重构 Coordinator 类,优化全景摄像头与球机的联动跟踪流程
- 实现异步联动控制器 AsyncCoordinator,分离检测线程与PTZ控制线程
- 增加目标选择逻辑支持多目标同时处理及粘性切换策略
- 支持基于事件驱动的联动控制,提升系统响应效率
- 优化PTZ命令发送,避免频繁重复动作并支持PTZ位置确认
- 实现配对图片保存机制,关联全景与球机图像进行批次管理
- 增加多线程安全机制,保障状态和目标数据一致性
- 丰富系统运行统计和日志输出,便于性能监控和问题排查
- 增加校准器支持,允许坐标转换提升定位精度
- 提升OCR识别流程,控制调用频率并集成识别结果回调机制
wenhongquan 2 dni temu
rodzic
commit
50292f9517
1 zmienionych plików z 13 dodań i 0 usunięć
  1. 13 0
      dual_camera_system/coordinator.py

+ 13 - 0
dual_camera_system/coordinator.py

@@ -1218,6 +1218,18 @@ class AsyncCoordinator(Coordinator):
         """发送PTZ命令并打印日志"""
         """发送PTZ命令并打印日志"""
         x_ratio, y_ratio = target.position
         x_ratio, y_ratio = target.position
         
         
+        # 冷却检查(与 _send_ptz_command 保持一致)
+        current_time = time.time()
+        if current_time - self._last_ptz_time < self.PTZ_COMMAND_COOLDOWN:
+            return
+        
+        # 位置变化阈值检查
+        if self.last_ptz_position is not None:
+            last_x, last_y = self.last_ptz_position
+            if abs(x_ratio - last_x) < self.ptz_position_threshold and \
+               abs(y_ratio - last_y) < self.ptz_position_threshold:
+                return
+        
         # 计算PTZ角度(用于日志)
         # 计算PTZ角度(用于日志)
         if self.enable_calibration and self.calibrator and self.calibrator.is_calibrated():
         if self.enable_calibration and self.calibrator and self.calibrator.is_calibrated():
             pan, tilt = self.calibrator.transform(x_ratio, y_ratio)
             pan, tilt = self.calibrator.transform(x_ratio, y_ratio)
@@ -1242,6 +1254,7 @@ class AsyncCoordinator(Coordinator):
         
         
         try:
         try:
             self._ptz_queue.put_nowait(cmd)
             self._ptz_queue.put_nowait(cmd)
+            self.last_ptz_position = (x_ratio, y_ratio)  # 更新位置记录
             self._update_stats('ptz_commands_sent' if 'ptz_commands_sent' in self.stats else 'persons_detected')
             self._update_stats('ptz_commands_sent' if 'ptz_commands_sent' in self.stats else 'persons_detected')
             logger.info(
             logger.info(
                 f"[PTZ] 命令已发送: 目标ID={target.track_id} "
                 f"[PTZ] 命令已发送: 目标ID={target.track_id} "