get_parameter
선언해 둔 speed 값을 코드에서는 어떻게 읽을까?
꺼내기
꺼낸 것은 상자, 값은 .value
self.get_parameter('speed')는 값만이 아니라 이름, 타입, 값이 든 Parameter 상자를 돌려줍니다. 파이썬 값은 .value로 꺼냅니다. 공식 튜토리얼처럼 get_parameter_value()에서 타입에 맞는 칸(double_value)을 꺼내도 같습니다.
언제 읽나
한 번만 읽으면 바뀐 값을 모릅니다
__init__에서 한 번 읽어 변수에 넣어 두면, 나중에 ros2 param set으로 바꿔도 노드는 처음 값을 계속 씁니다. 실행 중에 바뀔 값은 쓸 때마다 읽습니다. 3편의 키보드 노드가 키를 누를 때마다 읽던 것과 같습니다.
코드
타이머에서 읽어 Twist에 싣기
6강 8편에서 만든 거북이 몰기 노드에 4편의 선언 두 줄을 더하고, 타이머 콜백에서 두 값을 읽어 Twist에 넣습니다. 0.1초마다 읽으므로 값을 바꾸면 곧바로 움직임이 달라집니다.
Twist는 geometry_msgs.msg에서 가져옵니다(4강 5편). import 줄과 main은 줄였습니다.
따라 하기
값을 바꾸면 원이 커집니다
turtlesim과 driver 노드를 띄우면 거북이가 원을 그립니다. 새 터미널에서 ros2 param set /driver speed 2.0을 치면 도는 빠르기는 그대로인데 앞으로 가는 속도가 두 배라서 원이 두 배로 커집니다.
원의 반지름은 speed ÷ turn입니다. 그림의 크기는 대략입니다.
주의
선언 안 한 이름을 읽으면 예외가 납니다
선언하지 않은 이름을 get_parameter로 읽으면 ParameterNotDeclaredException이 나고 노드가 멈춥니다. 오타가 있으면 바로 드러납니다. 있는지 먼저 보려면 self.has_parameter('speed')를 씁니다.
긴 오류 줄은 화면에 맞게 나눴습니다.
정리
값을 읽는 세 가지 때
바뀌지 않는 값이면 한 번 읽어도 됩니다. 자주 쓰는 값은 쓸 때마다 읽는 것이 가장 쉽습니다. 바뀌는 순간에만 무언가 해야 한다면 7편의 콜백을 씁니다.
다음 편