declare_parameter

내가 만든 노드에 설정값을 달려면 무엇부터 할까?

선언

받을 이름은 먼저 선언합니다

ROS 2 노드는 받을 파라미터를 모두 미리 선언(declare)해야 합니다. 이름과 타입이 시작할 때 정해지므로, 선언하지 않은 이름으로 값을 넣으면 노드가 거절합니다. sped 같은 오타가 조용히 묻히지 않습니다.

/driver는 6강 8편처럼 거북이를 모는 예시 노드입니다. speed와 turn도 예시 이름입니다.

코드

이름과 기본값을 한 줄에

노드 클래스의 __init__에서 self.declare_parameter('speed', 1.0)처럼 이름과 기본값을 적습니다. 따로 값을 넣지 않으면 이 기본값을 씁니다. 보통 노드를 만들자마자 선언합니다.

타입

기본값이 타입을 정합니다

타입은 기본값에서 정해집니다. 속도를 1로 선언하면 정수가 되어 1.5를 거절합니다. 반대로 실수 파라미터에 값을 줄 때는 명령줄, -p, YAML 어디서든 2가 아니라 2.0처럼 소수점을 붙입니다. 2는 정수로 읽혀 set은 거절되고, -p나 YAML이면 노드가 시작하자마자 죽습니다.

count, name, debug도 예시 이름입니다.

설명 달기

설명을 붙이면 describe에 나옵니다

세 번째 인자로 ParameterDescriptor를 넘기면 설명을 붙일 수 있습니다. 읽기 전용(read_only)이나 넣을 수 있는 범위 같은 제약도 여기에 적습니다. 2편에서 본 turtlesim의 0~255 범위가 이렇게 붙은 것입니다.

rcl_interfaces를 쓰므로 package.xml에 <depend>rcl_interfaces</depend>를 더합니다.

따라 하기

내 노드에도 speed가 보입니다

워크스페이스 루트에서 colcon build --symlink-install --packages-select my_turtle로 빌드하고, 새 터미널에서 source install/setup.bash를 한 뒤 노드를 띄웁니다(5강). 다른 터미널에서 목록을 보면 선언한 두 이름이 있습니다.

my_turtle은 예시 패키지 이름입니다. 나머지 두 줄은 ROS가 모든 노드에 붙이는 것입니다.

시작할 때 넣기

실행할 때 -p로 덮어씁니다

노드를 띄울 때 ros2 run my_turtle driver --ros-args -p speed:=2.0처럼 값을 주면 선언할 때 기본값 대신 이 값이 들어갑니다. 코드는 그대로 두고 실행마다 다른 값을 쓸 수 있습니다.

--ros-args 뒤에 ROS용 인자를 적습니다. 값이 많으면 6편의 YAML 파일로 넘깁니다.

다음 편

선언한 값을 코드 안에서는 어떻게 읽을까요?

5편코드에서 값은 어떻게 꺼낼까? 8강 목록