ROS2 msg 와 srv files
이전까지 메세지, 서비스 인터페이스로 topic, services, 간단한 pub/sub, service/client 노드를 만들어 봤는데
기존에는 있던 interface를 갖다가 만들었다.
이번에는 interface를 만들어서 써보도록 한다.
커스텀 interface를 만드는 방법을 알아본다.
.msg 랑 .srv 를 만든다.
같은 workspase에 패키지 두개를 만든다.
~/ros2_dev_ws/src$ ros2 pkg create --build-type ament_cmake tutorial_interfaces
그리고 안에다가 msg 랑 srv 디렉토리를 만든다.
~/ros2_dev_ws/src/tutorial_interfaces$ mkdir msg srv
msg 디렉토리에다가 Num.msg 파일을 만든다.
내용은
~/ros2_dev_ws/src/tutorial_interfaces/msg$ cat Num.msg
int64 num
이번엔 srv 를 만들어본다.
~/ros2_dev_ws/src/tutorial_interfaces/srv$ cat AddThreeIntssrv
int64 a
int64 b
int64 c
---
int64 sum
CMakeLists.txt 를 고친다.
find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
"srv/AddThreeInts.srv"
"msg/Num.msg"
)
package.xml 도 다음 세줄을 추가한다.
<buildtool_depend>rosidl_default_generators</buildtool_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
build 한다.
$ colcon build --packages-select tutorial_interfaces
하다가 에러 메세지 나오면 경로가 잘못되어있을 수 있으니 확인해본다.
실행해본다.
$ source install/setup.bash
~/ros2_dev_ws$ ros2 interface show tutorial_interfaces/msg/Num
int64 num
~/ros2_dev_ws$ ros2 interface show tutorial_interfaces/srv/AddThreeInts
int64 a
int64 b
int64 c
---
int64 sum
전에 만들었던 pub/sub 이나 service/client 에 적용해서 써볼 수 있다.
원래는 인터페이스 전용 패키지를 만드는게 정석.
그러나 때로는 한 패키지에 다 때려 넣는게 좋을 때도 있다.
기존에 빌드 방법이랑 섞으면 된다.
그런데 ament_python 은 안된다.
interface (srv, msg)는 cmake 로만 된다.
rosidl_generate_interfaces(${PROJECT_NAME} ${msg_files} )
CMakeLists.txt 에서
이런식으로 한꺼번에 지정할 수 있다.
set(msg_files
"msg/Message1.msg"
"msg/Message2.msg"
# etc
)
set(srv_files
"srv/Service1.srv"
"srv/Service2.srv"
# etc
)
rosidl_generate_interfaces(${PROJECT_NAME}
${msg_files}
${srv_files}
)
'Embeded > ROS' 카테고리의 다른 글
ROS2 class 에서 parameter 쓰기 (C++), launch 파일 만들기 (0) | 2021.01.13 |
---|---|
ROS2 간단한 service 와 client 만들기 (C++) (0) | 2021.01.12 |
ROS2 간단한 publisher 와 subscriber 만들기 (C++) (1) | 2021.01.12 |