ActionServer

목표가 도착하면 서버 안에서는 무슨 일이 벌어질까?

만들기

네 가지를 넘겨 만듭니다

노드 클래스의 __init__에서 ActionServer를 만듭니다. 붙을 노드, 액션 타입, 액션 이름, 그리고 수락된 목표를 실행할 실행 콜백(execute callback)을 넘깁니다.

ROS 2 공식 튜토리얼 코드에서 import만 5편의 my_interfaces로 바꿨습니다. 클래스 이름은 FibonacciActionServer, 노드 이름은 fibonacci_action_server입니다.

실행 콜백

목표 핸들 하나를 받습니다

서버가 목표를 수락하면 실행 콜백을 부르면서 그 목표의 목표 핸들을 넘깁니다. 받은 목표는 goal_handle.request에 있고, 피드백과 끝 알림도 이 핸들로 보냅니다.

중간 보고

한 칸마다 보고합니다

반복문을 한 번 돌 때마다 수열에 한 칸을 더하고 publish_feedback()으로 보냅니다. 클라이언트가 지켜볼 수 있게 한 번에 1초씩 쉽니다.

공식 예제를 화면 폭에 맞게 줄였습니다. 위에서 feedback_msg = Fibonacci.Feedback()을 만들고 partial_sequence를 [0, 1]로 시작합니다.

끝 알리기

succeed()하고 결과를 돌려줍니다

일이 끝나면 목표 핸들에 succeed()를 부르고, 결과 메시지를 만들어 돌려줍니다. 실행 콜백은 반드시 결과를 돌려줘야 합니다.

상태를 정하지 않고 돌아오면 경고와 함께 ABORTED로 처리됩니다(공식 튜토리얼).

따라 하기

서버를 띄우고 손으로 목표를

공식 튜토리얼처럼 서버를 파일 하나로 두고 python3로 실행합니다. 두 터미널 모두 워크스페이스를 source 해야 my_interfaces를 찾습니다. 4편의 send_goal로 목표를 보내 봅니다.

파일 끝 main()에는 6강처럼 rclpy.init()과 rclpy.spin()이 있습니다. 패키지에 넣어 ros2 run으로 띄워도 되는데(5강), 그때는 package.xml에 <depend>my_interfaces</depend>가 필요합니다(7강 8편). 출력은 줄였습니다.

주의

실행 중에는 노드가 바쁩니다

rclpy.spin()은 콜백을 하나씩 부릅니다(6강 3편). 실행 콜백이 time.sleep()으로 몇 초씩 붙잡고 있으면, 그동안 취소 요청 같은 다른 콜백은 기다립니다.

취소를 제때 받으려면 MultiThreadedExecutor와 콜백 그룹을 씁니다(11강 8편).

다음 편

이제 코드로 목표를 보내고 결과를 기다립니다

7편액션 클라이언트 만들기 9강 목록