ROS 파라미터 서버 제대로 쓰기: rosparam, YAML, 동적 설정 완벽 정리

대상: ROS(Melodic/Noetic)에서 노드 간 파라미터를 깔끔하게 관리하고 싶거나, 런타임 중 설정을 바꾸고 싶은 개발자
환경: Ubuntu 20.04 / ROS Noetic / catkin_make


1. 문제/주제 요약

ROS에서는 여러 노드가 동시에 실행되기 때문에
하드코딩된 설정값(예: 토픽 이름, 속도, 프레임 ID 등)을 코드 안에 직접 넣어두면 유지보수가 어렵습니다.

이를 해결하기 위한 핵심 기능이 바로 파라미터 서버(Parameter Server) 입니다.

이 글에서는 다음 세 가지를 중심으로 정리합니다:

  1. rosparam을 이용한 파라미터 사용
  2. YAML 파일로 파라미터 관리
  3. dynamic_reconfigure를 통한 런타임 파라미터 변경

2. 파라미터 서버 기본 개념

ROS의 파라미터 서버는 ROS Master에 존재하는 전역 Key-Value 저장소입니다.

즉, 모든 노드가 같은 파라미터 공간에 접근할 수 있습니다.

예시 구조:

/camera/frame_id = "camera_link"
/lidar/scan_rate = 10
/use_sim_time = true

이 값들은 실행 중에도 조회(rosparam get)하거나 변경(rosparam set)할 수 있습니다.


3. 파라미터 선언과 접근

(1) C++ 노드에서

#include <ros/ros.h>

int main(int argc, char** argv)
{
  ros::init(argc, argv, "param_example");
  ros::NodeHandle nh("~");  // "~"는 private namespace

  int scan_rate;
  std::string frame_id;

  nh.param("scan_rate", scan_rate, 10);
  nh.param<std::string>("frame_id", frame_id, "laser_link");

  ROS_INFO("scan_rate: %d", scan_rate);
  ROS_INFO("frame_id: %s", frame_id.c_str());
}

rosparam set /param_example/scan_rate 20 으로 런타임 수정도 가능합니다.


(2) Python 노드에서

#!/usr/bin/env python
import rospy

rospy.init_node("param_example")

scan_rate = rospy.get_param("~scan_rate", 10)
frame_id  = rospy.get_param("~frame_id", "laser_link")

rospy.loginfo(f"scan_rate={scan_rate}, frame_id={frame_id}")

4. launch 파일에서 파라미터 설정

(1) 직접 정의

<launch>
  <node pkg="rplidar_ros" type="rplidarNode" name="lidar">
    <param name="frame_id" value="laser_link"/>
    <param name="scan_rate" value="10"/>
  </node>
</launch>

→ 실행 시 /lidar/frame_id = "laser_link" 형태로 등록됩니다.


(2) YAML 파일로 불러오기

config/lidar.yaml

frame_id: "laser_link"
scan_rate: 10
inverted: false

launch/lidar.launch

<launch>
  <rosparam file="$(find my_robot_pkg)/config/lidar.yaml" command="load" />
  <node pkg="rplidar_ros" type="rplidarNode" name="lidar" />
</launch>

👉 rosparam은 YAML의 모든 키를 파라미터 서버에 자동 등록합니다.


(3) 네임스페이스 관리

lidar.yaml

lidar:
  frame_id: "laser"
  scan_rate: 15

launch/lidar.launch

<launch>
  <rosparam file="$(find my_robot_pkg)/config/lidar.yaml" command="load" />
  <node pkg="rplidar_ros" type="rplidarNode" name="lidar" ns="lidar"/>
</launch>

→ 실제 등록 결과:

/lidar/frame_id = "laser"
/lidar/scan_rate = 15

5. 실행 중 파라미터 조작

(1) 조회

rosparam get /lidar/frame_id

(2) 설정

rosparam set /lidar/scan_rate 20

(3) 모든 파라미터 확인

rosparam list

(4) 파라미터 저장/불러오기

rosparam dump config_backup.yaml
rosparam load config_backup.yaml

6. 런타임에서 값 바꾸기: Dynamic Reconfigure

dynamic_reconfigure 패키지를 사용하면
GUI 또는 코드에서 실시간으로 파라미터를 변경할 수 있습니다.

(1) 의존성 추가

package.xml

<build_depend>dynamic_reconfigure</build_depend>
<exec_depend>dynamic_reconfigure</exec_depend>

CMakeLists.txt

find_package(catkin REQUIRED COMPONENTS
  roscpp
  dynamic_reconfigure
)
generate_dynamic_reconfigure_options(
  cfg/LidarConfig.cfg
)

(2) 설정 파일 작성 (cfg/LidarConfig.cfg)

#!/usr/bin/env python
PACKAGE = "my_robot_pkg"

from dynamic_reconfigure.parameter_generator_catkin import *

gen = ParameterGenerator()
gen.add("scan_rate", int_t, 0, "Lidar Scan Rate", 10, 1, 20)
gen.add("inverted", bool_t, 0, "Inverted Scan", False)
exit(gen.generate(PACKAGE, "my_robot_pkg", "LidarConfig"))

(3) 노드에서 사용

#include <ros/ros.h>
#include <dynamic_reconfigure/server.h>
#include <my_robot_pkg/LidarConfig.h>

void callback(my_robot_pkg::LidarConfig &config, uint32_t level)
{
  ROS_INFO("Reconfigure Request: scan_rate=%d inverted=%d",
           config.scan_rate, config.inverted);
}

int main(int argc, char **argv)
{
  ros::init(argc, argv, "lidar_reconf");
  dynamic_reconfigure::Server<my_robot_pkg::LidarConfig> server;
  dynamic_reconfigure::Server<my_robot_pkg::LidarConfig>::CallbackType f;
  f = boost::bind(&callback, _1, _2);
  server.setCallback(f);

  ros::spin();
  return 0;
}

(4) 런타임에서 GUI로 변경

rosrun rqt_reconfigure rqt_reconfigure

→ 슬라이더를 움직이면 실시간으로 파라미터가 변경됩니다.


7. 파라미터 관리 실무 패턴

목적방법설명
공통 설정 (모든 노드 공통)rosparam + YAMLuse_sim_time, robot_frame, tf_prefix
노드별 설정<param> 태그launch 내부에 직접 선언
환경별(실기/시뮬) 구분YAML 분리lidar_real.yaml, lidar_sim.yaml
런타임 조정dynamic_reconfigure개발·튜닝 시 유용
상태 확인rosparam list, rosparam get현재 값 확인

8. 추가 팁 / 자주 하는 실수

  • ⚠️ rosparam은 전역 네임스페이스에 등록되므로,
    ns를 지정하지 않으면 충돌 발생 가능
  • ⚠️ YAML 파일 내 들여쓰기(tab) 대신 space만 사용해야 함
  • rosparam dump를 이용하면 현재 런타임 설정을 그대로 저장 가능
  • dynamic_reconfigure를 적용하면 노드를 재시작하지 않고도 실시간 튜닝 가능

9. 정리

기능명령/파일역할
정적 설정<param> / YAML초기 설정값 등록
전역 관리rosparam파라미터 조회/변경
런타임 수정dynamic_reconfigure실시간 파라미터 변경
환경 구분YAML 파일 다중 관리실제/시뮬레이션 분리

👉 정리하면,

  • 개발 초기: YAML + launch로 구조적 관리
  • 튜닝 단계: dynamic_reconfigure로 실시간 조정
  • 운영 단계: rosparam dump/load로 설정 복구

댓글 남기기