1.ROS中std_msgs消息类型中只有一维数组
2.对于二维数组,是由一维数组构成,在发送二维数组时可拆分为一维数组.
发布者代码:
#coding=utf-8
import time
import rospy
from std_msgs.msg import Float64MultiArray
import numpy as np
def Array_pub():
data_list = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
rospy.init_node('talker', anonymous=True)
pub = rospy.Publisher('chatter', Float64MultiArray, queue_size=10)
rate = rospy.Rate(10)
time.sleep(0.5)
for i in range(4):
data = Float64MultiArray(data=data_list[i]) # 二维数组依次发送
pub.publish(data) # 发布数据
rospy.loginfo(data) # 输出数据
rate.sleep()
if __name__ == '__main__':
try:
Array_pub()
except rospy.ROSInterruptException:
pass
1.发布数据
注: 发布者代码中time(0.5)的作用,如果没有这行代码,发现订阅时候缺少第一维的数据.
2.订阅数据
发布者添加time(0.5)前
发布者添加time(0.5)后
订阅者代码:
# -*- coding: utf-8 -*-
import rospy
from std_msgs.msg import Float64MultiArray
import numpy as np
linear_angular = np.zeros((4, 2)) # 4 * 2数组
def callback(data):
print(data)
# print(data.data[0]) # 直接输出一维数组的第一个值
linear_angular[0] = data.data # data.data是取出一维数组
# print(linear_angular) # 二维数组
def Array_sub():
rospy.init_node('listener', anonymous=True)
rospy.Subscriber("chatter", Float64MultiArray, callback)
rospy.spin()
if __name__ == '__main__':
Array_sub()
对于订阅者代码,有两点解释.
接收的data是一维数组
a: 如果引用整个一维数组,需要使用data.data
b:如果引用一维数组中的一个值,使用索引data.data[index]