前回は超音波センサーを使って障害物を回避できるようにしたので実機走行してみました。
これで無事にロボットが無事に動いているように見えますが、実際はできていません。
というのも今までロボットを動かすときは複数ターミナルでRaspberry PiにSSH接続していました。
つまり、結果的にはロボットの操作はRaspberry Pi側だけで完結していました。
これだとただRaspberry PiでPythonを実行しているのと何ら変わりないです。
ROSの特徴の一つに複数のマシン間で通信を行うことができる仕組みが整っていることがあります。
これをMaster / Slaveといいます。
この方法でエッジ側の処理を最小限にして別のマシンと連携することで計算量を分散できるわけです。
というわけで今回はこのMaster / Slaveを使って別のPCからロボットを遠隔操作できるようにする方法を試してみます。
今回は特にスクリプトを実装するわけではないのでブランチは切っていませんが、このシリーズは以下のGithubレポジトリを元にして話をしていきます。
ちなみに今回のネタはRaspberry Piもくもく会の時間とその後に試したことです。(気まぐれで出没しているので良かったらぜひ!)
raspberry-pi-moku.connpass.com
Master / Slaveとは?
ROSには簡単に分散処理をできる設計があります。それがMaster / Slaveです。
MasterとSlaveの違いはroscoreを動かしているかいないかだけです。
Masterはroscoreを動かすマシンのことで、そのMasterのroscoreに接続するマシンはすべてSlaveになります。
SlaveのマシンではMasterの接続先を設定することでMasterで起動しているroscoreを接続するので複数のマシンに処理が分散できる仕組みです。
前提条件
使用するマシンは以下のOSが搭載されています。
- Master: Ubuntu 20.04
- Slave: Raspbian Buster(Raspberry Pi)
MasterとSlaveを行うマシンは必ず同じネットワークに接続している状態で行います。
Masterの設定
それではMaster / Slaveをやってみます。
まずはMasterの設定です。Masterに使うPCはもちろんUbuntuです。
PCのIPアドレスを確認するためにifconfig
コマンドを使用します。
Ubuntuの場合はifconfigコマンドを使うにはnet-toolsをインストールする必要があります。
以下のコマンドを実行してインストールします。
sudo apt install net-tools
インストールを終えたらifconfigコマンドでIPアドレスを確認します。
ifconfig
実行結果の中にあるinetアドレスををメモしておきます。
Wifiに接続しているときにはwlan0
と記載されているinetアドレスを確認すればOKです。
僕の場合はWifiルーターに有線で接続したのでenp
のinetアドレスをメモしておきました(同じルーターであれば有線でも無線でも接続できます)。
そして、以下のコマンドでROSで使うIPアドレスを環境変数に設定しておきます。
export ROS_IP=【MASTER_IP_ADDRESS】
再起動したときにも同じIPアドレスを使いたいときには以下のコマンドで.bashrc
に設定を残しておきます。
echo "export ROS_IP=【MASTER_IP_ADDRESS】" >> ~/.bashrc source ~/.bashrc
Slaveの設定
続いてSlaveの設定です。
Slaveでも同様にIPアドレスを確認して、inetアドレスををメモしておきます。
ifconfig
以下のコマンドでメモしたIPアドレスを環境変数にメモしておきます。
export ROS_IP=【SLAVE_IP_ADDRESS】
こちらも再起動しても同じIPアドレスを使いたいときには以下のコマンドで.bashrc
に残します。
echo "export ROS_IP=【SLAVE_IP_ADDRESS】" >> ~/.bashrc source ~/.bashrc
ここでSlaveではもう一つ設定を行います。
それはMasterの接続先の設定です。この設定をすることで、Masterのroscoreに接続できるようになります。
Masterの接続先は以下のコマンドで設定します。
【MASTER_IP_ADDRESS】
には先程Masterの設定でメモしたIPアドレスに書き換えます。
export ROS_MASTER_URI=http://【MASTER_IP_ADDRESS】:11311
動かしてみる
MasterとSlaveを設定したところで実際に動かしてみます。
まずはMaster側のPCでroscoreを起動します。
roscore
起動後にROS_MASTER_URI
にMasterのIPアドレスが表示されればOKです。
つづいてSlave側のRaspberry Piで前回作成したロボットの制御をするノードを起動します。
roslaunch my_rober my_rober.launch
こちらも起動後にROS_MASTER_URI
にMasterのIPアドレスが表示されればOKです。
これでMasterとSlaveの準備ができました。
あとはMasterのPCで別ターミナルを起動して、Slaveのロボットを動かしてみます。
動かす前に【ワークスペースのディレクトリ】/src
上にコードをクローンしておきます。
git clone https://github.com/Miura55/ros_rober cd ~/【ワークスペースのディレクトリ】 catkin_make
.bashrc
にIPアドレスを設定していない場合は、先に以下のコマンドでIPアドレスを設定します。(最初これを忘れてロボットが動かなくてセンサーの値だけ取れたので詰まりました…)
export ROS_IP=【SLAVE_IP_ADDRESS】
以下のコマンドでロボットを動かします。
rosrun my_rober control_rober.py
実行すると以下のようにMasterのPC上でロボットを操作できるようになります(流石にロボット側のプログラムを起動するためにSSHはつないでます)。
今日の目標達成!
— KMiura (@k_miura_io) 2022年1月23日
別のPCからRaspberry Piのロボットカーを動かせるようになった
(動画だとちゃんと動いてるかわかりにくいw)#raspimoku #rosjp pic.twitter.com/QxzbMkCudh
MasterのPCでrqt_graphを確認するとすると以下のようにトピック通信ができていることを確認できます。
終わりに
今回は別PCから遠隔でロボットを操作できるようにしました。
今までロボットを操作するために必要な数だけターミナルからSSHしていましたが、その手間もなくなった上にエッジ側の計算量も減って、より安定した動作が期待できそうです。
何より高いスペックのPCに接続できるようになったので、SLAMを始めとした高度な処理をMasterで実現できるようになり、ロボットでできることが一気に増えて夢が広がります。
というわけで次回はSLAMをやるために買ってからずっと放置していたLiDARセンサーを動かしていきます。