ROSで動かすロボットカー作り(別PCから遠隔操作できるようにしてみた編)

前回は超音波センサーを使って障害物を回避できるようにしたので実機走行してみました。

supernove.hatenadiary.jp

これで無事にロボットが無事に動いているように見えますが、実際はできていません。

というのも今までロボットを動かすときは複数ターミナルでRaspberry PiSSH接続していました。

つまり、結果的にはロボットの操作はRaspberry Pi側だけで完結していました。

これだとただRaspberry PiPythonを実行しているのと何ら変わりないです。

ROSの特徴の一つに複数のマシン間で通信を行うことができる仕組みが整っていることがあります。

これをMaster / Slaveといいます。

この方法でエッジ側の処理を最小限にして別のマシンと連携することで計算量を分散できるわけです。

というわけで今回はこのMaster / Slaveを使って別のPCからロボットを遠隔操作できるようにする方法を試してみます。

今回は特にスクリプトを実装するわけではないのでブランチは切っていませんが、このシリーズは以下のGithubレポジトリを元にして話をしていきます。

github.com

ちなみに今回のネタはRaspberry Piもくもく会の時間とその後に試したことです。(気まぐれで出没しているので良かったらぜひ!)

raspberry-pi-moku.connpass.com

Master / Slaveとは?

ROSには簡単に分散処理をできる設計があります。それがMaster / Slaveです。

MasterとSlaveの違いはroscoreを動かしているかいないかだけです。

Masterはroscoreを動かすマシンのことで、そのMasterのroscoreに接続するマシンはすべてSlaveになります。

SlaveのマシンではMasterの接続先を設定することでMasterで起動しているroscoreを接続するので複数のマシンに処理が分散できる仕組みです。

f:id:KMiura:20220123210911p:plain

前提条件

使用するマシンは以下のOSが搭載されています。

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

.bashrcIPアドレスを設定していない場合は、先に以下のコマンドでIPアドレスを設定します。(最初これを忘れてロボットが動かなくてセンサーの値だけ取れたので詰まりました…)

export ROS_IP=【SLAVE_IP_ADDRESS】

以下のコマンドでロボットを動かします。

rosrun my_rober control_rober.py

実行すると以下のようにMasterのPC上でロボットを操作できるようになります(流石にロボット側のプログラムを起動するためにSSHはつないでます)。

MasterのPCでrqt_graphを確認するとすると以下のようにトピック通信ができていることを確認できます。

f:id:KMiura:20220123223455p:plain

終わりに

今回は別PCから遠隔でロボットを操作できるようにしました。

今までロボットを操作するために必要な数だけターミナルからSSHしていましたが、その手間もなくなった上にエッジ側の計算量も減って、より安定した動作が期待できそうです。

何より高いスペックのPCに接続できるようになったので、SLAMを始めとした高度な処理をMasterで実現できるようになり、ロボットでできることが一気に増えて夢が広がります。

というわけで次回はSLAMをやるために買ってからずっと放置していたLiDARセンサーを動かしていきます。