【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
talker.pyからのデータがlistener.py側に表示されたはず
なお、ROSノードのloginfoはrqt_consoleを用いることで一括で監視できる
別のターミナルから下記を実行
$ rqt_console>
Messageの内容やNodeの名前が表示されていることが分かる
画面中央のExclude Messages...でInfoやErrorなどを押すと表示内容の切り替えも可能
ROSにはこうした便利なデバッグツールが豊富にある