출처: YOUTUBE: ROS 1 (05강 of 25강) - Developers and Creators
Node 실행 방식은 크게 두 가지로 나뉨.
1. roslaunch < package-name > < lauch-file-name.launch >
: launch 파일을 통해 한번에 여러 개 Node 동시 실행 가능.
$ roslaunch gcamp_gazebo gazebo_world.launch
2. rosrun < package-name > < executable-file-name >
: 단 하나의 Node를 실행하는 것.
$ rosrun teleop_twist_keyboard teleop_twist_keyboard.py
roslaunch 사용을 위해 필요한 launch file에 대해 알아보고자 함.
$ cd ~/gcamp_ws/src/gcamp_ros_basic/gcamp_gazebo
$ l
CMakeLists.txt launch/ meshes/ package.xml rviz/ urdf/ worlds/
launch 파일 내

이렇게 들어있고, 그 중 gazebo_world.launch에 대해 알아보고자 함.
<?xml version="1.0" encoding="UTF-8"?>
<launch>
<!-- Robot pose -->
<arg name="x" default="0"/>
<arg name="y" default="0"/>
<arg name="z" default="0"/>
<arg name="roll" default="0"/>
<arg name="pitch" default="0"/>
<arg name="yaw" default="0"/>
<arg name="world_name" default="gcamp_world.world"/>
<arg name="world_file" default="$(find gcamp_gazebo)/worlds/$(arg world_name)"/>
<arg name="model_name" default="tinybot"/>
<arg name="package_name" default="gcamp_gazebo" />
<arg name="path" value="(find $(arg package_name))" />
<arg name="dollar" value="$" />
<!-- Launch other relevant files-->
<include file="$(arg dollar)$(arg path)/launch/robot_description.launch"/>
<!-- Launch Gazebo World -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="use_sim_time" value="true"/>
<arg name="debug" value="false"/>
<arg name="gui" value="true" />
<arg name="world_name" value="$(arg world_file)"/>
</include>
<!-- Spawn My Robot -->
<node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
args="-urdf -param robot_description -model $(arg model_name)
-x $(arg x) -y $(arg y) -z $(arg z)
-R $(arg roll) -P $(arg pitch) -Y $(arg yaw)"/>
<!--launch rviz-->
<node pkg="rviz" type="rviz" name="rviz" args="-d $(arg dollar)$(arg path)/rviz/tinybot.rviz"/>
</launch>
launch 파일은 xml 문법을 사용한다고 하니,
가볍게 짚고 넘어가보기로.
(1) line 시작/끝/태그
<tag />
or
<tag (value)>
...
</tag>
line은 /로 종료되어야 함.
(2) tag 종류
launch : launch 파일임을 알려주는 tag. html의 body와 비슷하다고 볼 수 있음.
include : launch 파일에서 다른 launch파일을 가져올 수 있음. 모듈화 잘 해두었다면 수월하겠죠.
<include file="$(arg dollar)$(arg path)/launch/robot_description.launch"/>
<include file="$(find gazebo_ros)/launch/empty_world.launch">
node : 단일 node를 추가하고자 하는 경우 사용. 직접 만든 node를 launch파일로 만들고자 하는 경우 많이 사용됨. <node pkg="rviz" type="rviz" name="rviz" args="-d $(arg dollar)$(arg path)/rviz/tinybot.rviz"/>
arg : 변수 설정하듯, 파일 안에서 사용될 argument 지정. # argument 설정
<arg name="test_arg" value="Hello"/>
<arg name="test_arg2" default="0"/>
# argument 사용
<arg name="package_name" default="gcamp_gazebo" />
<arg name="path" value="(find $(arg package_name))" />
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="use_sim_time" value="true"/>
<arg name="debug" value="false"/>
<arg name="gui" value="true" />
<arg name="world_name" value="$(arg world_file)"/>
</include>
`empty_world.launch`에는 `use_sim_time`, `debug`, `gui`, `world_name`라는 arg들이 있을 것임.
좀 더 직접적으로 살펴보자면,
$ roscd gazebo_ros
$ cd launch
$ gedit empty_world.launch
상단 코드를 통해 진입.
(roscd 사용하여 특정 ROS 패키지로 진입)
<?xml version="1.0"?>
<launch>
<!-- these are the arguments you can pass this launch file, for example paused:=true -->
<arg name="paused" default="false"/>
<arg name="use_sim_time" default="true"/>
<arg name="extra_gazebo_args" default=""/>
<arg name="gui" default="true"/>
<arg name="recording" default="false"/>
<!-- Note that 'headless' is currently non-functional. See gazebo_ros_pkgs issue #491 (-r arg does not disable
rendering, but instead enables recording). The arg definition has been left here to prevent breaking downstream
launch files, but it does nothing. -->
<arg name="headless" default="false"/>
<arg name="debug" default="false"/>
<arg name="physics" default="ode"/>
<arg name="verbose" default="false"/>
<arg name="output" default="screen"/>
<arg name="world_name" default="worlds/empty.world"/> <!-- Note: the world_name is with respect to GAZEBO_RESOURCE_PATH environmental variable -->
<arg name="respawn_gazebo" default="false"/>
<arg name="use_clock_frequency" default="false"/>
<arg name="pub_clock_frequency" default="100"/>
<arg name="enable_ros_network" default="true" />
<arg name="server_required" default="false"/>
<arg name="gui_required" default="false"/>
(...)
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<include file="$(find gazebo_ros)/launch/empty_world.launch">
find < package-name >을 통해 다른 패키지에 있는 파일을 가져올 수 있음.
단, launch file 안에 넣기 전, rosrun을 통해 작동에 이상이 없는지 먼저 확인해 봐야한다고 함.
(3) 주석
xml 주석은 html 주석과 마찬가지로 <!-- --> 사이에 오는 코드는 무시됨.
단, launch 파일을 사용 시 --가 자주 쓰이는데, 이 경우 주석 오류 나니 주의 필요.

오픈소스 패키지를 사용하면 launch 파일 분석을 통해 많은 정보들을 파악할 수 있음.
단, 그만큼 우리가 만들 패키지 또한, 파일 정리를 잘 해야 추후 효율적으로 사용할 수 있을 것임!