[ROS2]009: ROS2 토픽

maroo·2022년 7월 21일
0

ROS2

목록 보기
9/39
post-thumbnail

https://cafe.naver.com/openrt/24101

1. 토픽(topic)

008에서 토픽에 대한 기본적인 설명을 했다.

추가로 토픽의 다자간 통신에 대해 설명하자.

토픽은 1:1 통신을 기본으로 하지만 그림과 같이 하나의 토픽을 송수신하는 1:N도 가능하고 N:1, N:N 통신도 가능하다.

-두 개 이상의 토픽을 발행할 수 있다.(Node A)
-PublisherSubscriber 역할을 동시에 수행할 수 있다.(Node A)
-자신이 publish한 토픽을 subscribe할 수도 있다.
-비동기성과 연속성 >> 센서 값 전송 / 항시 정보를 주고 받아야 하는 부분에 주로 사용한다.

2. 토픽 목록 확인

만만한 turtlesim을 실행시켜본다.

$ ros2 run turtlesim turtlesim_node

turtlesim_node 노드의 토픽 정보를 확인해보자.
(turtlesim_node 노드는 turtlesim이라는 노드 이름으로 실행된다)

$ ros2 node info /turtlesim

ros2 topic list로 현재 개발 환경에서 동작 중인 모든 노드들의 토픽 정보를 간단히 보자.
-t 는 옵션으로, 각 메시지의 형태(type)를 함께 표시해준다.

$ ros2 topic list -t
$ rqt_graph
$ ros2 run turtlesim turtle_teleop_key

지금 상태에서 rqt_graph를 확인해보자.

$ rqt_graph


color_sensor 및 pose 토픽은 아직 이를 구독하는 노드가 없기 때문에 나타나지 않는다.
모든 토픽을 보고 싶다면 Dead sinksLeaf topics를 해제해 보자.

오로카 포스팅과 다르게 t__rosout과의 연결은 나오지 않는데 그 이유는 잘 모르겠다.
나중에 전 과정을 마치고 복습할 때 알 수 있지 않을까..?,,

3. 토픽 정보 확인

(계속 이전 명령들을 실행해놓은 상태에서 진행해야 한다!)
ROS 2 CLI 툴을 이용하여 토픽 메시지 형태, 토픽의 발행 및 구독 정보를 확인할 수 있지만 이 명령어는 잘 사용하지 않는다고 한다.

$ ros2 topic info /turtle1/cmd_vel

4. 토픽 내용 확인

ros2 topic echo는 특정 토픽의 메시지 내용을 실시간으로 표시한다.

$ ros2 topic echo /turtle1/cmd_vel

이 명령을 실행하고 난 후 ros2 run turtlesim turtle_teleop_key창에서 키를 한번이라도 움직여야 결과가 나온다.(이 토픽이 키를 움직일 때 발행되는 것인가보다)

5. 토픽 대역폭 확인

ros2 topic bw으로 지정된 토픽 메시지의 송수신되는 토픽의 초당 대역폭을 알 수 있다.

$ ros2 topic bw /turtle1/cmd_vel


나 같은 경우는 메시지를 지속적으로 보내는 게 아니라 turtle을 갑자기 움직여봤다 안 움직여봤다 했어서 메시지 대역폭의 평균이 나오지 않고 초당 대역폭이 일일히 표시되는 것 같다.

가만히 놔뒀더니 대역폭이 지속적으로 감소하던데, 이게 뭘 의미하는 건지는 아직 모르겠다..,,

6. 토픽 주기 확인

ros2 topic hz로 토픽의 전송 주기를 확인할 수 있다.

$ ros2 topic hz /turtle1/cmd_vel

(이 또한 ros2 run turtlesim turtle_teleop_key창에서 키를 움직여야 한다. 키를 움직이는 게 해당 토픽을 발행하는 것이므로. 처음에 아무 행동도 취하지 않았더니 does not appear to be published yet에러가 떴고 키를 움직이는 걸 멈췄더니 더이상 표시되지 않았다)

7. 토픽 지연 시간 확인

토픽은 RMW 및 네트워크 장비를 거치기 때문에 지연 시간이 반드시 존재한다.
ros2 topic delay /TOPIC_NAME 명령어를 이용하여 메시지 발행 시간과 구독 시간의 차를 계산하여 지연 시간을 확인할 수 있다.

msg does not have header 에러가 떴는데 무슨 의미인지는 모르겠다. 나중에 돌아와서 알아볼 것

8. 토픽 발행

ros2 topic pub 명령어에 토픽 이름, 토픽 메시지 타입, 메시지 내용을 기술해서 간단히 토픽을 발행할 수 있다.

$ 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: 단 한번의 발행
토픽 이름: /turtle1/cmd_vel
토픽 메시지 타입: geometry_msgs/msg/Twist
메시지 내용: 병진 속도 linear.x 값으로 2.0 m/s, 회전 속도 angular.z 값으로 1.8 rad/s

지속적인 발행을 하고 싶다면 --once대신 --rate 1을 사용해보자.

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

메시지 내용을 수정하여 경로로 그림을 그릴 수 있다.
뭔가 의미 있는 그림을 그려 보려 했으나 실패했다(..

나중에 오로카 포스팅에 있는 그림을 그려보는 게 좋은 복습이 될 듯하다

9. bag기록

-rosbag: 발행하는 토픽을 파일 형태로 저장하고 필요할 때 저장된 토픽을 다시 불러와 동일 타이밍으로 재생할 수 있는 기능
-매번 토픽을 발행할 때마다 환경에 따라 결과가 미세하게 달라질 수 있기 때문에, 같은 환경을 조성할 수 있는 이점이 있다.

ros2 bag record 뒤에 기록하고자 하는 토픽 이름을 적으면 된다.
기록 종료는 다른 명령어와 마찬가지로 Ctrl+C를 누르면 된다.

$ ros2 bag record /turtle1/cmd_vel


나는 위와 같이 turtle을 움직였다.

10. bag정보

저장된 rosbag 파일의 정보를 확인해 보자.
위의 명령에서 rosbag이 'rosbag2_2022_07_25-11_30_27/rosbag2_2022_07_25-11_30_27_0.db3'로 저장돼 있음을 볼 수 있다.
ros2 bag info 뒤에 rosbag2_2022_07_25-11_30_27/를 붙이면 bag정보를 확인할 수 있다.

$ ros2 bag info rosbag2_2022_07_25-11_30_27/

11. bag 재생

turtlesim노드를 종료하고 다시 실행해 초기화한 후, bag을 재생해 거북이가 똑같이 움직이는지 보자.

$ ros2 bag play rosbag2_2022_07_25-11_30_27

똑같이 동작하는 걸 확인할 수 있다.

12. ROS 인터페이스

-ROS 인터페이스: 토픽, 서비스, 액션을 사용해 ROS 노드 간에 데이터를 주고받을 때, 이 때 사용되는 데이터의 형태
-토픽-msg interface, 서비스-srv interface, 액션-action interface 사용

13. 메시지 인터페이스

지금까지 계속 다뤘던 /turtle1/cmd_vel 토픽은 geometry_msgs/msgs/Twist 형태이다.
geometry_msgs 패키지(기하학 관련 메시지를 모아둠)의, msgs 분류의, Twist 데이터 형태라는 뜻이다.

Twist 데이터 형태를 자세히 보면 Vector3 linear과 Vector3 angular 이라고 되어 있다.
Vector3 형태에 linear이라는 이름의 메시지,
Vector3 형태에 angular 이라는 이름의 메시지가 있다는 것이며
Vector3는 다시 float64 형태로 x, y, z 값이 존재한다.

따라서 /turtle1/cmd_vel 또한 float64 자료형의 병진 속도 3개(linear.x, linear.y, linear.z), 회전 속도 3개(angular.x, angular.y, angular.z)의 메시지이다.

이 메세지들을 살펴보자.

$ ros2 interface show geometry_msgs/msg/Twist

$ ros2 interface show geometry_msgs/msg/Vector3

list는 현재 개발 환경의 모든 msg, srv, action 메시지를 보여준다.

$ ros2 interface list

packages는 msg, srv, action 인터페이스를 담고 있는 패키지의 목록을 보여준다.

$ ros2 interface packages

package 옵션에 패키지명을 입력하면 지정한 패키지에 포함된 인터페이스들을 보여준다.

$ ros2 interface package turtlesim

proto에 특정 인터페이스 형태를 입력하면 그 인터페이스의 기본 형태를 표시해준다.

$ ros2 interface proto geometry_msgs/msg/Twist
profile
할수이따 ~

0개의 댓글