ROS2 添加自定义msg
参考博客:https://blog.csdn.net/wei242425445/article/details/115278114
新建我们的消息包
colcon build --packages-select system_msg
删除include和src文件夹,然后新建个msg目录,创建两个消息包Yolo.msg和YoloArray.msg

消息包命名规则:首字母必须大写,不然编译会报错。
Yolo.msg 内容如下:
string class_name
float32 conf
int32[4] box
YoloArray.msg 内容如下:
Yolo[] yolo_array
变量名命名规则:首字母必须小写,不然编译会报错。
然后在CMakeLists.txt文件中添加下面内容
find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
"msg/Yolo.msg"
"msg/YoloArray.msg"
)
如下:

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 pkg create --build-type ament_cmake system_msg
# 验证是否可用
ros2 interface show system_msg/msg/Yolo
ros2 interface show system_msg/msg/YoloArray
如下:

验证代码如下:
import cv2
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from system_msg.msg import Yolo, YoloArray
from cv_bridge import CvBridge, CvBridgeError
class Subscriber(Node):
def __init__(self):
super().__init__("system_yolo_test")
self.publisher_ = self.create_publisher(YoloArray, 'yolo_detections', 10)
self.subscription = self.create_subscription(YoloArray, 'yolo_detections', self.listener_callback, 10)
self.timer = self.create_timer(1.0, self.timer_callback)
def timer_callback(self):
msg = YoloArray()
# 创建3个模拟检测结果
for i in range(3):
detection = Yolo()
detection.class_name = f'person_{i}'
detection.conf = 0.8 + i * 0.05
detection.box = [100 + i*50, 200 + i*30, 40, 80] # [x, y, width, height]
msg.yolo_array.append(detection)
self.publisher_.publish(msg)
self.get_logger().info(f'Publishing: {len(msg.yolo_array)} detections')
def listener_callback(self, msg):
self.get_logger().info(f'Received {len(msg.yolo_array)} detections')
for idx, detection in enumerate(msg.yolo_array):
print(f"idx:{idx} {detection.class_name} {detection.conf:.2f} {detection.box}")
def main(args=None):
rclpy.init(args=args)
node = Subscriber()
rclpy.spin(node)
rclpy.shutdown()
if __name__ == "__main__":
main()
如下:
