먼저, 앞에 world파일을 먼저 만들고 map을 만들기 위해 필요한 과정인 launch 파일을 작성해보자. world파일이 궁금한 분들은 본래 ros의 world파일을 보는 방법 + sdformat.org를 같이 본다면 빠른 습득이 가능할 것이다.
launch파일을 공부하기위해
직접 파일을 보고 습득해보자.
(먼저, http://wiki.ros.org/roslaunch/XML의 4.Tag Reference를 참조하였다.)
<launch>는 root element of any roslaunch file로써 기본 시작이다.
그 다음으로 큰 카테고리인 <include>는 다음의 예를 보고 이해해보자.
위의 페이지 <arg> 페이지에 들어가게 되면 다음과 같은 예시를 들어주고 있다.
즉, my_file.launch에서 included.launch를 부르고 있는 모습을 볼 수 있다.
<include>태그를 통해서 included.launch를 부르고 그 안에서 <arg>태그의 역할은 included.launch파일에서 "hoge"대신이 된다.
included.launch에서 "hoge"의 역할은 <param>태그안에서 설정되어 있는데 그 안의 값을 "fuga"가 되는 것이다. 따라서
my_file.launch 파일은
included.launch
<launch>
<arg name="fuga" />
<param name="param" value="fuga"/>
</launch>
가 되는 파일을 부르는 것이다.
+ <arg>태그를 정리해보자!
<arg>태그는 세 가지 방법으로 쓰일 수 있다.
1) <arg name="foo" />
: foo를 정의(declares), 단 이것은 command line 또는 <include>를 통해 정의될 수 있다.
2) <arg name="foo" default="1" />
: default값을 가진 foo를 정의, 이 또한 command line, <include>를 통해 정의 될 수 있다.
3) <arg name="foo" value="bar" />
: 상수(constant value)를 가진 foo를 정의, overriden 할 수 없다.
더 높은 레벨의 접근필요없이 내부 파라미터의 사용을 가능케 함.
Attributes
- name="arg_name"
- : name of argument.
- default="default value" (optional)
- : default value of argument. value attribute와 함께 쓸 수 x
- value="value" (optional)
- : argument value. default attribute와 함께 쓸 수 x
- doc="description for this arg" (optional) New in Indigo
- : description of the argument.
그 다음으로 큰 카테고리인 <node>태그의 역할은 우리가 ros에서 배운 "node"를 부르는 것이다. node를 만드려면 node를 정의하는 파일이 필요하니까 그 파일들에 대한 정보를 제공해주는 것이다.
turtlebot_world.launch에서는 두 가지 node가 선언되어 있다.
1) robot의 상태 node
<node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher">
<param name="publish_frequency" type="double" value="30.0" /></node>
2) robot의 laserscan node
<!-- Fake laser -->
<node pkg="nodelet" type="nodelet" name="laserscan_nodelet_manager" args="manager"/><node pkg="nodelet" type="nodelet" name="depthimage_to_laserscan"
args="load depthimage_to_laserscan/DepthImageToLaserScanNodelet laserscan_nodelet_manager">
<param name="scan_height" value="10"/>
<param name="output_frame_id" value="/camera_depth_frame"/>
<param name="range_min" value="0.45"/>
<remap from="image" to="/camera/depth/image_raw"/>
<remap from="scan" to="/scan"/>
</node>
자, 그러면 위의 캡처 사진인 turtlebot_world.launch파일을 살펴보자.
(node 태그는 살펴보았으니 생략하도록 한다.)
<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="$(arg gui)" />
<arg name="world_name" value="$(arg world_file)"/>
</include>
위와 같은 경로로 들어가서 empty_world.launch파일을 열게되면
<arg name="use_sim_time" value="true"/>
<arg name="debug" value="false"/><arg name="gui" value="$(arg gui)" />
<arg name="world_name" value="$(arg world_file)"/>
다음과 같은 <arg>태그를 찾아볼 수 있다. 즉, turtlebot_world.launch파일에서 empty_world.launch파일을 읽어들이는데 다음과 같은 값을 넣어 불러들이겠다는 것이다.
특히
<arg name="gui" value="$(arg gui)" />
<arg name="world_name" value="$(arg world_file)"/>
이 <arg>태그 $(arg gui)은 empty_world.launch의 <arg name="gui" default="true"/>를 말하고 있다. 이런 부분은
사진과 같이 launch파일은 많고 어떤 파일이 불릴지 모를 상황에서 각자 안의 값이 다르기 때문에 다음과 같이 선언하고있다.
댓글 없음:
댓글 쓰기