토픽

평범한컴공생·2022년 8월 2일
0

[ROS2]

목록 보기
6/19
post-thumbnail

배경

ROS 2에서는 복잡한 시스템을 많은 모듈화 노드로 분할하였다. 토픽은 노드들이 서로 메시지를 교환하는 과정에서 버스의 역할을 수행하는 ROS 그래프의 중요한 요소이다.

노드는 여러 개의 토픽을 이용해 통신할 수 있고, 동시에 여러 개의 토픽에 대한 Subscriber를 가질 수 있다.

작업

1. 설정

두 개의 터미널을 열자.

ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key

2. rqt_graph

노드와 토픽, 서로 간의 연결을 rqt_graph 통해 시각화할 수 있다.

rqt_graph

rqt를 연 후, Plugins > Introspection > Node Graph를 통해서도 rqt_graph를 열 수 있다.

해당 그래프는 /turtlesim 노드와 /teleop_turtle 노드가 토픽을 통해 서로 통신하고 있는 방식을 묘사하고 있다. /teleop_turtle 노드는 키보드 입력을 /turtle1/cmd_vel을 통해 송신(publish)하며, turtlesim 노드는 해당 토픽을 통해 수신(subscribe)한다.

3. ros2 topic list

ros2 topic list 명령어를 통해 현재 실행 중인 토픽들을 볼 수 있다.

ros2 topic list
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

ros2 topic list -t은 토픽의 타입까지 알 수 있다.

ros2 topic list -t
/parameter_events [rcl_interfaces/msg/ParameterEvent]
/rosout [rcl_interfaces/msg/Log]
/turtle1/cmd_vel [geometry_msgs/msg/Twist]
/turtle1/color_sensor [turtlesim/msg/Color]
/turtle1/pose [turtlesim/msg/Pose]

rqt_graph내에서 모든 토픽을 보고 싶다면, Hide 오른쪽에 있는 모든 체크 박스를 해제하면 된다.

4. ros2 topic echo

퍼블리시 된 데이터를 보고 싶을 때는 다음 명령어를 사용한다.

ros2 topic echo <topic_name>

/teleop_turtle노드는 /turtle1/cmd_vel을 통해 /turtlesim으로 송신하기 때문에, 위 명령어를 이용해 데이터를 볼 수 있다.

ros2 topic echo /turtle1/cmd_vel
linear:
  x: 0.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: -2.0
---
... 후략

화살표 키를 이용하여 거북이를 제어할 때 마다 위와 같은 데이터를 볼 수 있다.

rqt_graph에서 Debug만 체크 해제하자.

/_ros2cli_6294는 방금 전 명령어의 echo에 의해 생성된 노드이다. /turtle1/cmd_vel 토픽을 통해 /_ros2cli_6294, /turtlesim 두 개의 노드가 수신하고 있음을 볼 수 있다.

5. ros2 topic info

토픽은 점대점 방식뿐만 아니라 일대다, 다대일, 다대다 방식까지 가질 수 있다.

ros2 topic info 명령어를 통해 이를 볼 수 있다.

ros2 topic info <topic_name>
Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 2

6. ros2 interface show

노드들은 토픽을 통해 메시지를 전달한다. 퍼블리셔와 서브스크라이버가 서로 통신하기 위해서는 동일한 타입의 메시지를 주고받아야 한다.

토픽의 타입은 ros2 topic list -t로 볼 수 있었다. 이를 통해 각 토픽에 사용되는 메시지 타입을 알 수 있다. cmd_vel의 타입은 geometry_msgs/msg/Twist이었다.

즉, 패키지 geomery_msgs안에 Twist라 부르는 msg가 있는 것이다.

ros2 interface show <msg_type> 명령어는 해당 메시지를 자세히 보여 준다.

ros2 interface show geometry_msgs/msg/Twist
# This expresses velocity in free space broken into its linear and angular parts.

Vector3  linear
Vector3  angular

/turtlesim 노드는 세 개의 요소를 가진 Vector3 linearangular를 가진 메시지를 받음을 알 수 있다.

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는 메시지 하나를 송신하고 종료하라는 의미이다.

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

옵션 --rate 1은 해당 명령을 1 Hz 단위로 수행하라는 의미이다.

rqt_graph를 새로고침해보자. ros2 topic pub 명령으로 생성된 노드 /_ros2cli_14639가 토픽 /turtle1/cmd_vel을 통해 송신하고 있으며, ros2 topic echo 명령어를 통해 생성된 노드 /_ros2cli_6294와 노드 /turtlesim이 이를 수신하고 있다. 이번엔 /turtle1/pose 토픽을 상대로 ros2 topic echo 명령어를 한 번 더 수행해 보자.

ros2 topic echo /turtle1/pose

업로드중..

이번엔 /turtlesim노드가 퍼블리셔 역할이 되어 pose 토픽을 통해 새롭게 생성된 노드 _ros2cli_15828에게 송신하고 있다.

8. ros2 topic hz

다음의 명령어를 통해 데이터가 송신되는 속도를 볼 수 있다.

ros2 topic hz /turtle1/pose
average rate: 62.500
	min: 0.015s max: 0.017s std dev: 0.00045s window: 1198

노드 turtlesim이 토픽 pose를 통한 송신 속도를 보여 준다.

ros2 topic hz /turtle1/cmd_vel
average rate: 1.000
	min: 1.000s max: 1.000s std dev: 0.00009s window: 9

이전에 --rate 1옵션을 통해 속도를 1 Hz설정했으므로 토픽 /turtle1/cmd_vel에서의 송신 속도는 위와 같을 것이다.

9. 종료

여러 개의 터미널을 열어 노드가 많을 것이다. 터미널마다 Ctrl + C로 종료해 주자.

참고

ROS 2 Documentation: Foxy

profile
학부 연구생(220627~)

0개의 댓글