[ 본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다. ]
https://fastcampus.info/4oKQD6b
[강의시작 | 강의종료]


[완강 인증]

[학습 내용]

동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.
[강의 후기]
action client를 생성하고 동작시켜보는 실습을 진행했습니다.
-class-
: 객체 생성 시 <self>, <사용할 action type>, <action sever>의 이름을 매개변수로 전달합니다.
class PlayMotionClient(Node):
def __init__(self):
super().__init__('play_motion_client')
self.action_client = ActionClient(
self,
<사용할 action type>,
'<action server의 이름>',
)
self.get_logger().info('Play Motion Client has been started')
-send_goal()-
: action server에 작업을 요청합니다.
def send_goal(self, motion_name, skip_planning=False):
self._action_client.wait_for_server()
send_goal_msg = PlayMotion2.Goal() # 객체 생성, 매개변수 설정
...
...
self.send_goal_future = self.action_client.send_goal_async( # async 메소드를 통해 goal 전달
send_goal_msg,
feedback_callback=self.feedback_callback
)
self.send_goal_future.add_done_callback(self.goal_response_callback) # goal 승인 여부 확인
위 코드에서 중요한 메서드 2가지가 있습니다.
- send_goal_async(<실행할 모션 정보>, <feedback_callback 함수>)
: 서버에서 goal을 수락/거부를 확인 - goal_response_callback
: goal이 처리될 때 호출되는 메서드, goal이 수락되면 get_result_async()로 결과를 요청
-goal_response_callback()-
:goal이 처리될 때 호출, goal이 수락되면 get_result_async()로 결과를 요청
def goal_response_callback(self, future):
결과값 = future.result()
if not 결과값.accepted:
self.get_logger().error('Goal rejected')
return
self.get_result_future = 결과값.get_result_async()
self.get_result_future.add_done_callback(self.get_result_callback) # 성공/실패 여부 확인
-get_result_callback()-
: action 실행 결과를 받아 성공/실패 여부 확인
def get_result_callback(self, future):
result = future.result().result # 결과값 변수에 할당
if result.success: # 성공했을 경우
self.get_logger().info('Motion completed successfully!')
else: # 실패했을 경우
self.get_logger().error(f'Motion failed with error: {result.error}')
-생각해볼 점-
action은 이전에 들었던 topic, service와 달랐습니다. topic, service는 한개의 server/client(publisher/subscriber)가 callback 함수를 2개 이상 가지고 있지 않습니다. 하지만 action은 client에만 3개의 callback 함수를 다루고 있습니다. 장기적인 작업을 수행하는 만큼 코드가 복잡하게 짜여있습니다. 미로찾기를 주제로 한 자율주행 자동차 개인 프로젝트에 간략하게 적용해 본다면, send_goal() 함수를 통해 거리, 속도, 방향, 센서를 바탕으로 막혀있는 길을 인식하고 이를 피해가는 목표 전달. goal_response_callback() 함수를 통해 목표 수락 여부를 확인, get_result_callback() 함수를 통해 성공, 실패여부를 확인하고 logging가 되겠습니다. 코드가 매우 정교하게 짜여있어 손을 대기 어려웠고, 개인 프로젝트에 어떻게 적용해야 할 지 쉽게 감이 오지 않았습니다. 첫 술에 배부를 수 없다고, 계속 복습하고 반복하며 자유자재로 사용할 수 있을 때 까지 연습하겠습니다.
'[패스트캠퍼스 11월 환급 챌린지]' 카테고리의 다른 글
| 패스트캠퍼스 환급챌린지 6일차 : Interface Programming - Action (0) | 2025.11.17 |
|---|---|
| 패스트캠퍼스 환급챌린지 5일차 : Action Server (0) | 2025.11.16 |
| 패스트캠퍼스 환급챌린지 3일차 : Action 명령어 (0) | 2025.11.14 |
| 패스트캠퍼스 환급챌린지 2일차 : Action (0) | 2025.11.13 |
| 패스트캠퍼스 환급챌린지 1일차 : Service/Interface Programming (0) | 2025.11.12 |