본문 바로가기

[패스트캠퍼스 11월 환급 챌린지]

패스트캠퍼스 환급챌린지 4일차 : Action Client

 

 

 

[ 본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다. ]

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가 되겠습니다. 코드가 매우 정교하게 짜여있어 손을 대기 어려웠고, 개인 프로젝트에 어떻게 적용해야 할 지 쉽게 감이 오지 않았습니다. 첫 술에 배부를 수 없다고, 계속 복습하고 반복하며 자유자재로 사용할 수 있을 때 까지 연습하겠습니다.