[ROS] ROS의 Launch 프로그래밍을 사용해보자

HY K·2024년 8월 19일

ROS1

목록 보기
33/34

이번에는 다수의 노드를 한번에 실행시킬 수 있는 launch 프로그래밍에 대해서 알아보자. 참고한 링크는 다음과 같다.
https://cafe.naver.com/openrt/3113
https://wiki.ros.org/ROS/Tutorials/Roslaunch%20tips%20for%20larger%20projects


1. roslaunch

💡 roslaunch
오직 하나의 노드만을 실행시킬 수 있는 rosrun 명령어와 다르게, roslaunch는 하나 이상의 복수 노드를 한번에 실행시킬 수 있다. 그 이외에 패키지의 매개변수 변경, 노드 이름 변경, 노드 namespace 설정, ROS_ROOT 및 ROS_PACKAGE_PATH 설정, 환경 변수 설정 등 많은 옵션들을 가지고 있기 때문에 매우 유용하게 사용할 수 있다.

ROS에서는 XML 기반 문법으로 작성되는 .launch 파일을 통해서 실행 노드에 대한 설정을 하고, 태그별 옵션을 제공하고 있다. 명령어는 다음과 같이 사용한다.

$ roslaunch <package_name> <ros_launch_file>

또한 roslaunch는 자동으로 roscore 명령을 실행하여, ROS Master를 구동한다. 따라서 별도로 roscore를 입력할 필요가 없다.


본격적으로 launch 파일을 활용한 프로그래밍을 해보도록 하자.

$ cd catkin_ws/src/oroca_ros_tutorials
$ mkdir -p launch
$ cd launch

그 다음에 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 : roslaunch 태그로써 태그 안에 roslaunch에 필요한 태그들이 기술된다.
  • node : roslaunch를 통해서 실행할 노드를 기술하게 된다. 옵션으로는 pkg, type, name이 있으며, pkg는 패키지의 이름, type은 실제 실행할 노드의 이름, name은 type을 실행할 때 붙여지는 이름이다.

이제 다음 명령어를 통해서 해당 launch 파일을 실행해보자.

$ roslaunch oroca_ros_tutorials union.launch

그러면 다음과 같은 결과가 나타난다.


또한, 다음 명령어를 통해서 노드를 확인해보면 이런 결과가 나온다.

$ rosnode list

/msg_publisher1
/msg_publisher2
/msg_subscriber1
/msg_subscribe
/rosout

이는 ros_tutorial_msg_publisher 노드를 msg_publisher1과 msg_publisher2로 이름을 바꾸고, 마찬가지로 ros_tutorial_msg_subscriber 노드를 msg_subscriber1과 msg_subscriber2로 이름을 바꿔서 실행하게 된 것임을 알 수 있다.

$ rqt_graph

위 명령어를 통해서 알아본 노드 사이의 토픽과 메시지 관계는 다음과 같다.

모든 발행자 노드가 모든 구독자 노드에게 토픽을 게시하고 있음을 알 수 있다. 그러지 말고, 1번 노드끼리, 2번 노드끼리만 통신하도록 roslaunch 파일을 수정해서 만들어보자.

다시 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로 지정한 namespace 내부에 포함되게 된다.

그 후 다시 launch 파일을 실행하고, rqt_graph를 통해서 노드 간의 연결 및 메시지 송수신 상태를 확인해보자.

서로 다른 그룹으로 구별되어서, 같은 그룹 내부에서만 통신이 성공적으로 이루어지고 있음을 확인할 수 있다.


2. roslaunch에 사용되는 태그들

roslaunch는 XML 파일의 태그들을 어떻게 활용하냐에 따라서 다양한 응용이 가능하다.

이에 대한 링크들을 달아둘테니, 필요하면 가서 보고 공부를 하도록 하자.

launch 태그

roslaunch 파일의 시작과 끝을 가리킨다.
https://wiki.ros.org/roslaunch/XML/launch

node 태그

노드 실행에 관한 태그이다. 패키지, 노드명, 실행명을 변경 가능하다.
https://wiki.ros.org/roslaunch/XML/node

machine 태그

노드를 실행시키는 PC의 이름, 주소, ros-root, ros-package-path 등을 설정할 수 있다.
https://wiki.ros.org/roslaunch/XML/machine

include 태그

다른 패키지 및 같은 패키지에 속해있는 다른 roslaunch 파일을 불러와 하나의 파일처럼 실행이 가능하다.
https://wiki.ros.org/roslaunch/XML/include

remap 태그

토픽 이름 등, 노드에서 사용 중인 ROS 변수의 이름을 변경할 수 있다.
https://wiki.ros.org/roslaunch/XML/remap

env 태그

환경 변수 등을 설정, 변경할 수 있다.
https://wiki.ros.org/roslaunch/XML/env

param 태그

ROS 매개변수를 설정할 수 있다.
https://wiki.ros.org/roslaunch/XML/param

rosparm 태그

roslaunch에서 rosparm의 명령어를 이용하는 태그이다.
https://wiki.ros.org/roslaunch/XML/rosparam

group 태그

실행하는 노드를 그룹화 할 때 사용하는 태그이다. namespace도 여기서 지정 가능하다.
https://wiki.ros.org/roslaunch/XML/group

test 태그

노드를 테스트 할 때 사용하는 태그로, node 태그와 비슷하지만 테스트에서 사용하는 옵션들이 추가되어 있다.
https://wiki.ros.org/roslaunch/XML/test

arg 태그

roslaunch에서 사용하는 변수들을 정의할 수 있고, roslaunch에서 변수처럼 재사용되어 주소 및 대체 이름 등에 사용할 수 있다.
https://wiki.ros.org/roslaunch/XML/arg

profile
로봇, 드론, SLAM, 제어 공학 초보

0개의 댓글