ROS 2
ROS 2 Tutorials : Understanding topics
정지홍
2024. 12. 31. 17:24
background
- ROS2의 복잡한 시스템은 아래로 갈수록 많은 modular nodes로 갈라진다.
topic들은 node들이 메시지를 교환하기 위한 bus를 수행하기 위해서 ROS graph의 필수적인 요소이다.

- 하나의 node는 많은 topic들에게 data를 publish할것이며, 동시에 많은 topic들을 subscription할 것이다.
- ' 시스템의 다른 부분 사이의 이동 ' or 'topic은 노드간의 data'가 이동하는 주요 통로이다.

task
- 1. 우선 turtlesim을 우선 실행하고, turtle_teleop_key도 실행시킨다.
- 이렇게 하면 ros2 node list를 입력하면, /turtlesim과 /teleop_turtle이라는 노드가 실행된다고 출력됨.
- 2. 이번에는 rqt_graph를 실행해볼거임.
- rqt_graph는 node와 topics간의 connections이 바뀌는것을 시각화 해준다.
rqt_graph

- 위의 그래프에서 nodes와 topic을 볼 수 있다.(마우스를 올리면 색이 변함)
- 그리고 주변에 있는 2개의 action들을 볼 수 도 있다.
- /turtlesim과 /teleaop_turtle node는 서로 communicate함을 확인 할 수 있다.
- /teleaop_turtle node는 publishing data(키를 누르면 거북이 움직이는거)함을 볼 수 있다.
- /turtle1/cmd_vel로 data가 전송된다.
- /turtlesim은 /turtle1/cmd_vel를 subscribed하고 있다.
- 3. topic 리스트 조회
- ros2 topic list 명령어를 통해서 현재 실행중은 topic의 리스트들을 조회할 수 있다.
- ros2 topic list
- 현재 실행중인 토픽들을 이름만 출력
- ros2 topic list -t
- 각 topic에 대한 타입 정보를 출력함. 즉, topic이름 뿐만 아니라 해당 topic의 message타입이 함께 출력됨
- ros2 topic list
- ros2 topic list 명령어를 통해서 현재 실행중은 topic의 리스트들을 조회할 수 있다.
ros2 topic list
ros2 topic list -t


- 4. topic echo
- 특정 ROS 2 토픽의 메시지를 실시간으로 출력하는 명렬어이다.
# 1. 우선 아래 명령어를 실행한다.
### 아래 명령어 입력하면 아무것도 출력 안될거임. 왜냐면 /teleop_turtle로부터 publish되기를 기다리기 때문
ros2 topic echo /turtle1/cmd_vel
# 2. 아래 명령어를 입력후에 거북을 움직인다.
### 움직이고 위의 터미널로 가면 출력이 됨을 확인 할 수 있다.
ros2 run turtlesim turtle_teleop_key


- /_ros2cli_47882는 echo command로 생성되었다. ( debug옵션 줘야함)
- 5. topic에 대한 정보를 cmd에서도 확인하는게 가능하다.
ros2 topic info /turtle1/cmd_vel

- 6. cmd에서 직접 data를 publish하는 것도 가능하다.
- ros2 topic pub <topic_name> <msg_type> '<args>' 같은 구조로 사용한다.
- pub은 publish의 약자이다.
- geometry_msgs/msg/Twist은 publish할 메시지의 타입이다.
- 이 메시지는 선형속도linear와 각속도angular를 포함하는 메시지 타입이며, 로봇의 이동 속도와 회전을 지정하는 데 사용함.
- {linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}
- linear는 {x,y,z}로 이루어 지며, 각 축 방향으로의 속도를 지정.
- angular도 {x,y,z}로 이루어짐.
- ros2 topic pub <topic_name> <msg_type> '<args>' 같은 구조로 사용한다.
ros2 topic pub /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}}"
# 이거는 2번만 수행
ros2 topic pub --once -w 2 /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}}"



- 7. pose
- 이 명령어는 /turtle1/pose 토픽에 publish되는 메시지를 실시간으로 출력함. 이를 통해서 turtle1의 현재 위치와 자세 정보를 알 수 있다.
- theta는 거북이의 방향이다.
ros2 topic echo /turtle1/pose
ros2 topic pub /pose geometry_msgs/msg/PoseStamped '{header: "auto", pose: {position: {x: 1.0, y: 2.0, z: 3.0}}}'
ros2 topic pub /reference sensor_msgs/msg/TimeReference '{header: "auto", time_ref: "now", source: "dumy"}'


- 8. 토픽이 초당 몇번 메시지 전송하는지 측정하기
- 아래의 코드는 특정한 토픽에서의 publish 주파수를 측정하고 출력한다.
즉, 해당 토픽이 초 당 몇번의 메시지를 전송하는지 실시간으로 확인 가능 - hz는 헤르츠Hz를 의미한다.
- 출력 인자 설명...
- arverage rate : 토픽의 평균 퍼블리시 속도 Hz
- min : 메시지가 두 번 연속으로 도착하는데 걸린 최소 시간
- max : 메시지가 두 번 연속으로 도착하는데 걸린 최대 시간
- std dev : 메시지 간 간격의 표준 편차이며, 이는 퍼블리시 속도의 일관성을 의미
- window : 계산에 사용된 메시지 샘플 수
- 아래의 코드는 특정한 토픽에서의 publish 주파수를 측정하고 출력한다.
ros2 topic hz /turtle1/pose

- 9. 토픽이 네트워크를 통해서 전송하는 데이터의 크기를 실시간으로 확인하기
ros2 topic bw /turtle1/pose

- 10. ros2의 특정 메시지 타입을 사용하는 모든 모픽을 검색하기
- ros topic find : ros2의 명령어이며, 주어진 메시지 타입을 사용하는 토픽을 검색함
- <topic_type> : 검색하려는 ROS 메시지 타입을 지정한다.
- 아래에서는 geometry_msg/msg/Twist 타입을 지정
- 위의 타입은 ros2에서 사용하는 표준 메시지 타입이며, 선형 및 각속도를 표현하기 위해서 사용한다.
- Twist는 linear , angular라는 2개의 vector필드를 포함한다.
- 위의 타입은 ros2에서 사용하는 표준 메시지 타입이며, 선형 및 각속도를 표현하기 위해서 사용한다.
- 아래에서는 geometry_msg/msg/Twist 타입을 지정
ros2 topic find <topic_type>
ros2 topic find geometry_msgs/msg/Twist

Summary
- node들은 topic을 통해서 정보를 publish하며, 이를 통해서 다른 여러 node들이 해동 정보를 구독하고 접근할 수 있다.
- 이번 튜토리얼에서는 rqt_graph와 명령어 도구를 사용해서 여러 node가 topic을 통해서 서로 연결되는 방식을 보았다.
- 이제 ros 2 시스템 내부에서 data가 어떻게 이동하는지 알게되었을것이다.



