LIFE LOG(ここにはあなたのブログ名)

あつあつ備忘録

ソフトやハード、時にはメカの備忘録をまとめていきます

【ROS】ServiceServerとServiceClientを作る

f:id:AtsuyaKoike:20190421152613p:plain
画像元

ServiceServerの作成

#!/usr/bin/env python
import rospy
from std_srvs.srv import Empty
from std_srvs.srv import EmptyResponse

def handle_service( req ):
    rospy.loginfo( 'called!' )
    return EmptyResponse()

def service_server():
    rospy.init_node( 'service_server' )
    s = rospy.Service( 'call_me', Empty, handle_service )
    print "Ready to serve."
    rospy.spin()

if __name__ == '__main__':
    service_server()
  • 3行目:Serviceの型「std_srvs/Empty」をimport
  • 4行目:Serviceを定義するEmptyと、返り値用のEmpty_Responseをimport
  • handle_serviceは、Serviseを呼ばれた時に実行する関数
  • 返り値はEmptyResponse()にしなければいけない
  • rospy.spin()はServiceが呼ばれるのを待つ

ServiceClientの作成

#!/usr/bin/env python
import rospy
from std_srvs.srv import Empty

def call_service():
    rospy.loginfo( 'waiting service' )
    rospy.wait_for_service( 'call_me' )
    try:
        service = rospy.ServiceProxy( 'call_me', Empty )
        response = service()
    except rospy.ServiceException, e:
        print "Service call failed: %s" % e

if __name__ == "__main__":
    call_service()
  • 6行目:logを使ってメッセージ表示
  • 7行目:call_meのServerが立ち上がるのを待つ。TopicのPublisherとは違い相手がいないとエラーを吐く
  • call_meという名前でstd_srvs/EmptyのServiceProxy、つまりSerciceClientを作っている
  • SeviceProxyは関数オブジェクトー>関数のように使用可能
$ chmod 755 service_server.py service_client.py 
$ roscore
$ rosrun ros_start service_server.py 
$ rosrun ros_start service_client.py 

これで、サーバ側(service_server.pyを実行した側)に

Ready to serve.
[INFO] [1557392599.541559]: called!

と表示されます。