취소

이미 돌고 있는 거북이에게 "그만"은 어떻게 전할까?

취소 요청

클라이언트가 멈춰 달라고 합니다

클라이언트는 2편에서 본 cancel_goal 서비스로 취소(cancel)를 요청합니다. 서버가 받아들이면 하던 일을 멈추고, 결과를 CANCELED 상태로 돌려줍니다.

결정은 서버가

받아 줄지는 서버가 정합니다

취소 요청은 부탁입니다. 받아들일지는 서버가 정하고, 받아들인 뒤 실제로 멈추는 것도 서버 코드가 합니다. 파이썬의 ActionServer는 따로 정하지 않으면 취소를 거절합니다.

중단

서버가 스스로 그만둘 수도 있습니다

클라이언트가 멈추게 하는 것이 취소, 서버가 스스로 그만두는 것이 중단(abort)입니다. turtlesim은 돌던 중에 새 목표가 오면 앞 목표를 중단합니다. 새 목표를 거절하거나 줄 세우는 서버도 있으니, 서버마다 확인해야 합니다.

이때 turtlesim 터미널에 "[WARN] [turtlesim]: Rotation goal received before a previous goal finished. Aborting previous goal"이 찍힙니다.

따라 하기

F 글쇠로 취소해 봅니다

turtlesim과 teleop을 띄우고, teleop 터미널에서 C를 누른 뒤 거북이가 다 돌기 전에 F를 누릅니다. turtlesim 터미널에 취소되었다는 로그가 찍힙니다.

D를 누르고 다 돌기 전에 G를 누르면 앞 장의 중단 경고를 볼 수 있습니다.

코드에서는

양쪽에 몇 줄씩 더합니다

클라이언트는 목표를 보낼 때 받은 목표 핸들(goal handle)에 cancel_goal_async()를 부릅니다. 서버는 cancel_callback에서 받아들이겠다고 답하고, 실행 콜백 안에서 취소 요청이 왔는지 살펴 canceled()로 끝냅니다.

Fibonacci는 5편에서 만드는 예제 액션이고, cancel_callback은 ActionServer를 만들 때 cancel_callback=으로 넘깁니다. 이 코드를 단일 스레드 서버에 그대로 붙이면 실행 콜백이 끝난 뒤에야 취소가 처리됩니다. 제때 받으려면 6편 7장을 보세요.

세 결말

누가 멈췄는지가 다릅니다

어떻게 끝났든 클라이언트는 결과와 함께 이 상태를 받습니다. 서버 코드는 목표 핸들의 메서드 하나로 끝을 알립니다. 4편의 ros2 action send_goal 마지막 줄에도 이 이름이 찍힙니다.

다음 편

코드 없이 명령 한 줄로 목표를 보낼 수 있을까요?

4편손으로 보내 보기 9강 목록