techno_memo

個人用の技術メモ。python・ROS・AI系のソフトウェア・ツールなどの情報を記載

ROS端末間のTopic通信 (デスクトップPCとRaspberry pi )

この記事の目的

 ROS 端末間 (デスクトップPCとRaspberry pi )のTopic 通信についてまとめる

1. デスクトップ PC とRaspberry pi 間のTopic 通信

ROSでは複数の端末間でのTopic通信を行う機能が提供されている。(下記参考サイト参照)

wiki.ros.org

qiita.com

 上記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における設定画面)

f:id:sd08419ttic:20191201004344p:plain

f:id:sd08419ttic:20191202004426p:plain

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でそれぞれ下記コマンドを実行する。

export ROS_MASTER_URI=http://192.168.0.2:11311
export ROS_IP=192.168.0.2
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などを用いると良い)

sd08419ttic.hatenablog.com

正しく動作するとSlaveで起動したtalker.pyのtopicをMasterで取得(もしくはその逆)できることが確認できる。

次回はArduinoUbuntu PCの通信方法についてまとめる。