如何发布 ROS Float32MultiArray 消息类型
使用 Float32MultiArray 可以帮助我们直接使用系统已有的消息类型来发送复杂的消息,这样我们就可以不用每次都定义新的消息类型了。
下面的Python程序可以帮助我们理解如何使用 Float32MultiArray
#!/usr/bin/env python
# license removed for brevity
import rospy
from std_msgs.msg import Float32MultiArray
from std_msgs.msg import MultiArrayDimension
import random
def talker():
pub = rospy.Publisher('chatter', Float32MultiArray, queue_size=10)
rospy.init_node('talker', anonymous=True)
rate = rospy.Rate(1) # hz
# 1. 创建一个 Float32MultiArray 变量
arg = Float32MultiArray()
# 2. 通过 MultiArrayDimension 定义 Float32MultiArray 中要存储的内容
# n 维数组需要定义 n 个 MultiArrayDimension 变量
d1 = MultiArrayDimension()
d1.size = 1
d1.stride = 1
d1.label = 'time'
# 2.1 把定义好的 MultiArrayDimension 变量加到 Float32MultiArray 变量中
arg.layout.dim.append(d1)
d2 = MultiArrayDimension()
d2.size = 1
d2.stride = 1
d2.label = 'x'
arg.layout.dim.append(d2)
d3 = MultiArrayDimension()
d3.size = 1
d3.stride = 1
d3.label = 'y'
arg.layout.dim.append(d3)
d4 = MultiArrayDimension()
d4.size = 1
d4.stride = 1
d4.label = 'z'
arg.layout.dim.append(d4)
d5 = MultiArrayDimension()
d5.size = 1
d5.stride = 1
d5.label = 'w'
arg.layout.dim.append(d5)
d6 = MultiArrayDimension()
d6.size = 1
d6.stride = 1
d6.label = 't1'
arg.layout.dim.append(d6)
d7 = MultiArrayDimension()
d7.size = 1
d7.stride = 1
d7.label = 'h1'
arg.layout.dim.append(d7)
# 3 为数组申请存储空间,不然你会看到 index out of range 的错误
arg.data = [0]*7
while not rospy.is_shutdown():
arg.data[0] = rospy.get_time()
for i in range(1, 6):
arg.data[i] = random.randrange(0,10)
# 为了简单起见我们只把前 3 个数组数据记录到了日志里
rospy.loginfo("[%f, %d, %d]" % (arg.data[0], arg.data[1], arg.data[2]))
pub.publish(arg)
rate.sleep()
if __name__ == '__main__':
try:
talker()
except rospy.ROSInterruptException:
pass