카테고리 없음

패스트캠퍼스 환급챌린지 19일차 : 자율주행 로봇을 위한 ROS 2 & Nav 2 한번에 끝내기 강의 후기

연두부진 2025. 3. 23. 22:15

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

 

오늘은 service의 server를 직접 코딩을 통해 실습했다.

 

이를 수행하기 전에 어제 쓴다고 했던

rclpy.spin과 rclpy.spin_once에 대해서 작성하겠다.

 

rclpy.spin(node)란?

1. 이 함수는 지정된 노드에 대해 무한 루프를

실행하여 콜백을 계속해서 호출한다.

2. 프로그램이 종료될 때까지 계속 실행되며,

모든 콜백, 타이머, 서비스 등이 처리될 수 있도록 한다.

3. 노드가 계속해서 실행되어야 할 때 주로 사용된다.

 

→ 코드 실행 중에 callback함수 부분만을 계속해서

실행하고 싶을 때 사용한다.

 

rclpy.spin_once (node, timeout_sec=None)란?

1. 이 함수는 지정된 노드에 사용 가능한

콜백을 호출한다.

2. 주로 while 루프 안에서 호출됩니다.

이렇게 하면 프로그램이 계속 실행되면서

필요에 따라 콜백을 실행하고 다른 작업을 수행할 수 있다.

3. 노드를 더 세밀하게 제어할 필요가 있을 때 유용하다.

 

→ 한번만 callback함수를 수행하는 코드로

while 루프를 사용해 callback을 원할 때만 한번 사용한다.

 

[오늘의 수강 영상]

 

[오늘의 실습]

 

오늘은 SetBool 서비스 타입을 사용하여 실습을 진행했다.

 

시나리오 순서는 아래와 같다.

1. /tiago_move 서비스를 생성 (std_srvs/srv/SetBool 활용)

2. 서비스 호출을 받으면, 요청된 상태(True/False)에 따라 로봇의 이동을 시작하거나 중지

True: 계속 원을 그리며 움직임

False: 기존 움직임을 정지

 

이때, 10Hz의 주기로 로봇에 속도 명령을 publish한다.

 

이때, SetBool의 interface를 보면

response와 request 부분을 다음과 같다.

 

먼저, Class 부분을 보면

 

self.srv = self.create_service(SetBool, 'tiago_move', self.tiago_move_callback)

→ self.create_service(인터페이스 타입, 서비스 이름, 작동시킬 콜백함수)가 기본 형식이다.

→ 이를 사용해서 'tiago_move'라는 서비스를 생성한다.

 

self.publisher_ = self.create_publisher(Twist, 'cmd_vel', 10)

→ 속도 명령 퍼블리셔를 생성하여

'cmd_vel' 토픽에 Twist 메시지를 발행한다.

 

self.timer = self.create_timer(0.1, self.timer_callback)

→ timer 퍼블리시를 생성하여

0.1초(10Hz)마다 timer_callback 실행한다.

 

self.is_moving = False 

로봇이 움직이는 상태인지 저장하는 플래그이다.

→ 처음에는 False를 저장해둔다.

 

이렇게 init을 설정해 준 후

def tiago_move_callback(self, request, response): 에서

 

self.is_moving = request.data

→ request로 오는 메시지를 저장한다.

 

그 후, data에 True가 들어오면message에 string값에 "TIAGo starts moving in a circle"를담아서 response로 보낸다.

 

혹은 data에 false가 들어오면message에 "TIAGo stops moving"를담아서 response로 보낸다.

 

response.success = True

→ success에 True를 담아서 response로 보낸다.

 

이렇게 되면 response에 있는success와 message를 채워서 보낼 수 있게 된다.

 

다음으로 def timer_callback(self):를 보면

위와 같이 request.data가 true일 때

코드가 돌면서 10hz로 로봇을 이동시켜준다.

 

이렇게 코드를 진행하고 main문은 아래와 같다.

 

다음으로 setup.py에 아래와 같이 노드를 추가해준 후

 

build를 해주면 아래와 같이 동작하게 된다.

 

보면, ros2 service call /tiago_move std_srvs/srv/SetBool data:\ true를 했을 때와

ros2 service call /tiago_move std_srvs/srv/SetBool data:\ false를 했을 때

request.data에 true 혹은 false가 들어가면

server에서 알맞는 message와 data를 담아서

보내는걸 확인할 수 있다.

 


오늘은 이렇게 server를 실습을 통해 코드를 살펴보았는데

막상 실습할 때는 잘 이해가 되지 않았는데

이렇게 포스팅을 하면서 다시 차근차근 보면서

이해가 되는게 뿌듯하게 느껴졌다.

 

내일은 custom server를 만들어 볼 예정인데

살짝 봤을 때, 메시지 타입까지 직접 만들어 볼 수 있는 것 같아서

기대가 된다.


공부 시작시간
공부 종료시간

 

#패스트캠퍼스 #직장인자기계발 #직장인공부 #환급챌린지 #패스트캠퍼스후기 #오공완

https://bit.ly/4hTSJNB

 

커리어 성장을 위한 최고의 실무교육 아카데미 | 패스트캠퍼스

성인 교육 서비스 기업, 패스트캠퍼스는 개인과 조직의 실질적인 '업(業)'의 성장을 돕고자 모든 종류의 교육 콘텐츠 서비스를 제공하는 대한민국 No. 1 교육 서비스 회사입니다.

fastcampus.co.kr