[2023-03-27] 5. Launch 파일 사용
roslaunch
$ roslaunch
-
*.launch 파일 내용에 따라 여러 노드들을 한꺼번에 실행할 수 있음
- *.launch 파일은 실행시킬 노드들의 정보가 XML 형식으로 기록되어 있음
- 예를들어, 아래의 launch 파일은 4개의 노드들을 한번에 실행시켜주는 것
-
node 태그란?
- 실행할 노드 정보를 입력할 때 사용되는 태그
-
e.g.
<node pkg ="my_pkg1" type = "pub.py" name="pub_node"/>
-
속성
-
pkg : 실행시킬 노드의 패키지 이름을 입력하는 속성
- 반드시 빌드된 패키지의 이름을 입력해야 함
-
type : 노드의 소스코드가 담긴 파이썬 파일의 이름을 입력하는 속성
- 이때 파이썬의 .py 파일은 반드시 실행권한이 있어야함
- 실행권한이 없을 경우 다음과 같은 에러가 발생
-
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 파일이어야 함
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개의 노드들이 정상적으로 실행됨
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 파라미터 서버에 등록된 변수는 노드 코드에서 불러와 사용할 수 있음
파라미터 전달 실습
$ 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 값을 변경하면 변경한 값 크기의 원을 그리는 것을 확인할 수 있음