ArduinoをROSのノードとして動作させる

ROSがインストールされたPCとArduinoをUSB(シリアル)で接続し、ArduinoをROSのノードとして動作させることができます。

これにより例えば、ROSのトピックメッセージをArduinoに送信し、Arduinoに接続したモータの速度を設定したり、Arduinoに接続したセンサの情報をトピックメッセージとしてROSで受け取ったりすることができます。

シリアル通信を通してトピックなどをやりとりするROSのパッケージとしてrosserialがあります。

さらに、ArduinoをROSのノードとし、rosserialを使ってPCと通信するためのパッケージrosserial_arduinoがあります。

ArduinoをROSのノードとして機能させるためのArduinoスケッチを作成し、これをArduino UNOに書き込みます。このArduinoUNOをROSがインストールされたPC(Linux)にUSBで接続してArduinoUNOからROSにトピックを送信してみます。

今回使うパッケージもROS wikiに詳しいチュートリアルがあるので、それに従って作業すればできるのですが、流れが分かりやすいようチュートリアルよりも簡単に説明します。

roserial, rosserial_arduinoパッケージのインストール

ROSがインストールされたPC(Linux)にroserial, rosserial_arduinoパッケージをインストールし、makeします。

$sudo apt-get install ros-indigo-rosserial-arduino  ros-indigo-rosserial
$cd catkin_ws/src
$git clone https://github.com/ros-drivers/rosserial.git
$cd ..
$catkin_make
$catkin_make install   <--必要な場合
$source ~/catkin_ws/install/setup.bash   <--必要な場合
			

Arduinoのライブラリを準備

rosserial_arduinoのパッケージには、ArduinoIDEで使用するための(Arduino開発側の)ライブラリが含まれています。これを用意してArduinoIDEがインストールされたPC(今回はWindows PC)にコピーします。

まずは、ROSがインストールされたPC(Linux)で

$roscore &
$mkdir ~/arduino_lib  <-- 適当なフォルダを作成
$cd ~/arduino_lib
$rosrun rosserial_arduino make_libraries.py .
$ls
ros_lib <--これをArduinoIDEを使うWindowsPCの C:\Prog\Arduino\libraries フォルダにコピー
			

目的のros_libフォルダが生成されるので、これをWindowsPCのArduino ライブラリフォルダ(たとえばC:\Prog\Arduino\libraries)にコピーします。

ArduinoIDEでサンプルスケッチを書き込む

ros_libをWindowsPCにコピーしたら、ArduinoIDEを起動します。

ArduinoIDEでライブラリにros_libが追加されていることを確認します。

また、ファイル->スケッチの例->ros_libにサンプルスケッチが追加されるので、試しにHelloWorldサンプルを開いてみます。 このサンプルは、ROSチュートリアルにあるHello World (example publisher)となっています。

このスケッチをArduinoUNOに書き込みます。

ROSのPCに接続してみる

ArduinoUNOをROSがインストールされたPC(Linux)にUSBで接続します。dmsgやlsusbでデバイス名が表示されます。

PC側(ROS)で、シリアル通信をするためのノードを開始すれば、ArduinoUNOからのトピックを受信できます。

まず、ユーザにttyUSB0へのアクセス権を与える
#less /etc/group | grep dialout
dialout:x:20:    <--- dialoutグループにユーザが登録されていない場合、以下で追加登録
#usermod -a -G dialout USER   <--- USERはユーザ名
$rosrun rosserial_python serial_node.py /dev/ttyUSB0
$rostopic list
 /chatterが表示される
$rostopic echo chatter
			

ros_libには他にもサンプルがあり、これを試してみるだけでもrosserial_arduinoの使い方は大体わかると思います。

メモ:AVRのdebugWire ヒューズの消し方

久々に取り出したArduino基板にAtmel-ICEでArduinoのブートローダを書き込もうとすると、Unable to enter programming modeとなって書き込めなくなり焦ることがあります。

Arduino基板にAtmel-ICEを接続してデバッグをすると、debugWire ヒューズビットがEnableにされます。(Debuggerが書き込む)その状態でAtmel-ICEをプログラマとしてISPモードで書き込もうとしても書き込めない、というのが原因です。Arduino基板をArduinoIDEでだけ使っていれば、きっとこんなことは起こらないのですが、ICEをつないで色々やっていると起こります。

debugWireのEnableビットをクリアしてやれば良いのですが、プログラマがISPモードでしか使えないので、それもできません。

そこで、AtmelStudioでmain()だけのCプロジェクトを作成します。(もちろん使うデバイス、ここではATmega328Pを選びます)

ICEをつないでAtmel-ICEをdebugWireのデバッガに設定してDebugを開始します。

main()だけのプログラムがマイコンで走りますが、ここでメニューからデバッグ->Disable debugWire and close を選択するとdebugWireビットをクリアしてくれます。

これでAtmel-ICEをISPプログラマとして接続して、書き込める状態になります。

今回は、チップイレースの後、Arduinoのブートローダ C:\Prog\Arduino\hardware\arduino\avr\bootloaders\optiboot\optiboot_atmega328.hex を書き込み、ヒューズ Extended:0xFD High:0xD6 Low:0xFF を書き込んで、Arduinoとして使えるようになりました。