大掃除で見つかったPololu 3pi robotですが、これはATmega328Pが搭載されていて、Arduino IDEでもプログラミングができます。そこでrosserial_arduinoを使って、ROSのノードにしてみました。
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を接続して、受信したデータをそのまま送信するようにしたところ、入力した文字がエコーバックされたので問題なさそうです。これでシリアル通信設定は確認できました。
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をインストールする
インストールは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に書き込みます。
次にシリアルポートの読み書き権限を設定します。
$ sudo chmod o+rw /dev/ttyUSB0
ホスト側のrosserialを動かすと同時に3pi robotのリセットをして同期します。
$ rosrun rosserial_python serial_node.py /dev/ttyUSB0 _baud:=115200
マイコン側のrosserialクライアントと同期ができると以下のように表示されます。できない場合はもう一度同時にリセットするとうまく動きます。(ここが少し面倒)
新しいターミナルを起動してトピックを確認します。ここに /cmd_vel が表示されればOKです。
モーターを動かすための /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
次のような画面が表示されます。
次のキーボード操作で3pi robotが操作できました。
I:前進 | ||
J:左旋回 | K:停⽌ | L:右旋回 |
,:後退 |
動作中の様子をYouTubeにアップしておきました。
今後の計画
3piにはセンサーやプッシュスイッチがついているので、これらの状態をpublishすることもできると思いますが、それはまた次回で。