파라미터 설정 콜백

누가 속도에 100을 넣어도 노드는 그냥 받아야 할까?

문제

아무 값이나 받으면 곤란합니다

지금 driver 노드는 타입만 맞으면 어떤 값이든 받습니다. 거북이라면 벽에 부딪히고 말지만, 실제 로봇이라면 위험합니다. 노드가 받아도 되는 값인지 스스로 따져야 합니다.

설정 콜백

값이 바뀌기 전에 검사합니다

add_on_set_parameters_callback으로 함수를 하나 달아 두면, 값이 바뀌기 직전에 바뀔 파라미터 목록을 받아 이 함수를 부릅니다. 함수는 SetParametersResult를 돌려 받을지 말지 답합니다. 거절하면 값은 바뀌지 않습니다.

코드

거절할 때는 successful=False

함수는 바뀔 파라미터들을 리스트로 받습니다. 하나씩 보며 speed가 3.0을 넘으면 successful=False와 이유를 돌려주고, 문제가 없으면 successful=True를 돌려줍니다. 등록은 선언 다음에 합니다.

SetParametersResult는 rcl_interfaces.msg에서 가져옵니다. 선언 뒤에 등록하므로 시작할 때 -p·YAML로 들어온 값은 이 검사를 거치지 않습니다. 단순한 범위는 4편의 ParameterDescriptor 범위로 걸어야 시작 값까지 막습니다.

따라 하기

거절되면 이유가 돌아옵니다

노드를 다시 띄운 뒤 5.0을 넣어 보세요. 함수가 돌려준 reason이 오류 줄 끝에 그대로 나옵니다. 2.0은 받아들여지고, get으로 보면 5.0은 들어가지 않았습니다.

주의

검사 콜백에서는 검사만 합니다

검사 콜백은 여러 개 달 수 있고, 하나라도 거절하면 값은 바뀌지 않습니다. 앞 콜백은 뒤에서 거절될지 모릅니다. 그래서 여기서 노드 변수를 바꾸면 실제 파라미터와 어긋날 수 있습니다.

바뀐 뒤

바뀐 뒤 할 일은 post-set 콜백에

add_post_set_parameters_callback으로 단 함수는 값이 바뀐 뒤에만 불리고, 아무것도 돌려주지 않습니다. 노드 변수를 고치거나 로그를 남기는 일은 여기서 합니다.

다른 노드의 파라미터 변화를 지켜보려면 rclpy의 ParameterEventHandler를 씁니다.

다음 편

애써 맞춘 값을 다음 실행에도 그대로 쓰려면?

8편설정 저장과 불러오기 8강 목록