1、问题描述
因为需要将一个数组数据发布到一个话题上,然后用另一个话题接收。
起初用from std_msgs.msg import Float32,就是把数据类型定义为Float32,然后订阅数据的时候,一直读不到数据,而且发送数据的程序会直接报错退出。然后用就想这个类型是不是只能传送一个数据,而我传送的数组有24个数据,果然,将数据改成一个,用这个类型就没什么问题,可以连续的发送和接收。找到原因就好办了。
刚开始想自己定义一个float32[]的数组,但是觉得太麻烦,往自己杂乱的程序包里面一放,肯定又是一大堆问题。想着std_msgs肯定有数组类型,不可能只有单个数据的类型。所以查了一下,有以下这么多类型
最后直接把类型改为了Float32MultiArray,即
from std_msgs.msg import Float32MultiArray,还是报错,然后查看这个类型的具体信息
rosmsg show std_msgs/Float32MultiArray
我们只需要里面的data,所以数据发布的时候需要处理以下,如下:
data=Float32MultiArray(data=data_list)
pub.publish(data)
然后订阅话题部分还是老样子,这样就可以实现数组中的数据的发布和订阅。
2、实现代码
发布
img0 = cv.imread('/home/whp/my_robot/src/code/script/yolov5_detect/image/image1.png')
data_list=detect(img0)
rospy.init_node('yolov5_detect_data')
pub = rospy.Publisher('data_list', Float32MultiArray, queue_size=10)
while not rospy.is_shutdown():
print('start')
data=Float32MultiArray(data=data_list)
pub.publish(data)
print('end')
订阅:
import rospy
from std_msgs.msg import Float32MultiArray
def yolov5_grasp():
rospy.init_node('yolov5_grasp')
print(2)
sub=rospy.Subscriber("/data_list", Float32MultiArray, call_back)
rospy.spin()
def call_back(data):
print(data)
if __name__ == '__main__':
yolov5_grasp()