일전 예시 실행에서 다음과 같은 커멘드 라인을 사용했었습니다.
roslaunch smb_gazebo smb_gazebo.launch
roslaunch란, 다수의 ROS Node들을 한번에 실행할 수 있도록 해주는 툴 입니다.
roslaunch를 사용하기 위해서는 xml이라는 포멧을 사용하는 launch file이 있어야 하며, 이는 보통 패키지의 launch 폴더에 위치하고 있습니다.
launch file의 구조를 파악해봅시다.
xml
이라는 문법을 사용합니다. html을 사용해보셨다면 아시겠지만, <>를 이용하여 라인을 구분하는 포멧입니다.<tag />
or
<tag (value)>
...
</tag>
launch file은 시작과 끝, 태그로 감싸집니다.
<launch>
<node name="listener" pkg="rospy_tutorials" type="listener.py" output="screen"/>
<node name="talker" pkg="rospy_tutorials" type="talker.py" output="screen"/>
</launch>
이번에는 smb_gazebo.launch
를 살펴봅시다.
<?xml version="1.0" encoding="utf-8"?>
<launch>
<!-- GAZEBO ARGUMENTS -->
<!-- Run Gazebo headless -->
<arg name="headless" default="false"/>
<arg name="model_path" default="$(find smb_gazebo)/"/>
<arg name="robot_namespace" default=""/>
<arg name="robot_model_name" default="smb"/>
<arg name="enable_ekf" default="true"/>
...
<!-- Load Gazebo world -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<env name="GAZEBO_MODEL_PATH" value="$(arg model_path)"/>
<arg name="world_name" value="$(arg world_file)"/>
<arg name="paused" value="$(arg paused)"/>
<arg name="use_sim_time" value="$(arg use_sim_time)"/>
<arg name="gui" value="$(arg run_gui)"/>
<arg name="headless" value="$(arg headless)"/>
<arg name="debug" value="$(arg debug)"/>
<arg name="verbose" value="$(arg verbose)"/>
</include>
arg란, argument의 약자이며 launch 파일에서 인자로 작용하는 일종의 변수입니다.
예를 들어, smb_gazebo.launch 실행 시. world를 바꾸어 아래와 같이 사용이 가능합니다.
roslaunch smb_gazebo smb_gazebo.launch world:=big_map_summer_school
초기 실행 시 시간이 다소 걸릴 수 있습니다.
현재 예시에서 제공되는 world는 다음 3가지 입니다.
roslaunch smb_gazebo smb_gazebo.launch
제작한 launch file을 다시 다른 launch file에서 불러오는 경우가 더러 있습니다.
이때, include 태그를 사용하며, 패키지 단위를 기반으로 파일의 경로를 가져오게 됩니다.
include하는 launch file의 내부에도 여러 argument들이 있을 것입니다. 이들은 arg 태그를 통해 접근할 수 있습니다.
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<env name="GAZEBO_MODEL_PATH" value="$(arg model_path)"/>
<arg name="world_name" value="$(arg world_file)"/>
<arg name="paused" value="$(arg paused)"/>
<arg name="use_sim_time" value="$(arg use_sim_time)"/>
<arg name="gui" value="$(arg run_gui)"/>
<arg name="headless" value="$(arg headless)"/>
<arg name="debug" value="$(arg debug)"/>
<arg name="verbose" value="$(arg verbose)"/>
</include>
html과 마찬가지로 <!-- -->
사이에 오는 코드는 주석으로 무시됩니다.
단, 주의사항 하나 있습니다. launch 파일을 사용하다보면 --
가 종종 쓰이곤 하는데요. 이 경우 주석에 오류가 나니 주의하시기 바랍니다.
Launch File을 다루는 연습을 해봅시다.
smb_gazebo.launch를 다음과 같이 수정합니다.
ROS에는 로봇의 다양한 센서 데이터들을 시각화해주는 3D 툴이 있으며, 이는 RViz라고 불립니다.
Rviz의 사용법을 알아봅시다.
# Terminal 1
roslaunch smb_gazebo smb_gazebo.launch world:=big_map_summer_school
# Terminal 2
rviz
사진과 같이 Gazebo와 RViz가 잘 실행된 상황에서 강의를 따라합니다.
rviz에서 센서 데이터를 시각화하기 전, 우선 어떤 좌표계를 기준으로 시각화할지 설정해주어야 합니다.
같은 센서라도 원점 좌표계에서 본 모습과, 센서 좌표계에서 본 모습이 다르기 때문입니다.
이는 RViz의 Fixed Frame에서 설정 가능합니다. (odom으로 설정해보겠습니다.)
이제 다양한 시각화 기능들을 사용해보려 합니다.
이렇게 잘 설정해둔 RViz는 config 포멧으로 추출하여 이후에 다시 사용할 수 있습니다.
File ⇒ Save Config를 통해 config를 저장하고, Open Config를 통해 저장한 config를 불러올 수 있습니다.
아래와 같이 다양한 Plugin을 통해 여러 센서, 로봇 데이터를 시각화할 수 있으며, 자신만의 Plugin을 제작할 수도 있습니다.
지금까지 여러분들이 만든 RViz 설정을 저장해보고, launch file에 통합해봅시다.
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find smb_gazebo)/rviz/my_config.rviz" />
</launch>
이제, 다시 Gazebo launch를 해봅시다.
roslaunch smb_gazebo smb_gazebo.launch world:=big_map_summer_school
지금까지 사용한 ROS 툴은 rqt_graph와 RViz가 있었습니다.
사실 ROS에는 수많은 추가 툴들이 존재하며 이들을 묶어 rqt tools라고 부릅니다.
image from : wiki.ros.org
image from : project march
image from : wiki.ros.org
image from : rqt tf tree
이러한 수많은 툴들이 있어 ROS 개발을 편리하게 해주고 있으며, 함께 ROS를 공부하면서 하나씩 같이 살펴보고 사용해보려 합니다.
참고자료