roslaunch

$ roslaunch

  • *.launch 파일 내용에 따라 여러 노드들을 한꺼번에 실행할 수 있음

    • *.launch 파일은 실행시킬 노드들의 정보가 XML 형식으로 기록되어 있음
    • 예를들어, 아래의 launch 파일은 4개의 노드들을 한번에 실행시켜주는 것

    image

    • node 태그란?

      • 실행할 노드 정보를 입력할 때 사용되는 태그

      e.g. <node pkg ="my_pkg1" type = "pub.py" name="pub_node"/>

      • 속성

        • pkg : 실행시킬 노드의 패키지 이름을 입력하는 속성

          • 반드시 빌드된 패키지의 이름을 입력해야 함
        • type : 노드의 소스코드가 담긴 파이썬 파일의 이름을 입력하는 속성

          • 이때 파이썬의 .py 파일은 반드시 실행권한이 있어야함
          • 실행권한이 없을 경우 다음과 같은 에러가 발생

          image

        • name : 노드의 이름을 입력하는 속성

          • 소스코드에서 지정한 노드의 이름을 무시하고, launch 파일에 기록된 노드의 이름으로 노드가 실행
    • include 태그

      • 다른 launch 파일을 불러오고 싶을 때 사용하는 태그

      e.g. <include file = '../cam/cam_test.launch' />

      e.g. <include file = "$(find usb_cam)/src/launch/aaa.launch"/>

  • $ roslaunch [패키지 이름] [실행시킬 launch 파일 이름]

    e.g. $ roslaunch my_pkg1 aaa.launch

  • [실행시킬 launch 파일]은 반드시 패키지에 포함된 launch 파일이어야 함

image

Launch 디렉터리 만들기 및 파일 작성

  • $ roslaunch [package_name] [file.launch]

  • 여러 노드를 함께 실행시킬 때 편리

  • 다수의 노드를 한꺼번에 실행 가능

  • 파라미터 값을 노드에 전달 가능

  • $ mkdir launch

  • $ gedit pub-sub.launch 를 launch 디렉터리에서 실행하고 아래의 내용을 입력

<launch>
	<node pkg = "turtlesim" type = "turtlesim_node" name = "turtlesim_node"/>
    <node pkg = "my_pkg1" type = "pub.py" name = "pub_node"/>
    <node pkg = "my_pkg1" type = "sub.py" name = "sub_node" output="screen"/>	
</launch>
  • $cm 을 입력해 새로 작성한 launch 파일에 대해 build를 진행함

  • $ roslaunch my_pkg1 pub-sub.launch

    • roslaunch 명령을 사용할 때는 roscore 명령을 실행할 필요가 없음 -> 자동으로 실행됨

실행결과

  • 3개의 노드들이 정상적으로 실행됨

image

launch 파일 사례

  • USB 카메라 구독과 파라미터 세팅을 위한 launch 파일
  • 패키지 이름은 ‘usb_cam’
  • 파라미터 총 5개 : autoexposure, exposure, image_width, image_height, camera_frame_id
<launch>
	<node name = "usb_cam" type = "cam_node" pkg="usb_cam" output= "screen"/>
    	<param name = "autoexposure" value ="false" />
    	<param name = "exposure" value ="150" />
    	<param name = "image_width" value ="640" />
    	<param name = "image_height" value ="480" />
    	<param name = "camera_frame_id" value ="usb_cam" />
   	</node>
</launch>

param 태그

  • ROS 파라미터 서버에 변수를 등록하고 그 변수에 값을 설정하기 위한 태그
  • 속성
    • name : 등록할 변수의 이름
    • type : 등록할 변수의 타입 (사용 할 수 있는 타입의 종류 : str, int, double, bool, yaml)
    • value : 등록할 변수의 값
  • ROS 파라미터 서버에 등록된 변수는 노드 코드에서 불러와 사용할 수 있음

image

파라미터 전달 실습

  • $ gedit pub-sub-param.launch 를 입력해 circle_size 파라미터가 있는 launch 파일을 만듬
<launch>
	<node pkg = "turtlesim" type = "turtlesim_node" name = "turtlesim_node"/>
    <node pkg = "my_pkg1" type = "pub.param.py" name = "node_param"/>
    	<param name = "circle_size" value="4"/>
    </node>
    <node pkg = "my_pkg1" type = "sub.py" name = "sub_node" output="screen"/>	
</launch>
- 패키지 이름 : my_pkg1
- 타입(소스코드 파일) = pub_param.py
- 노드 이름 = node.param
- 파라미터 이름 = circle_size
- 파라미터 값 = 4
  • $ cp pub.py pub_param.py pub.py를 복사해서 pub_param.py를 만듬
  • $ gedit pub_param.py 를 입력하여 코드를 아래처럼 수정함
  • msg.linear.x = 2.0을 주석처리하고 새로운 linear_X 변수를 만들어 ‘circle_size’라는 파라미터 변수 값을 받아오도록 코드를 변경함
#!/usr/bin/env python

import rospy
from geometry_msgs.msg import Twist

rospy.init_node('my_node', anonymous=True)
pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10)

msg = Twist()

# msg.linear.x = 2.0 
linear_X = rospy.get_param('~circle_size')
msg.linear.x = linear_x

msg.linear.y = 0.0
msg.linear.z = 0.0
msg.angular.x = 0.0
msg.angular.y = 0.0
msg.angular.z = 1.8

실행결과

  • parameter 값을 변경하면 변경한 값 크기의 원을 그리는 것을 확인할 수 있음

image