2015-07-12 1 views
1

Я новичок в ros + python, и я пытаюсь опубликовать одномерный массив из узла python ros. Я использовал Int32MultiArray, но я не могу понять концепцию макета в multiarray. Может ли кто-нибудь объяснить это мне? или есть ли другой способ публикации массива?Публикация массива ROS из узла python

Спасибо.

#!/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) 

ответ

1

Сообщения *MultiArray немного переборщит в вашем случае. Я думаю, что это намного проще, если вы создадите свой собственный простой тип сообщения IntList (см. this tutorial on how to create custom messages). IntList.msg -file выглядит так же, как следует:

int32[] data 

Чтобы опубликовать список с этим сообщением использовать следующий фрагмент кода:

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

Обратите внимание, что вы не можете напрямую публиковать список, но должны создать экземпляр IntList объект и заполнить элемент data этого объекта (это относится ко всем типам сообщений, даже если вы просто хотите опубликовать одно целое!).

+0

Благодаря luator ваш ответ работал! –

1

Если вы хотите использовать MultiArray, попробуйте:

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