ROS2 msg 와 srv files

Embeded/ROS : 2021. 1. 13. 15:11
반응형

이전까지 메세지, 서비스 인터페이스로 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}
)

 

 

반응형
Posted by Real_G