うごくものづくりのために

技術的な備忘録がメインです。

rosserial を用いてROSとArduinoの間の通信を行う

久方ぶりの記事です。

今回はタイトル通り、rosserialを用いてROSとArduinoを接続します。 ついでに、カスタムメッセージを用いた通信についても解説します。

rosserialとは

ja/rosserial - ROS Wiki

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

f:id:tilt_silvie:20150405180757p:plain

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

さすがに誤り訂正はしてくれないですが、一応チェックサムが入ってるので信頼性はそこそこかと。