可以自己做漫画的网站,北仑营销型网站制作,网站网页优化技巧,网站每个页面都有标题话题
节点之间的通信。
叫话题很形象。发布者发布一定数据类型的话题#xff0c;订阅者订阅发布者。 订阅者发布者不唯一。 异步通信#xff0c;适用于周期发布的数据而不是逻辑性强的数据。 .msg 格式的消息结构#xff0c;一种通信接口。
每个话题 topic 有话题名订阅者订阅发布者。 订阅者发布者不唯一。 异步通信适用于周期发布的数据而不是逻辑性强的数据。 .msg 格式的消息结构一种通信接口。
每个话题 topic 有话题名数据类型和数据三个属性。
Hello world
pub 按一定周期发布 helloworld 信息sub 接收。
pub
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
作者: 古月居(www.guyuehome.com)
说明: ROS2话题示例-发布“Hello World”话题
import rclpy # ROS2 Python接口库
from rclpy.node import Node # ROS2 节点类
from std_msgs.msg import String # 字符串消息类型
创建一个发布者节点class PublisherNode(Node):def __init__(self, name):super().__init__(name) # ROS2节点父类初始化self.pub self.create_publisher(String, chatter, 10) # 创建发布者对象消息类型、话题名、队列长度self.timer self.create_timer(0.5, self.timer_callback) # 创建一个定时器单位为秒的周期定时执行的回调函数def timer_callback(self): # 创建定时器周期执行的回调函数msg String() # 创建一个String类型的消息对象msg.data Hello World # 填充消息对象中的消息数据self.pub.publish(msg) # 发布话题消息self.get_logger().info(Publishing: %s % msg.data) # 输出日志信息提示已经完成话题发布def main(argsNone): # ROS2节点主入口main函数rclpy.init(argsargs) # ROS2 Python接口初始化node PublisherNode(topic_helloworld_pub) # 创建ROS2节点对象并进行初始化rclpy.spin(node) # 循环等待ROS2退出node.destroy_node() # 销毁节点对象rclpy.shutdown() # 关闭ROS2 Python接口
sub
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
作者: 古月居(www.guyuehome.com)
说明: ROS2话题示例-订阅“Hello World”话题消息
import rclpy # ROS2 Python接口库
from rclpy.node import Node # ROS2 节点类
from std_msgs.msg import String # ROS2标准定义的String消息
创建一个订阅者节点class SubscriberNode(Node):def __init__(self, name):super().__init__(name) # ROS2节点父类初始化self.sub self.create_subscription(\String, chatter, self.listener_callback, 10) # 创建订阅者对象消息类型、话题名、订阅者回调函数、队列长度def listener_callback(self, msg): # 创建回调函数执行收到话题消息后对数据的处理self.get_logger().info(I heard: %s % msg.data) # 输出日志信息提示订阅收到的话题消息def main(argsNone): # ROS2节点主入口main函数rclpy.init(argsargs) # ROS2 Python接口初始化node SubscriberNode(topic_helloworld_sub) # 创建ROS2节点对象并进行初始化rclpy.spin(node) # 循环等待ROS2退出node.destroy_node() # 销毁节点对象rclpy.shutdown() # 关闭ROS2 Python接口
物品识别
之前 webcam 最好是分开写为两个节点之间的通信一个是摄像头一个是呈现的视频。
主要是拿到识别的图像数据之后不是第一时间就调用 opencv 算法处理而是发给 subsub 进行处理。
这个发送的过程中的消息数据类型应当是 imgmsg 类型所以需要一个 opencv - imgmsg 类型的转换方法。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
作者: 古月居(www.guyuehome.com)
说明: ROS2话题示例-发布图像话题
import rclpy # ROS2 Python接口库
from rclpy.node import Node # ROS2 节点类
from sensor_msgs.msg import Image # 图像消息类型
from cv_bridge import CvBridge # ROS与OpenCV图像转换类
import cv2 # Opencv图像处理库
创建一个发布者节点class ImagePublisher(Node):def __init__(self, name):super().__init__(name) # ROS2节点父类初始化self.publisher_ self.create_publisher(Image, image_raw, 10) # 创建发布者对象消息类型、话题名、队列长度self.timer self.create_timer(0.1, self.timer_callback) # 创建一个定时器单位为秒的周期定时执行的回调函数self.cap cv2.VideoCapture(0) # 创建一个视频采集对象驱动相机采集图像相机设备号self.cv_bridge CvBridge() # 创建一个图像转换对象用于稍后将OpenCV的图像转换成ROS的图像消息def timer_callback(self):ret, frame self.cap.read() # 一帧一帧读取图像if ret True: # 如果图像读取成功self.publisher_.publish(self.cv_bridge.cv2_to_imgmsg(frame, bgr8)) # 发布图像消息self.get_logger().info(Publishing video frame) # 输出日志信息提示已经完成图像话题发布def main(argsNone): # ROS2节点主入口main函数rclpy.init(argsargs) # ROS2 Python接口初始化node ImagePublisher(topic_webcam_pub) # 创建ROS2节点对象并进行初始化rclpy.spin(node) # 循环等待ROS2退出node.destroy_node() # 销毁节点对象rclpy.shutdown() # 关闭ROS2 Python接口
sub 代码
class ImageSubscriber(Node):def __init__(self, name):super().__init__(name) # ROS2节点父类初始化self.sub self.create_subscription(Image, image_raw, self.listener_callback, 10) # 创建订阅者对象消息类型、话题名、订阅者回调函数、队列长度self.cv_bridge CvBridge() # 创建一个图像转换对象用于OpenCV图像与ROS的图像消息的互相转换def object_detect(self, image):hsv_img cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 图像从BGR颜色模型转换为HSV模型mask_red cv2.inRange(hsv_img, lower_red, upper_red) # 图像二值化contours, hierarchy cv2.findContours(mask_red, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) # 图像中轮廓检测for cnt in contours: # 去除一些轮廓面积太小的噪声if cnt.shape[0] 150:continue(x, y, w, h) cv2.boundingRect(cnt) # 得到苹果所在轮廓的左上角xy像素坐标及轮廓范围的宽和高cv2.drawContours(image, [cnt], -1, (0, 255, 0), 2) # 将苹果的轮廓勾勒出来cv2.circle(image, (int(xw/2), int(yh/2)), 5,(0, 255, 0), -1) # 将苹果的图像中心点画出来cv2.imshow(object, image) # 使用OpenCV显示处理后的图像效果cv2.waitKey(10)def listener_callback(self, data):self.get_logger().info(Receiving video frame) # 输出日志信息提示已进入回调函数image self.cv_bridge.imgmsg_to_cv2(data, bgr8) # 将ROS的图像消息转化成OpenCV图像self.object_detect(image) # 苹果检测流程是 opencv 图像数据转换成 ros2 可以传输的图像数据传输给 subsub 再转回来再调用 opencv 库。
其实常用 usb 相机驱动基本都是一致的所以 pub 节点我们不需要自己手动写。可以用下面的命令替代 pub有一行 ERR 不影响。
$ sudo apt install ros-humble-usb-cam
$ ros2 run usb_cam usb_cam_node_exe ros2 topic bw 可以看带宽数据量。
可以通过 /rqt_graph 查看节点关系图。