rosserial を用いてROSとArduinoの間の通信を行う
久方ぶりの記事です。
今回はタイトル通り、rosserialを用いてROSとArduinoを接続します。 ついでに、カスタムメッセージを用いた通信についても解説します。
rosserialとは
rosserialは、シリアル通信を用いて、ROSと組み込みボード、あるいはセンサノード等と通信するためのパッケージです。 シリアル通信をするだけでは無く、ROSとその他のもの達との通信プロトコルも提供します。 ArduinoでいうところのFirmataみたいなものです。Firmata使ったこと無いけど。
rosserialを使うと、シリアル通信で接続されたボードが、ROS側からはROSノードのように見えます。 ボードと通信するには、rosserialによってできたノードに対して、いつものようにトピックをPublish/SubscribeすればOKです。
まずは動かす
インストール
rosserial_arduino/Tutorials/Arduino IDE Setup - ROS Wiki
まずは、rosserialのパッケージをインストールします。
sudo apt-get install ros-indigo-rosserial-arduino sudo apt-get install ros-indigo-rosserial
次に、Arduino IDEに、rosserialのライブラリを導入します。 Arduino IDEをまだインストールしてないひとは、ダウンロードしてインストールしてください。
Arduino IDEのインストールフォルダの下、librariesフォルダに移動して、make_libraries.pyを実行すると、ros_libフォルダができます。 ros_libフォルダの中には、rosserialのライブラリと各種メッセージのヘッダが含まれています。
cd <sketchbook>/libraries rm -rf ros_lib rosrun rosserial_arduino make_libraries.py .
二行目は、もし既にros_libフォルダがあった際、一旦それを削除するためのものです。
最後に、Aruduino IDEを起動して、サンプルスケッチの中にros_lib関連のものが入っていることを確認してください。
通信テスト
rosserial_arduino/Tutorials/Hello World - ROS Wiki
Arduino側の準備ですが、 Arduino IDEから、サンプルのros_lib/HelloWorldを選択し、Arduinoに書き込むだけです。
PC側は、まずroscoreを立ち上げておきます。その後、以下のコマンドを打ちます。
rosrun rosserial_python serial_node.py _port:=/dev/ttyUSB0
これで、ArduinoがROSノードとして認識されます。/dev/ttyUSB0は適宜読み替えてください。
最後に、ArduinoがPublishしてるトピックを確認します。
rostopic echo chatter
Arduinoへの書き込み時にPermission Deniedが出る場合
Arduinoが接続されているシリアルポート(/dev/ttyUSB0とか)に権限を与えてやりましょう。
sudo chmod 666 /dev/ttyUSB0
ただし、Arduinoを接続するたびに権限を与え直す必要があります。 それが面倒だ、って人は、そのための方法もあるのでググってください。
独自メッセージの作り方
まずは、ROSで普通にメッセージを定義します。以下のリンクの手順通り。
ja/ROS/Tutorials/CreatingMsgAndSrv - ROS Wiki
メッセージを作ったあとは、一応rosmsg show hogepiyo
等をして、きちんと出来てることを確認しましょう。
作ったメッセージの導入は、最初にrosserialをArduino IDEに導入した時と同じ手順でいけます。
cd <sketchbook>/libraries rm -rf ros_lib rosrun rosserial_arduino make_libraries.py .
ros_lib以下に、作ったメッセージのヘッダファイルができてればOK。
rosserialの通信プロトコル詳細が気になる方へ
こちらをどうぞ。
rosserial/Overview/Protocol - ROS Wiki
さすがに誤り訂正はしてくれないですが、一応チェックサムが入ってるので信頼性はそこそこかと。