이번에는 다수의 노드를 한번에 실행시킬 수 있는 launch 프로그래밍에 대해서 알아보자. 참고한 링크는 다음과 같다.
https://cafe.naver.com/openrt/3113
https://wiki.ros.org/ROS/Tutorials/Roslaunch%20tips%20for%20larger%20projects
💡 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를 통해서 노드 간의 연결 및 메시지 송수신 상태를 확인해보자.

서로 다른 그룹으로 구별되어서, 같은 그룹 내부에서만 통신이 성공적으로 이루어지고 있음을 확인할 수 있다.
roslaunch는 XML 파일의 태그들을 어떻게 활용하냐에 따라서 다양한 응용이 가능하다.
이에 대한 링크들을 달아둘테니, 필요하면 가서 보고 공부를 하도록 하자.
roslaunch 파일의 시작과 끝을 가리킨다.
https://wiki.ros.org/roslaunch/XML/launch
노드 실행에 관한 태그이다. 패키지, 노드명, 실행명을 변경 가능하다.
https://wiki.ros.org/roslaunch/XML/node
노드를 실행시키는 PC의 이름, 주소, ros-root, ros-package-path 등을 설정할 수 있다.
https://wiki.ros.org/roslaunch/XML/machine
다른 패키지 및 같은 패키지에 속해있는 다른 roslaunch 파일을 불러와 하나의 파일처럼 실행이 가능하다.
https://wiki.ros.org/roslaunch/XML/include
토픽 이름 등, 노드에서 사용 중인 ROS 변수의 이름을 변경할 수 있다.
https://wiki.ros.org/roslaunch/XML/remap
환경 변수 등을 설정, 변경할 수 있다.
https://wiki.ros.org/roslaunch/XML/env
ROS 매개변수를 설정할 수 있다.
https://wiki.ros.org/roslaunch/XML/param
roslaunch에서 rosparm의 명령어를 이용하는 태그이다.
https://wiki.ros.org/roslaunch/XML/rosparam
실행하는 노드를 그룹화 할 때 사용하는 태그이다. namespace도 여기서 지정 가능하다.
https://wiki.ros.org/roslaunch/XML/group
노드를 테스트 할 때 사용하는 태그로, node 태그와 비슷하지만 테스트에서 사용하는 옵션들이 추가되어 있다.
https://wiki.ros.org/roslaunch/XML/test
roslaunch에서 사용하는 변수들을 정의할 수 있고, roslaunch에서 변수처럼 재사용되어 주소 및 대체 이름 등에 사용할 수 있다.
https://wiki.ros.org/roslaunch/XML/arg