ROS端末間のTopic通信 (デスクトップPCとRaspberry pi )
この記事の目的
ROS 端末間 (デスクトップPCとRaspberry pi )のTopic 通信についてまとめる
1. デスクトップ PC とRaspberry pi 間のTopic 通信
ROSでは複数の端末間でのTopic通信を行う機能が提供されている。(下記参考サイト参照)
上記2つ目のサイトに説明があるようにROSは『Master』端末が『roscore』を実行し、それ以外の『Slave 』端末がMaster からの調停に従ってTopicを送受信する。(複数のSlaveを存在させることも可能) 一般的にはMasterをPC (システム全体を管理するPC)、Slaveを移動ロボット、小型機器などで構成することが多い。
同一のLANにROSを搭載したデスクトップPCとRaspberry pi が接続されている場合は下記の手順でROS Topic通信を行うことが可能である。
今回利用している環境
- Master PC (Desktop) : Ubuntu 18.04 + ROS melodic (有線接続)
- Slave PC (Raspberry pi) : Ubuntu Mate 16.04 + ROS kinetic (無線接続)
1.1 IPアドレスの確認/設定
最初に接続対象となる機器のIPアドレスを確認する必要がある。IPアドレスはターミナルを起動して下記コマンドを実行すると確認できる。
ifconfig #出力される文字列の "inet "の値を確認
LANの設定によってはPCのIPアドレスが毎回変動してしまい以降のROS設定を毎回修正する必要があるため固定IPとしておくと良い。 IPの固定はUbuntuのネットワーク設定から可能である。(下記はUbuntu18.04における設定画面とUbuntu Mate 16.04における設定画面)
1.2 SSHの設定
Slave端末を移動ロボットに搭載して通信する場合はSSHの設定をしてMaster端末からアクセスできるようにしておくと便利である。 SSHの導入は下記コマンドから行う。(Master/Slave共に実施)
sudo apt-get install openssh-server
その後、SlaveのRaspberry pi で下記設定を実施してPort 22を開放する。
sudo ufw allow 22 #Port 22のFireWall許可 sudo /etc/init.d/ssh restart # sshの再起動 sudo systemctl enable ssh # 起動時にsshが起動するように設定
上記設定後、ターミナルに下記コマンドを入力するとMasterからSlave PCの処理を実施できるようになる。
ssh -p 22 ユーザー名@ローカルアドレス名
1.3 ROS設定の修正
ROSで端末間通信を行うために、MasterとSlaveでそれぞれ下記コマンドを実行する。
- Master PC (下記は IPアドレスが 192.168.0.2の場合)
export ROS_MASTER_URI=http://192.168.0.2:11311 export ROS_IP=192.168.0.2
- Slave PC (下記は IPアドレスが 192.168.0.3の場合)
export ROS_MASTER_URI=http://192.168.0.2:11311 export ROS_IP=192.168.0.3
いずれも利用時に毎回書くのは面倒なので.bashrcに記載しておくと良い。
Ubuntuにファイアフォール(ufw)を導入済みの場合下記コマンドで無効化しておく。
sudo ufw allow 11311 sudo ufw reload
1.4 ROSノードの起動
上記設定を実施した状態でROSノードを立ち上げ、TopicをPublishすると相互にデータがやり取りできる。
(動作確認には下記記事のtalker.pyとlistener.pyなどを用いると良い)
正しく動作するとSlaveで起動したtalker.pyのtopicをMasterで取得(もしくはその逆)できることが確認できる。