대상: ROS (Melodic/Noetic) 환경에서 여러 노드를 동시에 실행하거나, launch 파일 구조를 체계적으로 관리하고 싶은 개발자
환경: Ubuntu 20.04 / ROS Noetic / catkin_make
1. 문제/주제 요약
ROS 패키지를 사용하다 보면
하나의 노드를 실행하는 건 간단하지만,
여러 개의 노드를 동시에 띄워야 하는 경우가 많습니다.
예를 들어,
- 카메라 드라이버 + 이미지 처리 노드
- LiDAR 드라이버 + SLAM 노드 + RViz
- 자율주행 스택 전체 구성
이럴 때 roslaunch를 이용하면
여러 노드를 한 번에 올리고, 파라미터·네임스페이스·리맵핑까지 한 곳에서 관리할 수 있습니다.
이 글에서는 실무에서 자주 쓰는 roslaunch 패턴을 단계별로 정리합니다.
2. 기본 구조
ROS의 launch 파일은 XML 기반이며,
보통 패키지명/launch/ 폴더 안에 저장합니다.
my_robot_pkg/
├── launch/
│ └── bringup.launch
└── src/
└── ...
launch 파일의 기본 구조는 다음과 같습니다:
<launch>
<node pkg="패키지이름" type="실행파일" name="노드이름" output="screen" />
</launch>
예시:
<launch>
<node pkg="turtlesim" type="turtlesim_node" name="turtle_sim" output="screen"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="turtle_key" output="screen"/>
</launch>
👉 실행 명령:
roslaunch my_robot_pkg bringup.launch
3. 여러 노드 실행하기
(1) 단순 병렬 실행
<launch>
<node pkg="usb_cam" type="usb_cam_node" name="camera" output="screen"/>
<node pkg="image_view" type="image_view" name="viewer" output="screen"/>
</launch>
이렇게 하면 카메라 드라이버 + 이미지 뷰어 두 노드가 동시에 실행됩니다.
(2) 네임스페이스 분리
여러 센서나 로봇 인스턴스를 동시에 띄우는 경우,
노드 이름 충돌을 피하기 위해 namespace를 설정합니다.
<launch>
<group ns="front_camera">
<node pkg="usb_cam" type="usb_cam_node" name="cam_front"/>
</group>
<group ns="rear_camera">
<node pkg="usb_cam" type="usb_cam_node" name="cam_rear"/>
</group>
</launch>
→ 실제 토픽 이름:/front_camera/image_raw, /rear_camera/image_raw
(3) 파라미터 설정 (param 태그)
노드가 실행될 때 파라미터를 함께 로드할 수 있습니다.
<launch>
<param name="camera_frame" value="camera_link"/>
<param name="use_sim_time" value="true"/>
<node pkg="usb_cam" type="usb_cam_node" name="camera" output="screen"/>
</launch>
또는 YAML 파일에서 파라미터 불러오기:
<launch>
<rosparam file="$(find my_robot_pkg)/config/camera.yaml" command="load" />
<node pkg="usb_cam" type="usb_cam_node" name="camera" />
</launch>
(4) 토픽 리맵핑 (remap 태그)
노드 내부 토픽 이름을 변경할 때 사용합니다.
<launch>
<node pkg="image_proc" type="image_proc" name="rectify">
<remap from="/camera/image_raw" to="/front_cam/image_raw"/>
</node>
</launch>
→ image_proc 노드가 /camera/image_raw 대신 /front_cam/image_raw 토픽을 구독하게 됩니다.
4. launch 파일 중첩 (include 패턴)
여러 노드 구성을 모듈화할 때 유용합니다.
예를 들어 다음과 같이 구성할 수 있습니다:
launch/
├── sensors.launch
├── navigation.launch
└── bringup.launch
sensors.launch
<launch>
<node pkg="rplidar_ros" type="rplidarNode" name="lidar" />
<node pkg="usb_cam" type="usb_cam_node" name="camera" />
</launch>
navigation.launch
<launch>
<node pkg="amcl" type="amcl" name="amcl" />
<node pkg="move_base" type="move_base" name="move_base" />
</launch>
bringup.launch
<launch>
<include file="$(find my_robot_pkg)/launch/sensors.launch"/>
<include file="$(find my_robot_pkg)/launch/navigation.launch"/>
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find my_robot_pkg)/rviz/nav.rviz" />
</launch>
👉 이렇게 하면sensors + navigation + rviz를 한 번에 실행할 수 있습니다.
5. 조건부 실행 (if, unless)
상황에 따라 특정 노드를 실행하거나 생략할 수 있습니다.
<launch>
<arg name="use_rviz" default="true"/>
<node pkg="rplidar_ros" type="rplidarNode" name="lidar"/>
<node pkg="rviz" type="rviz" name="rviz" if="$(arg use_rviz)"/>
</launch>
→ 실행 시 다음과 같이 선택 가능:
roslaunch my_robot_pkg bringup.launch use_rviz:=false
6. 실행 순서 제어 (respawn, required)
<launch>
<node pkg="rosserial_python" type="serial_node.py" name="arduino" respawn="true"/>
<node pkg="move_base" type="move_base" name="move_base" required="true"/>
</launch>
respawn="true": 노드가 죽으면 자동 재시작required="true": 노드가 종료되면 전체 launch가 종료
7. 실전 예시 – 로봇 bringup
<launch>
<!-- Global Params -->
<param name="use_sim_time" value="false"/>
<!-- Sensors -->
<include file="$(find my_robot_pkg)/launch/lidar.launch"/>
<include file="$(find my_robot_pkg)/launch/camera.launch"/>
<!-- Localization -->
<node pkg="amcl" type="amcl" name="amcl" output="screen"/>
<!-- Navigation -->
<node pkg="move_base" type="move_base" name="move_base" output="screen"/>
<!-- Visualization -->
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find my_robot_pkg)/rviz/nav.rviz"/>
</launch>
한 줄로 모든 시스템 Bring-up:
roslaunch my_robot_pkg bringup.launch
8. 추가 팁 / 자주 하는 실수
- ⚠️
pkg,type이름은 CMakeLists.txt의 실행 파일 이름과 일치해야 함 - ⚠️
roslaunch는 catkin 빌드 후devel/setup.bash를 반드시 source 해야 함 - ✅ 여러 노드를 분리 관리하고 싶다면
include구조를 적극 활용 - ✅ YAML 파라미터 파일을
config/폴더에 정리하면 유지보수 용이
9. 정리
roslaunch는 여러 노드를 동시에 실행하고 관리하는 표준 도구- 주요 기능 요약:
| 기능 | 태그 | 예시 |
|---|---|---|
| 노드 실행 | <node> | pkg, type, name |
| 네임스페이스 | <group ns="..."> | 여러 카메라/로봇 관리 |
| 파라미터 설정 | <param> / <rosparam> | 환경 설정 로드 |
| 토픽 리맵 | <remap> | 토픽 이름 변경 |
| 파일 포함 | <include> | launch 모듈화 |
| 조건 실행 | <arg> + if | 실행 옵션 분기 |
👉 한 번만 정의해두면, roslaunch my_robot_pkg bringup.launch 한 줄로
자율주행 로봇 전체 시스템을 올릴 수 있습니다.