티스토리 친구하기

본문 바로가기

Robotics/ROS2

ROS2 topic 2 [ROS2 토픽 2]

728x90

5. ros2 topic info

`ros2 topic info` 명령어는 지정된 ROS 2 토픽에 대한 세부 정보를 출력합니다. 이 명령어를 사용하면 선택한 토픽의 이름, 메시지 유형, 토픽이 발행되는 노드의 이름 등을 확인할 수 있습니다.

 

예를 들어, `ros2 topic info /my_topic` 명령어는 `/my_topic` 토픽에 대한 정보를 출력합니다. 결과에는 토픽의 name, 토픽이 사용하는 메시지 Type, 발행자(Publisher) 노드의 이름 등이 포함됩니다. 이 정보는 토픽이 어떤 종류의 데이터를 전달하고 있는지, 어떤 노드가 해당 토픽을 사용하고 있는지 등을 파악하는 데 도움을 줍니다.

`ros2 topic info` 명령어를 사용하여 ROS 2 토픽에 대한 정보를 확인하면 시스템의 토픽 구성을 이해하고, 다른 노드들과의 상호작용을 설정하고 디버깅하는 데 도움이 됩니다.

 

아래의 명령어를 입력시켜 보세요

 

# 입력
ros2 topic info /turtle1/cmd_vel

# 출력
Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 2

 

topic은 일대일 통신뿐만 아니라 일대다, 다대일, 다대다 통신이 가능합니다. 

- 일대일: 하나의 Publisher(발생자), 하나의 Subscriber(구독자)

- 일대다: 하나의 Publisher(발생자), 다수의 Subscriber(구독자)

- 다대일: 다수의 Publisher(발생자), 하나의 Subscriber(구독자)

- 다대다: 다수의 Publisher(발생자), 다수의 Subscriber(구독자)

 

위의 출력을 보면 geometry_msgs/msg/Twist를 turtle_teleop_key만 publish 하고 있기 때문에 "Publisher count"가 1이고, /_ros2cli_26646와 /turtlesim 이렇게 2개의 node가 subscription 하고 있기 때문에 "Subscription count"가 2인 것을 확인할 수 있습니다. 

6. ros2 interface show

`ros2 interface show` 명령어는 ROS 2 인터페이스의 내용을 터미널에서 보여주는 도구입니다. 이 명령어를 사용하여 특정 ROS 2 메시지나 서비스의 구조와 필드에 대한 정보를 확인할 수 있습니다.

예를 들어, `ros2 interface show std_msgs/msg/String` 명령어는 `std_msgs/msg/String` 메시지 인터페이스의 내용을 터미널에 출력합니다. 결과에는 메시지의 필드 이름, 데이터 유형 및 배열 여부 등이 포함됩니다. 이 정보는 메시지의 구조를 이해하고 필드에 액세스 하는 데 도움이 됩니다.

 

"cmd_vel"의 토픽 Type은 다음과 같습니다.

 

geometry_msgs/msg/Twist

 

이제 우리는 "ros2 interface show <msg type>"을 실행해서 해당 메시지의 세부 정보를 알아볼 수 있습니다. 구체적으로, 메시지가 어떤 데이터 구조를 기대하는지 알 수 있습니다.

 

"ros2 interface show geometry_msgs/msg/Twist" 명령은 위에서 언급한 메시지 Type에 대한 세부 정보를 제공합니다. 

 

# This expresses velocity in free space broken into its linear and angular parts.

Vector3  linear
Vector3  angular

 

이를 통해서 "/turtlesim" 노드가 각각 3개의 요소로 구성된 linear 및 angular 2개의 벡터로 이루어진 메시지를 기대하고 있다는 것을 알 수 있습니다. "echo" 명령어를 사용해서 /teleop_turtlr에서 /turtlesim으로 전달된 데이터를 기억한다면, 이러한 구조와 동일한 구조를 갖고 있다는 것을 상기시킬 수 있습니다.

linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
  ---

7. ros2 topic pub

이제 메시지 구조를 알았으므로, 다음과 같이 명령줄에서 직접 토픽에 데이터를 발행할 수 있습니다:

ros2 topic pub <topic_name> <msg_type> '<args>'

 

<args>인수는 이전 섹션에서 확인한 구조에 따라 토픽에 전달할 실제 데이터입니다. <args>는 YAML 구문으로 입력해야 한다는 점에 주의해야 합니다. 다음과 같이 전체 명령을 입력하세요

 

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는 "한 번의 메시지를 발행한 후 종료"라는 선택적인 argument(인수)입니다. 터미널에서 다음과 같은 출력을 볼 수 있습니다:

 

publisher: beginning loop
publishing #1: geometry_msgs.msg.Twist(linear=geometry_msgs.msg.Vector3(x=2.0, y=0.0, z=0.0), angular=geometry_msgs.msg.Vector3(x=0.0, y=0.0, z=1.8))


그리고 다음과 같이 거북이가 움직이는 것을 볼 수 있을 것입니다:

 


거북이(그리고 일반적으로 이를 에뮬레이션하는 실제 로봇)는 계속해서 명령을 받아 작동하기 위해 일정한 스트림의 명령을 필요로 합니다. 그래서 거북이가 계속해서 움직이도록 하려면 다음을 실행할 수 있습니다:

 

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 옵션이 추가되었습니다. 이는 ros2 topic pub에게 1Hz의 속도로 명령을 지속적으로 발행하도록 지시합니다.

 


rqt_graph를 새로고침하여 그래픽으로 어떤 일이 벌어지는지 확인할 수 있습니다. ros2 topic pub ... 노드 (/_ros2cli_30358)가 /turtle1/cmd_vel 토픽을 통해 발행되고, 이를 ros2 topic echo ... 노드 (/_ros2cli_26646)와 /turtlesim 노드가 수신하는 것을 확인할 수 있습니다.

 

 

마지막으로, pose 토픽에 대해 echo를 실행하고 rqt_graph를 다시 확인할 수 있습니다:

 

ros2 topic echo /turtle1/pose

 

 

/turtlesim 노드가 pose 토픽에도 발행하고 있으며, 새로운 echo 노드가 이에 구독하고 있는 것을 확인할 수 있습니다.

8. ros2 topic hz

`ros2 topic hz`는 데이터가 게시되는 속도를 확인하는 데 사용되는 명령어입니다. 

 

ros2 topic hz /turtle1/pose


`ros2 topic hz /turtle1/pose`를 실행하면 /turtlesim 노드가 pose 토픽에 데이터를 게시하는 속도에 대한 데이터를 반환합니다.

 

average rate: 59.354
  min: 0.005s max: 0.027s std dev: 0.00284s window: 58
  
# 평균 속도: 59.354
# 최소: 0.005초 최대: 0.027초 표준 편차: 0.00284초 윈도우: 58

 

 `ros2 topic pub --rate 1`을 사용하여 turtle1/cmd_vel의 발행 속도를 1Hz로 설정했음을 기억하시길 바랍니다. turtle1/pose 대신 turtle1/cmd_vel로 위의 명령을 실행하면 해당 비율을 반영하는 평균이 표시됩니다.

9. Clean up

이 시점에서 실행 중인 많은 노드가 있을 것입니다. 각 터미널에서 Ctrl+C를 입력하여 종료하는 것을 잊지 마세요.

Summary

노드는 토픽을 통해 정보를 게시하며, 이를 통해 다른 노드들이 해당 정보에 구독하고 액세스할 수 있습니다. 이 튜토리얼에서는 rqt_graph와 명령줄 도구를 사용하여 여러 노드 간의 연결을 살펴보았습니다. ROS 2 시스템에서 데이터가 어떻게 이동하는지에 대한 좋은 아이디어를 가지게 되었을 것입니다.


반응형