[ROS] [파이썬 패키지] 서비스를 만들어보자(2)

HY K·2024년 8월 17일

ROS1

목록 보기
27/34

이번 포스팅에서는 저번에 다룬 서비스 패키지를 파이썬으로 작성해보도록 하자. 참고한 링크는 다음과 같다.
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)}")
    # 최종적인 결과를 출력한다.

권한 부여, CMakeLists.txt 파일 수정

$ 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 확장자를 붙여서 실행하는 것에 유의하자.

profile
로봇, 드론, SLAM, 제어 공학 초보

0개의 댓글