粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

ROS aruduinoでモータ制御 + 複数のデバイスでデータ共有

それでは行ってみましょう.

システム例

なんでもSmartCarKitというのが有るそうな.

ラズパイでコントロールできるような車をROSで制御するというのはなるほどなかなか面白そうです.
Smart Video Car kit購入しました - yayu_daemanのブログ

Arduinoを用いたシステム例

一方でArduinoはちょっとしたモータ制御を簡単に行うのにもってこいな教材として広く知られています.
専用のモータシールドもそれなりに安くてにはいりますしね.



ROSとArduinoの通信

ということで,ROSとArduinoとをうまく通信させる必要があります.

rosserialのインストール

今のところメモでしか無いですが以下のようにrosserialパッケージをダウンロードすることで通信することが可能です.
ossyaritoori.hatenablog.com

実行方法

実行時に ls コマンドで/dev/以下を見ます.
そこでArduinoと接続しているUSBポートを見つけます.
頑張ってください.大体tty〜という名前になっています.MiniUSBに挿すとttyAMC0とかになります.

そしてそのデバイス名を仮にttyAMC0とすると

rosrun rosserial_python serial_node.py ttyAMC0

を実行することで接続することができます.


異なるデバイスのROS同士の接続

もちろんROS同士の通信もサポートされています.
こいつはロボットを走行させている時に,他のPCから様子をリアルタイムで確認したりデータを逐次チェックしたりするのに使えます.もちろんリモート制御も可能.


普段はROSの公式ページを貼るところなんですがこれに限っては以下の日本語のサイトが非常にわかりやすいです.
ROS 使い方メモ -- ROS ネットワーキング

手順としては以下の3つになります.

  • お互いにpingを通せるようにする.(ネットワーク設定)
  • ファイヤウォールの無効化(こわい)
  • ROS_MASTER_URIとROS_HOSTNAMEの設定

ここでは例えば,roscoreを走らせる側をhost,そうでない側をclientと定義します.
以下の設定は基本的には両方の側で設定する必要があります.

ネットワークの設定と確認

まずifconfigなどで同じローカル回線にいるか確認します.

次に/etc/hosts というファイルの設定を変更して例えば

sudo gedit /etc/hosts

としてファイルを開いた後,

<host ip address> host
<client ip address> client

のような一文を書き加えます.
これで192.168.12.xxと入力する代わりにhostとclientとうつことができます.

これは必須ではないのですがいちいち192.168.12.xxみたいなのを打ち込むよりよっぽど間違いが少ないです.
できることならDHCPでアドレスが変わることのないようmanualでipを設定できるようにすると良いでしょう.

なお,この設定はhost側とclient側の両方でやっておくことをおすすめします.

firewallの無効化

以下のコマンドでfirewallを無効化

$ sudo ufw disable

ファイアウォールの有効化は

$ sudo ufw enable

ROSの設定

ホスト側の設定

以下のような変数を定義します.

export ROS_MASTER_URI=http://host:11311
export ROS_HOSTNAME=host

上の定義は違う端末のROS同士がコミュニケーションする際に必須で,
下の定義は実際にデータをやり取りするときに必要になるようです.
これらはプログラムを実行するターミナル毎に必要ですのでbashrcに書いておくのがよいでしょう.

クライアント側の設定

同様に以下のような変数を定義します.

export ROS_MASTER_URI=http://host:11311
export ROS_HOSTNAME=client

ここで,これらをbashrcに書くかというと書かないほうがいいのかなと思っています.
どうしても必要ならroslaunchに書くか,シェルスクリプトとして書いたほうがいい気がします.

なぜならこれを実行するとデバイス外のroscoreにしかアクセスできなくなるからです.もっというとroscoreがちゃんと働かないはずです.楽をする良い方法を考えておきます.


ハマった罠とか

とりあえず,ROS_MASTER_URIはきちんと設定しないと通信がまずできません.
その後,ROS_HOSTNAMEを持っていないとrostopic listは見れるのにechoができないとかいうことになります.

困った時はチュートリアルGoogleで頑張って.
ROS/Tutorials/MultipleMachines - ROS Wiki

参考になりそうな書籍

たのしくできるArduino電子制御

たのしくできるArduino電子制御

Raspberry Piで学ぶ ROSロボット入門

Raspberry Piで学ぶ ROSロボット入門

Programming Robots With ROS

Programming Robots With ROS

  • 作者: Morgan Quigley,Brian Gerkey,William D. Smart
  • 出版社/メーカー: Oreilly & Associates Inc
  • 発売日: 2015/12/25
  • メディア: ペーパーバック
  • この商品を含むブログを見る