ArduinoをROSで動かす

OSでArduinoを動かす第一歩として書きました。
ROSでArduinoを動かす基礎になりますが、応用もできるようになるはずです。
 

 

 
環境
ROS kinetic
Ubuntu 16.04.4
ThinkPad X1 Carbon 2017 
 
セットアップ
1.Arduino IDEをダウンロードする。
2018年5月現在最新のバージョンは1.8.5です。リンク 
Linux 64bitsをクリックした後、JUST DOWNLOADボタンをクリックすればIDEのダウンロードが始まります。

f:id:panapp-paripari:20180503233732p:plain

 

f:id:panapp-paripari:20180503233755p:plain

Arduino-1.8.5-linux64.tar.xzのダウンロードが始まります。ダウンロード容量は99MBぐらいあります。
ダウンロードが完了したら解凍します。解凍はArduino-1.8.5-linux64.tar.xzのアイコンを右クリックして、ここに展開(Extract Here)を実行してもいいですし、端末で下記を実行することでも解凍可能です。
$ xz -dc arduino-1.8.5-linux64.tar.xz | tar xfv -
 
解凍がおわったら、端末で下記のコマンドを実行し、arduino-1.8.5のフォルダーを/opt下に移動しておきます。
移動したらArduino-1.8.5フォルダの中に異動してinstall.shを実行しArduinoIDEをUbuntuにインストールします。
$ sudo mv arduino-1.8.5 /opt
$ cd /opt/arduino-1.8.5
$ sudo ./install.sh

 

*もしうまくいかなかったらchmod +x install.shを実行したあとに./install.shを実行してみてください。
 
 
インストールが終わったらPCとArduino UnoをUSBで接続します。
USBデバイスへのアクセス権限を設定します。ttyACM後の数値は ls /dev/ |grep ttyACM*コマンドを実行すれば確認することができます。
$ ls /dev/ |grep ttyACM*
ttyACM0
 
arduino-1.8.5のフォルダの下にarduino実行ファイルがあるので実行してください。
Arduino IDEが開きます。IDEが開いたら、✓マークを1回クリックしておいてください。
$sudo chmod 666 /dev/ttyACM0
/opt/arduino-1.8.5$ arduino

 

f:id:panapp-paripari:20180503234454p:plain

 

rosserial_arduinoをインストール
$ sudo apt-get install ros-kinetic-rosserial-arduino ros-kinetic-rosserial
 
ros_libディレクトリーをarduino-1.8.5/librariesの下に生成する
$ cd /opt/arduino-1.8.5/libraries
$ rosrun rosserial_arduino make_libraries.py schetchbook
 
上記を実行すると 実行したルート下にschetchbookというフォルダーが生成されその下にROS_libがあります。
 
Arduino IDEを開き、schetchbookのpathを通してあげましょう。
File -> Preferences -> Sketchbook location に先ほど生成したschetchbookのpathを通します。私の場合は下記です。
/home/username/sketchbook
 
これで完了です。
File -> Examples -> ros_libがあればokです。

 

f:id:panapp-paripari:20180503235008j:plain

 サーボモータGS90をサクッと動かす

 
やりたいことはPCからサーボ角度を指定してArduinoに接続されているSG90サーボモータを動かすことです。
 
まずハードウェア構成です。
SG90の3本線は下記のようにArduinoとワイヤーで接続してください。
オレンジの信号線はサンプルコードの都合上Pin9に接続してください。
ソフトウェアの設定によってはdigitalピンであればどれでもかまいません。
茶色
GND ArduinoのGNDへ接続
赤色
VCC(電源)
Arduinoの5Vへ接続
オレンジ
信号線
ArduinoのPin9へ接続

f:id:panapp-paripari:20180503235113j:plain

ソフトウェアの用意
File -> Sketchbook -> libraries -> ros_libの中にServoControlにサンプルコードがあるので開き、Arduinoに送信します。
 
プログラムの実行
端末を開き、Arduinoに権限を与えます。*AMC0でない場合もあります。
$ sudo chmod 666 /dev/ttyACM0
 
端末をもう一つ開いてroscoreを実行しておく
$ roscore
 
最初に開いた端末に戻って下記のコマンドを実行 *ACM0出ない場合もあります。
rosrun rosserial_python serial_node.py _port:=/dev/ttyACM0
 
Arduinoに送信したサンプルコードをちょっとみてみると"servo"というtopic名でUInt16型のmessageをtopicで受けとり、その値をservo.writeの引数に渡し、サーボを動かしています。
ros::Subscriber<std_msgs::UInt16>sub("servo",servo_cb);
servo.write(cmd_msg.data) //サーボの角度 0 - 180
 
ではさらにもう一つ端末を開き、servo topicにUInt16型で0°を送ってみます。0の箇所は角度なので0 - 180まで入力可能です。
$ rostopic pub -1 /servo std_msgs/UInt16 0
 
サーボが動くことが確認できましたでしょうか?
 
ネコのたわごと
環境構築は最初にして最大の難関です!環境構築で挫折してしまうことが多いので、導入をわかりやすく誰にでもできることを考えて書いています。部分的な解決策ではなく環境構築からその先のサーボモータを動かすところまでカバーできるように書きました。参考にしていただけたら幸いです。Arduino + ROSはとても相性がいいと感じました。私が学生時代のころArduinoが登場しましたが、そのときはROSとの連携など考えもしませんでしたが、今ではライブラリが充実しています。センサーを実装するところはArduinoのライブラリにあったりするので、それをROS対応にするだけなのでお手軽に開発できてしまいます。
ただいまGW中、田舎に帰省し田舎過ぎてやることが何もないので開発がはかどりました。いいねとおもったらスターつけていただけると今後の継続とやる気につながります! 
 
参考文献
下記のサイト参考にさせていただきました。ありがとうございます。