본문으로 바로가기

ROS에서 몇몇 투토리얼을 새마음 새뜻으로 공부하고 있습니다. 그중에서 오늘은 ROS 서비스를 이야기하려고 합니다. 당연히 Python으로 수행하는 것이죠.

catkin 폴더에 srv_tutorial을 create pkg로 만들었습니다.

그리고, rospy와 std_msgs 등을 build_depend와 exec_depend에 넣었습니다.

그리고, CMakeList에도 service와 연관있는 부분은 작성을 했습니다. srv 폴더에 AddTwoInts.srv라는 파일을 만들어두어야 합니다.

int64 a
int64 b
---
int64 sum

이렇게 넣어두어야 합니다. 그리고 scripts라는 폴더에

#!/usr/bin/env python

from srv_tutorial.srv import *
import rospy

def handle_add_two_ints(req):
    print "Returning [%s + %s = %s]"%(req.a, req.b, (req.a + req.b))
    return AddTwoIntsResponse(req.a + req.b)

def add_two_ints_server():
    rospy.init_node('add_two_ints_server')
    s = rospy.Service('add_two_ints', AddTwoInts, handle_add_two_ints)
    print "Ready to add two ints."
    rospy.spin()

if __name__ == "__main__":
    add_two_ints_server()

add_two_ints_server.py 파일

#!/usr/bin/env python

import sys
import rospy
from srv_tutorial.srv import *

def add_two_ints_client(x, y):
    rospy.wait_for_service('add_two_ints')
    try:
        add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts)
        resp1 = add_two_ints(x, y)
        return resp1.sum
    except rospy.ServiceException, e:
        print "Service call failed: %s"%e

def usage():
    return "%s [x y]"%sys.argv[0]

if __name__ == "__main__":
    if len(sys.argv) == 3:
        x = int(sys.argv[1])
        y = int(sys.argv[2])
    else:
        print usage()
        sys.exit(1)
    print "Requesting %s+%s"%(x, y)
    print "%s + %s = %s"%(x, y, add_two_ints_client(x, y))

그리고,  add_two_ints_client.py을 만들어 둡니다 이 내용은 그냥 ROS의 공식 투토리얼 페이지의 서비스부분에 있는 내용입니다.

이제, roscore를 실행하고,  add_two_ints_server.py를 실행합니다.

그리고 client에서 호출해서 사용할 수 있습니다. 

하나 더 turtlesim에서도 서비스를 사용해 보겠습니다.

turtlesim_node를 실행하고...

이렇게 거북이(^^)를 올려놓고~

rosservice list에서 보이는 /turtle1/teleport_absolute를 보겠습니다.

info 옵션으로 정보를 확인할 수 있습니다.

rossrv show 명령으로 서비스 데이터 구조를 확인하고~

위 그림처럼 rosservice call 명령을 주면, 거북이가 바로 위치와 자세 명령을 수행합니다.

혹은 rqt 명령으로 service caller를 gui로 명령을 수행하게 할 수 있습니다.

이렇게 말이죠~^^


댓글을 달아 주세요

  1. BlogIcon 북두협객 2019.05.13 13:27 신고

    느리기 움직여서 거북이를 배치한 건 아니겠지만 여튼 기특한 거북이네요 ㅎㅎ

  2. BlogIcon 핑구야 날자 2019.05.15 06:43 신고

    덕분에 코딩 정보 잘 보고 갑니다 즐거운 하루 보내세요