[英]ROS publishing array from python node
我是 ros+python 的新手,我正在尝试从 python ros 节点发布一维数组。 我使用了 Int32MultiArray 但我无法理解多数组中布局的概念。 谁能给我解释一下? 或者还有其他发布数组的方法吗?
谢谢。
#!/usr/bin/env python
import roslib
roslib.load_manifest('test_drone')
import numpy
import rospy
import sys
import serial
from std_msgs.msg import String,Int32,Int32MultiArray,MultiArrayLayout,MultiArrayDimension
from rospy.numpy_msg import numpy_msg
from rospy_tutorials.msg import Floats
#port = "dev/ttyS0"
#baud = 115200
#ser = serial.Serial()
#ser.port = port
#ser.baudrate = baud
################################################################################################
def main(args):
pub=rospy.Publisher('sonar_vals',Int32MultiArray,queue_size = 10)
rospy.init_node('ca_serial')
r = rospy.Rate(0.2)
while not rospy.is_shutdown():
print "LOOP running"
a = [3250,2682,6832,2296,8865,7796,6955,8236]
pub.publish(a)
r.sleep();
# try:
#data_raw = ser.readline()
# except e:
# print e
#sd = data_raw.split(',')
#a = numpy.array([sd[0],sd[1],sd[2],sd[3],sd[4],sd[5],sd[6],sd[7],sd[8],sd[9]],dtype=numpy.float32)
#if sd[0] == 777:
# pub.publish(a)
# else:
# print 'Invalid Data'
if __name__ == '__main__':
import sys, getopt
main(sys.argv)
*MultiArray
消息在您的情况下有点矫枉过正。 我认为如果为此创建自己的简单消息类型IntList
简单IntList
(请参阅有关如何创建自定义消息的教程)。 IntList.msg
文件如下所示:
int32[] data
要发布包含此消息的列表,请使用以下代码段:
a = IntList()
a.data = [3250,2682,6832,2296,8865,7796,6955,8236]
pub.publish(a)
请注意,您不能直接发布列表,而必须实例化一个IntList
对象并填充该对象的data
成员(这适用于所有消息类型,即使您只想发布一个整数!)。
python可以使用以下方法: pub = rospy.Publisher('chatter2', Float64MultiArray, queue_size=10) data_to_send = Float64MultiArray() # the data to be sent, initialise the array data_to_send.data = array # assign the array with the value you want to send pub.publish(data_to_send)
如果您确实想使用MultiArray
,请尝试:
array = []
my_array_for_publishing = Int32MultiArray(data=array)
不鼓励自定义应用程序使用 MultiArray* 消息(改用自定义消息)。 对于快速原型制作和使用通用数据可视化工具,它们似乎还不错(请参阅此处进行讨论)。 在 ROS2 中,您可以使用它来快速测试发送
publisher = node.create_publisher(Float32MultiArray,'topic',10)
data = [0.0, 1.0]
publisher.publish(Float32MultiArray(data=data))
这是为了在另一边解压消息。 消息已经是那里的数组对象。
subscription = node.create_subscription(
Float32MultiArray,'topic',listener_callback,10)
...
def listener_callback(msg):
rclpy.logging.get_logger().info('I heard: %f %f' % (msg.data[0], msg.data[1]))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.