- 개요
- 실습
- package 생성하기
- server node 작성하기
- client node 작성하기
- 빌드 및 실행
- Python으로 server와 client nodes를 생성하고 빌드하기
- service를 사용g한 nodes간 통신 구현 방법 이해
- client node
- request를 보내는 node
- server node
- request를 수신하고 나서 이에 대한 response를 보내는 node
- request와 response는 .srv 파일로 정의
- py_srvcli package 만들기
ros2 pkg create --build-type ament_python py_srvcli --dependencies rclpy example_interfaces
- exampel_interfaces package 내에 .srv 파일 (service에서 주고 받는 구조)
int64 a
int64 b
---
int64 sum
- package.xml
<description>Python client server tutorial</description>
<maintainer email="you@email.com">Your Name</maintainer>
<license>Apache License 2.0</license>
- setup.py
maintainer='Your Name',
maintainer_email='you@email.com',
description='Python client server tutorial',
license='Apache License 2.0',
- ros2_ws/src/py_srvcli/py_srvcli/service_member_function.py 파일 만들기
- server_member_function.py 파일 열어서 아래 코드 붙여넣기
from example_interfaces.srv import AddTwoInts
import rclpy
from rclpy.node import Node
class MinimalService(Node):
def __init__(self):
super().__init__('minimal_service')
self.srv = self.create_service(AddTwoInts, 'add_two_ints', self.add_two_ints_callback)
def add_two_ints_callback(self, request, response):
response.sum = request.a + request.b
self.get_logger().info('Incoming request\na: %d b: %d' % (request.a, request.b))
return response
def main(args=None):
rclpy.init(args=args)
minimal_service = MinimalService()
rclpy.spin(minimal_service)
rclpy.shutdown()
if __name__ == '__main__':
main()
-
ros2 run 명령으로 service 를 실행시키기 위해서 entry point 설정 필요 (setup.py 파일)
-
ros2_ws/src/py_srvcli/setup.py 파일 열기
-
'console_scripts': 부분에 아래 추가하기
'server = py_srvcli.service_member_function:main',
- ros2_ws/src/py_srvcli/py_srvcli/client_member_function.py 파일 추가하기
import sys
from example_interfaces.srv import AddTwoInts
import rclpy
from rclpy.node import Node
class MinimalClientAsync(Node):
def __init__(self):
super().__init__('minimal_client_async')
self.cli = self.create_client(AddTwoInts, 'add_two_ints')
while not self.cli.wait_for_service(timeout_sec=1.0):
self.get_logger().info('service not available, waiting again...')
self.req = AddTwoInts.Request()
def send_request(self, a, b):
self.req.a = a
self.req.b = b
self.future = self.cli.call_async(self.req)
rclpy.spin_until_future_complete(self, self.future)
return self.future.result()
def main(args=None):
rclpy.init(args=args)
minimal_client = MinimalClientAsync()
response = minimal_client.send_request(int(sys.argv[1]), int(sys.argv[2]))
minimal_client.get_logger().info(
'Result of add_two_ints: for %d + %d = %d' %
(int(sys.argv[1]), int(sys.argv[2]), response.sum))
minimal_client.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
- setup.py 파일 내부에 entry_points 필드에 client 부분 추가하기
entry_points={
'console_scripts': [
'server = py_srvcli.service_member_function:main',
'client = py_srvcli.client_member_function:main',
],
},
- 의존성 검사하기
rosdep install -i --from-path src --rosdistro humble -y
- py_srvcli package 빌드하기
cd ~/ros2_ws
colcon build --packages-select py_srvcli
- server node 실행하기 - 새 터미널 열고 아래 명령 실행
source install/setup.bash
ros2 run py_srvcli server
- client node 실행하기 - 새 터미널 열고 아래 명령 실행
source install/setup.bash
ros2 run py_srvcli client 2 3
- client 실행 터미널 결과
[INFO] [minimal_client_async]: Result of add_two_ints: for 2 + 3 = 5
- server 실행 터미널 결과
[INFO] [minimal_service]: Incoming request
a: 2 b: 3
- 실행 종료하기
- Ctrl + C