ROS
ROS 2 Python 서비스/클라이언트 실습 요약 (py_srvcli)
by 3in9u
2025. 4. 23.
📁 1. 프로젝트 구조
ros2_ws/
├── src/
│ └── py_srvcli/
│ ├── package.xml
│ ├── setup.py
│ ├── resource/py_srvcli
│ └── py_srvcli/
│ ├── __init__.py
│ ├── service_member_function.py
│ └── client_member_function.py
🔧 2. package.xml
- ROS 2 패키지 정보를 정의
- 서비스 인터페이스와 Python API를 사용하므로 다음 의존성 포함:
<depend>rclpy</depend>
<depend>example_interfaces</depend>
🛠️ 3. setup.py
- ament_python 방식으로 Python 패키지 설치
- 실행 엔트리포인트 등록:
entry_points={
'console_scripts': [
'service = py_srvcli.service_member_function:main',
'client = py_srvcli.client_member_function:main',
],
}
🧠 4. 서비스 노드 (service_member_function.py)
import rclpy
from rclpy.node import Node
from example_interfaces.srv import AddTwoInts
class AddTwoIntsService(Node):
def __init__(self):
super().__init__('add_two_ints_service')
self.srv = self.create_service(AddTwoInts, 'add_two_ints', self.add_callback)
def add_callback(self, request, response):
response.sum = request.a + request.b
self.get_logger().info(f'Received request: a={request.a}, b={request.b}')
return response
def main(args=None):
rclpy.init(args=args)
node = AddTwoIntsService()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
🤖 5. 클라이언트 노드 (client_member_function.py)
import rclpy
from rclpy.node import Node
from example_interfaces.srv import AddTwoInts
import sys
class AddTwoIntsClient(Node):
def __init__(self):
super().__init__('add_two_ints_client')
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...')
self.req = AddTwoInts.Request()
def send_request(self, a, b):
self.req.a = a
self.req.b = b
future = self.cli.call_async(self.req)
rclpy.spin_until_future_complete(self, future)
return future.result()
def main(args=None):
rclpy.init(args=args)
minimal_client = AddTwoIntsClient()
a = int(sys.argv[1]) if len(sys.argv) > 1 else 2
b = int(sys.argv[2]) if len(sys.argv) > 2 else 3
response = minimal_client.send_request(a, b)
minimal_client.get_logger().info(f'Result: {response.sum}')
minimal_client.destroy_node()
rclpy.shutdown()
⚙️ 6. 빌드 및 실행 흐름
# 1. 빌드
cd ~/ros2_ws
colcon build --packages-select py_srvcli --symlink-install
# 2. 환경 설정
source install/setup.bash
# 3. 서비스 실행
ros2 run py_srvcli service
# 4. 클라이언트 실행
ros2 run py_srvcli client 3 7