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로 명령을 수행하게 할 수 있습니다.
이렇게 말이죠~^^
'Robot > Robot Program - ROS' 카테고리의 다른 글
ROS2 맛보기 - Eloquent Elusor 간단 체험기 (14) | 2020.01.06 |
---|---|
ROS melodic에서 영상인식 YOLOv3 패키지 세팅하기 (42) | 2019.11.26 |
rosed의 에디터를 sublime text로 변경하기 (6) | 2019.05.23 |
ROS에서 새로운 메세지 유형 만들어 사용하기 (17) | 2019.03.04 |
VSCode로 ROS 패키지 생성해서, 간단한 subscribe 노드 만들어 보기 (12) | 2019.02.18 |
ROS의 node와 topic을 예제를 통해 알아볼까? (22) | 2019.02.11 |
역기구학을 풀 때 도움을 줄 수 있는 Python 모듈 - ikpy - (21) | 2018.08.20 |