ロボット研究開発、ソフトウェア開発、コンテンツ制作配信

【自律ロボット製作記】#10 ラズパイをJetsonNanoのサブモジュール化してUART通信を試す

どうも、こんにちは、
ロボットのシステム構成をシンプルにするため、ラズパイをjetsonNanoのサブモジュールにし、ROS関連は基本jetsonNanoで動かし、ラズパイはモーターを駆動させるための専用デバイスにしようと思います。
第1歩としてまずは、jetsonNanoとラズパイ間のUART通信を試しました。

スポンサーリンク

システム構成

以下のように、ROS関連はjetsonNanoに集約、ラズパイはモーター制御のみとしました。

接続とUART設定

ラズパイとjetsonNanoの接続、UART設定は以下の記事を参考にさせて頂きました。ありがとうございます。
ラズパイをJetson Nanoのサブボードとして使う方法(電源供給とシリアル通信)

UART 送信処理(jetsonNano側)

早速、jetsonNanoから送信してみます。モーターの左右回転数を通知してみます。
実装例:

# -*- coding: utf-8 -*-
import serial
import time
import json

obj = {'v_r':90, 'v_l':79}

ser = serial.Serial('/dev/ttyTHS1', 115200, timeout=1)
#ser.write("motor_out".encode())

while True:
    #json_string = json.dumps(obj)
    v_r = 132
    v_l = 432
    json_string = json.dumps({"v_r":v_r,"v_l":v_l})
    print(json_string)
    ser.write(json_string.encode('utf-8'))
    ser.write("\r\n".encode())
    time.sleep(1)

UART 受信処理(ラズパイ側)

受信側のサンプルです。jsonで通知したv_r,v_lを受信して表示するだけの単純なものです。
実装例:

# -*- coding: utf-8 -*-
import serial
import time
import json

ser = serial.Serial('/dev/ttyS0', 115200, timeout = 1)

while True:
    byte_data = ser.readline()
    #print(byte_data)
    str_data = byte_data.decode('utf-8')
    try:
        json_data = json.loads(str_data)
        print(json_data)
        print(json_data["v_r"])
        print(json_data["v_l"])
    except json.JSONDecodeError:
        continue
    #msg = ser.readline()
    #print(msg)

UART通信の問題点

これでUARTの送受信が確認できたので、
早速、cmd_velの値をv_r,v_lとし、UART送信、受信側は受けた数値をモーターへ出力するように組みました。
しかし、しばらく動かしていると、以下のエラーが発生し、プログラムが落ちてしまいました。
※とくに、jetsonNanoからrplidarを起動するとすぐに落ちてしまいます。

Traceback (most recent call last):
File “inobo_motor_rcv.py”, line 18, in
str_data = byte_data.decode(‘utf-8’)
File “/usr/lib/python2.7/encodings/utf_8.py”, line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: ‘utf8’ codec can’t decode byte 0xb8 in position 2: invalid start byte

エラーの対処

おそらく、原因はラズパイ側の電源をjetsonNanoから供給しているため、電力不足になっていたと思われます。
(rplidarを回すことで電力が不足していたと予測します。)
jetsonNano とラズパイそれぞれ別々の電源から供給すれば解決しました。

最後に

ということで、ラズパイをJetsonNanoのサブモジュールとし、モーター制御のみを実行させることができました。
これで、ROS関連はjetsonNanoに集約され、負荷分散にもなるし、システム構成がシンプルになりました。
あとは、タブレットアプリから色々プログラムを起動し、かんたんにロボットが動かせるシステムを組んていきたいと思います。

それでは!!

   

関連記事(一部広告含む)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


ページトップボタン