서비스 부터는 앞서 토픽의 publish, subscribe와 개념을 구분하기 위해서, server와 client로 노드를 구분한다. server는 서비스를 수행할 함수를 품고, 요청이 올때 까지 대기하는 노드이고, client는 실행상태에 있는 서비스 서버를 찾고, 함수에 값을 전달한 다음, 반환되는 결과 값을 처리하는 코드로 구성된다.
본 예제는 숫자를 전달하면, 숫자의 제곱승을 회신하는 서비스 서버와 클라이언트 예시로 작성되었다.
src/myServer.py
#!/usr/bin/python3
import rospy
from my_work_service.srv import myService, myServiceResponse #catkin이 열심히 만들어준 클래스 자료형을 import 한다
# 요청시, 이를 처리할 함수 (=콜백함수)
def cbMyService(request):
result = request.request_number ** 2
return myServiceResponse(result)
# 노드 초기화
rospy.init_node("myServerNode")
# 서비스 생성
# 첫 번째 인자는 서비스 이름
# 두 번째 인자는 서비스에서 사용할 데이터 형태
# 세 번째 인자는 콜백함수
service = rospy.Service("WhatNumber_SrvName", myService, cbMyService)
# 계속 기다려라!
rospy.spin()
src/myClient.py
#!/usr/bin/python3
import rospy
from my_work_service.srv import myService
# 클라이언트 노드 생성
rospy.init_node('myClientNode')
# 원하는 서비스가 있을때까지 기다림!
rospy.wait_for_service('WhatNumber_SrvName')
# 원하는 서비스에서 제공하는 서비스(==myServer.py에서 콜백함수!)를 받아옴.
cbServer = rospy.ServiceProxy('WhatNumber_SrvName',myService)
# 콜백함수를 수행함!
# 여기에선 12를 전달 (myServer.py에서 12의 제곱승을 수행해서 숫자를 반환함)
result = cbServer(12)
# 결과 출력
print("result from server: {}".format(result))
# 끝!
# myClient.py에서 ros.spin()이 없는 것은 서비스는 본질적으로 한번 사용하고 끝나기 때문이다!
위 코드를 수행하기 위해서는 다음 세가지를 수행해야 한다.
첫째, roscore 구동
$roscore
둘째, 서비스 서버 노드 실행 (수행 전에, *.py 파일에 실행권한을 주어야 한다. chmod u+x *.py)
$rosrun 패키지폴더명 myServer.py
셋째, 클라이언트 노드 실행
$rosrun 패키지폴더명 myClient.py
클라이언트 노드를 실행하면 다음과 같은 결과가 출력된다.
result from server: response_number: 144
$
'ROS' 카테고리의 다른 글
ROS1-12 액션 예제 2 - 서버/클라이언크 코딩 (0) | 2022.07.28 |
---|---|
ROS1-12 액션 예제 1 - 준비하기 (0) | 2022.07.28 |
ROS1-10 서비스 예제 - 서비스 메시지 준비하기 (0) | 2022.07.27 |
ROS1-09 토픽 예제2 - 사용자가 정의한 자료형 (0) | 2022.07.26 |
ROS1-07 본격적으로 코딩 하기 전에 기억할 순서! (0) | 2022.07.26 |