basic - parameters

ROS 2에서 **파라미터(Parameters)**는 개별 노드에 연결된 설정값이다. 코드 수정 없이 노드를 시작할 때(및 런타임에) 구성할 수 있으며, 파라미터의 수명은 노드 수명에 묶인다(재시작 후 값을 다시 불러오는 등 persistence는 노드에서 구현 가능).

파라미터는 노드 이름, 노드 네임스페이스, 파라미터 이름, 파라미터 네임스페이스로 지정된다. 파라미터 네임스페이스는 선택 사항이다.

각 파라미터는 키(key), 값(value), **디스크립터(descriptor)**로 구성된다. 키는 문자열이고, 값 타입은 bool, int64, float64, string, byte[], bool[], int64[], float64[], string[] 중 하나다. 디스크립터는 기본적으로 비어 있으며, 설명·값 범위·타입 정보·제약 조건 등을 넣을 수 있다.

실습 튜토리얼: Understanding parameters (공식 문서)

Parameters background

Declaring parameters (선언)

기본적으로 노드는 수명 동안 받아들일 모든 파라미터를 미리 선언해야 한다. 이렇게 하면 타입과 이름이 노드 시작 시점에 정해져 나중에 잘못된 설정 가능성이 줄어든다. 선언하지 않은 파라미터도 허용하려면 노드 생성 시 allow_undeclared_parameters: true로 설정할 수 있다.

Parameter types (타입)

각 파라미터는 위 Overview에 나온 사전 정의 타입 중 하나를 가진다. 기본적으로 선언된 파라미터의 타입을 런타임에 바꾸려고 하면 실패한다(예: 정수 파라미터에 불리언 대입 방지). 여러 타입을 허용하려면 선언 시 ParameterDescriptordynamic_typing: true를 사용한다.

Parameter callbacks (콜백)

누군가 노드의 파라미터를 바꾸려고 할 때, 그 전·중·후에 끼어들 수 있는 **세 가지 훅(hook)**이 있다. 모두 선택 사항이다.

흐름: (요청 들어옴) → pre setset → (실제 반영) → post set

  • pre set (add_pre_set_parameters_callback): “아직 반영되기 전”에 호출된다. “이번에 바뀌려는 값 목록”을 받아서 그 목록을 수정할 수 있다. 예: max_speed가 바뀔 때마다 min_speed도 같이 바꾸고 싶다면, 여기서 목록에 min_speed 변경을 추가하면 된다.
  • set (add_on_set_parameters_callback): “이 값으로 바꿔도 될지” 승인/거부만 하는 단계다. 받은 값을 검사해서 “허용” 또는 “거부”를 반환한다. 여기서는 다른 상태를 바리거나 부수 효과를 두면 안 된다 — 여러 콜백이 순서대로 실행되기 때문에, 나중 콜백에서 거부하면 실제로는 반영이 안 되는데 이미 상태만 바뀌어서 어긋날 수 있다.
  • post set (add_post_set_parameters_callback): 실제로 파라미터가 반영된 뒤에 한 번 호출된다. “값이 바뀌었으니 이제 뭔가 반응해야 할 때” 쓰면 된다. 예: max_speed가 바뀌었으면 내부 제한치를 갱신하거나 로그를 남기는 등.

Interacting with parameters

  • 노드 내부: 노드 API로 파라미터 조회·설정 (C++/Python: 공식 튜토리얼 "Using parameters in a class" 참고).
  • 외부 프로세스: 노드가 기본으로 생성하는 파라미터 서비스를 통해 조회·설정.

노드가 기본 제공하는 서비스 예:

서비스타입설명
~/describe_parametersrcl_interfaces/srv/DescribeParameters파라미터 이름 목록 → 디스크립터 목록
~/get_parameter_typesrcl_interfaces/srv/GetParameterTypes파라미터 이름 목록 → 타입 목록
~/get_parametersrcl_interfaces/srv/GetParameters파라미터 이름 목록 → 값 목록
~/list_parametersrcl_interfaces/srv/ListParameters접두사(선택) → 해당 파라미터 목록 (비우면 전체)
~/set_parametersrcl_interfaces/srv/SetParameters이름·값 목록으로 설정. 각 파라미터별 성공/실패 결과 반환
~/set_parameters_atomicallyrcl_interfaces/srv/SetParametersAtomically한 번에 설정. 하나라도 실패하면 전체 실패

(~/는 해당 노드 이름 기준, 예: /node_name/...)

초기값 설정

  • 노드 실행 시: 커맨드라인 인자 또는 YAML 파일로 초기 파라미터 지정. (공식 문서 "Setting parameters directly from the command line" 참고)
  • Launch 시: ROS 2 launch에서 파라미터 지정. (Launch 문서 참고)

런타임 조작

이미 동작 중인 노드의 파라미터는 ros2 param CLI로 조회·설정한다. 내부적으로 위 파라미터 서비스 API를 사용한다. 자세한 사용법: Using the ros2 param command-line tool.

프로그래밍으로는 C++(rclcpp), Python(rclpy) 클라이언트 라이브러리에서 get/set 및 파라미터 변경 감지 API를 제공한다.


참고: Parameters — ROS 2 Jazzy