Newer
Older
RobotCar / src / pi / main.py
"""
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: カメラ・通信・モーターを開始")

        while True:
            # カメラ画像を取得して送信
            frame = camera.capture()
            zmq_client.send_image(frame)

            # 操舵量を受信してモーターに反映
            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()

            time.sleep(0.01)

    except KeyboardInterrupt:
        print("\nPi: 終了")
    finally:
        motor.cleanup()
        camera.stop()
        zmq_client.stop()


if __name__ == "__main__":
    main()