えいあーるれいの技術日記

ROS2やM5 Stack、Ubuntuについて書いています

rospy(ROS Noetic)でのPubSubの基本[rospyチュートリアル]

 卒業研究が終わりましたーー。少し投稿間隔が空きましたが、ちまちまと進捗を書いていこうと思います。ただし、3月の近いうちに学会発表がまたあるので、まだまだ忙しい状況ではありますが…

3月の目標

 3月は「ROSのチュートリアルの資料をzennに出す」ことを達成したいと考えています。私自身はまだまだROSの初心者ですが、同じ研究室の先輩や後輩にROSを教えなければいけないので、どうせならということで本として資料を書こうと思いました。

 学内でROSを使用している人は少なく、Unixコマンドが怪しい学生にこれを教えるのは結構ハードルが高かったりします。なので、自分の独学での失敗経験などをもとに「どうすれば無理なく学べるのか」というのを突き詰めようと思います。

 今回は、rosにおけるHelloWorldであるPub-Subをrospyで実装します。ROSWikiにあるチュートリアルとは異なり、このチュートリアルではClassを用いた実装を徹底したいと思っています。

 実際はパッケージの作り方から丁寧に解説する予定ですが、ブログでは実例だけを示します。

動作環境

 全てROS NoeticのPython3.8.5環境(仮想環境なし)を前提にしています。

コード

 プログラムは全てrospy_tutorialで公開します。

GitHub - Ar-Ray-code/rospy_tutorial: Example source codes for rospy

Pub側

#!/bin/python3
import rospy
from std_msgs.msg import Int32

class hello_world:

    def __init__(self):
        self.number = 0

        self.pub = rospy.Publisher('pub_int', Int32, queue_size=1)
        rospy.init_node('pub_node')
        self.rate = rospy.Rate(2)
        self.pub_number()
    
    def pub_number(self):
        while not rospy.is_shutdown():
            rospy.loginfo(str(self.number))
            self.pub.publish(self.number)
            self.rate.sleep()
            self.number = self.number + 1

if __name__=="__main__":
    try:
        hello_world()
    except rospy.ROSInitException:
        pass

実行の様子です

f:id:Ray_ar:20210228235656p:plain
pub_int.pyの実行結果

Sub側

#!/bin/python3
import rospy
from std_msgs.msg import Int32

class hello_world:

    def __init__(self):
        rospy.Subscriber('pub_int',Int32,self.sub_number)

        rospy.init_node('sub_node')
        rospy.spin()
    
    def sub_number(self,data):
        rospy.loginfo(str(data.data))

if __name__=="__main__":
    try:
        hello_world()
    except rospy.ROSInitException:
        pass

実行の様子です

f:id:Ray_ar:20210228235809p:plain
sub_int.pyの実行結果

 追記するかもです