[ROS STUDY] ROS 5강

‍이수빈·2025년 2월 10일

[ROS STUDY]

목록 보기
5/12

출처: YOUTUBE: ROS 1 (05강 of 25강) - Developers and Creators

rosrun & roslaunch

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

launch file

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에 대해 알아보고자 함.

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>

xml

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하는 launch 파일에도 arg가 있는 경우, 하단과 같이 설정 가능.
	<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"/>

(...)
  • $(find pkg)
	<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 파일 분석을 통해 많은 정보들을 파악할 수 있음.
단, 그만큼 우리가 만들 패키지 또한, 파일 정리를 잘 해야 추후 효율적으로 사용할 수 있을 것임!

profile
🏫 Kookmin University, Major in Electrical Engineering (First Major), AI Big Data & Management (Double Major), Smart Car ICT (Interdisciplinary Major)

0개의 댓글