ROS2 3일차(1) Service

2024. 9. 23. 10:06ROS2/기초

Service

ros2 launch gcamp_gazebo gcamp_world.launch.py
ros2 run py_service_pkg gazebo_model_spawner

새로운 로봇 등장

방금 gazebo_ros의 Service Server에게 새로운 로봇을 등장시켜 달라는 Request를 보낸것

# terminal 1
$ ros2 run teleop_twist_keyboard teleop_twist_keyboard --ros-args -r __ns:=/skidbot2

# terminal 2
$ ros2 run teleop_twist_keyboard teleop_twist_keyboard --ros-args -r __ns:=/skidbot

각각 주행도 가능

 

ROS2 Service 개념

그림과 같이 Client Node가 Server Node로 request를 주면, 해당 request에 대응하는 적절한 response가 다시 Client에게 전달

하나의 service server에는 여러 client node가 request 할 수 있지만, server는 동시에 여러 request를 처리하지는 못함

 

Topic vs Service

  • topic publish를 하면 여러 node가 subscribe 가능 반면, service는 request가 온 대상에게만 response를 줌 > 1:1
  • service server는 동시에 여러 request를 처리할 수 없다. 현재 작업중인 request가 처리될 때 까지 다른 request를 기다리고 있어야 함
  • topic는 대부분 지속적으로 publish를 진행하는 반면, service는 1회성에 가까움
  • 분명한 요청의 주체가 있으며, 빠르게 동작이 완료되는 경우 >> Service
  • 불특정한 node가 subscribe의 대상이 되며, 지속적으로 데이터의 송수신이 일어나는 경우 >> Topic

Service srv

topic는 msg(message)를 사용했던 것처럼,

Service는 srv라는 타입 사용

 

특정 service가 어떤 srv타입을 사용하는지 검색하고 싶을 때

ros2 service type /spawn_entity
gazebo_msgs/srv/SpawnEntity

 

반대로, 특정 srv타입을 사용하는 service를 검색하고 싶을 때

ros2 service find gazebo_msgs/srv/SpawnEntity
/spawn_entity

 

특정 srv 타입에 대한 자세한 정보는 다음과 같이 조회할 수 있음

ros2 interface show gazebo_msgs/srv/SpawnEntity

 

srv 중간에 --- 부분은 request와 response를 구분해주는 칸막이

uint32, float64, bool, string과 같이 프로그래밍 언어에서 이미 익숙한 자료형을 쓸 수도 있고, ROS2에서 기본 제공하는 geometry_msgs, sensor_msgs와 같은 자료형도 사용 가능

 

Service Call Command

server에게 request 요청하는 것을 call이라고 표현함

터미널 커멘드를 통해 Server Call하는 방법은 다음과 같음

>> ros2 service call <service 이름> <srv 타입> '<srv 내용>'

 

아까 화면에서 초록색 로봇을 Gazebo 상에서 지우고 싶어졌다 어떻게 할까

> delete가 포함된 service를 조회한다

ros2 service list | grep delete
/delete_entity

 

이 service에 대해서 조회

name이라는 request를 하면 모델을 지우고, 성공여부를 response하는 것 같다

이제 내용을 채워서 service call을 해보면

초록색 로봇(skidbot)이 사라짐

Entry Point

python 개발에 한하여, 새로운 .py파일로 node를 구현하고 build 하여도 ros2 run을 통해 실행이 불가하였다

 

이는 Entry Point를 추가해주는 작업이 미비되었기 때문

 

<ros2 run 시 실행시킬 이름> = <패키지 이름>.<파일 이름> : <파일에서의 진입점 - 보통 main>

위 작업까지 마친 후 cbp를 하면, 이제 ros2 run을 통해 직접 만든 node를 실행할 수 있다.

'ROS2 > 기초' 카테고리의 다른 글

ROS2 3일차(3) Action  (0) 2024.09.23
ROS2 3일차(2) Service 프로그래밍  (0) 2024.09.23
ROS2 2일차(5) tf2  (0) 2024.09.20
ROS2 2일차(4) topic 프로그래밍  (0) 2024.09.20
ROS2 2일차(3) topic  (0) 2024.09.20