kakepro’s blog

プログラムとかPC周りのことを書いていきます

【ROS入門】ROSプログラミング:Publish/Subscribe

はじめに

・環境
Windows 10 Home 21H2
WSL2
Intel(R) Core(TM) i5-4200U CPU @ 1.60GHz

・ROS melodicのインストール
下記記事を参照のこと
kakepro.hatenablog.com

・ここでやること
ROSのTopicをPublish/Subscribe(配信/購読)する

Publish/Subscribeする

基本的なワークフローは下記参照
kakepro.hatenablog.com

まずはワークスペースの作成から

$ cd
$ mkdir -p ~/pubsub_ws/src
$ cd ~/pubsub_ws
$ catkin init
$ catkin build
$ source ./devel/setup.bash
$ cd src/
$ catkin_create_pkg pubsub rospy std_msgs

これでワークスペースの作成とpubsubパッケージを作成できた
続いてPublishするプログラムを作成していく

$ mkdir ./pubsub/scripts
$ cd ./pubsub/scripts
$ vim talker.py

#!/usr/bin/env python
import rospy
from std_msgs.msg import String
#std_msgsパッケージで定義されたString型メッセージをインポート
		
rospy.init_node('talker') #ノードの初期化
pub = rospy.Publisher('chatter', String, queue_size=10) #Publisherの作成
#chatterが名前、Stringが型
rate = rospy.Rate(10) #Rateインスタンスの作成
while not rospy.is_shutdown():
	hello_str = String() #String型メッセージの作成
	hello_str.data = "hello world %s" % rospy.get_time()
	#hello_strのメンバであるdataに変数を代入
	pub.publish(hello_str)
	#Publisherであるpubを使ってメッセージhello_strをPublishする
	rate.sleep() #10Hzだけsleep

続いてSubscribeするプログラムを作成していく

$ vim listener.py

#!/usr/bin/env python
import rospy
from std_msgs.msg import String
#std_msgsパッケージで定義されたString型メッセージをインポート
		
def callback(message):
	rospy.loginfo("I heard %s", message.data)
	#メッセージを受信したらそのメンバ変数dataを%sの部分に入れてPublishする
		
rospy.init_node('listener') #ノードの初期化
sub = rospy.Subscriber('chatter', String, callback) #Subscriberの作成
#chatterが名前、Stringが型、Topicを受信したらcallback関数を呼ぶ
rospy.spin() #無限ループ

作成したプログラムに実行権限を与えてビルドする

$ chmod +x talker.py listener.py
$ cd ~/pubsub_ws
$ catkin build

新しいターミナルでroscoreを実行

$ roscore

さらに別のターミナルで下記を実行

$ cd ~/pubsub_ws
$ source ./devel/setup.bash
$ rosrun pubsub talker.py

続いて別のターミナルで下記を実行してSubscribeする

$ cd ~/pubsub_ws
$ source ./devel/setup.bash
$ rosrun pubsub listener.py

f:id:kakepro:20220410164805p:plain
listener

talker.pyからのデータがlistener.py側に表示されたはず
なお、ROSノードのloginfoはrqt_consoleを用いることで一括で監視できる
別のターミナルから下記を実行

$ rqt_console>

f:id:kakepro:20220410164918p:plain
rqt_console

Messageの内容やNodeの名前が表示されていることが分かる
画面中央のExclude Messages...でInfoやErrorなどを押すと表示内容の切り替えも可能
ROSにはこうした便利なデバッグツールが豊富にある