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)となっています。
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の使い方は大体わかると思います。
久々に取り出した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として使えるようになりました。