ROS 2는 rqt라는 프로그램의 집합을 제공합니다. rqt의 GUI를 사용하면 데이터 시각화, 코딩 없이 통신 메커니즘과 상호 작용, tf frame의 시각화 등 ROS 2 프로그래밍이 매우 매우 편해집니다.
이번 시간을 통해 몇가지 자주 사용되는 rqt들을 살펴보고, 약간의 실습도 진행해보겠습니다.
rqt
⇒ 초기 실행 시 빈 화면이 등장하지만, 상단 탭을 통해 수많은 응용 프로그램들을 확인할 수 있습니다.
rqt_graph는 node와 topic에 대해 시각화하여 한 장의 이미지를 보여주는 툴로, 가장 많이 사용되는 Rqt Tool입니다.
rqt_graph
Node Option | Hide Option | ETC |
---|---|---|
Node Only | Dead sinks | Group Option |
Nodes/Topics (Active) | Leaf Topics | Actions |
Nodes/Topics (All) | Debug | tf |
tf | Images | |
Unreachable | Highlight | |
Params | Fit |
⇒ 참고로, rqt_graph의 node에 마우스 커서를 가져가면 관련 topic들의 색상을 바꿔줍니다. (Highlight)
Topic 이름을 잘못 생성하거나 겹치는 경우, 코드 차원에서 디버깅이 힘들지만 rqt_graph를 사용하면 손쉽게 판별 가능합니다.
rqt 상단의 탭에서 다음과 같이 화면을 구성합니다.
# Terminal 1
ros2 launch husky_gazebo husky_playpen.launch.py
# Terminal 2
rqt
rqt 상단의 탭에서 다음과 같이 화면을 구성합니다.
# Terminal 1 - Run Gazebo ROS
ros2 launch gazebo_ros gazebo.launch.py
# Terminal 2 - rqt & Service Caller
rqt
Rviz2는 ROS 2 개발 중 발생하는 수많은 로봇 데이터들을 시각화해주는 고마운 툴입니다. 다른 rqt 프로그램들은 몰라도, Rviz2의 사용법은 반드시 익혀두시기를 추천합니다.
# install requirements
cd du2023-ros2
./setup_scripts.sh
# package build
cd ~/ros2_ws
cbp src_controller && source install/local_setup.bash
cbp src_gazebo && source install/local_setup.bash
cbp src_odometry && source install/local_setup.bash
# demo env launch
ros2 launch src_gazebo racecourse.launch.py
⇒ 현재는 제가 미리 준비해둔 rviz2 화면이 등장했지만, 실습을 통해 이런 rviz2 화면을 구성하고 launch file을 통해 실행하는 법까지 다루어 보겠습니다.
rviz2
⇒ Orbit이 기본이며, 종종 TopDownOrtho도 사용됩니다.
rviz2에서는 By display type / By Topic의 두가지 add option을 제공합니다.
Topic type을 사용하면 rviz2가 현재 실행되고 있는 topic을 인식하여 적합한 시각화를 해주게됩니다.
Display type은 원하는 시각화 타입을 먼저 선택하고, 해당 타입을 갖는 topic을 사용자가 매칭하는 방식입니다.
rviz2 또한 ros2 node입니다. 그렇기에 launch file에서의 실행은 일반 node와 동일합니다.
# Launch RViz
rviz = Node(
package='rviz2',
executable='rviz2',
name='rviz2',
output='screen',
)
import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
pkg_path = os.path.join(get_package_share_directory('src_gazebo'))
rviz_config_file = os.path.join(pkg_path, 'rviz', 'gazebo_racecourse.rviz')
# Launch RViz
rviz = Node(
package='rviz2',
executable='rviz2',
name='rviz2',
output='screen',
arguments=['-d', rviz_config_file]
)
return LaunchDescription([
rviz
])
install(
DIRECTORY
launch
meshes
models
config
worlds
rviz
urdf
DESTINATION
share/${PROJECT_NAME}/
)
# Package build again
cbp src_gazebo
source install/local_setup.bash
# execute your launch file
ros2 launch src_gazebo <your-launch-file>
# package install
sudo apt install ros-foxy-rqt-robot-steering
# run node
rqt_robot_steering
# Terminal 1
ros2 launch husky_gazebo husky_playpen.launch.py
# Terminal 2
rqt_robot_steering
rosbag은 프로그램 동작 중 발생하는 message 데이터를 기록하고 복기할 수 있게 해주는 툴입니다. 로봇 알고리즘을 개발할 때, 같은 상황에 대해 성능을 비교하는 경우, 혹은 교육 목적으로 데이터셋을 제공하는 경우 등에 매우 유용하게 사용할 수 있습니다.
# Example package clone
cd ~/ros2_ws/src
git clone https://github.com/RB2023ROS/gz_ros2_examples
cd ~/ros2_ws
# Example package build
cbp lidar_world
# Run Example package
ros2 launch lidar_world lidar_world.launch.py
해당 예시는 GPU Sensor를 사용하므로 일반 랩탑에서 실행 시 오류가 발생할 수 있습니다. 랩탑에서의 실행을 원하신다면 lidar_world/urdf/sensor_stick.urdf.xacro 파일에서 CPU 버전으로 토글합니다.
<?xml version="1.0"?>
<robot name="sensor_stick" xmlns:xacro="http://www.ros.org/wiki/xacro">
...
<!--Import gazebo elements-->
<!-- <xacro:include filename="$(find lidar_world)/urdf/sensor_stick.gazebo.xacro" /> -->
<!-- <xacro:include filename="$(find lidar_world)/urdf/sensor_stick_gpu.gazebo.xacro" /> -->
이런 여러 기능을 가진 시뮬레이션은 매우 느리게 동작하기 때문에 정확한 알고리즘의 검증이 불가능합니다.
# Terminal 1 - gazebo env
ros2 launch lidar_world lidar_world.launch.py
# Terminal 2 - rosbag2 install & run
sudo apt-get install ros-foxy-ros2bag ros-foxy-rosbag2*
# create seperate dir for rosbag2
mkdir ~/ros2_ws/rosbag2
cd ~/ros2_ws/rosbag2
ros2 bag record -a -o lidar_world
...
[INFO] [1681816765.163369771] [rosbag2_transport]: Listening for topics...
[INFO] [1681816765.164494950] [rosbag2_transport]: Subscribed to topic '/tf_static'
[INFO] [1681816765.165085302] [rosbag2_transport]: Subscribed to topic '/clicked_point'
[INFO] [1681816765.165696583] [rosbag2_transport]: Subscribed to topic '/tf'
[INFO] [1681816765.166304849] [rosbag2_transport]: Subscribed to topic '/goal_pose'
⇒ record의 종료는 ctrl + c를 사용합니다.
$ ros2 bag info lidar_world/lidar_world_0.db3
[INFO] [1681817128.588731891] [rosbag2_storage]: Opened database 'lidar_world/lidar_world_0.db3' for READ_ONLY.
Files: lidar_world/lidar_world_0.db3
Bag size: 569.4 MiB
Storage id: sqlite3
Duration: 16.325s
Start: Apr 18 2023 20:19:25.172 (1681816765.172)
End: Apr 18 2023 20:19:41.497 (1681816781.497)
Messages: 1068
Topic information: Topic: /clock | Type: rosgraph_msgs/msg/Clock | Count: 173 | Serialization Format: cdr
Topic: /performance_metrics | Type: gazebo_msgs/msg/PerformanceMetrics | Count: 82 | Serialization Format: cdr
...
# Terminal 1 - ros2 bag play
$ ros2 bag play lidar_world/lidar_world_0.db3
[INFO] [1681817182.011798950] [rosbag2_storage]: Opened database 'lidar_world/lidar_world_0.db3' for READ_ONLY.
...
# Terminal 2 - rviz2
$ rviz2
⇒ Fixed Frame을 link_1으로 변경해야 포인트들을 확인 가능합니다.
한차례 실습을 진행해 보았는데요, 이제 각각의 커멘드 라인 옵션들을 살펴보겠습니다.
Command | Description |
---|---|
record | topic data를 저장합니다. |
info | 저장된 rosbag 데이터의 정보를 조회합니다. |
play | 저장된 rosbag 데이터를 재생합니다. |
Command | Description |
---|---|
-a | 모든 topic data를 저장합니다. |
-o | 저장될 rosbag의 이름을 지정합니다. |
-b | rosbag 저장 시, 최대 사이즈를 지정하며 사이즈 초과 시 새로운 rosbag으로 저장됩니다. |
-d | rosbag 저장 시, 최대 시간을 지정하며 사이즈 초과 시 새로운 rosbag으로 저장됩니다. |
더불어, convert 기능을 통해 rosbag2를 쪼개거나 합할 수 있습니다. 자세한 사용법은 링크로 남겨두겠습니다. https://github.com/ros2/rosbag2#converting-bags
실제 로봇 제품이 없더라도 기록된 rosbag2 데이터를 통해 알고리즘의 검증과 시연이 가능합니다. 이번 강의에서도 rosbag2 데이터를 적극 사용하고자 하니 잘 기억해주세요!