🚗

JetBot + Zao SDK を活用した自動運転と遠隔監視の実現(実践編2)

2024/03/25に公開

はじめに 🌟

Zao SDK スターターキット上で、PyTorch を利用してラジコンカーの自動運転と Zao Cloud View からの遠隔監視でラジコンカーの自動運転停止・再開を実現する方法を3部構成で紹介していきます。

本記事は3部構成の一部です。

  1. 準備編
  2. 実践編1
  3. 実践編2 (本記事)

1: Zao SDK シリアル通信との連携の概要 📡

Zao SDK シリアル通信を活用して、自動運転中の JetBot の動作を制御できるようにします。自動運転中に停止を行い、安全が確認された後に動作を再開するような動きとします。
具体的には下図のように、Zao Cloud View を動作させている PC にシリアルクロスケーブルで別の PC を接続します。
接続した PC から TeraTerm 等のシリアル通信ソフトウェアから 's'(停止)と 'g'(再開)のシリアル信号を Zao Cloud View に送信し、 Zao SDK を介して JetBot の動作を制御します。

2: コード追加 ⌨

では、連係動作を実現するためのプログラムコードを実装追加していきましょう。
Zao SDK スターターキット上から、「準備編」の記事で作成した Docker イメージを実行して、JupyterNote を起動します。

まず、以下のコードをブラウザ上の notebook/road_following/live_demo.ipynb の execute メソッドが定義されているセルの上部に追加してください。
このコードは Zao SDK のシリアル通信のデータを読み取り、stop パラメータを設定する役割を担います。

import serial
import threading
import time

port = '/run/zao/ttyZAOV1'
baudrate = 115200

stop=False

def read_serial(ser):
    global stop
    while True:
        if ser.in_waiting > 0:
            message = ser.readline().decode('utf-8').rstrip()
            print("Received message:", message)
            if message == 'g':
                stop = False
                print('stop = false')
            elif message == 's':
                stop = True
                print('stop = true')
        

ser = serial.Serial(port, baudrate, timeout=1)

thread = threading.Thread(target=read_serial, args=(ser,))
thread.start()

次に execute メソッドを変更します。
上で定義した stop パラメータを使用することで、シリアルポートから 's'(停止)信号を受信した時にスピードをゼロにして停止するように以下のようにコードを追加します。

angle = 0.0
angle_last = 0.0

def execute(change):
    global angle, angle_last
    image = change['new']
    xy = model(preprocess(image)).detach().float().cpu().numpy().flatten()
    x = xy[0]
    y = (0.5 - xy[1]) / 2.0
    
    x_slider.value = x
    y_slider.value = y
    
    if stop:
        speed_slider.value = 0
    else:
        speed_slider.value = speed_gain_slider.value
    
    angle = np.arctan2(x, y)
    pid = angle * steering_gain_slider.value + (angle - angle_last) * steering_dgain_slider.value
    angle_last = angle
    
    steering_slider.value = pid + steering_bias_slider.value
    
    robot.left_motor.value = max(min(speed_slider.value + steering_slider.value, 1.0), 0.0)
    robot.right_motor.value = max(min(speed_slider.value - steering_slider.value, 1.0), 0.0)
    
execute({'new': camera.value})

以上の実装で準備完了です。

3: 自動運転の実行と遠隔監視制御の実行 🕹

では早速、動かしてみましょう。
Zao Cloud View を動かす PC にシリアルクロスケーブルで別の PC を接続します。接続した PC 上で TeraTerm などのシリアル通信ソフトウェアを起動します。
TeraTerm の Baudrate は 115200 に設定してください。

notebook/road_following/live_demo.ipynb 上の以下のコードを実行し、自動運転を開始します。

camera.observe(execute, names='value')

先ほどシリアルクロスケーブルで接続した PC 上から、TeraTerm などのシリアル通信ソフトウェアを実行して 's' のシリアル信号を送信すると JetBot が停止します。
その次に 'g' のシリアル信号を送ると自動運転が再開されます。
これらの操作を通じて JetBot の動作制御が適切に行われることを確認してください。

終わりに

この記事では JetBot の Road Following のコードを基にして、自動運転の実現及び Zao SDK の活用方法を紹介しました。
JetBot は衝突防止やオブジェクト追跡などのコードも用意されており、PyTorch と Zao SDK を組み合わせることで低遅延の映像転送やシリアル通信を利用した多様なアプリケーションの開発が可能です。
これらのテクノロジーを活用して、さまざまなプロジェクトに挑戦してみてください。

Discussion