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 줄과 앞부분, 로그의 시각 표시는 줄였습니다.

다음 편

이번에는 코드로 물어볼까요?

6편서비스 클라이언트 만들기 7강 목록