テーマ記事へのリンク
以下の記事には今回のテーマを設定した目的や関連記事がまとめてあります。自分が見たい項目がある場合は利用してください。
自作ロボット(ローバー)のROS対応
目次
準備するもの
- Ubuntu 16.04
- Arduino IDE
- 3WD48mmオムニホイールモバイルロボット(以下ローバー)
ROS化の定義
ROS対応ロボットにはTurtleBotやHSRなどが挙げられる。しかし、ROS対応と書かれていなければROSが使えないわけではなく、最近ではプリメイドロボットが有志によってROS化が進んでいる。なのでサーボやカメラなどのハードに制約があるわけではない(もちろんメモリや相性などの関係はある)。やっていることはROSメッセージを使ってセンサやサーボの値をやり取りしているだけである。
つまりROSメッセージを使ってセンサから取得した値をPublishしたり、値をSubscribeしてサーボを動かせればそれはROS対応ということになる。
そこで本記事で定義する自作ロボットのROS化とは、Pub・Sub通信を用いてデータのやり取りを行い、ROSの既存のパッケージを利用可能にすることを指す。
システムの構成
システムの構成を以下の図に示す。
"〇"で書かれたものがROSノードである。Arduinoの部分はROS化を行っておらず、シリアル通信を通して通信を行う。
本記事では以下の流れでローバーの操作を行っている。
- キーボードの入力を読み込み、中継ノードにキーに対応したデータを送信
- 中継ノードが送られてきたデータを読み込み、シリアル通信を介してArduinoに送信
ソースコードのダウンロード&コンパイル
以下のフォルダをROSのワーキングディレクトリにダウンロードし、コンパイルする。
$ cd ~/catkin_ws/src
$ git clone https://github.com/NaotakaKawata/rover
$ chmod +x rover/src/teleop_serial.py
$ cd ..
$ catkin_make
その後、ローバーにArduino IDEを使ってarduino_scripts/arduino_serial.inoを書き込む。
自分のロボットを使いたい場合
もしローバー以外のArduinoで制御しているロボットを使いたい場合は自分のロボットに合わせたスケッチを使ってください。Arduinoの部分はROS化していないため既存のプログラムが使えるはずです。
ROS側から送られてくるのは"r"や"f"などの文字列なので、文字列を受け取った時の処理の部分に任意の制御を書けば好きに動かせるようになります。
実行
ローバーにシリアルケーブルが刺さった状態で以下のコマンドを実行。別の窓が開くため、そこにキー入力を行うことでローバーを操作することが可能になる。
$ roslaunch rover rover_serial.launch
ArduinoのROS化を行わなかった理由
rosserialを使うことでArduinoの部分もROSノードのように見せることができ、Pub・Sub通信を行うことが出来る。~~この実装を行わなかった理由ですが、今回使ったマイコンであるATmega328P(Arduino UNOに乗っているものと同じ)にrosserialを用いて実装を行った結果、モーターは回るが制御不能になるという現象が起きたからである。オシロスコープがあればはっきりするがなぜこの事象が起きるかが分からなかったので、Arduino側でのROS化を断念した。~~自分で1から書いたら動きました
またrosを使うだけでSRAM2000byteの内の1000byte以上が使われてしまうので、Arduinoのようなマイコンを使う場合にはROS化を行う際は工夫しないとメモリが足りなくなってしまう。
ただしこのメモリに関しての問題については、ros.hで定義されているトピックの上限や送信するデータの上限を書き換えたり、mROSを使えば解決できると思う。
今後の改善
本記事が「自作ロボットのROS対応」というテーマの最後になる予定だった。しかしArduinoの部分をROS化していないため、モーター制御の部分にROSの資産を使えていない。このままではSLAMやPlanningなどのNavigation Stackが実行できない。
そのため中継ノードから送られてくるデータをそのまま使い、Arduinoによるモーター制御ができるよう改良し、ROSの資産を有効に活用できるようにする。
なので「自作ロボットのROS対応」テーマでもう少しだけ続きます。