대상: ROS(Melodic/Noetic)에서 노드 간 파라미터를 깔끔하게 관리하고 싶거나, 런타임 중 설정을 바꾸고 싶은 개발자
환경: Ubuntu 20.04 / ROS Noetic / catkin_make
1. 문제/주제 요약
ROS에서는 여러 노드가 동시에 실행되기 때문에
하드코딩된 설정값(예: 토픽 이름, 속도, 프레임 ID 등)을 코드 안에 직접 넣어두면 유지보수가 어렵습니다.
이를 해결하기 위한 핵심 기능이 바로 파라미터 서버(Parameter Server) 입니다.
이 글에서는 다음 세 가지를 중심으로 정리합니다:
rosparam을 이용한 파라미터 사용- YAML 파일로 파라미터 관리
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 + YAML | use_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로 설정 복구