전공/ROS
ROS2 서비스 서버, 클라이언트 만들기
흔한 학생
2024. 11. 17. 20:02
서비스 서버, 클라이언트 만들기 (service_server.py)
서비스 서버의 구조
서버 노드 만들기(클래스)
- init 정의
- 서버를 만드는 함수 self.create_service(만든 서비스 타입, 이름, 실행함수)
- callback 함수 정의 (response 반환)
- client 로부터 request 받으면 실행
main 함수
- 객체화
- spin 실행
- shutdown
if 문
서비스 서버 만들기
구독, 발행 노드를 만들때는 create_subscription, create_publisher를 이용했던 것처럼 이번에는 create_service를 이용한다.
multi_spawn이란 이름의 MultiSpawn 데이터 타입의 서비스를 호출?
callback 함수에서는 request와 response를 받고
from my_first_package_msgs.srv import MultiSpawn
import rclpy as rp
from rclpy.node import Node
class MultiSpawning(Node):
def __init__(self):
super().__init__('multi_spawn')
self.server = self.create_service(MultiSpawn, 'multi_spawn', self.callback_service)
def callback_service(self, request, response):
print('Request:', request)
response.x= [1., 2., 3.]
response.y= [10., 20., 30.]
response.theta = [100., 200., 300.]
return response
def main(args=None):
rp.init(args=args)
multi_spawn = MultiSpawning()
rp.spin(multi_spawn)
rp.shutdown()
if __name__== '__main__':
main()
터미널 상에서 service call
더보기
ros2 service call /multi_spawn my_first_package_msgs/srv/MultiSpawn “{num: 1}”
서비스를 호출하면 request를 전달하고 response를 반환받을 수 있다.
실제로 사용할 때에는 전달받은 request를 이용해
response를 도출해내고 반환하거나 하는 동작을 만들 수 있을 것이다.
teleport_absolute 에 대한 클라이언트 추가하기
동작
위에서 만든 서버는 그대로 두고
서버에 request가 들어오면 teleport_absolute 를 요청하는? 클라이언트를 추가하려고 한다.
코드 구현
teleport absolute 쓸 것이기에
from turtlesim.srv import TeleportAbsolute 임포트 해야함
class MultiSpawning(Node):
def __init__(self):
super().__init__('multi_spawn')
self.server = self.create_service(MultiSpawn, 'multi_spawn', self.callback_service)
self.teleport = self.create_client(TeleportAbsolute, '/turtle1/teleport_absolute')
self.req_teleport = TeleportAbsolute.Request()
def callback_service(self, request, response):
self.req_teleport.x = 1.
self.teleport.call_async(self.req_teleport)
return response
터틀심 실행 → 서버 실행 → 서비스 호출
서버도 만들고 클라이언트 호출도 가능하다.