본 블로그 포스팅은 https://www.youtube.com/@pinklab_studio/playlists
에서 현재 강의 중에 있는
ROS2 무작정 따라하기강의의 내용을 필자가 다시 복기하여 기록하는 내용에 관한 것이다.
우선 위 사진에 대해 서령하자면, 왼편의 그림은 ROS Service의 작동 도식도를 나타내며, 오른편의 그림은 ROS Topic의 작동 도식도를 나타낸다.
ROS Service은 Service Client가 서비스를 Request
하는 과정을 Service Server가 받고 이에 대한 Response
한다면
ROS Topic은 N개의 ROS Node내 구현된 Publisher가 Message를 발행하여 이를 Broadcast(방송)을 하고, 또다른 M개의 ROS Node내 구현된 Subscriber는 듣고 싶은 Message를 청취하는 구조로 되어 있다.
마치 여러개의 라디오 방송국(Publisher)이 할당된 주파수(Message)에 컨텐츠를 실어 방송을 진행하고, 유저(Subscriber)은 주파수 다이얼(Message)를 조정해 듣고 싶으 방송국의 컨텐츠를 청취하는 것이다.
이 ROS Service와 Topic의 차이점은 Message의 전달에 있어 사전 인증 절차 유/무로 볼 수 있으며, 별다른 절차 없이 간단하게 Message를 보내고 받을 수 있는 ROS Topic는 사용이 편리하고, 확장성이 용이한 장점이 있다.
따라서 ROS를 사용하여 Robot를 만든다면, 그 로봇의 내부 통신 방식은 대부분 ROS Topic로 이뤄져 있는 경우가 많다.
아무튼 서론은 여기까지 하고 ROS Topic예제를 수행해 보자
우선 첫번째로 ROS Topic 수행을 위해 Turtelsim turtle 노드를 하나 구동하자
ros2 run turtlesim turtlesim_node
이 상태에서 turtlesim_node와 연관되어 있는 Topic 종류를 알아보고 싶다면 아래의 명령어를 수행하면 된다.
ros2 topic list
ros2 topic list -t
ros2 topic list -v
topic list에서 -t
, -v
명령어를 뒤에 덧붙이면 더 자세하게 토픽이 필요로 하는 메세지명(타입) 그리고 해당 토픽이 Publishe, Subscribe로 분류가 되는지 알 수 있다.
다음으로 turtlesim_node에 연관된 Topic 중 /turtle1/pose 토픽에 관한 정보를 추출해보자
ros2 topic info /turtle1/pose
-> 토픽의 Publish/Subscive 종류, 해당 토픽이 받을 수 있는 메세지명(타입)
ros2 interface show turtlesim/msg/Pose
-> 토픽 /turtle1/pose이 받을 수 있는 메세지명(타입)인 turtlesim/msg/Pose의 메세지 구성(데이터 인자값 종류)
다음으로 앞서 살펴보고자 하는 대상 토픽인
/turtle1/pose
의 정보를 echo로 듣고, 이렇게 echo로 듣는 상태를 유지하면서 rqt_graph
명령을 수행하면 위 사진처럼 turtle 노드가 수행되고, echo하고 있는 topic를 도식으로 볼 수 있다.
ros2 topic echo /turtle1/pose
-> 토픽 /turtle1/pose의 메세지 정보를 echo를 통해 수신함
rqt_graph
-> 위 echo상태를 유지한 채로 rqt_graph를 치면 토픽을 받는 상태로 도식이 출력됨
이를 위 사진처럼 이전 챕터에서 사용한 Service인 Turtle1의 위치를 변화시키는 teleport_absolute 서비스를 콜하여 위치를 변화시키면,
ros2 topic echo /turtle1/pose
에서 출력되는 turtle1의 위치 정보가 변화됨을 알 수 있다.
다음으로 Ros topic 중 turtle1을 제어할 수 있는 토픽을 알아보고, 이에 대한 제어실습을 진행해보자
위 사진처럼 topic 정보를 모두 훑어보는것도 추천하지만 turtle1을 제어하는 topic는
/turtle1/cmd_vel
이며, cmd_vel은 command of velocity
의 약자이다.
이 topic의 메세지명(타입)인 geometry_msgs/msg/Twist의 인터페이스 정보(메세지의 구성 및 인자 정보)를 살펴보면 선속도 Linear
, 각속도 Angular
두가지 Vactor 타입 변수에, 각 Vector별로 float형 x, y, z가 배정되어 있다.
ros2 interface show geometry_msgs/msg/Twist
이를 첨부한 사진으로 살펴본다면 선속도 x,y,z는 각 방향별 진행방향, 각속도 x, y, z는 해당 축 별 회전속도인 Roll, Pitch, Yaw
가 된다.
Turtle1은 2차원 좌표로만 움직임을 확인할 수 있으니 Linear x, y, Angular z(yaw)가 의미있는 제어 인자값이라 볼 수 있다.
실습을 위해 아래와 같이 Turtle1의 위치를 reset해주자
그 이후 아래의 사진과 같이 cmd_vel
에 아래와 같이 제어값을 넣어서 turtle1제어를 실행하자
ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"
->
토픽 /turtle1/cmd_vel의
메세지명(타입) geometry_msgs/msg/Twist에
제어인자값 {linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}} 을 입력
이 명령에서 설명이 필요한 인자는 pub --once
인데 이것은 Publish(발행)을 1번만 수행하라는 뜻이다.
다음으로 위 사진처럼 publish를 지속적으로 한다면 pub --rate 1
으로 인자값을 수정하면 된다. 이때 rate 1
은 1Hz를 의미한다
ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"
Ros Action은 동작방식은 ROS Service와 유사하지만 Request와 Response 사이에 작업이 진행되는 과정을 지속적으로 Feedback Topic을 하는 Service + Tioic 을 합친 개념이라 이해하고 넘어가면 된다.
이거는 ROBOT를 조이스틱으로 수동제어 하는 과정을 구현하는 것 외에는 잘 안쓰긴 한다..
아무튼 설명을 하자면
위 사진처럼 turtlesim_node를 하나 실행시킨 다음에
ros2 run turtlesim turtle_teleop_key
노드를 하나 더 실행해서 turtle1을 키보드로 제어하는 기능을 활성화 해주자
ros2 run turtlesim turtlesim_node
-> 1번 터미널에서 터틀심 노드 실행
ros2 run turtlesim turtle_teleop_key
-> 2번 터미널에서 터틀봇을 '키보드 제어' 하기 위한 노드 실행
다음으로 활성화된 Action List와 해당 Action이 받을 수 있는 메세지명(타입) 그리고 해당 메세지명(타입)의 구성(인자값)을 확인해보자
ros2 action list -t
-> 활성화된 Action List 출력
ros2 interface show turtlesim/action/RotateAbsolute
-> 활성화된 Action :turtle1/rotate_absolute
가 받을 수 있는 메세지명(타입)turtlesim/action/RotateAbsolute
의 메세지 구성(인자 형태) 확인
메세지의 인자값 까지 확인했으니 위 명령어처럼 ROS Action을 제어하는 구문을 작성하면 turtle1이 제어되며, 제어된 결과값을 출력한다.
ros2 action send_goal /turtel1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 3.14}"
-> turtle1의 방향을 90도 로 바꾸는 기능을 수행하라는 뜻