Arduino(ESPr Developer(ESP-WROOM-02))をROS2ノードにしてpublishしてみた

#概要
Windows10マシンでVirtualBoxを使用したUbuntu環境上で、Arduino(ESPr Developer)をROS2ノードとして設定、Arduinoからpublishします。
前回Ubuntu環境でArduinoのLチカができたので、今回はROS2+Arduinoの動作確認に進んでいます。世の中のROS2を使った開発環境が分からないので実際のところROS2でこのボードを使うのがいいのか悪いのかわかりませんが、何かのお役に立てればいいかなと思います。

#構成
* ベースマシン(Windows10)
 * VirtualBox(バージョン5.2.22)

VirtualBox上の構成は、

* Ubuntu18.04(64bit)
 * ROS2(Dashing Diademata)
 * Mico-XRCE-DDS-Agent
* Arduino
 * ESPr Developer(ESP-WROOM-02開発ボード、スイッチサイエンス)　※以下、ESPrと表記します
 * Arduino IDE(バージョン1.8.1)
     * なお、IDEへのESPrボードのインストールは済んでいるものとします。インストール方法はスイッチサイエンスさんのHP[「ESP-WROOM-02開発ボードをArduino IDEで開発する方法」](http://trac.switch-science.com/wiki/esp_dev_arduino_ide) を参照してください。

#全体の流れ(事前準備と動作確認)
##事前準備(ソフトのインストール等)
1. VirtualBox上でのESPrの認識
2. ROS2のインストール
3. 通信用設定(Micro-XRCE-DDS-Agentのインストール)
4. ROS2Arduinoのインストール(Arduino IDE上)

##動作確認(サンプルスケッチを用いた動作確認の手順)
1. ROS2の起動
2. スケッチのアップロード(Arduino IDE)
3. Micro-XRCE-DDS-Agentの起動とESPrのリセット
4. 動作確認(topicの確認、表示)

#事前準備
##1. VirtualBox上でのESPrの認識
* 前回の投稿を参照してESPrを認識させてください([前回投稿:「VirtualBoxとUbuntuとArduinoでLチカ」)](https://qiita.com/kaji_demems/items/7ee417402ac49e01022c)
* 注意点ですが、VirtualBoxのデバイスフィルタにはArduinoではなくFTDI FT231X USB UARTと表示されるので惑わされないようにしてください。

##2. ROS2のインストール
近藤 豊さん著の「ROS2ではじめよう次世代ロボットプログラミングを参考にしました(参考資料1.)
 注意点ですが、"2-3-3 APTソースリストの設定"で、コマンド中にシングルクォーテーションとバッククォーテーションが混在しているので、手打ちされる方は間違えないようにしてください(私だけ？)

##3. 通信用設定(Micro-XRCE-DDS-Agentのインストール)
* Micor-XRCE-DDS-Agentをインストールしますが(正確にはGit-Hub[「eProsima /
Micro-XRCE-DDS-Agent」](https://github.com/eProsima/Micro-XRCE-DDS-Agent)からダウンロードしてmakeしてインストール)、インストール方法によっては実行時にROS2のライブラリとアンマッチを起こしてエラーとなるため、以下を参照してください。
* インストール方法は、[「ros2arduino利用時に必要なMicroXRCEAgentは、ビルド時と実行時のライブラリの依存関係に注意する必要があった話」](http://asukiaaa.blogspot.com/2020/01/ros2arduinomicroxrceagent.html)を参考にさせていただきました。
 * なお、上記サイトの対処方法2、「ROS2のsetup.bashを読み込んで・・・」で実施し、エラー無く動作しています。
* ソフト自体のビルド、インストールの方法については、Git-HubのREADME.mdのInstallation manualをご覧ください(On Linux参照)。

##4. ROS2Arduinoのインストール
ArduinoがROS2と通信するためのライブラリをIDEにインストールします。
作業はいたって簡単、IDEを立ち上げて、スケッチ→ライブラリをインクルード→ライブラリを管理、でライブラリマネージャーを開いて「ROS2Arduino」でフィルタをかけるとros2arduinoのみが残るので(2020/5/5時点)あとはインストールするだけです。

#動作確認
##1. ROS2の起動
以下のコマンドで通常のROS2の起動を行います。
`bash /opt/ros/dashing/setup.bash`

##2. スケッチのアップロード(Arduino IDE)
今回は以下のros2arduinoのサンプルをそのまま使用します。
ファイル→スケッチ例→ros2arduino→publisher
Reset Methodに(dtr(aka nodemcu))を選択していれば、「マイコンボードに書き込む」ボタンで、で正常に書き込めるはずです。

※ 個人的にハマったのがこの部分、次の手順のMicro-XRCE-DDS-Agentを起動してからスケッチを書き込もうとするとコンパイルまではできますが、書き込みがどうやってもできませんでした。
※ なお、書き込んだスケッチはリセットスイッチを押さないと有効になりませんが、次のMicro-XRCE-DDS-Agentを起動してからリセットスイッチを押す必要があります。


##3. Micro-XRCE-DDS-Agentの起動とESPrのリセット
* 以下のコマンドで起動します、シリアル用のコマンドになります。(udpだとコマンド変わるので注意)
`MicorXRCEAgent serial --dev /dev/ttyUSB0 -b 115200`

* ESPrのリセットスイッチを押して書き込んだスケッチを有効にします


##4. 動作確認(topicの表示)
新しく端末を開き、ESPrがROS2のトピックになっているかを以下のコマンドで確認します。
`ros2 topic list`

サンプルではトピック名はarduino_chatterとなっていますので、トピックリスト中にこれが表示されていればOKです。
>`/arduino_chatter`

続けて、トピックの内容を以下のコマンドで確認します。
`ros2 topic echo /arduino_chatter`
サンプルではトピックは以下のように表示されます
>`data: Hello ros2arduino publish回数`(実際の表示ではpublish回数の部分には数字が入ります)


#最後に
さすがにROSと通信するとなると手間が多いですが、ここまでできればArduinoからROSにデータが送れたことになるので、ROS2＋Arduino版のHello Worldができた！！、となるのでしょうか？
次回はArduino側でセンサーデータ取得してROSに送る、などやってみたいですね。


#参考資料
1. [ROS2ではじめよう次世代ロボットプログラミング(書籍)](https://gihyo.jp/book/2019/978-4-297-10742-0)
2. [ros2arduino利用時に必要なMicroXRCEAgentは、ビルド時と実行時のライブラリの依存関係に注意する必要があった話](http://asukiaaa.blogspot.com/2020/01/ros2arduinomicroxrceagent.html)
3. [ROS2で自作ロボットの開発ツールを整える](https://qiita.com/nomumu/items/db01bc9e39bf1fb116d5)