create_service (AddTwoInts)
두 수를 받으면 합을 돌려주는 노드는 어떻게 짤까?
패키지
의존성에 example_interfaces
5강 3편처럼 워크스페이스의 src에서 파이썬 패키지 py_srvcli를 만듭니다. --dependencies에 AddTwoInts가 들어 있는 example_interfaces를 함께 적습니다.
꼭 확인
package.xml에 depend 한 줄
package.xml에 <depend>example_interfaces</depend>가 있어야 합니다. --dependencies로 만들었다면 이미 적혀 있고, 아니라면 손으로 적습니다.
빠뜨려도 내 컴퓨터에서는 돌아갈 수 있습니다. 하지만 다른 컴퓨터에서는 rosdep이 설치해 주지 않아 실패합니다(5강 4편).
서버 만들기
create_service에 세 가지
from example_interfaces.srv import AddTwoInts로 타입을 가져온 뒤, create_service에 타입, 서비스 이름, 콜백을 줍니다. 이 노드가 /add_two_ints 서비스의 서버가 됩니다.
콜백
응답을 채워서 돌려줍니다
요청이 오면 rclpy가 콜백에 request와 빈 response를 넘겨줍니다. 콜백은 응답을 채워 return response로 돌려줍니다. return을 빠뜨리면 클라이언트는 제대로 된 답을 받지 못합니다.
main
spin이 요청을 기다립니다
main은 6강과 같습니다. 6강 3편에서 본 것처럼 spin이 돌면서, 요청이 들어올 때마다 콜백을 부릅니다.
setup.py의 console_scripts에 'service = py_srvcli.service_member_function:main',을 더합니다(5강 5편).
따라 하기
빌드하고 서버를 띄웁니다
워크스페이스 루트에서 빌드하고, 실행은 새 터미널에서 source 한 뒤 합니다(5강 7편). --symlink-install은 5강 8편처럼 늘 붙이고, --packages-select는 적은 패키지만 빌드합니다.
빌드 전에 rosdep install -i --from-path src --rosdistro jazzy -y로 빠진 의존성을 확인하면 좋습니다.
확인
다른 터미널에서 불러 봅니다
클라이언트 코드가 없어도 3편의 ros2 service call로 내 서버를 시험할 수 있습니다. 응답에 합 5가 오고, 서버 터미널에는 콜백이 남긴 로그가 찍힙니다.
출력의 requester 줄과 앞부분, 로그의 시각 표시는 줄였습니다.
다음 편