ROS 2

ROS 2 Tutorials : Understanding topics

정지홍 2024. 12. 31. 17:24

background

  • ROS2의 복잡한 시스템은 아래로 갈수록 많은 modular nodes로 갈라진다.
    topic들은 node들이 메시지를 교환하기 위한 bus를 수행하기 위해서 ROS graph의 필수적인 요소이다.

출처: ros2 documentation: jazzy의 tutorials/beginner/understanding topics

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

출처: ros2 documentation: jazzy의 tutorials/beginner/understanding nodes

 

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 -t

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

cmd로 확인 가능
/turtle1/cmd_vel에 대해서 2개의 노드가 subscribed하였다.

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

퍼블러셔는 1개, 구독자는 2개이다.

  • 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 /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 : 계산에 사용된 메시지 샘플 수 
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 topic find <topic_type>

ros2 topic find geometry_msgs/msg/Twist

 

 

 

Summary

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

 

 

토픽 인포
ros와 gz의 브릿지
시뮬레이션
노드