最近Qiitaが湯婆婆で溢れているので、便乗すればもしかしたらLGTMもらえるかも せっかくなのでまだ見ていない物を使って実装しようと思ったので、ROSを使用していきます。
srvファイル
Yubaba.srv
string name
---
string new_name
名前を入力したら、新しい名前を返してくれるサービスです。
Service Proxy
import rospy
from std_msgs.msg import String, Empty
from yubaba.srv import Yubaba
def listen_to_yubaba(msg):
print(msg.data)
yubaba_proxy = rospy.ServiceProxy("/yubaba/name_service", Yubaba)
yubaba_words = rospy.Subscriber("/yubaba/words", String, listen_to_yubaba)
greet_yubaba = rospy.Publisher("greet_yubaba", Empty, queue_size=1)
if __name__ == "__main__":
rospy.init_node("client")
greet_yubaba.publish()
name = input()
new_name = yubaba_proxy(name)
Yubaba Node
import rospy
import random
from yubaba.srv import Yubaba
from std_msgs.msg import String, Empty
class YubabaNode:
def __init__(self):
rospy.init_node("yubaba")
self.yubaba_service = rospy.Service("~name_service", Yubaba, self.name_service)
self.word_publisher = rospy.Publisher("~words", String, queue_size=1)
self.greet_subscriber = rospy.Subscriber("greet_yubaba", Empty, self.start)
def start(self, msg):
self.word_publisher.publish("契約書だよ。そこに名前を書きな。")
def name_service(self, req):
name = req.name
self.word_publisher.publish(f"フン。{name}というのかい。贅沢な名だねぇ。")
rospy.sleep(0.5)
new_name = random.choice(name)
self.word_publisher.publish(f"今からお前の名前は{new_name}だ。いいかい、{new_name}だよ。分かったら返事をするんだ、{new_name}!!")
return new_name
if __name__ == "__main__":
yubaba = YubabaNode()
rospy.spin()
おまけのlistener
import sys
import rospy
from std_msgs.msg import String
def listen_to_yubaba(msg):
print(msg.data)
yubaba_words = rospy.Subscriber("/yubaba/words", String, listen_to_yubaba)
if __name__ == "__main__":
args = sys.argv
rospy.init_node(f"listener{args[1]}")
rospy.spin()
実行例
構成
-
Yubaba Node
- /yubaba/words: 湯婆婆様のありがたいお言葉。
- /yubaba/name_service: 名前を新しく変えてくれるやつです。
-
/greet_yubaba: まずは湯婆婆に挨拶。
まとめ
もしかして ROS + 湯婆婆 = 老婆婆??