커스텀 msg 등록

2022. 6. 28. 19:19공부/ROS2

ROS2에서 기본적으로 제공되는 msg 타입이 아닌 사용자가 직접 구성한 msg 타입을 사용하는 방법에 대해 작성하였다.

튜토리얼을 바탕으로 직접 테스트를 진행하였다.

msg 파일 생성

  • .../msg/Sensor.msg
string name
int64 status
  • …/msg/SensorSet.msg
pkg_device/Sensor[] sensors

여기서 주의해야 할 점은 msg 변수들은 모두 소문자로 구성해야 한다는 것이다.

(X) pkg_device/Sensor[] Sensors
(O) pkg_device/Sensor[] sensors

 

CMakeLists.txt 설정

find_package(rosidl_default_generators REQUIRED)
find_package(pkg_device REQUIRED)

...

rosidl_generate_interfaces(${PROJECT_NAME}
  "msg/Sensor.msg"
)

...

rosidl_target_interfaces(device_monitor ${PROJECT_NAME} "rosidl_typesupport_cpp")

 

package.xml 설정 

...

<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>

...

 

빌드 후, 확인

$ ros2 interface show pkg_device/msg/Sensor 
string name
int64 status

 

코드에서 include 할 때,

반드시 lowercase / underscore 규칙을 적용해야 한다.

msg가 "Sensor.msg" 이더라도 소문자로 고쳐 "sensor"로 인클루드 해야 한다.

"Float32MultiArray" msg를 인클루드하는 예시는 아래와 같다.

std_msgs::msg::Float32MultiArray ⇒ #include "std_msgs/msg/float32_multi_array.hpp”

 

실제 사용할 때,

원래 이름을 그대로 사용한다. 예시는 아래와 같다.

rclcpp::Publisher<pkg_device::msg::SensorSet>::SharedPtr device_status_pub_;
...
auto sensors = pkg_device::msg::SensorSet();
...
auto sensor = pkg_device::msg::Sensor();
sensor.name = (*iter)->get_node_name();
sensor.status = (*iter)->get_status();
sensors.sensors.push_back(sensor);
...
device_status_pub_->publish(sensors);

 

 

'공부 > ROS2' 카테고리의 다른 글

Executor  (0) 2022.06.27
Behavior Tree Node  (0) 2022.06.26
Behavior Tree setup&tutorial (Groot 포함)  (0) 2022.06.25
BehaviorTree.CPP 라이브러리 튜토리얼  (0) 2022.06.25