프로젝트/ros2

ROS2 foxy 튜토리얼4 - Understanding ROS2 topics

ekgus2222 2022. 2. 24. 19:47

https://ropiens.tistory.com/41?category=828450 

 

ROS2 foxy 튜토리얼3 - ROS2 노드(node) 이해하기

그동안은 ROS2의 학습용 패키지인 turtlesim 패키지만을 돌려봤습니다. 이번 차 부터는 그 것들이 어떻게 돌아가는 지 내부를 알아보면서 다시 한 번 학습을 해 보겠습니다. 오늘은 노드(node)에 대해

ropiens.tistory.com

 

이 블로그를 보고 따라해보다가 뒷부분을 이어서 써본다.

 

 

Topic이란?

  • node가 메시지를 교환하는 버스 역할
  • 여러 topic에 데이터를 게시 및 구독할 수 있음.
  • 데이터가 node 간에 이동하는 주요 방법 중 하나

 

 

실습

1. 설정

터미널 2개를 열고 다음과 같은 명령어를 실행한다.

(참고 : ros2 run <package_name> <executable_name>)

- 터미널 1

ros2 run turtlesim turtlesim_node

- 터미널 2

ros2 run turtlesim turtle_teleop_key

 

2. rqt_graph

또 다른 터미널을 열고 rqt_graph를 실행한다.

- 터미널 3

rqt_graph

 

 

위와 같은 창을 볼 수 있다.

이 그래프는 방금 실행시킨 /turtlesim 노드와 /teleop_turtle 노드가 topic에 대해 서로 통신하는 모습을 보여준다.

/teleop_turtle node는 키 데이터를 /turtle1/cmd_vel topic에 pub하고 /turtlesim node는 그 topic을 sub해서 데이터를 받아온다.

 

3. ros2 topic list

새로운 터미널에서 다음과 같은 명령어를 입력해 현재 활성화된 topic list를 확인한다.

- 터미널 4

ros2 topic list

그러면 다음과 같은 list가 반환된다.

/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
더보기

참고로 $ ros2 node info /turtlesim 을 입력했을 때도 

Subscribers와 Publishers에 같은 topic이 출력된다.

 

4. ros2 topic echo

pub되는 data를 확인하려면 다음과 같은 명령어를 사용한다.

- ros2 topic echo <topic_name>

위 그림의 /turtle1/cmd_vel topic을 확인해볼 것이다.

- 터미널 4

ros2 topic echo /turtle1/cmd_vel

 

터미널 4가 실행되는 채로 놔두고 터미널 2를 클릭해서 활성화 시킨 후 turtle을 방향키로 조작해본다.

그러면 터미널 4에 다음과 같이 출력될 것이다.

 

다시 rqt_graph로 가서 Debug의 체크를 해제한 후 왼쪽 상단의 새로고침을 누른다.

그러면 창이 아래와 같이 바뀌는데 /turtle1/cmd_vel topic을 다른 node가 sub하고 있는 것을 알 수 있다.

아래의 /_ros2cil_17865 가 터미널 4에서 실행한 노드이다.

 

 

5. ros2 topic info

topic의 정보를 보고 싶다면 다음과 같은 명령어를 사용하면 된다.

- ros2 topic info <topic_name>

- 터미널 5

ros2 topic info /turtle1/cmd_vel

그러면 아래와 같이 Topic Type과 Publisher, Subscription count가 출력된다.

 

6. ros2 interface show

ros2 topic list -t 라는 명령어를 사용하면 현재 topic의 message type을 알려준다.

- 터미널 5

ros2 topic list -t

아래의 사진에서 확인할 수 있듯이 /turtle1/cmd_vel은 geometry_msgs/msg/Twist를 사용한다.

이것은 geometry_msgs 안에 Twist라고 불리는 msg가 있다는 걸 의미한다.

 

이 메시지 구조에 대해 자세히 알고 싶다면 다음과 같은 명령어를 이용한다.

- 터미널 5

ros2 interface show geometry_msgs/msg/Twist

다음과 같이 출력된다.

4번째 과정에서 확인한 것과 같은 형식으로 구성되어 있는 것을 확인할 수 있다.

 

 

7. ros2 topic pub

6번째 과정에서 메시지 구조를 알 수 있었다.

메시지 형식만 맞춘다면 터미널에서 직접 데이터를 게시하는 것이 가능하다.

ros2 topic pub <topic_name> <msg_type> <args> 꼴로 작성하면 된다.

 

-터미널 5

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: 1.8}}"

거북이가 호를 그리는 것을 확인할 수 있다.

 

여기서 --once 는 하나의 메시지를 게시한 후 종료하는 옵션이다. 만약 이 옵션을 추가하지 않는다면 ^C를 누르기 전까지 계속해서 거북이가 빙글빙글 돈다.

 

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: 1.8}}"

이 명령어는 --once를 제거한 후 --rate 1 옵션을 추가한 명령어인데 1Hz로 메시지를 게시하는 것이다.

 

 

8. ros2 topic hz

아래와 같은 명령어를 사용해서 topic이 게시되는 hz를 볼 수 있다.

ros2 topic hz <topic_name>