首页 > 解决方案 > 订阅数组 python ros

问题描述

这是我第一次在 ROS 中使用 python 并且我坚持使用语法,我想让 python 订阅我已经使用 C++ 发布的一维数组,我还想访问这个数组的元素并使用它来使用 PyQt 在窗口上显示地图,但我无法访问数组内的数据,因为我不知道语法 第 33 行有错误(msg.(i+j)==1

#!/usr/bin/env python
from PyQt4.QtCore import * 
from PyQt4.QtGui import *
import sys 
from mainw import Ui_Form
#Subscriber 
from std_msgs.msg import MultiArrayDimension
from std_msgs.msg import Int32MultiArray 
import rospy

class main(QWidget, Ui_Form):
    def __init__(self):
        QWidget.__init__(self)
        self.setupUi(self)

        for i in range(0,20):
            for j in range(0,20):
                self.tableWidget.setItem(i, j, QTableWidgetItem())

    def callback(msg):
        for i in range(0,19):
            for j in range(0,19):
                if(msg.(i+j)==1) 
                    self.tableWidget.item(i,j).setBackground(QColor(170, 0, 0))

                else if(data.data==2)
                    self.tableWidget.item(i, j).setBackground(QColor(170, 0, 0))


def TwoDMap():
    rospy.init_node('TwoDMap', anonymous=True)
    rospy.Subscriber("array", Int32MultiArray, callback)
    rospy.spin()

if __name__ == '__main__':
    TwoDMap()        
    app=QApplication(sys.argv)
    window =main()
    window.show()
    app.exec_()    

标签: pythonpyqtros

解决方案


根据Int32MultiArray message,您应该进行如下更改:

if msg.data[i+j] == 1:
    # do something

elif msg.data[i+j] == 2:
    # do something else 

此外,您.callback()在类中的方法没有self参数,并且您在方法调用中存在一些错误。因此,您的代码将如下所示:

class Main(QWidget, Ui_Form):
    def __init__(self):
        QWidget.__init__(self)
        self.setupUi(self)
        rospy.Subscriber("array", Int32MultiArray, self.callback)

        for i in range(0,20):
            for j in range(0,20):
                self.tableWidget.setItem(i, j, QTableWidgetItem())

    def callback(self, msg):
        for i in range(0,19):
            for j in range(0,19):
                if msg.data[i+j] == 1: 
                    self.tableWidget.item(i,j).setBackground(QColor(170, 0, 0))

                elif msg.data[i+j] == 2:
                    self.tableWidget.item(i, j).setBackground(QColor(170, 0, 0))            

if __name__ == '__main__':
    rospy.init_node('TwoDMap', anonymous=True)
    app = QApplication(sys.argv)
    obj = Main()
    obj.show()
    app.exec_() 
    rospy.spin()

推荐阅读