1. 토픽 (topic)
토픽(topic)은 그림 1의 `Node A - Node B`처럼 비동기식 단방향 메시지 송수신 방식으로 msg 메시지 형태의 메시지를 발행하는 `Publisher`와 메시지를 구독하는 `Subscriber` 간의 통신이라고 볼 수 있다. 이는 1:1 통신을 기본으로 하지만 그림 2의 `Node A - Node B`, `Node A - Node C`와 같이 하나의 토픽(예: Topic C)을 송수신하는 1:N도 가능하고 그 구성 방식에 따라 N:1, N:N 통신도 가능하며 ROS 메시지 통신에서 가장 널리 사용되는 통신 방법이다.
그리고 그림 2의 `Node A`처럼 하나의 이상의 토픽을 발행할 수 있을 뿐만이 아니라 `Publisher` 기능과 동시에 토픽(예: Topic D)을 구독하는 `Subscriber` 역할도 동시에 수행할 수 있다. 원한다면 자신이 발행한 토픽을 셀프 구독할 수 있게 구성할 수도 있다. 이처럼 토픽 기능은 목적에 따라 다양한 방법으로 사용할 수 있는데 이러한 유연성으로 다양한 곳에 사용중에 있다. 경험상 ROS 프로그래밍시에 70% 이상이 토픽으로 사용될 정도로 통신 방식 중에 가장 기본이 되며 가장 널리쓰이는 방법이다. 기본 특징으로 비동기성과 연속성을 가지기에 센서 값 전송 및 항시 정보를 주고 받아야하는 부분에 주로 사용된다.
8. 토픽 발행 (ros2 topic pub)
토픽의 발행(publish)은 ROS 프로그램에 내장하는게 기본이다. 이는 ROS 프로그래밍 시간에 다루도록 하고 여기서는 `ros2 topic pub` 명령어를 통해 간단히 토픽을 발행하는 테스트를 해보자. 이 명령어의 사용은 다음과 같다. `ros2 topic pub` 명령어에 토픽 이름, 토픽 메시지 타입, 메시지 내용을 기술하면 된다.
ros2 topic pub <topic_name> <msg_type> "<args>"
즉, 아래와 같이 기술하면 되는데 아래 명령어를 풀어 해석하자면 `--once` 옵션을 사용하여 단 한번의 발행만을 수행하도록 하였으며, 토픽 이름으로는 /turtle1/cmd_vel 을 사용하였고, 토픽 메시지 타입은 geometry_msgs/msg/Twist 을 사용하였다. 메시지 내용으로는 병진 속도 linear.x 값으로 2.0 m/s를 넣었고, 회전 속도 angular.z 값으로 1.8 rad/s를 입력하였다.
$ 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` 옵션 제거하고 대신 `--rate 1` 옵션처럼 주기 1Hz의 발행도 할 수 있다. 이를 사용하면 그림 9와 같이 동작할 것이다.
$ 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}}"
* Remapping
ros2 run turtlesim turtle_teleop_key --ros-args --remap turtle1/cmd_vel:=turtle2/cmd_vel
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle
9. bag 기록 (ros2 bag record)
ROS에는 발행하는 토픽을 파일 형태로 저장하고 필요할 때 저장된 토픽을 다시 불러와 동일 타이밍으로 재생할 수 있는 기능이 있다. 이를 rosbag이라고 한다. 이는 매우 유용한 ROS의 기능으로 디버깅에 큰 도움을 준다.
예를 들어 내가 SLAM 알고리즘을 개발한다면 알고리즘 개발에 집중하기 위해서는 SLAM에 필요한 라이다와 같은 센서 정보와 로봇의 위치 정보인 오도메트리와 같은 상태 정보가 필요한데 매번 로봇을 구동시켜 데이터를 취득하기도 힘들고 데이터 취득을 매번하여 테스트를 하더라도 센서 정보 및 로봇 상태 값에 따라 결괏값이 상이해져 알고리즘이 좋아진 것인지 테스트할 때 운이 좋게 센서 및 로봇 상태 값이 좋았는지 구분하기 어렵다. 이럴 때에는 알고리즘의 입력 값을 고정하고 반복하여 테스트할 수 있다면 알고리즘만의 개선 작업 및 성능 검증 테스트를 할 수 있게 된다. rosbag은 이러한 상황에서 원하는 토픽을 기록하고 재생하는 도구이다.
rosbag은 다음과 같이 bag 기록 (ros2 bag record) 명령어에 내가 기록하고자 하는 토픽 이름을 기재하면 된다. 예를 들어 /turtle1/cmd_vel 토픽을 기록하려면 다음 명령어와 같이 실행해주면 된다. 기록 종료는 프로그램을 종료하면 되는데 일반적인 노드 종료와 마찬가지로 해당 터미널 창에서 `Ctrl + c`를 눌러주면 된다. 기록이 종료되면 `rosbag2_2020_09_04-08_31_06` 이라는 이름으로 폴더가 생성된다. 참고로 원하는 이름이 별도로 있다면 `ros2 bag record -o 이름 /turtle1/cmd_vel` 과 같이 `-o` (output) 옵션을 이용하여 특정 이름을 지정해도 된다.
ros2 bag record <topic_name1> <topic_name2> <topic_name3>
ros2 bag record /turtle1/cmd_vel [INFO]: Opened database 'rosbag2_2020_09_04-08_31_06'. [INFO]: Listening for topics... [INFO]: Subscribed to topic '/turtle1/cmd_vel'
10. bag 정보 (ros2 bag info)
저장된 rosbag 파일의 정보를 확인하려면 아래 예제와 같이 bag 정보 (ros2 bag info) 명령어를 이용하면 된다. 내용을 살펴보면 방금 전 우리가 기록한 이 rosbag 파일은 84.4 KiB 크기에 31.602s 시간 동안 기록되었고, 기록이 언제 시작되고 언제 끝났는지 타임스태프와 취득한 토픽의 이름 메시지 형태 메시지 별 갯수와 총 갯수 등이 기록되어 있다.
$ ros2 bag info rosbag2_2020_09_04-08_31_06/
Files: rosbag2_2020_09_04-08_31_06.db3
Bag size: 84.4 KiB
Storage id: sqlite3
Duration: 31.602s
Start: Sep 4 2020 08:31:09.952 (1599175869.952)
End Sep 4 2020 08:31:41.554 (1599175901.554)
Messages: 355
Topic information: Topic: /turtle1/cmd_vel | Type: geometry_msgs/msg/Twist | Count: 355 | Serialization Format: cdr
11. bag 재생 (ros2 bag play)
rosbag 파일을 기록하고 정보를 확인해봤으니 이제는 재생을 해보자. 일단 turtlesim 노드를 종료한 후 다시 시작하여 초기화를 해준 후 아래의 예제처럼 rosbag를 재생하면 기록 시간 타이밍에 따라 토픽이 재생됨을 확인할 수 있다. 이는 위에서 설명한 `ros2 topic echo /turtle1/cmd_vel` 명령어를 이용하여 터미널 창에서 학인해도 되고, 그림 11와 같이 turtlesim 노드위의 거북이의 움직임을 비교해도 된다.
ros2 bag play rosbag2_2020_09_04-08_31_06/
[INFO]: Opened database 'rosbag2_2020_09_04-08_31_06/'.
13. 메시지 인터페이스 (message interface, msg)
지금까지 우리가 다루었던 그림 12의 /turtle1/cmd_vel 토픽은 geometry_msgs/msgs/Twist 형태이다. 이름이 좀 긴데 풀어서 설명하면 기하학 관련 메시지를 모아둔 geometry_msgs 패키지의 msgs 분류의 Twist 데이터 형태라는 것이다.
Twist 데이터 형태를 자세히 보면 Vector3 linear과 Vector3 angular 이라고 되어 있다. 이는 메시지 안에 메시지를 품고 있는 것으로 Vector3 형태에 linear 이라는 이름의 메시지와 Vector3 형태에 angular 이라는 이름의 메시지, 즉 2개의 메시지가 있다는 것이며 Vector3는 다시 float64 형태에 x, y, z 값이 존재한다.
다시 말해 geometry_msgs/msgs/Twist 메시지 형태는 float64 자료형의 linear.x, linear.y, linear.z, angular.x, angular.y, angular.z 라는 이름의 메시지인 것이다. 이를 통해 병진 속도 3개, 회전 속도 3개를 표현할 수 있게 된다.
'자동제어 > ROS2' 카테고리의 다른 글
ROS2 13장 액션(action) (0) | 2023.04.13 |
---|---|
ROS2 12장 서비스 (0) | 2023.04.13 |
리눅스 민트 설정 (0) | 2023.04.11 |
001: ROS2 개발 환경 구축 (1) | 2023.04.10 |