ROS

ROS - roslaunch

스테디음 2022. 3. 1. 21:01

파일을 하나 실행할 때 → rosrun

그런데 파일이 여러 개라면?? 그 갯수만큼 rosrun을 해주어야 하나???

 

여러 개의 파일 이름을 한 파일에 담아 roslaunch로 실행시켜주면 된다.

*.launch 파일 내용에 따라 여러 노드들을 한꺼번에 실행시킬 수 있다.

이 *.launch 파일은 실행시킬 노드들의 정보가 XML 형식으로 기록되어 있다.

package 디렉토리 내에 launch 디렉토리가 있고 그 안에 *.launch 확장자의 파일이 있다.

 

 

roslaunch 사용법

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

 

 

 

*.launch에서 사용하는 Tag : node

 

실행할 노드 정보를 입력할 때 사용한다.

<node pkg="패키지 명" type="노드가 포함된 소스파일 명" name="노드 이름" />
  • pkg : 실행시킬 노드의 패키지 이름
  • type : 노드의 소스코드가 담긴 파이썬 파일의 이름 (이 때 반드시 파이썬 파일은 실행권한이 있어야 한다.)
  • name : 노드의 이름을 입력하는 속성 (소스코드에서 지정한 노드의 이름을 무시하고, launch 파일에 기록된 노드의 이름으로 노드가 실행된다.)

 

 

 

*.launch에서 사용하는 Tag : include

 

다른 launch 파일을 불러오고 싶을 때 사용한다.

<include file="같이 실행할 *.launch 파일 경로" />
  • file : 함께 실행시킬 *.launch 파일의 경로를 입력하는 속성

 

 

 

<pub-sub.launch 파일 작성>

$ gedit pub-sub.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>

roscore는 내부적으로 자동으로 실행시켜 주기 때문에 코드 내에 적지 않아도 된다.

 

 

<launch 파일 실행>

$ roslaunch my_pkg1 pub-sub.launch

 

실행 결과물

 

 

 

*.launch에서 사용하는 Tag : param

 

ROS 파라미터 서버에 변수를 등록하고 그 변수에 값을 설정하기 위한 태그

<param name="변수의 이름" type="변수의 타입" value="변수 값" />
  • name : 등록할 변수의 이름
  • type : 등록할 변수의 타입 (int, str, double, bool, yaml,,,)
  • value : 등록할 변수의 값

 

ROS 파라미터 서버에 등록된 변수는 노드 코드에서 불러와 사용할 수 있다.

예시: print(rospy.get_param('~변수 name'))  #private parameter는 앞에 '~'를 붙인다.

 

 

<launch 파일에서 파라미터 전달하기>

 

launch 파일 있는 곳에 가서

$ gedit pub-sub-param.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="2"/>
    </node>
    <node pkg="my_pkg1" type="sub.py" name="sub_node" output="screen"/>
</launch>

 

pub_param.py

#!/usr/bin/env python

import rospy
from geometry_msgs.msg import Twist

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

	msg = Twist()
	linear_X = rospy.get_param('~circle_size') # .launch 파일에서 "circle_size" param값을 읽어들여 사용한다.
	msg.linear.x = 2.0
	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

	rate = rospy.Rate(1)

	while not rospy.is_shutdown():
		pub.publish(msg)
		rate.sleep()

if __name__ == '__main__':
	try:
		move()
	except rospy.ROSInterruptException:
		pass

 

실행하기

$ roslaunch my_pkg1 pub=sub-param.launch

 

launch 파일에서 circle_size를 변경해주면 거북이가 그리는 원의 크기가 달라진다.

 

 

 

 

 

'ROS' 카테고리의 다른 글

ROS - 1:N, N:1, N:N 통신  (0) 2022.03.01
ROS - 노드 통신을 위한 패키지 만들기  (0) 2022.03.01
ROS - turtlesim, publisher, subscriber  (0) 2022.03.01
ROS 설치 및 환경설정  (0) 2022.02.28
ROS 명령어  (0) 2022.02.28