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

# はじめに
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していますが別の場合は別にしてください

```py: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したい場合があるかと思います
その場合は，以下に示したプログラムで良いと思います

```py: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のやつです

```py: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()


```