ROS2: TurtleSim에서 기본 명령 알아보기
이 포스팅은 ‘ROS2‘에 대한 내용을 담고 있습니다.
참고 문헌
- 표윤석,임태훈. ROS2로 시작하는 로봇 프로그래밍. 루비 페이퍼. 2021
- https://www.youtube.com/playlist?list=PL0xYz_4oqpvhj4JaPSTeGI2k5GQEE36oi
TurtleSim
TurtleSim은 ROS2 설치와 함깨 같이 설치되는 기본 패키지입니다. 아래의 명령어를 사용해 TurtleSim을 간단히 실행해볼 수 있습니다.
ros2 run turtlesim turtlesim_node
노드
위와 같이 turtlesim_node
를 실행하고 나면, 노드가 생성됩니다. ROS2의 동작을 한 눈에 볼 수 있는 도구로 rqt_graph가 있습니다. 아래의 명령어로 실행하면 위의 그래프를 확인할 수 있는데, /turtlesim 노드가 생성된 것을 확인할 수 있습니다.
rqt_graph
ros2 node info /turtlesim
위는 특정 노드의 정보를 출력한 결과입니다. 그 출력 결과에는 노드가 어떤 일들을 수행하는지가 나오는데요, 크게는 Subscribers, Publishers가 해당되는 토픽, 그리고 서비스와 액션이 있습니다. 이 세 가지는 모두 노드의 기능에 해당합니다.
서비스
서비스는 요청과 응답으로 이루어지는 노드 사이의 데이터 교환 방식입니다. 서비스는 요청을 하는 Service Client와 요청에 따라 응답하는 Service Server로 구성됩니다.
ros2 service list
위의 명령어를 통해 ROS2에서 실행중인 노드들이 가지는 모든 사용 가능한 서비스 리스트를 출력할 수 있습니다. 위의 결과가 ros2 node info /turtlesim
에서 Service Servers:
결과와 동일한데, 이는 현재 실행중인 노드가 /turtlesim 하나 뿐이라 그렇습니다.
서비스를 요청하기 위해서는 해당 서비스의 이름, 정의(구조) 그리고 요청 데이터를 넣어줘야 합니다. 이름은 위의 리스트에서 확인할 수 있었고, 서비스 이름의 정의와 해당 서비스에서 필요로하는 데이터의 형태를 알아야 합니다.
ros2 service type /turtle1/teleport_absolute
>>> turtlesim/srv/TeleportAbsolute
ros2 interface show turtlesim/srv/TeleportAbsolute
위의 명령어를 통해 서비스의 정의와 그 내용을 확인할 수 있습니다. 서비스 정의는 Request
, ---
, Response
로 구성되는데, 위 그림에는 ---
밑에 아무런 내용이 나타나지 않았습니다. 이는 /turtle1/teleport_absolute
라는 서비스가 거북이를 시뮬레이터 상에서 순간이동을 시켜주는 응답을 수행해주는 서비스이기 때문에 반환해주는 데이터가 없어서 Response
부분이 나타나지 않은 것입니다.
ros2 service call <service name> <service definition> "data"
위와 같이 서비스의 이름, 정의, 그리고 데이터를 넣어주어 Service Server에게 서비스를 요청할 수 있고, 명령어를 실행했을 때 거북이의 위치가 바뀌는 것을 확인할 수 있습니다. 다른 서비스들도 동일한 과정들을 통해 요청할 수 있습니다.
토픽
노드간의 데이터 교환은 서비스를 통해 발생할 수도 있고, 토픽을 통해 발생할 수도 있습니다. 토픽이란 노드가 공중에 던지는 데이터의 타입이라고 이해하면 됩니다. 공중에 데이터를 던지는 친구를 Publisher라고 하고, 그 데이터를 받아서 쓰는 친구를 Subscriber라고 합니다. 토픽을 통한 데이터 교환에서는 요청이 필요하지 않습니다. 내가 공중에 쏘려는, 공중에 쏘아진 데이터 중, 내가 받으려는 데이터의 토픽 이름과 정의(구조)만 알면 됩니다.
ros2 topic list -v
위의 명령어를 통해 현재 ROS2 상에 어떤 토픽들이 존재하는지, 그리고 그 토픽의 정의와 구독 상태를 한 번에 확인할 수 있습니다. 위에서 보면 현재 /turtle1/cmd_vel
이라는 토픽을 누군가가 구독하는 있다는 사실이 보이는데요, /turtlesim 노드가 해당 토픽을 구독하고 있음을 ros2 node info /turtlesim
을 통해 확인할 수 있었습니다. 따라서 다른 노드에서 해당 이름을 갖는 토픽을 발행해준다면 /turtlesim 노드는 바로 해당되는 데이터를 받게 됩니다.
ros2 topic pub --once(or --rate<hz>) <topic_name> <msg_type> "<args>"
토픽을 전달하는 과정은 서비스와 거의 유사합니다. 해당 토픽이 어떤 정의를 사용하는지 확인하고, 위의 포맷을 통해 명령어를 입력하면 토픽을 발행할 수 있습니다.
ros2 topic echo /turtle1/pose
토픽을 발행하면, /turtlesim이 해당 데이터를 받아 시뮬레이터 안의 거북이를 위와 같이 뺑글뺑글 회전시키게 하는 것을 확인할 수 있습니다. 토픽을 통해 데이터를 받는 과정을 훨씬 더 간단한데, 토픽의 이름만 알고 있으면 위의 명령어를 사용해 토픽을 받아볼 수 있습니다. 아래의 rqt graph에서 토픽을 통한 데이터 전달을 확인할 수 있습니다.
액션
액션은 서비스와 토픽의 조합으로 구성되는 데이터 전달 방식입니다. 액션의 Server와 Client가 둘 다 작업을 도중에 중단할 수 있는 기능을 가진다는 것을 특징으로 갖습니다. 액션 Client는 Server에게 먼저 Goal Service를 요청합니다. 그리고 해당 서비스에 대한 수용 여부를 전달하고, 만약에 수용되면 Client는 Result Service에 대해 요청을 이어서 보내게 됩니다. 그 과정에서 Action Server는 Client가 보낸 목표를 수행하면서 Feedback 토픽을 발행합니다. 마지막으로 목표를 달성하게 되면 Result Service에 대한 Response를 Action Client에게 보내고 Action이 마무리됩니다.
ros2 run turtlesim turtle_teleop_key
위의 명령문을 실행시키면 /teleop_turtle이라는 노드가 생성되고, 키보드 입력에 따라 액션을 전달합니다. /teleor_turtle은 중간에 액션 중간에 다른 방향에 해당하는 키를 전달해 액션을 중단시킬 수 있습니다.
댓글남기기