ROS从python节点发布数组

qacovj5a  于 2023-01-11  发布在  Python
关注(0)|答案(4)|浏览(343)

我刚接触ros + python,我正在尝试从python ros节点发布一个1-D数组。我使用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)
bjp0bcyl

bjp0bcyl1#

*MultiArray消息在您的情况下有点多余。我认为如果您为此创建自己的简单消息类型IntList会简单得多(参见this tutorial on how to create custom messages)。IntList.msg-文件看起来如下所示:

int32[] data

要发布包含此消息的列表,请使用以下代码段:

a = IntList()
a.data = [3250,2682,6832,2296,8865,7796,6955,8236]
pub.publish(a)

注意,您不能直接发布列表,而是必须示例化一个IntList对象并填充该对象的data成员(这适用于所有消息类型,即使您只想发布一个整数!)。

z2acfund

z2acfund2#

如果确实要使用MultiArray,请尝试:

array = []
my_array_for_publishing = Int32MultiArray(data=array)
sbdsn5lh

sbdsn5lh3#

对于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)
2w3rbyxf

2w3rbyxf4#

自定义应用程序不建议使用MultiArray* 消息(请改用自定义消息)。对于快速原型设计和使用通用数据可视化工具,它们似乎可以(有关讨论,请参见here)。在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]))

相关问题