인터페이스 패키지

세 수를 더하는 내 서비스 타입은 어디에 만들까?

왜 CMake

.srv에서 코드를 만들어 냅니다

빌드할 때 .srv·.msg 파일은 C++와 파이썬 코드로 바뀝니다. 이 생성 단계가 CMake로 돌아가기 때문에 인터페이스 패키지는 ament_cmake로만 만듭니다. 만든 타입은 파이썬 노드에서 그대로 씁니다.

5강 9편처럼 인터페이스는 노드와 따로 떼어 패키지 하나로 둡니다. 여러 패키지가 같은 타입을 쓰기 때문입니다.

따라 하기

패키지를 만들고 srv 폴더에 파일

워크스페이스의 src에서 ros2 pkg create --build-type ament_cmake my_interfaces로 만듭니다. .msg는 msg, .srv는 srv 폴더에 둡니다. 예로 msg/Num.msg에는 int64 num 한 줄을 적습니다.

파일 이름은 AddThreeInts처럼 대문자로 시작하는 낱말을 이어 붙입니다.

CMakeLists.txt

CMakeLists.txt에 파일 목록

rosidl_default_generators를 찾고, rosidl_generate_interfaces(...)에 코드로 바꿀 파일을 적습니다. 이 줄은 ament_package()보다 위에 둡니다.

다른 패키지의 타입(예: geometry_msgs/Point)을 필드로 쓰면 목록 끝에 DEPENDENCIES geometry_msgs도 적습니다.

package.xml

package.xml에 세 줄

그림의 세 줄을 <package> 안에 넣습니다. 한 줄은 <태그>값</태그> 모양입니다. 앞의 두 줄은 빌드와 실행에 필요한 것을 알리고, 마지막 줄은 이 패키지가 인터페이스 패키지라고 표시합니다.

빌드

--packages-select로 하나만

워크스페이스 루트에서 colcon build --symlink-install --packages-select my_interfaces로 이 패키지만 빌드합니다. 그리고 새 터미널에서 source 한 뒤 ros2 interface show로 확인합니다.

쓰는 쪽

쓰는 패키지에는 depend

타입을 쓰는 py_srvcli의 package.xml에 <depend>my_interfaces</depend>를 적고, 코드에서는 AddTwoInts 자리에 AddThreeInts를 씁니다. 콜백은 request.a + request.b + request.c를 돌려주고, 클라이언트는 req.c도 채웁니다. 그다음 패키지 둘을 다시 빌드합니다.

colcon build --symlink-install --packages-select my_interfaces py_srvcli · 공식 튜토리얼은 서비스 이름도 'add_three_ints'로 바꿉니다.

자주 막히는 곳

source를 잊으면 ModuleNotFoundError

my_interfaces를 빌드하기 전에 source 한 터미널에는 새 패키지의 경로가 없습니다. 그 터미널에서 노드를 띄우면 ModuleNotFoundError가 납니다. 빌드한 뒤에는 새 터미널에서 source install/setup.bash를 하고 실행합니다.

출력 일부만 보였습니다.

다음 편

토픽과 서비스, 언제 무엇을 쓸까요?

9편언제 무엇을 쓸까 7강 목록