상세 컨텐츠

본문 제목

ROS2 msg 파일 및 srv 파일 인터페이스 python으로 만들기

Programming

by 신농해태 2021. 8. 25. 08:41

본문

반응형

1. msg 메세지 srv 서비스 패키지 만들기

1) package 만들기

터미널창을 새롭게 실행하여 dev_ws/src 이동

ros2 pkg create --build-type ament_cmake tutorial_interfaces 입력 엔터

python은 .msg와 .srv를 만들 수 없습니다. 

 

dev_ws/src/tutorial_interfaces 로 이동하여

mkdir msg

mkdir srv

 

2) msg, srv 만들기

dev_ws/src/tutorial_interfaces/msg 로 이동

Num.msg 이름으로 새 파일을 만들고 편집기로 열어서

int64 num 을 첫줄에 입력 후 저장

 

tutorial_interfaces/srv 로 이동

AddThreeInts.srv 이름으로 새 파일을 만들고 편집기로 열어서

int64 a

int64 b

int64 c

---

int64 sum    을 첫줄에 입력 후 저장

 

3) CMakeLists.txt 을 편집기로 열어서

find_package(rosidl_default_generators REQUIRED)

rosidl_generate_interfaces(${PROJECT_NAME}

  "msg/Num.msg"

  "srv/AddThreeInts.srv"

)

내용을 추가

 

4) package.xml 을 편집기로 열어서

<build_depend>rosidl_default_generators</build_depend>

<exec_depend>rosidl_default_runtime</exec_depend> <member_of_group>rosidl_interface_packages</member_of_group>

내용을 추가

 

5) tutorial_interfaces 빌드하기

터미널창을 새로 열어서 ~/dev_ws 로 이동

colcon build --packages-select tutorial_interfaces 입력 엔터

 

6) msg, srv 최종 생성 확인하기

터미널창을 새로 열어서 ~/dev_ws 로 이동

. install/setup.bash 입력 엔터

 

ros2 interface show tutorial_interfaces/msg/Num 입력 엔터 실행

int64 num 결과값이 출력됨

 

ros2 interface show tutorial_interfaces/srv/AddThreeInts 입력 엔터 실행

int64 a

int64 b

int64 c

---

int64 sum  결과값이 출력됨

 

2. 만들어진 인터페이스 사용하기

앞에서 만든 py_srvcli 디렉토리의 service client package를 이용함

 

1) service 소스 코드 수정하기

service_membet_function.py 를 편집기로 열어서 아래처럼 수정

 

from tutorial_interfaces.srv import AddThreeInts     # CHANGE
import rclpy
from rclpy.node import Node
class MinimalService(Node):
    def __init__(self):
        super().__init__('minimal_service')
        self.srv = self.create_service(AddThreeInts, 'add_three_ints', self.add_three_ints_callback)        # CHANGE
    def add_three_ints_callback(self, request, response):
        response.sum = request.a + request.b + request.c                                                  # CHANGE
        self.get_logger().info('Incoming request\na: %d b: %d c: %d' % (request.a, request.b, request.c)) # CHANGE
        return response
def main(args=None):
    rclpy.init(args=args)
    minimal_service = MinimalService()
    rclpy.spin(minimal_service)
    rclpy.shutdown()
if __name__ == '__main__':
    main()

 

2) client 소스 코드 수정하기

client_membet_function.py 를 편집기로 열어서 아래처럼 수정

 

from tutorial_interfaces.srv import AddThreeInts       # CHANGE
import sys
import rclpy
from rclpy.node import Node
class MinimalClientAsync(Node):
    def __init__(self):
        super().__init__('minimal_client_async')
        self.cli = self.create_client(AddThreeInts, 'add_three_ints')       # CHANGE
        while not self.cli.wait_for_service(timeout_sec=1.0):
            self.get_logger().info('service not available, waiting again...')
        self.req = AddThreeInts.Request()                                   # CHANGE
    def send_request(self):
        self.req.a = int(sys.argv[1])
        self.req.b = int(sys.argv[2])
        self.req.c = int(sys.argv[3])                  # CHANGE
        self.future = self.cli.call_async(self.req)
def main(args=None):
    rclpy.init(args=args)
    minimal_client = MinimalClientAsync()
    minimal_client.send_request()
    while rclpy.ok():
        rclpy.spin_once(minimal_client)
        if minimal_client.future.done():
            try:
                response = minimal_client.future.result()
            except Exception as e:
                minimal_client.get_logger().info(
                    'Service call failed %r' % (e,))
            else:
                minimal_client.get_logger().info(
                    'Result of add_three_ints: for %d + %d + %d = %d' %                               # CHANGE
                    (minimal_client.req.a, minimal_client.req.b, minimal_client.req.c, response.sum)) # CHANGE
            break
    minimal_client.destroy_node()
    rclpy.shutdown()
if __name__ == '__main__':
    main()

 

3) 빌드하기

package.xml 을 편집기로 열어서 아래 줄을 추가

<exec_depend>tutorial_interfaces</exec_depend>

 

colcon build --packages-select py_srvcli

 

4) 실행하기 

새창을 열고 dev_ws로 이동한후

. install/setup.bash 입력 엔터

ros2 run py_srvcli service

 

새창을 열고 dev_ws로 이동한후

. install/setup.bash 입력 엔터

ros2 run py_srvcli client 2 3 1

728x90
LIST

관련글 더보기

댓글 영역