はじめに
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()