본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
오늘은 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를 만들어 볼 예정인데
살짝 봤을 때, 메시지 타입까지 직접 만들어 볼 수 있는 것 같아서
기대가 된다.
#패스트캠퍼스 #직장인자기계발 #직장인공부 #환급챌린지 #패스트캠퍼스후기 #오공완
커리어 성장을 위한 최고의 실무교육 아카데미 | 패스트캠퍼스
성인 교육 서비스 기업, 패스트캠퍼스는 개인과 조직의 실질적인 '업(業)'의 성장을 돕고자 모든 종류의 교육 콘텐츠 서비스를 제공하는 대한민국 No. 1 교육 서비스 회사입니다.
fastcampus.co.kr