이번 포스팅에서는 저번에 다룬 서비스 패키지를 파이썬으로 작성해보도록 하자. 참고한 링크는 다음과 같다.
https://wiki.ros.org/ROS/Tutorials/WritingServiceClient%28python%29
오늘도 우리의 패키지 beginner_tutorials를 사용하도록 하자.
이번에는 파이썬 파일을 작성하기 때문에 scripts 폴더 내부에 작성한다.
그리고 작성이 끝난 후에는 파이썬 파일은 chmod +x를 통해서 실행 권한을 부여하는 것과, CMakeLists.txt 파일을 수정하는 것을 잊으면 안된다.
add_two_ints_server.py 라는 이름으로 작성한다.
#!/usr/bin/env python3
# 파이썬 인터프리터 지정
from beginner_tutorials.srv import AddTwoInts, AddTwoIntsResponse
# 서비스 메시지와 응답 메시지를 불러온다.
import rospy
def handle_add_two_ints(req): # 서비스 요청을 처리하게 된다.
print(f"Returning {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)
# 서비스를 생성하고 클라이언트의 요청 처리를 위해 handle 함수를 지저앟낟.
print("Ready to add two ints")
rospy.spin()
if __name__ == "__main__":
add_two_ints_server()
add_two_ints_clinet.py라는 이름으로 작성한다.
#!/usr/bin/env python3
import sys
import rospy
from beginner_tutorials.srv import *
# 서비스 메시지를 import 한다.
def add_two_ints_client(x,y): # 두 정수를 더하는 서비스 클라이언트를 정의하는 함수
rospy.wait_for_service('add_two_ints') # 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 as e: # 서비스 호출시 예외 발생할 때 사용
print("Service call failed: %s"%e)
def usage(): # 잘못된 명령줄 인자 사용에 대한 안내 메시지 출력
return "%s [x y]"%sys.argv[0] # 스크립터 이름과 함께 사용법 설명
if __name__=="__main__":
if len(sys.argv) == 3: # 명령줄 인자가 3개인지 확인한다.
x = int(sys.argv[1])
y = int(sys.argv[2])
else:
print(usage()) # 아니면 사용법 함수를 출력한다.
sys.exit()
print(f"Requesting {x}+{y}")
print(f"{x}+{y}={add_two_ints_client(x,y)}")
# 최종적인 결과를 출력한다.
$ cd catkin_ws/src/beginner_tutorials/scripts
$ chmod +x add_two_ints_client.py
$ chmod +x add_two_ints_server.py
CMakeLists.txt 파일은 다음과 같이 내용을 추가한다.
catkin_install_python(PROGRAMS scripts/add_two_ints_server.py scripts/add_two_ints_client.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
이후 사용 방법은 C++ 패키지와 동일하다.
단, .py 확장자를 붙여서 실행하는 것에 유의하자.