diff --git a/src/common/config.py b/src/common/config.py index b3b68eb..db73bd7 100644 --- a/src/common/config.py +++ b/src/common/config.py @@ -22,7 +22,7 @@ # テレメトリメッセージのプロトコルバージョン # Pi/PC 間でこの値が一致しないと正しくパースできない -TELEMETRY_VERSION: int = 2 +TELEMETRY_VERSION: int = 3 # ── ネットワーク設定(.env から読み込み) ────────────────────── diff --git a/src/pc/gui/telemetry_display.py b/src/pc/gui/telemetry_display.py index bc1c343..8cca816 100644 --- a/src/pc/gui/telemetry_display.py +++ b/src/pc/gui/telemetry_display.py @@ -31,6 +31,7 @@ is_intersection: bool = False is_recovering: bool = False intersection_available: bool = False + compute_ms: float = 0.0 fps: float = 0.0 throttle: float = 0.0 steer: float = 0.0 @@ -100,6 +101,9 @@ self.state.intersection_available = telemetry.get( "intersection_available", False, ) + self.state.compute_ms = telemetry.get( + "compute_ms", 0.0, + ) self.state.fps = telemetry.get("fps", 0.0) self.state.throttle = telemetry.get( "throttle", 0.0, @@ -122,10 +126,15 @@ self._update_detect_info_label() # パフォーマンス表示 - self._perf_label.setText( + perf_text = ( f"recv FPS: {self._recv_fps:.1f}" f" Pi FPS: {self.state.fps:.1f}" ) + if self.state.compute_ms > 0.0: + perf_text += ( + f" 計算: {self.state.compute_ms:.1f}ms" + ) + self._perf_label.setText(perf_text) self._display_frame(frame, overlay_flags) return True diff --git a/src/pi/comm/zmq_client.py b/src/pi/comm/zmq_client.py index 8a150b2..f12ee99 100644 --- a/src/pi/comm/zmq_client.py +++ b/src/pi/comm/zmq_client.py @@ -62,6 +62,7 @@ is_intersection: bool, is_recovering: bool, intersection_available: bool, + compute_ms: float, fps: float, binary_image: np.ndarray | None = None, ) -> None: @@ -83,6 +84,7 @@ is_intersection: 十字路と判定されたか is_recovering: 復帰動作中か intersection_available: 十字路分類器が利用可能か + compute_ms: 操舵計算時間(ミリ秒) fps: Pi 側の処理 FPS binary_image: 二値画像(None で省略) """ @@ -102,6 +104,7 @@ "intersection_available": ( intersection_available ), + "compute_ms": compute_ms, "fps": fps, } diff --git a/src/pi/main.py b/src/pi/main.py index 266ab94..3b8f27b 100644 --- a/src/pi/main.py +++ b/src/pi/main.py @@ -57,6 +57,10 @@ frame_count = 0 fps_start = time.time() current_fps = 0.0 + compute_ms_avg = 0.0 + compute_ms_sum = 0.0 + compute_count = 0 + compute_start = time.time() try: camera.start() @@ -132,6 +136,7 @@ if mode == "auto": # 線検出 + 制御 + t_start = time.time() output = steering.compute(frame) det = steering.last_detect_result @@ -181,6 +186,18 @@ throttle = output.throttle steer = output.steer + compute_ms_sum += ( + (time.time() - t_start) * 1000.0 + ) + compute_count += 1 + ce = time.time() - compute_start + if ce >= 1.0: + compute_ms_avg = ( + compute_ms_sum / compute_count + ) + compute_ms_sum = 0.0 + compute_count = 0 + compute_start = time.time() elif mode == "manual": throttle = manual_throttle @@ -215,6 +232,7 @@ intersection_available=( intersection_clf.available ), + compute_ms=compute_ms_avg, fps=current_fps, binary_image=binary_image, )