Loading firmware/firmware.ino +2 −0 Original line number Diff line number Diff line Loading @@ -73,6 +73,7 @@ void setup() // Wait acknowledge while(!Serial.available()) { Serial.println("Wait"); DBG.println("Remove standstill"); delay(250); } Loading @@ -92,6 +93,7 @@ void setup() motor3.setMaxSpeed(15 * k); motor3.setAcceleration(30 * k); delay(1000); Serial.println("Ready"); } bool parse_data(String data, float* values) Loading firmware/firmware.ino.old→firmware/firmware.ino.ooo +23 −48 Original line number Diff line number Diff line Loading @@ -77,7 +77,7 @@ void setup() motor3.setAcceleration(200); delay(1000); // Standstill for automatic tuning delay(100000); // Standstill to remove the Support Blocks delay(20000); // Standstill to remove the Support Blocks //----------------------------------Move to the Home----------------------- Loading @@ -93,33 +93,8 @@ void setup() delay(1000); } bool parse_data(String data, float* values) { bool ret = true; int count = 0; // data.indexOf() while (count < 3) { int index = data.indexOf(","); values[count++] = data.substring(0, index).toFloat(); data = data.substring(index + 1); } return ret; } void loop() { float new_pos[3] = {0.0}; if (Serial.available()) { String data = Serial.readStringUntil('\n'); if (!parse_data(data, new_pos)) { goto send_current_pos; } } if (Serial.available()) { // check for incoming serial data String RpiData = Serial.readStringUntil('\n'); // read command from serial port // get first target position Loading Loading @@ -217,12 +192,18 @@ void loop() float xactual3 = posa3 / 10.0; //motor2.getCurrentPosition()*50.0; float xactual4 = posa4 / 10.0; //motor3.getCurrentPosition()*50.0; float xactual5 = 0.0; if (isnan(xactual1)) xactual1 = xactualold1; if (isnan(xactual2)) xactual2 = xactualold2; if (isnan(xactual3)) xactual3 = xactualold3; if (isnan(xactual4)) xactual4 = xactualold4; if (isnan(xactual5)) xactual5 = xactualold5; if (isnan(xactual2)) xactual2 = xactualold2; if (isnan(xactual3)) xactual3 = xactualold3; if (isnan(xactual4)) xactual4 = xactualold4; if (isnan(xactual5)) xactual5 = xactualold5; xactualold1 = xactual1; xactualold2 = xactual2; xactualold3 = xactual3; Loading @@ -233,11 +214,16 @@ void loop() float vactual3 = motor2.getCurrentSpeed(); float vactual4 = motor3.getCurrentSpeed(); float vactual5 = 0.0; if (isnan(vactual1)) vactual1 = vactualold1; if (isnan(vactual2)) vactual2 = vactualold2; if (isnan(vactual3)) vactual3 = vactualold3; if (isnan(vactual4)) vactual4 = vactualold4; if (isnan(vactual5)) vactual5 = vactualold5; if (isnan(vactual1)) vactual1 = vactualold1; if (isnan(vactual2)) vactual2 = vactualold2; if (isnan(vactual3)) vactual3 = vactualold3; if (isnan(vactual4)) vactual4 = vactualold4; if (isnan(vactual5)) vactual5 = vactualold5; vactualold1 = vactual1; vactualold2 = vactual2; vactualold3 = vactual3; Loading @@ -256,15 +242,4 @@ void loop() Serial.print("v"); Serial.print((abs(vactual1) + abs(vactual2) + abs(vactual3) + abs(vactual4) + abs(vactual5)) / (5 * 1000), 2); Serial.println("x"); send_current_pos: float current_pos[3] = { motor1.getCurrentPosition(), motor2.getCurrentPosition(), motor3.getCurrentPosition() }; } No newline at end of file frontend/main.py +62 −12 Original line number Diff line number Diff line Loading @@ -9,11 +9,21 @@ from PyQt6.QtWidgets import ( from PyQt6.QtGui import QCloseEvent, QImage, QPixmap from PyQt6.QtCore import QObject, Qt, QThread, pyqtSignal import time, sys from functools import partial from enum import Enum POS_DEFAULT = 0.0 VEL_DEFAULT = 12.0 ACC_DEFAULT = 18.0 class JOG(Enum): RZ_NEG = 0 RZ_POS = 1 RY_NEG = 2 RY_POS = 3 RZ1_NEG = 4 RZ1_POS = 5 class CommThread(QThread): update_positions = pyqtSignal(list) Loading Loading @@ -45,38 +55,78 @@ class Window(QMainWindow, Ui_MainWindow): self.robot = CommThread("/dev/ttyACM0") self.__setup_signals() self.robot.start() time.sleep(0.5) self.step_size_cb.addItems(["1", "5", "10", "50"]) self.current_pos = None self.store() def __setup_signals(self): # UI self.move_pb.pressed.connect(self.send_pos) self.move_pb.pressed.connect(self.move_pb_callback) self.home_pb.pressed.connect(self.home) self.store_pb.pressed.connect(self.store) self.step_size_cb.currentIndexChanged.connect(self.__update_spinbox_step_size) self.jog_rz_neg_pb.pressed.connect(partial(self.jog_callback, JOG.RZ_NEG)) self.jog_rz_pos_pb.pressed.connect(partial(self.jog_callback, JOG.RZ_POS)) self.jog_ry_neg_pb.pressed.connect(partial(self.jog_callback, JOG.RY_NEG)) self.jog_ry_pos_pb.pressed.connect(partial(self.jog_callback, JOG.RY_POS)) self.jog_rz1_neg_pb.pressed.connect(partial(self.jog_callback, JOG.RZ1_NEG)) self.jog_rz1_pos_pb.pressed.connect(partial(self.jog_callback, JOG.RZ1_POS)) # Thread self.robot.update_positions.connect(self.update_position) def home(self): def __update_spinbox_step_size(self): move = WorldPosition(0.0, 0.0, 0.0) self.robot.send_pos(move) self.update_sb(move) self.move_rx_sb.setSingleStep(int(self.step_size_cb.currentText())) self.move_ry_sb.setSingleStep(int(self.step_size_cb.currentText())) self.move_rz_sb.setSingleStep(int(self.step_size_cb.currentText())) def store(self): move = WorldPosition(-60.0, 0.0, 0.0) self.robot.send_pos(move) self.update_sb(move) def home(self): self.move(WorldPosition(0.0, 0.0, 0.0)) def send_pos(self): def store(self): self.move(WorldPosition(-60.0, 0.0, 0.0)) def jog_callback(self, jog: JOG): new_pos = self.current_pos step = int(self.step_size_cb.currentText()) match jog: case JOG.RZ_NEG: new_pos.rz -= step case JOG.RZ_POS: new_pos.rz += step case JOG.RY_NEG: new_pos.ry -= step case JOG.RY_POS: new_pos.ry += step case JOG.RZ1_NEG: new_pos.rz1 -= step case JOG.RZ1_POS: new_pos.rz1 += step self.move(new_pos) def move_pb_callback(self): move = WorldPosition( float(self.move_rx_sb.value()), float(self.move_ry_sb.value()), float(self.move_rz_sb.value()) ) self.robot.send_pos(move) self.move(move) def move(self, new_pos: WorldPosition): self.current_pos = new_pos self.update_spinboxes(new_pos) self.robot.send_pos(new_pos) print(self.current_pos) def update_sb(self, pos : WorldPosition): def update_spinboxes(self, pos : WorldPosition): self.move_rx_sb.setValue(int(pos.rz)) self.move_ry_sb.setValue(int(pos.ry)) Loading frontend/ui/robot.ui +137 −69 Original line number Diff line number Diff line Loading @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> <width>437</width> <height>206</height> <width>503</width> <height>218</height> </rect> </property> <property name="windowTitle"> Loading @@ -19,13 +19,61 @@ <rect> <x>10</x> <y>10</y> <width>411</width> <height>149</height> <width>481</width> <height>152</height> </rect> </property> <layout class="QGridLayout" name="gridLayout" columnstretch="1,1,1"> <item row="1" column="2"> <widget class="QSpinBox" name="move_rx_sb"> <layout class="QGridLayout" name="gridLayout" columnstretch="1,1,1,1"> <item row="0" column="0"> <spacer name="horizontalSpacer"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item row="1" column="0"> <widget class="QLabel" name="label_3"> <property name="text"> <string>Rz</string> </property> </widget> </item> <item row="0" column="1"> <widget class="QLabel" name="label_2"> <property name="text"> <string>Current postion</string> </property> </widget> </item> <item row="3" column="0"> <widget class="QLabel" name="label_6"> <property name="text"> <string>Rz'</string> </property> </widget> </item> <item row="2" column="0"> <widget class="QLabel" name="label_5"> <property name="text"> <string>Ry</string> </property> </widget> </item> <item row="4" column="1"> <widget class="QPushButton" name="home_pb"> <property name="text"> <string>Home</string> </property> </widget> </item> <item row="3" column="2"> <widget class="QSpinBox" name="move_rz_sb"> <property name="minimum"> <number>-180</number> </property> Loading @@ -34,10 +82,24 @@ </property> </widget> </item> <item row="0" column="2"> <widget class="QLabel" name="label_4"> <item row="4" column="2"> <widget class="QPushButton" name="move_pb"> <property name="text"> <string>Move to</string> <string>Move</string> </property> </widget> </item> <item row="2" column="1"> <widget class="QLineEdit" name="current_ry_le"> <property name="enabled"> <bool>false</bool> </property> </widget> </item> <item row="4" column="0"> <widget class="QPushButton" name="store_pb"> <property name="text"> <string>Store</string> </property> </widget> </item> Loading @@ -51,13 +113,6 @@ </property> </widget> </item> <item row="0" column="1"> <widget class="QLabel" name="label_2"> <property name="text"> <string>Current postion</string> </property> </widget> </item> <item row="1" column="1"> <widget class="QLineEdit" name="current_rx_le"> <property name="enabled"> Loading @@ -65,10 +120,20 @@ </property> </widget> </item> <item row="2" column="1"> <widget class="QLineEdit" name="current_ry_le"> <property name="enabled"> <bool>false</bool> <item row="1" column="2"> <widget class="QSpinBox" name="move_rx_sb"> <property name="minimum"> <number>-180</number> </property> <property name="maximum"> <number>180</number> </property> </widget> </item> <item row="0" column="2"> <widget class="QLabel" name="label_4"> <property name="text"> <string>Move to</string> </property> </widget> </item> Loading @@ -79,72 +144,75 @@ </property> </widget> </item> <item row="3" column="0"> <widget class="QLabel" name="label_6"> <item row="0" column="3"> <widget class="QLabel" name="label"> <property name="text"> <string>Rz'</string> <string>Jog</string> </property> </widget> </item> <item row="2" column="0"> <widget class="QLabel" name="label_5"> <property name="text"> <string>Ry</string> <item row="4" column="3"> <widget class="QComboBox" name="step_size_cb"> <property name="currentText"> <string/> </property> </widget> </item> <item row="1" column="0"> <widget class="QLabel" name="label_3"> <item row="1" column="3"> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QPushButton" name="jog_rz_neg_pb"> <property name="text"> <string>Rz</string> <string>-</string> </property> </widget> </item> <item row="3" column="2"> <widget class="QSpinBox" name="move_rz_sb"> <property name="minimum"> <number>-45</number> </property> <property name="maximum"> <number>45</number> <item> <widget class="QPushButton" name="jog_rz_pos_pb"> <property name="text"> <string>+</string> </property> </widget> </item> <item row="0" column="0"> <spacer name="horizontalSpacer"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </layout> </item> <item row="2" column="3"> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> <widget class="QPushButton" name="jog_ry_neg_pb"> <property name="text"> <string>-</string> </property> </spacer> </widget> </item> <item row="4" column="2"> <widget class="QPushButton" name="move_pb"> <item> <widget class="QPushButton" name="jog_ry_pos_pb"> <property name="text"> <string>Move</string> <string>+</string> </property> </widget> </item> <item row="4" column="1"> <widget class="QPushButton" name="home_pb"> </layout> </item> <item row="3" column="3"> <layout class="QHBoxLayout" name="horizontalLayout_3"> <item> <widget class="QPushButton" name="jog_rz1_neg_pb"> <property name="text"> <string>Home</string> <string>-</string> </property> </widget> </item> <item row="4" column="0"> <widget class="QPushButton" name="store_pb"> <item> <widget class="QPushButton" name="jog_rz1_pos_pb"> <property name="text"> <string>Store</string> <string>+</string> </property> </widget> </item> </layout> </item> </layout> </widget> </widget> <widget class="QMenuBar" name="menubar"> Loading @@ -152,7 +220,7 @@ <rect> <x>0</x> <y>0</y> <width>437</width> <width>503</width> <height>22</height> </rect> </property> Loading frontend/ui/robot_ui.py +83 −41 Original line number Diff line number Diff line Loading @@ -12,74 +12,109 @@ from PyQt6 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(437, 206) MainWindow.resize(503, 218) self.centralwidget = QtWidgets.QWidget(parent=MainWindow) self.centralwidget.setObjectName("centralwidget") self.gridLayoutWidget = QtWidgets.QWidget(parent=self.centralwidget) self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 10, 411, 149)) self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 10, 481, 152)) self.gridLayoutWidget.setObjectName("gridLayoutWidget") self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget) self.gridLayout.setContentsMargins(0, 0, 0, 0) self.gridLayout.setObjectName("gridLayout") self.move_rx_sb = QtWidgets.QSpinBox(parent=self.gridLayoutWidget) self.move_rx_sb.setMinimum(-180) self.move_rx_sb.setMaximum(180) self.move_rx_sb.setObjectName("move_rx_sb") self.gridLayout.addWidget(self.move_rx_sb, 1, 2, 1, 1) self.label_4 = QtWidgets.QLabel(parent=self.gridLayoutWidget) self.label_4.setObjectName("label_4") self.gridLayout.addWidget(self.label_4, 0, 2, 1, 1) self.move_ry_sb = QtWidgets.QSpinBox(parent=self.gridLayoutWidget) self.move_ry_sb.setMinimum(-180) self.move_ry_sb.setMaximum(180) self.move_ry_sb.setObjectName("move_ry_sb") self.gridLayout.addWidget(self.move_ry_sb, 2, 2, 1, 1) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) self.gridLayout.addItem(spacerItem, 0, 0, 1, 1) self.label_3 = QtWidgets.QLabel(parent=self.gridLayoutWidget) self.label_3.setObjectName("label_3") self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1) self.label_2 = QtWidgets.QLabel(parent=self.gridLayoutWidget) self.label_2.setObjectName("label_2") self.gridLayout.addWidget(self.label_2, 0, 1, 1, 1) self.current_rx_le = QtWidgets.QLineEdit(parent=self.gridLayoutWidget) self.current_rx_le.setEnabled(False) self.current_rx_le.setObjectName("current_rx_le") self.gridLayout.addWidget(self.current_rx_le, 1, 1, 1, 1) self.current_ry_le = QtWidgets.QLineEdit(parent=self.gridLayoutWidget) self.current_ry_le.setEnabled(False) self.current_ry_le.setObjectName("current_ry_le") self.gridLayout.addWidget(self.current_ry_le, 2, 1, 1, 1) self.current_rz_le = QtWidgets.QLineEdit(parent=self.gridLayoutWidget) self.current_rz_le.setEnabled(False) self.current_rz_le.setObjectName("current_rz_le") self.gridLayout.addWidget(self.current_rz_le, 3, 1, 1, 1) self.label_6 = QtWidgets.QLabel(parent=self.gridLayoutWidget) self.label_6.setObjectName("label_6") self.gridLayout.addWidget(self.label_6, 3, 0, 1, 1) self.label_5 = QtWidgets.QLabel(parent=self.gridLayoutWidget) self.label_5.setObjectName("label_5") self.gridLayout.addWidget(self.label_5, 2, 0, 1, 1) self.label_3 = QtWidgets.QLabel(parent=self.gridLayoutWidget) self.label_3.setObjectName("label_3") self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1) self.home_pb = QtWidgets.QPushButton(parent=self.gridLayoutWidget) self.home_pb.setObjectName("home_pb") self.gridLayout.addWidget(self.home_pb, 4, 1, 1, 1) self.move_rz_sb = QtWidgets.QSpinBox(parent=self.gridLayoutWidget) self.move_rz_sb.setMinimum(-45) self.move_rz_sb.setMaximum(45) self.move_rz_sb.setMinimum(-180) self.move_rz_sb.setMaximum(180) self.move_rz_sb.setObjectName("move_rz_sb") self.gridLayout.addWidget(self.move_rz_sb, 3, 2, 1, 1) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) self.gridLayout.addItem(spacerItem, 0, 0, 1, 1) self.move_pb = QtWidgets.QPushButton(parent=self.gridLayoutWidget) self.move_pb.setObjectName("move_pb") self.gridLayout.addWidget(self.move_pb, 4, 2, 1, 1) self.home_pb = QtWidgets.QPushButton(parent=self.gridLayoutWidget) self.home_pb.setObjectName("home_pb") self.gridLayout.addWidget(self.home_pb, 4, 1, 1, 1) self.current_ry_le = QtWidgets.QLineEdit(parent=self.gridLayoutWidget) self.current_ry_le.setEnabled(False) self.current_ry_le.setObjectName("current_ry_le") self.gridLayout.addWidget(self.current_ry_le, 2, 1, 1, 1) self.store_pb = QtWidgets.QPushButton(parent=self.gridLayoutWidget) self.store_pb.setObjectName("store_pb") self.gridLayout.addWidget(self.store_pb, 4, 0, 1, 1) self.move_ry_sb = QtWidgets.QSpinBox(parent=self.gridLayoutWidget) self.move_ry_sb.setMinimum(-180) self.move_ry_sb.setMaximum(180) self.move_ry_sb.setObjectName("move_ry_sb") self.gridLayout.addWidget(self.move_ry_sb, 2, 2, 1, 1) self.current_rx_le = QtWidgets.QLineEdit(parent=self.gridLayoutWidget) self.current_rx_le.setEnabled(False) self.current_rx_le.setObjectName("current_rx_le") self.gridLayout.addWidget(self.current_rx_le, 1, 1, 1, 1) self.move_rx_sb = QtWidgets.QSpinBox(parent=self.gridLayoutWidget) self.move_rx_sb.setMinimum(-180) self.move_rx_sb.setMaximum(180) self.move_rx_sb.setObjectName("move_rx_sb") self.gridLayout.addWidget(self.move_rx_sb, 1, 2, 1, 1) self.label_4 = QtWidgets.QLabel(parent=self.gridLayoutWidget) self.label_4.setObjectName("label_4") self.gridLayout.addWidget(self.label_4, 0, 2, 1, 1) self.current_rz_le = QtWidgets.QLineEdit(parent=self.gridLayoutWidget) self.current_rz_le.setEnabled(False) self.current_rz_le.setObjectName("current_rz_le") self.gridLayout.addWidget(self.current_rz_le, 3, 1, 1, 1) self.label = QtWidgets.QLabel(parent=self.gridLayoutWidget) self.label.setObjectName("label") self.gridLayout.addWidget(self.label, 0, 3, 1, 1) self.step_size_cb = QtWidgets.QComboBox(parent=self.gridLayoutWidget) self.step_size_cb.setCurrentText("") self.step_size_cb.setObjectName("step_size_cb") self.gridLayout.addWidget(self.step_size_cb, 4, 3, 1, 1) self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.jog_rz_neg_pb = QtWidgets.QPushButton(parent=self.gridLayoutWidget) self.jog_rz_neg_pb.setObjectName("jog_rz_neg_pb") self.horizontalLayout.addWidget(self.jog_rz_neg_pb) self.jog_rz_pos_pb = QtWidgets.QPushButton(parent=self.gridLayoutWidget) self.jog_rz_pos_pb.setObjectName("jog_rz_pos_pb") self.horizontalLayout.addWidget(self.jog_rz_pos_pb) self.gridLayout.addLayout(self.horizontalLayout, 1, 3, 1, 1) self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.jog_ry_neg_pb = QtWidgets.QPushButton(parent=self.gridLayoutWidget) self.jog_ry_neg_pb.setObjectName("jog_ry_neg_pb") self.horizontalLayout_2.addWidget(self.jog_ry_neg_pb) self.jog_ry_pos_pb = QtWidgets.QPushButton(parent=self.gridLayoutWidget) self.jog_ry_pos_pb.setObjectName("jog_ry_pos_pb") self.horizontalLayout_2.addWidget(self.jog_ry_pos_pb) self.gridLayout.addLayout(self.horizontalLayout_2, 2, 3, 1, 1) self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.jog_rz1_neg_pb = QtWidgets.QPushButton(parent=self.gridLayoutWidget) self.jog_rz1_neg_pb.setObjectName("jog_rz1_neg_pb") self.horizontalLayout_3.addWidget(self.jog_rz1_neg_pb) self.jog_rz1_pos_pb = QtWidgets.QPushButton(parent=self.gridLayoutWidget) self.jog_rz1_pos_pb.setObjectName("jog_rz1_pos_pb") self.horizontalLayout_3.addWidget(self.jog_rz1_pos_pb) self.gridLayout.addLayout(self.horizontalLayout_3, 3, 3, 1, 1) self.gridLayout.setColumnStretch(0, 1) self.gridLayout.setColumnStretch(1, 1) self.gridLayout.setColumnStretch(2, 1) self.gridLayout.setColumnStretch(3, 1) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(parent=MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 437, 22)) self.menubar.setGeometry(QtCore.QRect(0, 0, 503, 22)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(parent=MainWindow) Loading @@ -92,11 +127,18 @@ class Ui_MainWindow(object): def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.label_4.setText(_translate("MainWindow", "Move to")) self.label_3.setText(_translate("MainWindow", "Rz")) self.label_2.setText(_translate("MainWindow", "Current postion")) self.label_6.setText(_translate("MainWindow", "Rz\'")) self.label_5.setText(_translate("MainWindow", "Ry")) self.label_3.setText(_translate("MainWindow", "Rz")) self.move_pb.setText(_translate("MainWindow", "Move")) self.home_pb.setText(_translate("MainWindow", "Home")) self.move_pb.setText(_translate("MainWindow", "Move")) self.store_pb.setText(_translate("MainWindow", "Store")) self.label_4.setText(_translate("MainWindow", "Move to")) self.label.setText(_translate("MainWindow", "Jog")) self.jog_rz_neg_pb.setText(_translate("MainWindow", "-")) self.jog_rz_pos_pb.setText(_translate("MainWindow", "+")) self.jog_ry_neg_pb.setText(_translate("MainWindow", "-")) self.jog_ry_pos_pb.setText(_translate("MainWindow", "+")) self.jog_rz1_neg_pb.setText(_translate("MainWindow", "-")) self.jog_rz1_pos_pb.setText(_translate("MainWindow", "+")) Loading
firmware/firmware.ino +2 −0 Original line number Diff line number Diff line Loading @@ -73,6 +73,7 @@ void setup() // Wait acknowledge while(!Serial.available()) { Serial.println("Wait"); DBG.println("Remove standstill"); delay(250); } Loading @@ -92,6 +93,7 @@ void setup() motor3.setMaxSpeed(15 * k); motor3.setAcceleration(30 * k); delay(1000); Serial.println("Ready"); } bool parse_data(String data, float* values) Loading
firmware/firmware.ino.old→firmware/firmware.ino.ooo +23 −48 Original line number Diff line number Diff line Loading @@ -77,7 +77,7 @@ void setup() motor3.setAcceleration(200); delay(1000); // Standstill for automatic tuning delay(100000); // Standstill to remove the Support Blocks delay(20000); // Standstill to remove the Support Blocks //----------------------------------Move to the Home----------------------- Loading @@ -93,33 +93,8 @@ void setup() delay(1000); } bool parse_data(String data, float* values) { bool ret = true; int count = 0; // data.indexOf() while (count < 3) { int index = data.indexOf(","); values[count++] = data.substring(0, index).toFloat(); data = data.substring(index + 1); } return ret; } void loop() { float new_pos[3] = {0.0}; if (Serial.available()) { String data = Serial.readStringUntil('\n'); if (!parse_data(data, new_pos)) { goto send_current_pos; } } if (Serial.available()) { // check for incoming serial data String RpiData = Serial.readStringUntil('\n'); // read command from serial port // get first target position Loading Loading @@ -217,12 +192,18 @@ void loop() float xactual3 = posa3 / 10.0; //motor2.getCurrentPosition()*50.0; float xactual4 = posa4 / 10.0; //motor3.getCurrentPosition()*50.0; float xactual5 = 0.0; if (isnan(xactual1)) xactual1 = xactualold1; if (isnan(xactual2)) xactual2 = xactualold2; if (isnan(xactual3)) xactual3 = xactualold3; if (isnan(xactual4)) xactual4 = xactualold4; if (isnan(xactual5)) xactual5 = xactualold5; if (isnan(xactual2)) xactual2 = xactualold2; if (isnan(xactual3)) xactual3 = xactualold3; if (isnan(xactual4)) xactual4 = xactualold4; if (isnan(xactual5)) xactual5 = xactualold5; xactualold1 = xactual1; xactualold2 = xactual2; xactualold3 = xactual3; Loading @@ -233,11 +214,16 @@ void loop() float vactual3 = motor2.getCurrentSpeed(); float vactual4 = motor3.getCurrentSpeed(); float vactual5 = 0.0; if (isnan(vactual1)) vactual1 = vactualold1; if (isnan(vactual2)) vactual2 = vactualold2; if (isnan(vactual3)) vactual3 = vactualold3; if (isnan(vactual4)) vactual4 = vactualold4; if (isnan(vactual5)) vactual5 = vactualold5; if (isnan(vactual1)) vactual1 = vactualold1; if (isnan(vactual2)) vactual2 = vactualold2; if (isnan(vactual3)) vactual3 = vactualold3; if (isnan(vactual4)) vactual4 = vactualold4; if (isnan(vactual5)) vactual5 = vactualold5; vactualold1 = vactual1; vactualold2 = vactual2; vactualold3 = vactual3; Loading @@ -256,15 +242,4 @@ void loop() Serial.print("v"); Serial.print((abs(vactual1) + abs(vactual2) + abs(vactual3) + abs(vactual4) + abs(vactual5)) / (5 * 1000), 2); Serial.println("x"); send_current_pos: float current_pos[3] = { motor1.getCurrentPosition(), motor2.getCurrentPosition(), motor3.getCurrentPosition() }; } No newline at end of file
frontend/main.py +62 −12 Original line number Diff line number Diff line Loading @@ -9,11 +9,21 @@ from PyQt6.QtWidgets import ( from PyQt6.QtGui import QCloseEvent, QImage, QPixmap from PyQt6.QtCore import QObject, Qt, QThread, pyqtSignal import time, sys from functools import partial from enum import Enum POS_DEFAULT = 0.0 VEL_DEFAULT = 12.0 ACC_DEFAULT = 18.0 class JOG(Enum): RZ_NEG = 0 RZ_POS = 1 RY_NEG = 2 RY_POS = 3 RZ1_NEG = 4 RZ1_POS = 5 class CommThread(QThread): update_positions = pyqtSignal(list) Loading Loading @@ -45,38 +55,78 @@ class Window(QMainWindow, Ui_MainWindow): self.robot = CommThread("/dev/ttyACM0") self.__setup_signals() self.robot.start() time.sleep(0.5) self.step_size_cb.addItems(["1", "5", "10", "50"]) self.current_pos = None self.store() def __setup_signals(self): # UI self.move_pb.pressed.connect(self.send_pos) self.move_pb.pressed.connect(self.move_pb_callback) self.home_pb.pressed.connect(self.home) self.store_pb.pressed.connect(self.store) self.step_size_cb.currentIndexChanged.connect(self.__update_spinbox_step_size) self.jog_rz_neg_pb.pressed.connect(partial(self.jog_callback, JOG.RZ_NEG)) self.jog_rz_pos_pb.pressed.connect(partial(self.jog_callback, JOG.RZ_POS)) self.jog_ry_neg_pb.pressed.connect(partial(self.jog_callback, JOG.RY_NEG)) self.jog_ry_pos_pb.pressed.connect(partial(self.jog_callback, JOG.RY_POS)) self.jog_rz1_neg_pb.pressed.connect(partial(self.jog_callback, JOG.RZ1_NEG)) self.jog_rz1_pos_pb.pressed.connect(partial(self.jog_callback, JOG.RZ1_POS)) # Thread self.robot.update_positions.connect(self.update_position) def home(self): def __update_spinbox_step_size(self): move = WorldPosition(0.0, 0.0, 0.0) self.robot.send_pos(move) self.update_sb(move) self.move_rx_sb.setSingleStep(int(self.step_size_cb.currentText())) self.move_ry_sb.setSingleStep(int(self.step_size_cb.currentText())) self.move_rz_sb.setSingleStep(int(self.step_size_cb.currentText())) def store(self): move = WorldPosition(-60.0, 0.0, 0.0) self.robot.send_pos(move) self.update_sb(move) def home(self): self.move(WorldPosition(0.0, 0.0, 0.0)) def send_pos(self): def store(self): self.move(WorldPosition(-60.0, 0.0, 0.0)) def jog_callback(self, jog: JOG): new_pos = self.current_pos step = int(self.step_size_cb.currentText()) match jog: case JOG.RZ_NEG: new_pos.rz -= step case JOG.RZ_POS: new_pos.rz += step case JOG.RY_NEG: new_pos.ry -= step case JOG.RY_POS: new_pos.ry += step case JOG.RZ1_NEG: new_pos.rz1 -= step case JOG.RZ1_POS: new_pos.rz1 += step self.move(new_pos) def move_pb_callback(self): move = WorldPosition( float(self.move_rx_sb.value()), float(self.move_ry_sb.value()), float(self.move_rz_sb.value()) ) self.robot.send_pos(move) self.move(move) def move(self, new_pos: WorldPosition): self.current_pos = new_pos self.update_spinboxes(new_pos) self.robot.send_pos(new_pos) print(self.current_pos) def update_sb(self, pos : WorldPosition): def update_spinboxes(self, pos : WorldPosition): self.move_rx_sb.setValue(int(pos.rz)) self.move_ry_sb.setValue(int(pos.ry)) Loading
frontend/ui/robot.ui +137 −69 Original line number Diff line number Diff line Loading @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> <width>437</width> <height>206</height> <width>503</width> <height>218</height> </rect> </property> <property name="windowTitle"> Loading @@ -19,13 +19,61 @@ <rect> <x>10</x> <y>10</y> <width>411</width> <height>149</height> <width>481</width> <height>152</height> </rect> </property> <layout class="QGridLayout" name="gridLayout" columnstretch="1,1,1"> <item row="1" column="2"> <widget class="QSpinBox" name="move_rx_sb"> <layout class="QGridLayout" name="gridLayout" columnstretch="1,1,1,1"> <item row="0" column="0"> <spacer name="horizontalSpacer"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item row="1" column="0"> <widget class="QLabel" name="label_3"> <property name="text"> <string>Rz</string> </property> </widget> </item> <item row="0" column="1"> <widget class="QLabel" name="label_2"> <property name="text"> <string>Current postion</string> </property> </widget> </item> <item row="3" column="0"> <widget class="QLabel" name="label_6"> <property name="text"> <string>Rz'</string> </property> </widget> </item> <item row="2" column="0"> <widget class="QLabel" name="label_5"> <property name="text"> <string>Ry</string> </property> </widget> </item> <item row="4" column="1"> <widget class="QPushButton" name="home_pb"> <property name="text"> <string>Home</string> </property> </widget> </item> <item row="3" column="2"> <widget class="QSpinBox" name="move_rz_sb"> <property name="minimum"> <number>-180</number> </property> Loading @@ -34,10 +82,24 @@ </property> </widget> </item> <item row="0" column="2"> <widget class="QLabel" name="label_4"> <item row="4" column="2"> <widget class="QPushButton" name="move_pb"> <property name="text"> <string>Move to</string> <string>Move</string> </property> </widget> </item> <item row="2" column="1"> <widget class="QLineEdit" name="current_ry_le"> <property name="enabled"> <bool>false</bool> </property> </widget> </item> <item row="4" column="0"> <widget class="QPushButton" name="store_pb"> <property name="text"> <string>Store</string> </property> </widget> </item> Loading @@ -51,13 +113,6 @@ </property> </widget> </item> <item row="0" column="1"> <widget class="QLabel" name="label_2"> <property name="text"> <string>Current postion</string> </property> </widget> </item> <item row="1" column="1"> <widget class="QLineEdit" name="current_rx_le"> <property name="enabled"> Loading @@ -65,10 +120,20 @@ </property> </widget> </item> <item row="2" column="1"> <widget class="QLineEdit" name="current_ry_le"> <property name="enabled"> <bool>false</bool> <item row="1" column="2"> <widget class="QSpinBox" name="move_rx_sb"> <property name="minimum"> <number>-180</number> </property> <property name="maximum"> <number>180</number> </property> </widget> </item> <item row="0" column="2"> <widget class="QLabel" name="label_4"> <property name="text"> <string>Move to</string> </property> </widget> </item> Loading @@ -79,72 +144,75 @@ </property> </widget> </item> <item row="3" column="0"> <widget class="QLabel" name="label_6"> <item row="0" column="3"> <widget class="QLabel" name="label"> <property name="text"> <string>Rz'</string> <string>Jog</string> </property> </widget> </item> <item row="2" column="0"> <widget class="QLabel" name="label_5"> <property name="text"> <string>Ry</string> <item row="4" column="3"> <widget class="QComboBox" name="step_size_cb"> <property name="currentText"> <string/> </property> </widget> </item> <item row="1" column="0"> <widget class="QLabel" name="label_3"> <item row="1" column="3"> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QPushButton" name="jog_rz_neg_pb"> <property name="text"> <string>Rz</string> <string>-</string> </property> </widget> </item> <item row="3" column="2"> <widget class="QSpinBox" name="move_rz_sb"> <property name="minimum"> <number>-45</number> </property> <property name="maximum"> <number>45</number> <item> <widget class="QPushButton" name="jog_rz_pos_pb"> <property name="text"> <string>+</string> </property> </widget> </item> <item row="0" column="0"> <spacer name="horizontalSpacer"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </layout> </item> <item row="2" column="3"> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> <widget class="QPushButton" name="jog_ry_neg_pb"> <property name="text"> <string>-</string> </property> </spacer> </widget> </item> <item row="4" column="2"> <widget class="QPushButton" name="move_pb"> <item> <widget class="QPushButton" name="jog_ry_pos_pb"> <property name="text"> <string>Move</string> <string>+</string> </property> </widget> </item> <item row="4" column="1"> <widget class="QPushButton" name="home_pb"> </layout> </item> <item row="3" column="3"> <layout class="QHBoxLayout" name="horizontalLayout_3"> <item> <widget class="QPushButton" name="jog_rz1_neg_pb"> <property name="text"> <string>Home</string> <string>-</string> </property> </widget> </item> <item row="4" column="0"> <widget class="QPushButton" name="store_pb"> <item> <widget class="QPushButton" name="jog_rz1_pos_pb"> <property name="text"> <string>Store</string> <string>+</string> </property> </widget> </item> </layout> </item> </layout> </widget> </widget> <widget class="QMenuBar" name="menubar"> Loading @@ -152,7 +220,7 @@ <rect> <x>0</x> <y>0</y> <width>437</width> <width>503</width> <height>22</height> </rect> </property> Loading
frontend/ui/robot_ui.py +83 −41 Original line number Diff line number Diff line Loading @@ -12,74 +12,109 @@ from PyQt6 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(437, 206) MainWindow.resize(503, 218) self.centralwidget = QtWidgets.QWidget(parent=MainWindow) self.centralwidget.setObjectName("centralwidget") self.gridLayoutWidget = QtWidgets.QWidget(parent=self.centralwidget) self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 10, 411, 149)) self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 10, 481, 152)) self.gridLayoutWidget.setObjectName("gridLayoutWidget") self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget) self.gridLayout.setContentsMargins(0, 0, 0, 0) self.gridLayout.setObjectName("gridLayout") self.move_rx_sb = QtWidgets.QSpinBox(parent=self.gridLayoutWidget) self.move_rx_sb.setMinimum(-180) self.move_rx_sb.setMaximum(180) self.move_rx_sb.setObjectName("move_rx_sb") self.gridLayout.addWidget(self.move_rx_sb, 1, 2, 1, 1) self.label_4 = QtWidgets.QLabel(parent=self.gridLayoutWidget) self.label_4.setObjectName("label_4") self.gridLayout.addWidget(self.label_4, 0, 2, 1, 1) self.move_ry_sb = QtWidgets.QSpinBox(parent=self.gridLayoutWidget) self.move_ry_sb.setMinimum(-180) self.move_ry_sb.setMaximum(180) self.move_ry_sb.setObjectName("move_ry_sb") self.gridLayout.addWidget(self.move_ry_sb, 2, 2, 1, 1) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) self.gridLayout.addItem(spacerItem, 0, 0, 1, 1) self.label_3 = QtWidgets.QLabel(parent=self.gridLayoutWidget) self.label_3.setObjectName("label_3") self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1) self.label_2 = QtWidgets.QLabel(parent=self.gridLayoutWidget) self.label_2.setObjectName("label_2") self.gridLayout.addWidget(self.label_2, 0, 1, 1, 1) self.current_rx_le = QtWidgets.QLineEdit(parent=self.gridLayoutWidget) self.current_rx_le.setEnabled(False) self.current_rx_le.setObjectName("current_rx_le") self.gridLayout.addWidget(self.current_rx_le, 1, 1, 1, 1) self.current_ry_le = QtWidgets.QLineEdit(parent=self.gridLayoutWidget) self.current_ry_le.setEnabled(False) self.current_ry_le.setObjectName("current_ry_le") self.gridLayout.addWidget(self.current_ry_le, 2, 1, 1, 1) self.current_rz_le = QtWidgets.QLineEdit(parent=self.gridLayoutWidget) self.current_rz_le.setEnabled(False) self.current_rz_le.setObjectName("current_rz_le") self.gridLayout.addWidget(self.current_rz_le, 3, 1, 1, 1) self.label_6 = QtWidgets.QLabel(parent=self.gridLayoutWidget) self.label_6.setObjectName("label_6") self.gridLayout.addWidget(self.label_6, 3, 0, 1, 1) self.label_5 = QtWidgets.QLabel(parent=self.gridLayoutWidget) self.label_5.setObjectName("label_5") self.gridLayout.addWidget(self.label_5, 2, 0, 1, 1) self.label_3 = QtWidgets.QLabel(parent=self.gridLayoutWidget) self.label_3.setObjectName("label_3") self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1) self.home_pb = QtWidgets.QPushButton(parent=self.gridLayoutWidget) self.home_pb.setObjectName("home_pb") self.gridLayout.addWidget(self.home_pb, 4, 1, 1, 1) self.move_rz_sb = QtWidgets.QSpinBox(parent=self.gridLayoutWidget) self.move_rz_sb.setMinimum(-45) self.move_rz_sb.setMaximum(45) self.move_rz_sb.setMinimum(-180) self.move_rz_sb.setMaximum(180) self.move_rz_sb.setObjectName("move_rz_sb") self.gridLayout.addWidget(self.move_rz_sb, 3, 2, 1, 1) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) self.gridLayout.addItem(spacerItem, 0, 0, 1, 1) self.move_pb = QtWidgets.QPushButton(parent=self.gridLayoutWidget) self.move_pb.setObjectName("move_pb") self.gridLayout.addWidget(self.move_pb, 4, 2, 1, 1) self.home_pb = QtWidgets.QPushButton(parent=self.gridLayoutWidget) self.home_pb.setObjectName("home_pb") self.gridLayout.addWidget(self.home_pb, 4, 1, 1, 1) self.current_ry_le = QtWidgets.QLineEdit(parent=self.gridLayoutWidget) self.current_ry_le.setEnabled(False) self.current_ry_le.setObjectName("current_ry_le") self.gridLayout.addWidget(self.current_ry_le, 2, 1, 1, 1) self.store_pb = QtWidgets.QPushButton(parent=self.gridLayoutWidget) self.store_pb.setObjectName("store_pb") self.gridLayout.addWidget(self.store_pb, 4, 0, 1, 1) self.move_ry_sb = QtWidgets.QSpinBox(parent=self.gridLayoutWidget) self.move_ry_sb.setMinimum(-180) self.move_ry_sb.setMaximum(180) self.move_ry_sb.setObjectName("move_ry_sb") self.gridLayout.addWidget(self.move_ry_sb, 2, 2, 1, 1) self.current_rx_le = QtWidgets.QLineEdit(parent=self.gridLayoutWidget) self.current_rx_le.setEnabled(False) self.current_rx_le.setObjectName("current_rx_le") self.gridLayout.addWidget(self.current_rx_le, 1, 1, 1, 1) self.move_rx_sb = QtWidgets.QSpinBox(parent=self.gridLayoutWidget) self.move_rx_sb.setMinimum(-180) self.move_rx_sb.setMaximum(180) self.move_rx_sb.setObjectName("move_rx_sb") self.gridLayout.addWidget(self.move_rx_sb, 1, 2, 1, 1) self.label_4 = QtWidgets.QLabel(parent=self.gridLayoutWidget) self.label_4.setObjectName("label_4") self.gridLayout.addWidget(self.label_4, 0, 2, 1, 1) self.current_rz_le = QtWidgets.QLineEdit(parent=self.gridLayoutWidget) self.current_rz_le.setEnabled(False) self.current_rz_le.setObjectName("current_rz_le") self.gridLayout.addWidget(self.current_rz_le, 3, 1, 1, 1) self.label = QtWidgets.QLabel(parent=self.gridLayoutWidget) self.label.setObjectName("label") self.gridLayout.addWidget(self.label, 0, 3, 1, 1) self.step_size_cb = QtWidgets.QComboBox(parent=self.gridLayoutWidget) self.step_size_cb.setCurrentText("") self.step_size_cb.setObjectName("step_size_cb") self.gridLayout.addWidget(self.step_size_cb, 4, 3, 1, 1) self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.jog_rz_neg_pb = QtWidgets.QPushButton(parent=self.gridLayoutWidget) self.jog_rz_neg_pb.setObjectName("jog_rz_neg_pb") self.horizontalLayout.addWidget(self.jog_rz_neg_pb) self.jog_rz_pos_pb = QtWidgets.QPushButton(parent=self.gridLayoutWidget) self.jog_rz_pos_pb.setObjectName("jog_rz_pos_pb") self.horizontalLayout.addWidget(self.jog_rz_pos_pb) self.gridLayout.addLayout(self.horizontalLayout, 1, 3, 1, 1) self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.jog_ry_neg_pb = QtWidgets.QPushButton(parent=self.gridLayoutWidget) self.jog_ry_neg_pb.setObjectName("jog_ry_neg_pb") self.horizontalLayout_2.addWidget(self.jog_ry_neg_pb) self.jog_ry_pos_pb = QtWidgets.QPushButton(parent=self.gridLayoutWidget) self.jog_ry_pos_pb.setObjectName("jog_ry_pos_pb") self.horizontalLayout_2.addWidget(self.jog_ry_pos_pb) self.gridLayout.addLayout(self.horizontalLayout_2, 2, 3, 1, 1) self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.jog_rz1_neg_pb = QtWidgets.QPushButton(parent=self.gridLayoutWidget) self.jog_rz1_neg_pb.setObjectName("jog_rz1_neg_pb") self.horizontalLayout_3.addWidget(self.jog_rz1_neg_pb) self.jog_rz1_pos_pb = QtWidgets.QPushButton(parent=self.gridLayoutWidget) self.jog_rz1_pos_pb.setObjectName("jog_rz1_pos_pb") self.horizontalLayout_3.addWidget(self.jog_rz1_pos_pb) self.gridLayout.addLayout(self.horizontalLayout_3, 3, 3, 1, 1) self.gridLayout.setColumnStretch(0, 1) self.gridLayout.setColumnStretch(1, 1) self.gridLayout.setColumnStretch(2, 1) self.gridLayout.setColumnStretch(3, 1) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(parent=MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 437, 22)) self.menubar.setGeometry(QtCore.QRect(0, 0, 503, 22)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(parent=MainWindow) Loading @@ -92,11 +127,18 @@ class Ui_MainWindow(object): def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.label_4.setText(_translate("MainWindow", "Move to")) self.label_3.setText(_translate("MainWindow", "Rz")) self.label_2.setText(_translate("MainWindow", "Current postion")) self.label_6.setText(_translate("MainWindow", "Rz\'")) self.label_5.setText(_translate("MainWindow", "Ry")) self.label_3.setText(_translate("MainWindow", "Rz")) self.move_pb.setText(_translate("MainWindow", "Move")) self.home_pb.setText(_translate("MainWindow", "Home")) self.move_pb.setText(_translate("MainWindow", "Move")) self.store_pb.setText(_translate("MainWindow", "Store")) self.label_4.setText(_translate("MainWindow", "Move to")) self.label.setText(_translate("MainWindow", "Jog")) self.jog_rz_neg_pb.setText(_translate("MainWindow", "-")) self.jog_rz_pos_pb.setText(_translate("MainWindow", "+")) self.jog_ry_neg_pb.setText(_translate("MainWindow", "-")) self.jog_ry_pos_pb.setText(_translate("MainWindow", "+")) self.jog_rz1_neg_pb.setText(_translate("MainWindow", "-")) self.jog_rz1_pos_pb.setText(_translate("MainWindow", "+"))