From 3683033abf8923a30ec45b901fc7bd8a7a3ba084 Mon Sep 17 00:00:00 2001 From: linyimin <18316471919@139.com> Date: Mon, 10 Aug 2026 11:38:12 +0800 Subject: [PATCH] =?UTF-8?q?pref:=20=E6=8B=8D=E7=85=A7=E6=9B=B4=E5=BF=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.yaml | 2 +- config.py | 2 +- main.py | 20 ++++++++++++++------ shoot_manager.py | 11 +++++++++-- version.py | 2 +- 5 files changed, 26 insertions(+), 11 deletions(-) diff --git a/app.yaml b/app.yaml index 88b8739..4d0b4f1 100644 --- a/app.yaml +++ b/app.yaml @@ -1,6 +1,6 @@ id: t11 name: t11 -version: 2.15.18 +version: 2.16.1 author: t11 icon: '' desc: t11 diff --git a/config.py b/config.py index 870897a..cff3c64 100644 --- a/config.py +++ b/config.py @@ -322,7 +322,7 @@ MAX_IMAGES = 1000 # Stage2 调试目录(默认 PHOTO_DIR/stage2_roi)内 JPEG 最多保留张数;None 表示与 MAX_IMAGES 相同 TRIANGLE_BLACK_YOLO_STAGE2_ROI_MAX_IMAGES = None -SHOW_CAMERA_PHOTO_WHILE_SHOOTING = False # 是否在拍摄时显示摄像头图像(True=显示,False=不显示),建议在连着USB测试过程中打开 +SHOW_CAMERA_PHOTO_WHILE_SHOOTING = True # 是否在拍摄时显示摄像头图像(True=显示,False=不显示),建议在连着USB测试过程中打开 # ==================== OTA配置 ==================== MAX_BACKUPS = 5 diff --git a/main.py b/main.py index 8bc549f..7c158fd 100644 --- a/main.py +++ b/main.py @@ -120,9 +120,9 @@ def cmd_str(): # ==================== 第二阶段:软件初始化 ==================== - # 1. 初始化日志系统 + # 1. 初始化日志系统(WARNING级别,不打印/写入INFO和DEBUG日志,提高执行流畅度) import logging - logger_manager.init_logging(log_level=logging.DEBUG) + logger_manager.init_logging(log_level=logging.WARNING) logger = logger_manager.logger # 补充:因为初始化的时候,激光会亮,先关了它 @@ -278,6 +278,8 @@ def cmd_str(): logger.info("系统准备完成...") last_adc_trigger = 0 + _latest_frame = None # 预读的最新帧缓存,供射箭触发时减少延迟 + _frame_read_counter = 0 # 相机预读计数器,避免每帧都读拖慢CPU # 气压采样:减少日志频率(每 N 个点输出一条),避免 logger.debug 拖慢采样 PRESSURE_BATCH_SIZE = 100 @@ -389,7 +391,8 @@ def cmd_str(): _flush_pressure_buf("before_trigger") try: - process_shot(adc_val) + process_shot(adc_val, pre_frame=_latest_frame) + _latest_frame = None except Exception as e: logger = logger_manager.logger if logger: @@ -399,13 +402,18 @@ def cmd_str(): time.sleep_ms(100) continue else: - if config.SHOW_CAMERA_PHOTO_WHILE_SHOOTING: + # 每3次循环预读一次相机帧(~15ms间隔),平衡buffer新鲜度与CPU占用 + _frame_read_counter += 1 + if _frame_read_counter >= 3: + _frame_read_counter = 0 try: - camera_manager.show(camera_manager.read_frame()) + _latest_frame = camera_manager.read_frame() + if config.SHOW_CAMERA_PHOTO_WHILE_SHOOTING and _latest_frame is not None: + camera_manager.show(_latest_frame) except Exception as e: logger = logger_manager.logger if logger: - logger.error(f"[MAIN] 显示异常: {e}") + logger.error(f"[MAIN] 预读/显示异常: {e}") time.sleep_ms(5) except Exception as e: diff --git a/shoot_manager.py b/shoot_manager.py index 81e1739..95e5dd2 100644 --- a/shoot_manager.py +++ b/shoot_manager.py @@ -311,17 +311,24 @@ def analyze_shot(frame, laser_point=None): return _build_circle_result(cdata, roi_xyxy) -def process_shot(adc_val): +def process_shot(adc_val, pre_frame=None): """ 处理射箭事件(逻辑控制部分) :param adc_val: ADC触发值 + :param pre_frame: 主循环预读的最新帧(可选),传入则跳过拍照以减少延迟 :return: None """ logger = logger_manager.logger try: + # 优先使用预读帧(零延迟),否则实时拍照 + if pre_frame is not None: + frame = pre_frame + else: + frame = camera_manager.read_frame() + + # 网络事件移到拍照之后,避免阻塞拍照 network_manager.safe_enqueue({"shoot_event": "start"}, msg_type=2, high=True) - frame = camera_manager.read_frame() # 调用算法分析 analysis_result = analyze_shot(frame) diff --git a/version.py b/version.py index 4ee9054..d877970 100644 --- a/version.py +++ b/version.py @@ -4,6 +4,6 @@ 应用版本号 每次 OTA 更新时,只需要更新这个文件中的版本号 """ -VERSION = '2.15.18' +VERSION = '2.16.1'