2024. 9. 23. 10:06ㆍROS2/기초
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을 해보면
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 |