roslaunch 기초: 여러 노드를 한 번에 올리는 패턴 정리

대상: 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 한 줄로
자율주행 로봇 전체 시스템을 올릴 수 있습니다.

댓글 남기기