ROS笔记二(基于Python、Kinetic):通信机制——话题(topic)

这篇ROS笔记介绍了基于Python和Kinetic的通信机制——话题。话题采用发布/订阅模式,适合单工通信,特别是多接收方场景。内容包括声明话题、订阅话题、发布消息到话题、接收消息以及使用rostopic命令进行话题管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

话题实现了一种发布/订阅的通信机制,这是一种在分布式系统中常见的数据交换方式。节点在发送数据到话题上之前,必须先声明话题名和发送到该话题的消息所具有的类型。话题适用于单工通信,尤其接收方有多个时(如传感器数据流)

catkin_ws工作空间下my_code程序包里的文件目录结构:

1.声明一个话题:

#!/usr/bin/env python

import rospy

from std_msgs.msg import Int32

rospy.init_node('topic_publisher') #初始化创建一个节点,用于发布消息

pub = rospy.Publisher('counter',Int32)  #声明一个话题名为“counter”,话题发布的消息类型为Int32

rate =rospy.Rate(2) #设置话题频率

count = 0

while not rospy.is_shutdown():
	pub.publish(count)
	count += 1
	rate.sleep()

 因为引入了ROS的标准消息包std_msgs,需要在package.xml文件中添加一个依赖:

<depend>std_msgs</depend>

2.订阅一个话题:

#!/usr/bin/env python

import rospy

from std_msgs.msg import Int32

def callback(msg):
	print(msg.data)

rospy.init_node('topic_subscriber') #初始化创建一个节点,用于接受消息

sub = rospy.Subscriber('counter',Int32,callback) #订阅话题,参数:话题名、消息类型、回调函数

rospy.spin() #将程序的运行交给ROS

3.将消息发布到话题上:

增加topic_publisher.py权限:

chmod u+x topic_publisher.py

 运行ros:

roscore

 新开一个终端,运行节点:(my_code为ROS程序包名)

rosrun my_code topic_publisher.py

4.订阅话题上的消息:

再打开另一个终端,同样先增加topic_subscriber.py的权限:

chmod u+x topic_subscriber.py

 运行节点:

rosrun my_code topic_subscriber.py

 5.rostopic -h:查看rostopic命令参数

查看系统可用的话题:

rostopic list

查看话题发布的消息:(可选参数:-n 5打印五条消息)

rostopic echo counter -n 5

 查看消息频率:

rostopic hz counter

 查看一个已经被声明的话题:

rostopic info counter

 查找发布某种类型消息的所有话题:(同时给出包名(std_msgs)和消息类型(Int32))

rostopic find std_msgs/Int32

 

 

以下是实现该需求的步骤: 1. 安装ROS和OpenCV: ``` sudo apt-get install ros-<distro>-opencv3 ``` 其中,`<distro>`表示你所使用的ROS发行版。比如,如果你使用的是ROS Kinetic版本,则需要将`<distro>`替换为`kinetic`。 2. 编写ROS节点,订阅图像话题并进行人脸识别,发布“/detected_faces”话题。 具体代码可参考如下: ```python import rospy from sensor_msgs.msg import Image from cv_bridge import CvBridge import cv2 # 创建ROS节点 rospy.init_node('face_detector') # 创建图像话题订阅者 image_sub = rospy.Subscriber('/camera/image_raw', Image, queue_size=1) # 创建图像话题发布者 image_pub = rospy.Publisher('/detected_faces', Image, queue_size=1) # 创建CvBridge bridge = CvBridge() # 创建人脸检测器 face_cascade = cv2.CascadeClassifier('/usr/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml') def detect_faces(image): # 将ROS图像转换为OpenCV图像 cv_image = bridge.imgmsg_to_cv2(image, 'bgr8') # 对OpenCV图像进行人脸检测 gray = cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5) # 绘制人脸框并统计人脸数量 num_faces = 0 for (x, y, w, h) in faces: cv2.rectangle(cv_image, (x, y), (x+w, y+h), (0, 255, 0), 2) num_faces += 1 # 将OpenCV图像转换为ROS图像并发布 image_pub.publish(bridge.cv2_to_imgmsg(cv_image, 'bgr8')) # 输出人脸数量 rospy.loginfo('Detected %d faces' % num_faces) # 循环等待图像话题 rospy.spin() ``` 3. 运行ROS节点: ``` rosrun <package_name> face_detector.py ``` 其中,`<package_name>`是你的ROS包名。 4. 查看图像和人脸识别结果: 在RViz中添加“Image”和“MarkerArray”视图,分别订阅“/camera/image_raw”和“/detected_faces”话题,即可查看摄像头采集的图像和人脸识别结果。 通过以上步骤,你就可以使用ROS调用摄像头进行人脸识别,并将人脸部分用框标出,以“/detected_faces”话题持续发布图像了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值