2017년 6월 30일 금요일

#Ros_launch_file_작성하기!


먼저, 앞에 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파일은 많고 어떤 파일이 불릴지 모를 상황에서 각자 안의 값이 다르기 때문에 다음과 같이 선언하고있다.

댓글 없음:

댓글 쓰기