ROS 2 파라미터 타입: YAML과 launch에서 문자열을 유지하는 방법

ROS 2에서 장비 이름 1이나 모드 이름 off를 문자열로 전달하려면, 노드의 파라미터 선언과 값을 읽는 쪽의 타입 해석을 함께 맞춰야 합니다. 설정 파일에 적힌 글자가 같아도 YAML 파서나 launch 치환을 거치며 정수·불리언으로 해석될 수 있습니다. 먼저 노드가 기대하는 타입을 확인한 뒤, 입력 경로에 맞게 문자열을 지정하고 실행 중인 노드에서 최종 값을 읽어 보세요.

가령 카메라를 구분하는 camera_id가 문자열인데 설정 생성기가 숫자 1을 써 넣었다고 해 봅시다. 카메라 장치가 열리지 않는 문제를 찾기 전에, 노드가 문자열 1을 받았는지 정수 1을 받았는지부터 구분할 수 있습니다. 이 글의 예시는 설정 해석을 설명하기 위한 것이며, 카메라나 ROS 노드를 직접 실행한 결과는 아닙니다.

노드의 선언이 먼저 정하는 타입

rclcpp의 정적 타입 파라미터 설명에 따르면, 일반적인 선언에서는 기본값의 타입으로 파라미터 타입을 정합니다. 기본값이 필요 없는 항목은 타입을 명시해 선언할 수도 있습니다. 숫자처럼 보이는 장비 식별자라면, 계산할 수량인지 이름인지부터 정해야 합니다.

예를 들어 식별자 001에서 앞의 두 자리가 의미를 가진다면 문자열이 맞습니다. 반면 반복 횟수나 포트 번호처럼 정수로 다룰 항목을 전부 문자열로 바꾸면, 노드가 기대하는 타입과 어긋날 수 있습니다. 오류를 없애려고 모든 값에 따옴표를 붙이기보다 선언과 입력을 한 쌍으로 확인하는 편이 좋습니다.

같은 문서는 dynamic_typing의 기본값이 false라고 설명합니다. 선언하지 않은 파라미터를 허용하는 구성 등에는 다른 동작도 있으므로, 타입이 잘못 들어온 원인을 찾기 전에 동적 타입으로 바꾸는 방식은 피하세요. 타입을 유연하게 만드는 것은 파라미터 설계를 바꾸는 선택입니다.

YAML 파일의 태그와 launch의 따옴표는 적용 지점이 다르다

ROS 2 Lyrical 릴리스 문서는 파라미터 YAML 파일에 !!str, !!bool, !!int, !!float 같은 태그로 타입을 지정하는 기능을 소개합니다. 아래는 그 문법으로 문자열 식별자와 불리언을 구분한 작은 예입니다.

camera_node:
  ros__parameters:
    camera_id: !!str 1
    use_sim_time: !!bool false

이 예에서 camera_id는 문자로 된 식별자이고 use_sim_time은 불리언입니다. 태그는 해당 ROS 배포판과 파서의 지원 여부를 확인한 뒤 사용해야 합니다. Lyrical에서 소개된 파일 처리 기능을 이전 배포판에도 그대로 적용할 수 있다고 가정하지 마세요.

XML launch 파일에는 한 단계가 더 있습니다. 공식 launch 이전 안내의 타입 추론 예는 다음 두 값을 구분합니다.

<param name="camera_id" value="'1'"/>
<param name="retry_count" value="1"/>

첫 줄은 문자열 1, 둘째 줄은 정수 1을 전달하는 형식입니다. 바깥의 큰따옴표는 XML 속성을 감싸고, 첫 줄의 안쪽 작은따옴표는 타입 해석 단계에 남습니다. XML 속성 전체가 따옴표 안에 있다는 이유만으로 ROS 파라미터도 문자열이 되는 것은 아닙니다. 이 두 줄은 node 안에 넣는 부분 예시입니다.

Python launch 치환은 문자열을 만든 뒤 다시 해석될 수 있다

LaunchConfiguration에서 값을 가져왔다고 해서 노드까지 문자열로 전달되는 것은 아닙니다. 확인한 launch_ros 처리 코드는 파라미터 딕셔너리의 치환을 먼저 수행한 뒤 결과를 yaml.safe_load로 해석합니다. 따라서 문자열로 만들어진 중간 결과와 노드에 전달할 최종 타입을 구분해야 합니다.

Python launch에서 문자열이어야 하는 치환값은 ParameterValue의 value_type=str로 의도를 명시할 수 있습니다. 다음은 전체 launch 파일이 아니라 노드의 parameters에 넣을 값 하나를 만드는 부분입니다.

from launch.substitutions import LaunchConfiguration
from launch_ros.parameter_descriptions import ParameterValue

camera_id = ParameterValue(
    LaunchConfiguration('camera_id'), value_type=str
)

이 값을 {'camera_id': camera_id}처럼 노드 파라미터에 넣고, 대응하는 launch 인자가 선언·제공되도록 구성합니다. 반대로 정수나 불리언이 필요한 항목은 그 타입을 지정해야 합니다. value_type을 생략하면 YAML 규칙을 이용한다는 설명도 같은 클래스에 있으므로, 문자열처럼 보이는 입력의 처리 방식을 의도적으로 고르는 데 쓰면 됩니다.

값을 넣는 경로 문자열을 유지할 때 확인할 곳 흔히 혼동하는 부분
노드의 파라미터 선언 기본값의 타입 또는 명시한 타입 장비 이름을 계산용 숫자로 선언
Lyrical 파라미터 YAML 파일 지원되는 !!str 태그와 실제 로드 결과 다른 배포판의 파일 파서도 같다고 가정
XML launch의 param 속성 값 안에 남는 문자열 따옴표 XML을 감싸는 따옴표만으로 충분하다고 판단
Python launch 치환 ParameterValue의 value_type 치환 중간 결과가 문자열이면 처리도 끝났다고 판단

한 프로젝트가 YAML 파일과 launch 인자를 함께 사용한다면, 화면에 보이는 최종 문자열만 비교하지 말고 어느 경로에서 타입이 결정되는지 표시해 두세요. 설정을 생성하는 스크립트가 바뀌었을 때도 그 지점을 다시 확인할 수 있습니다.

파일을 고친 다음에는 실행 중인 노드의 값을 읽는다

공식 ros2 param 안내는 get, describe, dump를 구분합니다. get으로 특정 노드의 값을 읽고, describe로 파라미터 설명을 확인하며, dump로 현재 파라미터를 YAML 형식으로 남길 수 있습니다. 예시 이름을 실제 노드와 파라미터 이름으로 바꿔 사용하세요.

ros2 param get /camera_node camera_id
ros2 param describe /camera_node camera_id
ros2 param dump /camera_node

기대값이 문자열 1이면 실제 값과 타입을 함께 비교합니다. 값이 없거나 기본값이 그대로라면 대상 노드 이름과 네임스페이스, 적용한 파일, launch 인자를 차례로 확인하세요. 값은 맞는데 타입이 다르면 선언과 파싱 경로로 돌아갑니다. 문자열이 제대로 들어왔더라도 그 식별자가 실제 카메라를 가리키는지는 장치를 여는 단계에서 따로 확인할 문제입니다.

설정 생성기를 사용하는 경우에는 숫자처럼 보이는 식별자, 불리언처럼 보이는 모드 이름, 앞자리 0을 포함한 이름을 작은 점검 사례로 남겨 두면 좋습니다. 설정값을 읽는 확인 이후 프로세스끼리 실제로 주고받는 동작까지 검사하려면 ROS launch 테스트의 실행 중 검사와 종료 후 검사 구분(영문)을 이어서 볼 수 있습니다.

이 설명은 2026년 10월 18일 확인한 공식 문서와 위에 연결한 고정 커밋의 코드를 기준으로 합니다. 설정을 수정한 뒤에는 기대한 타입, 입력 경로, 노드에서 읽은 값을 함께 남겨 두세요.