LoginSignup
27
18

More than 5 years have passed since last update.

ROS のプログラムテンプレート

Last updated at Posted at 2018-07-24

はじめに

ROSのテンプレートを自分用に作る機会があったので共有します

github:https://github.com/Shunichi09/ROS/tree/master/Templates

Matlabとの連携を考えたものもあるのでぜひ
https://qiita.com/MENDY/items/94cb23bf7a52441d0443

環境

  • Ubuntu 16.04 LTS
  • ROS Kinetic

プログラム

PublisherとSubscriberのクラスを作りました
ちなみに今回はfrom geometry_msgs.msg import Pose2Dをimportしていますが別の場合は別にしてください

template_1.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import rospy
# メッセージの型等のimport
from geometry_msgs.msg import Pose2D

class Publishsers():
    def __init__(self):
        # Publisherを作成
        self.publisher = rospy.Publisher('/topic_name', Pose2D, queue_size=10)

        # messageの型を作成
        self.message = Pose2D()

    def make_msg(self):
        # 処理を書く

    def send_msg(self):
        # messageを送信
        self.make_msg()
        self.publisher.publish(self.message)

class Subscribers():
    def __init__(self):
        # Subscriberを作成
        self.subscriber = rospy.Subscriber('/topic_name', Pose2D, self.callback)
            # messageの型を作成
        self.message = Pose2D()

    def callback(self, message):
        # callback時の処理(sendが必要な場合はここにsendを入れるやるのもあり)

def main():
    # nodeの立ち上げ
    rospy.init_node('Node_name')

    # クラスの作成
    pub = Publishsers()
    sub = Subscribers()

if __name__ == '__main__':
   main()

プログラム2

場合によってはSubscribeしてからPublishしたい場合があるかと思います
その場合は,以下に示したプログラムで良いと思います

templates_2.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import rospy
# メッセージの型等のimport
from geometry_msgs.msg import Pose2D

class Publishsers():
    def __init__(self):
        # Publisherを作成
        self.publisher = rospy.Publisher('/topic_name', Pose2D, queue_size=10)

        # messageの型を作成
        self.message = Pose2D()

    def make_msg(self, message):
       # 処理を書く

    def send_msg(self):
        # messageを送信
        self.make_msg(message)
        self.publisher.publish(self.message)

class Subscribe_publishers():
    def __init__(self, pub):
        # Subscriberを作成
        self.subscriber = rospy.Subscriber('/topic_name', Pose2D, self.callback)
        # messageの型を作成
        self.message = Pose2D()
        # publsishu

   def callback(self, message):
        # callback時の処理
        self.pub.make_msg(message)
        # publish
        self.pub.send_msg()

def main():
    # nodeの立ち上げ
    rospy.init_node('Node_name')

    # クラスの作成
    pub = Publishsers()
    sub = Subscribe_publishers(pub)

    rospy.spin()

if __name__ == '__main__':
   main()

補足

気になるのはrosspinの動きです
いろいろ調べてみたのですが,ROSPYのRosspinは別スレッドで回ってます!
なので,while文内で,publishをしながら,rosspinで値があったら更新的なことが勝手にできます
C++はRosspin once的なやつがあるみたいですが,pythonは勝手にやってしまっているという...

プログラム3

さっき述べた値があったら更新verのやつです

template_3.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import rospy
# メッセージの型等のimport
from geometry_msgs.msg import Pose2D

class Publishsers():
    def __init__(self):
        # Publisherを作成
        self.publisher = rospy.Publisher('/topic_name', Pose2D, queue_size=10)

        # messageの型を作成
        self.message = Pose2D()

    def make_msg(self):
        # 処理を書く

    def send_msg(self):
        # messageを送信
        self.make_msg()
        self.publisher.publish(self.message)

class Subscribers():
    def __init__(self):
        # Subscriberを作成
        self.subscriber = rospy.Subscriber('/topic_name', Pose2D, self.callback)
            # messageの型を作成
        self.message = Pose2D()

    def callback(self, message):
        # callback時の処理(sendが必要な場合はここにsendを入れるやるのもあり)

def main():
    # nodeの立ち上げ
    rospy.init_node('Node_name')

    # クラスの作成
    pub = Publishsers()
    sub = Subscribers()

    # spin
    rospy.spin()

    # ratesleep
    rate = rospy.Rate(40)

    while not rospy.is_shutdown():
        pub.send_msg()
        rate.sleep()

if __name__ == '__main__':
   main()


27
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
18