커스텀 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 |