ROS 런치 사용

이용욱·2022년 3월 17일
0

ROS1

목록 보기
3/5
post-thumbnail

pc 환경 : Ubuntu 18.04 melodic, ROS1

1. 로스런치

로스런(rosrun)이 하나의 노드를 실행하는 명령어라면 로스런치(roslaunch)는 복 수개의 노드를 실행하는 개념이다. 이 명령어를 통해 정해진 단일 혹은 복수의 노드를 실행시킬 수 있다.

그 이외의 기능으로 실행시에 패키지의 매개변수를 변경, 노드 명의 변경, 노드 네임 스페이스 설정, ROS_ROOT 및 ROS_PACKAGE_PATH 설정, 이름 변경, 환경 변수 변경 등의 실행시 변경할 수 있는 많은 옵션들을 갖춘 노드 실행에 특화된 로스 명령어이다.

로스런치는 "*.launch" 라는 로스런치파일을 사용하여 실행 노드에 대한 설정을 해주는데 이는 XML 기반으로 되어 있으며, 태그별 옵션을 제공하고 있다. 실행 명령어로는 "roslaunch 패키지명 로스런치파일" 이다.

2. 로스런치의 활용

로스런치의 활용으로 이전 강좌인 "ROS 빌드 시스템" 에서 작성한 ros_tutorial_msg_publisher 와 ros_tutorial_msg_subscriber 를 이름을 바꾸어서 실행해보자. 그냥 이름을 바꾸어 의미가 없으니, 발신자 노드와 구독자 노드를 각각 두 개씩 구동하여 서로간에 별도로 메시지 통신을 해보도록 하겠다.

우선, .launch 파일을 작성하자. 로스런치 파일은 .launch 이라는 파일명을 가지고 있으며, 노드 폴더에 로스런치를 저장할 launch 라는 폴더를 생성해줘야 한다. 아래의 명령어대로 폴더를 생성하고 새롭게 union.launch 이라는 파일으로 로스런치 파일을 생성해보자.

$ cd ~/catkin_ws/src/oroca_ros_tutorials
$ mkdir launch
$ cd launch
$ gedit union.launch
<launch>
  <node pkg="oroca_ros_tutorials" type="ros_tutorial_msg_publisher"   name="msg_publisher1"/>
  <node pkg="oroca_ros_tutorials" type="ros_tutorial_msg_subscriber"  name="msg_subscriber1"/>

  <node pkg="oroca_ros_tutorials" type="ros_tutorial_msg_publisher"  name="msg_publisher2"/>
  <node pkg="oroca_ros_tutorials" type="ros_tutorial_msg_subscriber"  name="msg_subscriber2"/>
</launch>
  • launch
    는 로스런치 태그로써 이 태그안에는 로스런치에 필요한 태그들이 기술된다.
  • node
    는 로스런치로 실행할 노드를 기술하게 된다. 옵션으로는 pkg, type, name 이 있다.
    - pkg는 패키지의 이름
    - type는 실제 실행할 노드의 이름
    - name은 type를 실행하되 실행할때 붙여지는 이름

로스런치파일의 작성을 마쳤으면 아래와 같이 로스런치를 실행해주자.

$ roslaunch oroca_ros_tutorials union.launch

실행 후, 결과가 어떻게 되었을까?
우선 아래와 같이 "rosnode list" 명령어로 현재 실행중인 노드를 살펴보자.
결과적으로

  • ros_tutorial_msg_publisher 노드가 msg_publisher1 및 msg_publisher2 로 이름이 바뀌어 두 개의 노드가 실행되었으며,
  • ros_tutorial_msg_subscriber 노드도 msg_subscriber1 및 msg_subscriber2 로 이름이 바뀌어 실행되었다.
$ rosnode list

/msg_publisher1
/msg_publisher2
/msg_subscriber1
/msg_subscriber2
/rosout

문제는,"발신자 노드와 구독자 노드를 각각 두 개씩 구동하여 서로간에 별도로 메시지 통신" 하게한다는 첫 의도와는 다르게 rqt_graph 를 통해 보면 서로간의 메시지를 모두 구독하고 있다는 것이다. 이는 단순히 실행되는 노드의 이름만을 변경해 주었을뿐 사용되는 메시지의 이름을 바꿔주지 않았기 때문이다. 이 문제를 다른 로스런치 태그를 사용하여 해결해보자.

미리 만들어둔 union.launch 을 수정해보자.

$ cd ~/catkin_ws/src/oroca_ros_tutorials/launch
$ gedit union.launch
<launch>

  <group ns="ns1">
    <node pkg="oroca_ros_tutorials" type="ros_tutorial_msg_publisher"   name="msg_publisher"/>
    <node pkg="oroca_ros_tutorials" type="ros_tutorial_msg_subscriber"  name="msg_subscriber"/>
  </group>

  <group ns="ns2">
    <node pkg="oroca_ros_tutorials" type="ros_tutorial_msg_publisher"  name="msg_publisher"/>
    <node pkg="oroca_ros_tutorials" type="ros_tutorial_msg_subscriber"  name="msg_subscriber"/>
  </group>

</launch>
  • group 은 지정된 노드를 그룹으로 묶어주는 태그이다. 옵션으로는 ns 가 있다. 이는 네임스페이스(namespace)로써 그룹의 이름을 지칭하며, 그룹에 속한 노드의 이름 및 메시지 등도 모두 ns로 지정한 이름에 포함되게 된다.

다시 한번, rqt_graph 로 노드간의 연결 및 메시지 송수신 상태를 확인해보자. 이번에는 우리가 처음에 의도한 "발신자 노드와 구독자 노드를 각각 두 개씩 구동하여 서로간에 별도로 메시지 통신" 가 성공적으로 이루어졌음을 확인할 수 있다.

  $ rqt_graph

3. ★★로스런치에 사용되는 태그★★

로스런치는 로스런치 파일에서 XML을 어떻게 작성하냐에 따라 다양한 응용이 가능할 것이다. 현재 로스런치에서 사용되는 태그들은 아래와 같다. 많이 사용되는 태그는 위에서 설명했고 그 이외에 필요한 부분에 대해서는 직접 찾아가보며 익혀보도록 하자. 각 태그에 링크로 설명 페이지의 주소를 걸어두었으니 필요한 태그의 공식 설명을 참조해보길 바란다.

  • launch : 로스런치 구문의 시작과 끝을 가르킨다.
  • node : 노드 실행에 대한 태그이다. 패키지, 노드명, 실행명을 변경할 수 있다.
  • machine : 노드를 실행하는 PC의 이름, address, ros-root, ros-package-path 등을 설정할 수 있다.
  • include : 다른 패키지 및 같은 패키지에 속해있는 다른 로스런치를 불러와 하나의 파일처럼 실행 시킬 수 있다.
  • remap : 토픽 이름 등의 노드에서 사용중인 로스변수의 이름을 변경할 수 있다.
  • env : 환경 변수를 변경한다.
  • param : 로스 매개변수를 변경한다
  • rosparam : 로스런치에서 rosparam 의 명령어를 이용하는 태그이다.
  • group : 실행되는 노드를 그룹화할때 사용되는 태그이다.
  • test : 노드를 테스트할 때 사용되는 태그로 와 비슷하지만 테스트에 사용되는 옵션들이 추가되어 있다.
  • arg : 로스런치에서 사용되는 변수를 정의할 수 있고, 로스런치에서 변수처럼 재사용되어 주소 및 대체 이름등에 사용된다.

[출처] 로봇 운영체제 강좌 : 로스런치 사용법 (오픈소스 소프트웨어 & 하드웨어: 로봇 기술 공유 카페 (오로카)) | 작성자 표윤석

profile
자율주행에 관심이 있으며, Lidar SLAM을 공부하고 있습니다. [개인 홈페이지 : https://woogiee.wixsite.com/youngwooklee]

0개의 댓글