【自律ロボット製作記】#10 ラズパイをJetsonNanoのサブモジュール化してUART通信を試す
どうも、こんにちは、
ロボットのシステム構成をシンプルにするため、ラズパイをjetsonNanoのサブモジュールにし、ROS関連は基本jetsonNanoで動かし、ラズパイはモーターを駆動させるための専用デバイスにしようと思います。
第1歩としてまずは、jetsonNanoとラズパイ間のUART通信を試しました。
システム構成
以下のように、ROS関連はjetsonNanoに集約、ラズパイはモーター制御のみとしました。
接続とUART設定
ラズパイとjetsonNanoの接続、UART設定は以下の記事を参考にさせて頂きました。ありがとうございます。
ラズパイをJetson Nanoのサブボードとして使う方法(電源供給とシリアル通信)
UART 送信処理(jetsonNano側)
早速、jetsonNanoから送信してみます。モーターの左右回転数を通知してみます。
実装例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# -*- 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を受信して表示するだけの単純なものです。
実装例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# -*- 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を起動するとすぐに落ちてしまいます。
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に集約され、負荷分散にもなるし、システム構成がシンプルになりました。
あとは、タブレットアプリから色々プログラムを起動し、かんたんにロボットが動かせるシステムを組んていきたいと思います。
それでは!!
スポンサーリンク