ros2 service call

명령 한 줄로 거북이를 한 마리 더 만들 수 있을까?

명령 모양

이름, 타입, 요청 내용 순서

ros2 service call 뒤에는 2편에서 본 서비스 이름과 타입, 그리고 요청에 실을 값을 차례로 적습니다. 값은 3강 6편의 topic pub처럼 YAML로 씁니다.

값 없는 서비스

먼저 /clear로 연습합니다

/clear의 타입 std_srvs/srv/Empty는 요청이 비어 있어서 값을 적지 않습니다. 부르면 거북이가 그린 선이 지워집니다.

명령이 길어 \로 줄을 나눴습니다. 한 줄로 쳐도 됩니다.

따라 하기

/spawn으로 한 마리 더

ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"

왼쪽 아래 (2, 2) 자리에 0.2라디안만큼 돌아간 거북이가 새로 생깁니다.

답 읽기

응답에 새 이름이 옵니다

위는 보낸 요청, 아래는 서버가 돌려준 응답입니다. name을 비워 두면 turtlesim이 turtle2처럼 겹치지 않는 이름을 지어 응답으로 알려 줍니다. 토픽으로는 받을 수 없던 답입니다.

실제로는 요청과 응답이 각각 한 줄로 나옵니다. 화면에 맞게 줄을 나눴습니다.

자주 막히는 곳

YAML은 콜론 뒤 한 칸

YAML에서는 x: 2처럼 콜론 뒤에 한 칸을 띄워야 값으로 읽힙니다. 필드 이름도 타입에 있는 그대로 써야 합니다. 바깥은 큰따옴표, 빈 이름은 작은따옴표 두 개('')입니다.

명령은 손으로 치기보다 그대로 복사해서 쓰는 편이 안전합니다.

치우기

/kill로 다시 지웁니다

ros2 service call /kill turtlesim/srv/Kill "{name: 'turtle2'}"

방법은 늘 같습니다. 이름과 타입을 확인하고, 요청에 실을 값을 YAML로 적습니다. 무엇을 적어야 하는지는 타입이 정합니다.

다음 편

x, y, theta, name은 어디에 적혀 있었을까요?

4편요청과 응답의 모양 7강 목록