rosserialでPololu 3pi robotをROSのノードにしてみました

大掃除で見つかったPololu 3pi robotですが、これはATmega328Pが搭載されていて、Arduino IDEでもプログラミングができます。そこでrosserial_arduinoを使って、ROSのノードにしてみました。

rosserial_3pi_robot1.jpg

rosserialのクライアントライブラリで小さなマイコンでもROSのノードにすることができます。ただしホストとなるPCのノードが必要で、そのPCとクライアントはシリアル接続をする必要があります。

今回はシリアル接続にXBeeの透過モードを使うことでワイヤレスにします。透過モードは一度設定すればXBee同士で透過的なシリアル通信が行えます。今回使用したXBeeはシリーズ2(S2)と呼ばれているもので少し古めのものですが、115200bpsまで使えますので十分です。

3pi robotの開発環境をArduino IDEに設定する

Arduino IDEの3pi用のライブラリやサンプルソースが準備されていますので、以下のドキュメント通りにインストールします。

3piへの書き込みは以前は純正のATMEL AVRISP mkIIを使っていたのですが、見つからなかったので新たにPololu USB AVRプログラマ v2.1を購入しました。スイッチサイエンスさんで取り扱っているので入手は容易ですし、小型でLEDがカッコよく光ります。

XBeeの設定

XBeeの設定を行うためには、専用のユーティリティXCTUを使います。また、手持ちのXBeeをUSBシリアルに接続できる基板(秋月電子のXBee USBインターフェースボードキット相当)にXBeeを取り付けてPCのUSBに接続します。この状態でXCTUを立ち上げたところXBeeを認識できました。

2台のXBeeを以下のように設定しました。DHとDLに通信相手のMACアドレスを設定します。(MACアドレスは一例です。)

XBee親機 XBee子機
型番 XB24-Z7CIT-004 revG XB24-Z7CIT-004 revJ
Product family XB24-B XB24-B
Function set ZigBee Coordinator AT ZigBee Router/End Device AT
Firmware version 1020 1220
MAC(XBeeごとに一意の値です) 0013A200406AAAAA 0013A200408BBBBB
DH Destination Address High 13A200 13A200
DL Destination Address Low 408BBBBB 406AAAAA
NI Node Identifier COORDINATOR ROUTER
BD Baud Rate 115200 115200

このように設定した状態でエコーバックテストを行います。

XBeeをUSBシリアルに接続できる基板に親機となるXBeeを載せてPCに接続します。認識したUSBシリアルポートにターミナルを接続し、115200bpsで接続します。子機となるXBeeは、秋月電子のXBee用2.54mmピッチ変換基板を使いブレッドボードに取り付けて電源を供給し、RX-TXを接続して、受信したデータをそのまま送信するようにしたところ、入力した文字がエコーバックされたので問題なさそうです。これでシリアル通信設定は確認できました。

rosserial_xbee_serial_test.jpg

XBeeを3piに接続する

子機のXBeeを3piのATmega328Pのシリアルポートに接続します。ちょうど3piの拡張用基板があったので、これに秋月電子のXBee用2.54mmピッチ変換基板を半田付けします。5V電源は3piのコネクタから供給され、XBee変換基板に搭載されている3.3VレギュレーターでXBeeに3.3V電源が供給されます。しかし、3piのシリアル信号は5Vのままですので、途中に4ビット双方向ロジックレベル変換モジュール(BSS138使用)を入れることでシリアル信号の電圧レベルを合わせました。これで3piとXBeeの接続は完了です。

m3piで使っていたSlaveプログラムのままで、この基板を接続してターミナルからコマンドを送ると応答があることを確認しました。

rosserial_3pi_xbee_comtest1.jpg

rosserialをインストールする

インストールはROSのチュートリアルに従って進めました。

今回はubuntu18.04のROS Melodicにインストールしました。このあとにインストールされたArduino用のrosライブラリをWindowsのDocuments\Arduino\libraries\ros_libにコピーしています。

rosserialのチュートリアルを3piで動かす

チュートリアルのソースコードを参考に、3pi robotで動作確認ができるように修正しました。

チュートリアル通りに問題なく動作したので、Githubに入れておきました。

3piのモーターを動かすトピックを実装する

モーターを動かすためのsubscriberを書いてみました。/cmd_vel のトピックに従ってモーターが動くシンプルなものです。

このスケッチをArduino IDEで3piに書き込みます。

rosserial_3pi_avrisp.jpg

次にシリアルポートの読み書き権限を設定します。

$ sudo chmod o+rw /dev/ttyUSB0

ホスト側のrosserialを動かすと同時に3pi robotのリセットをして同期します。

$ rosrun rosserial_python serial_node.py /dev/ttyUSB0 _baud:=115200

マイコン側のrosserialクライアントと同期ができると以下のように表示されます。できない場合はもう一度同時にリセットするとうまく動きます。(ここが少し面倒)

rosserial_python_startup1.png

新しいターミナルを起動してトピックを確認します。ここに /cmd_vel が表示されればOKです。

rosserial_rostopic_list1.png

モーターを動かすための /cmd_velのトピックを発行します。

$ rostopic pub -1 /cmd_vel geometry_msgs/Twist -- '[1.0, 0.0, 0.0]' '[0.0, 0.0, 0.0]'

モーターを止める /cmd_vel トピックを発行します。

$ rostopic pub -1 /cmd_vel geometry_msgs/Twist -- '[0.0, 0.0, 0.0]' '[0.0, 0.0, 0.0]'

ROSのトピックでモーターの制御ができました。

キーボードで3pi robotを動かしてみる

これまでルンバをキーボードを動かしてきましたが同じことができるはずです。

キーボードで動かすためのツールをインストールして動かします。

$ sudo apt install ros-melodic-teleop-twist-keyboard
$ rosrun teleop_twist_keyboard teleop_twist_keyboard.py

次のような画面が表示されます。

rosserial_teleop_twist_keyboard1.png

次のキーボード操作で3pi robotが操作できました。

I:前進
J:左旋回 K:停⽌ L:右旋回
,:後退


動作中の様子をYouTubeにアップしておきました。

今後の計画

3piにはセンサーやプッシュスイッチがついているので、これらの状態をpublishすることもできると思いますが、それはまた次回で。

前へ

m3piで2022年を描いてみました

次へ

Pololu Romi ロボットカーを組み立ててみました