"""
main
Pi 側アプリケーションのエントリーポイント
カメラ画像の送信と操舵量の受信・モーター制御を行う
"""
import time
from pi.camera.capture import CameraCapture
from pi.comm.zmq_client import PiZmqClient
from pi.motor.driver import MotorDriver
def main() -> None:
"""Pi 側のメインループを実行する"""
camera = CameraCapture()
zmq_client = PiZmqClient()
motor = MotorDriver()
try:
camera.start()
zmq_client.start()
motor.start()
print("Pi: カメラ・通信・モーターを開始")
# FPS / RTT 計測用
frame_count = 0
fps_start = time.time()
LOG_INTERVAL_SEC = 3.0
while True:
# カメラ画像を取得して送信
frame = camera.capture()
zmq_client.send_image(frame)
frame_count += 1
# 操舵量を受信してモーターに反映
control = zmq_client.receive_control()
if control is not None:
throttle, steer = control
motor.set_drive(throttle, steer)
# タイムアウト時はモーター停止
if zmq_client.is_timeout():
motor.stop()
# 定期的に FPS と RTT を表示
elapsed = time.time() - fps_start
if elapsed >= LOG_INTERVAL_SEC:
fps = frame_count / elapsed
rtt = zmq_client.last_rtt
rtt_ms = (
f"{rtt * 1000:.1f}ms"
if rtt is not None else "---"
)
print(
f"Pi: カメラ FPS={fps:.1f}"
f" RTT={rtt_ms}"
)
frame_count = 0
fps_start = time.time()
time.sleep(0.01)
except KeyboardInterrupt:
print("\nPi: 終了")
finally:
motor.cleanup()
camera.stop()
zmq_client.stop()
if __name__ == "__main__":
main()