Как многократно запустить ros.init_node () в одном python скрипте? - PullRequest
0 голосов
/ 03 февраля 2020

Я написал программу на python с ROS. Он содержит GUI для «дистанционного управления роботом», а в MainWindow я добавил 3 виджета (rviz, джойстик, панель кнопок). Когда я запускаю MainWindow , я получаю следующую ошибку:

повышение rospy.exceptions.ROSException ("rospy.init_node () уже был вызван с другими аргументами:" + str ( _init_node_args))

rospy.exceptions.ROSException: rospy.init_node () уже был вызван с разными аргументами: ('teleop_twist_keyboard', ['MainWindow.py'], False, None, False, False).

Joystick.py и Button.py содержат функцию ros.init_node(). В MainWindow я создаю Джойстик и Button class и добавляю их в MainWindow . Мне нужно несколько раз вызвать ros.init_node() для связи с различными узлами.

структура каталогов

пример главного окна

код главного окна

import sys
import PyQt5
import threading

from Joystick import Joystick
from QWidget_rviz import Rviz
from BaseArmPosition import BaseArmPosition

class MainWindow(PyQt5.QtWidgets.QMainWindow):

    def __init__(self,*args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        self.title = 'Robot teleoperation'
        self.left = 10
        self.top = 10
        self.width = 1920
        self.height = 1080

        self.joy = Joystick(maxDistance=50,MinimumSize=100,EclipseX=-20,EclipseY=40)
        self.rviz = Rviz()
        #self.arm_position = BaseArmPosition()


        self.initUI()


    def initUI(self):
        self.central_widget = PyQt5.QtWidgets.QWidget()
        self.setCentralWidget(self.central_widget)

        grid = PyQt5.QtWidgets.QGridLayout(self.centralWidget())

        grid.addWidget(self.joy, 0, 2)
        grid.addWidget(self.rviz, 0, 0)
        #grid.addWidget(self.arm_position, 0, 1)


        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.show() 

app = PyQt5.QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()

виджет кнопок кода, joistick.py имеет тот же

import PyQt5
import rospy
from std_msgs.msg import String


class BaseArmPosition(PyQt5.QtWidgets.QWidget):
    def __init__(self, *args, **kwargs):
        super(BaseArmPosition, self).__init__(*args, **kwargs)            
        self.initUI()

    def initUI(self):
        self.pushButton_moveInit = PyQt5.QtWidgets.QPushButton("moveInit",self)
        self.pushButton_moveLeft = PyQt5.QtWidgets.QPushButton("moveLeft",self)
        self.pushButton_moveRight = PyQt5.QtWidgets.QPushButton("moveRight",self)

        layout = PyQt5.QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.pushButton_moveRight)
        layout.addWidget(self.pushButton_moveLeft)
        layout.addWidget(self.pushButton_moveInit)

        self.pushButton_moveInit.clicked.connect(self.moveInit)
        self.pushButton_moveLeft.clicked.connect(self.moveLeft)
        self.pushButton_moveRight.clicked.connect(self.moveRight)

        rospy.init_node("controller_ur")
        self.pub_arm = rospy.Publisher("/controller_ur/order",String,queue_size=1)

    def moveInit(self):
        moveInit = "moveInit"
        msg = String()
        msg.data = moveInit
        self.pub_arm.publish(moveInit)

    def moveLeft(self):
        moveInit = "moveLeft"
        msg = String()
        msg.data = moveInit
        self.pub_arm.publish(moveInit)

    def moveRight(self):
        moveInit = "moveRight"
        msg = String()
        msg.data = moveInit
        self.pub_arm.publish(moveInit)

1 Ответ

1 голос
/ 03 февраля 2020

A ROS-узел может быть инициализирован только один раз в вашей программе. Вы должны централизовать инициализацию узла в начале основного скрипта, а остальные импортированные модули не должны пытаться инициализировать новый узел, так как это недопустимо.

Если то, что вы хотите, отличается субмодули для работы с различными данными, тогда вы должны просто создать отдельные темы в одном узле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...