본문 바로가기

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

패스트캠퍼스 환급챌린지 5일차 : Action Server

 

 

 

 

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

https://fastcampus.info/4oKQD6b

 

 

 

https://fastcampus.co.kr/data_online_selfdriving

 

자율주행 로봇을 위한 ROS 2 & SLAM & Nav2 한번에 끝내기 | 패스트캠퍼스

로봇 입문 시작점 ROS 2부터 자율주행 로봇을 위한 SLAM & Navigation2 와 시뮬레이터를 활용한 자율주행 로봇 실습까지 한번에

fastcampus.co.kr

본 글은 위 강의를 참고하여 작성되었습니다.

 

 

 

 

[강의시작 | 강의종료]

 

[완강 인증]

 

 

[학습 내용]

 

 

동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.

 

[강의 후기]

 

action client에서 보낸 goal의 feedback 작업과 result를 반환해주는 action service에 대해 실습을 진행했습니다. client에서는 주요 callback 함수가 3개였지만, server에서는 execute_callback 1개만 다룹니다.

 

 

-class-

: <self>,<액션타입>,<액션이름>,<execute_callback>을 매개변수로 설정합니다. 

class RotateActionServer(Node):
    def __init__(self):RotateActionServer
        super().__init__('rotate_action_server')
        self.action_server = ActionServer(
            self,
            <액션타입>,
            <'액션이름'>,
            self.execute_callback
        )
        self.cmd_pub = self.create_publisher(Twist, 'cmd_vel', 10) # 퍼블리셔 생성
        self.current_angle = 0.0 # 현재 각도 설정

 

-execute_callback()-

: 목표 각도에 도달할 때 까지 회전, 각도 차이 업데이트, 피드백 메세지 전송, 주기 설정을 반복합니다.

def execute_callback(self, goal_handle):
    self.get_logger().info('Executing goal to rotate to angle: %f' % goal_handle.request.theta) # logging
    target_angle = goal_handle.request.theta # 목표 각도
    angle = target_angle - self.current_angle # 목표 각도 - 현재 각도 : 각도 차이

    twist_msg = Twist() # 메세지 뚫어주기
    twist_msg.angular.z = 0.5 if angle_diff > 0 else -0.5 
    feedback_msg = RotateAbsolute.Feedback() # 피드백 받아오기

    while abs(angle) > 0.01:
        self.cmd_pub.publish(twist_msg) 
        angle -= 0.01 * twist_msg.angular.z # 각도 차이 업데이트
        feedback_msg.remaining = abs(angle) # 피드백 메세지 업데이트
        goal_handle.publish_feedback(feedback_msg)  # 피드백 메세지 전송
        if abs(angle) <= 0.01: # 각도 차이가 0.01보다 작다면 while문 중지
            break
        time.sleep(0.01) # 0.01초마다 while문 반복

 

 

 

-생각해볼 점-

이번 강의에선 action server에 대해 다뤘습니다. client보다 구조가 단순하고 간단합니다. server는 client에게서 goal에 대한 정보를 받고, goal의 진행상황을 feedback을 통해 전달하며, 최종 결과를 result를 통해 전달합니다. 앞서 말한 3가지 기능을 execute_callback() 함수에서 일괄적으로 진행합니다. 실습에선 목표 각도를 정해 회전하며 목표가 완료되면 완료 메세지와 함께 로봇이 정지하는 기능을 구현했습니다. client 의 goal_handle.request.theta를  받아옵니다. execute_callback(self, goal_handle) 함수를 통해 각도 차이 계산, 회전 방향 및 속도 설정, 피드백 메세지 초기화 등등 기능 수행에 필요한 정보를 입력합니다. 오늘 실습했던 내용을 개인 프로젝트(자율주행)에 적용해보자면, action type에 속도, 방향, 초음파 센서, 라이다 센서 등 잔율 주행에 필요한 값을 goal로 설정합니다. client가 받아와 server에 목표와 함께 전달합니다. server는 진행상황에 맞춰 값을 feedback 함수를 통해 client로 전달하고 최종 결과값을 result를 통해 client로 반환합니다. 간단하게 구상해봤지만, 실제로 구현하기엔 실력과 지식이 부족합니다. ros 2 통신의 개념과 기초 강의가 끝나면 심화 Node 강의에 들어갑니다. 지금 다루고있는 topic, service, action을 더 자세하게 다루며 활용 방안까지 챙길 수 있겠습니다.