mirror of
https://github.com/caperren/school_archives.git
synced 2025-11-09 21:51:15 +00:00
Added applied robotics code to archive.
This commit is contained in:
@@ -0,0 +1,195 @@
|
||||
#####################################
|
||||
# Imports
|
||||
#####################################
|
||||
# Python native imports
|
||||
from PyQt5 import QtCore, QtWidgets
|
||||
import pythoncom
|
||||
import win32com.client
|
||||
import time
|
||||
from time import time
|
||||
|
||||
#####################################
|
||||
# Global Variables
|
||||
#####################################
|
||||
THREAD_HERTZ = 100
|
||||
|
||||
P0 = (216.1302490234375, -9.575998306274414, 572.6145629882812, 63.89561462402344, 8.09478759765625, 83.43250274658203)
|
||||
P0_2 = (220.1302490234375, -9.575998306274414, 572.6145629882812, 63.89561462402344, 8.09478759765625, 83.43250274658203)
|
||||
P1 = (251.22869873046875, -9.575998306274414, 572.6145629882812, 63.89561462402344, 8.09478759765625, 83.43250274658203)
|
||||
P2 = (216.1302490234375, 0.10808953642845154, 606.7885131835938, 63.89561462402344, 8.09478759765625, 83.43250274658203)
|
||||
|
||||
|
||||
#####################################
|
||||
# Controller Class Definition
|
||||
#####################################
|
||||
class CAOController(QtCore.QThread):
|
||||
j1_set__signal = QtCore.pyqtSignal(float)
|
||||
j2_set__signal = QtCore.pyqtSignal(float)
|
||||
j3_set__signal = QtCore.pyqtSignal(float)
|
||||
j4_set__signal = QtCore.pyqtSignal(float)
|
||||
j5_set__signal = QtCore.pyqtSignal(float)
|
||||
j6_set__signal = QtCore.pyqtSignal(float)
|
||||
|
||||
def __init__(self, shared_objects):
|
||||
super(CAOController, self).__init__()
|
||||
|
||||
# ########## Reference to class init variables ##########
|
||||
self.shared_objects = shared_objects
|
||||
self.main_screen = self.shared_objects["screens"]["main_screen"]
|
||||
self.motor_power_label = self.main_screen.motor_power_label # type: QtWidgets.QLabel
|
||||
|
||||
self.control_mode_pushbutton = self.main_screen.control_mode_stored_points_radiobutton # type: QtWidgets.QRadioButton
|
||||
self.control_mode_pushbutton.setChecked(True)
|
||||
|
||||
self.move_p0_pushbutton = self.main_screen.movep0_pushbutton # type: QtWidgets.QPushButton
|
||||
self.move_p1_pushbutton = self.main_screen.movep1_pushbutton # type: QtWidgets.QPushButton
|
||||
self.move_p2_pushbutton = self.main_screen.movep2_pushbutton # type: QtWidgets.QPushButton
|
||||
|
||||
self.max_speed_label = self.main_screen.max_speed_label # type: QtWidgets.QLabel
|
||||
self.speed_limit_spinbox = self.main_screen.speed_limit_spinbox # type: QtWidgets.QSpinBox
|
||||
self.speed_limit_apply_pushbutton = self.main_screen.speed_limit_apply_pushbutton # type: QtWidgets.QPushButton
|
||||
|
||||
self.j1_spinbox = self.main_screen.j1_spinbox # type: QtWidgets.QSpinBox
|
||||
self.j2_spinbox = self.main_screen.j2_spinbox # type: QtWidgets.QSpinBox
|
||||
self.j3_spinbox = self.main_screen.j3_spinbox # type: QtWidgets.QSpinBox
|
||||
self.j4_spinbox = self.main_screen.j4_spinbox # type: QtWidgets.QSpinBox
|
||||
self.j5_spinbox = self.main_screen.j5_spinbox # type: QtWidgets.QSpinBox
|
||||
self.j6_spinbox = self.main_screen.j6_spinbox # type: QtWidgets.QSpinBox
|
||||
|
||||
# ########## Get the settings instance ##########
|
||||
self.settings = QtCore.QSettings()
|
||||
|
||||
# ########## Thread Flags ##########
|
||||
self.run_thread_flag = True
|
||||
|
||||
# ########## Class Variables ##########
|
||||
self.wait_time = 1.0 / THREAD_HERTZ
|
||||
|
||||
self.cao_engine = None
|
||||
self.controller = None
|
||||
self.arm = None
|
||||
|
||||
self.arm_power_status = None
|
||||
|
||||
self.command_queue = []
|
||||
|
||||
self.enable_motors = False
|
||||
|
||||
self.set_motor_speed = True
|
||||
self.new_motor_speed = 5
|
||||
|
||||
self.move_p0 = False
|
||||
self.move_p1 = False
|
||||
self.move_p2 = False
|
||||
|
||||
self.arm_last_power_status = -1
|
||||
|
||||
def run(self):
|
||||
pythoncom.CoInitialize()
|
||||
self.cao_engine = win32com.client.Dispatch("CAO.CaoEngine")
|
||||
self.controller = self.cao_engine.Workspaces(0).AddController("RC", "CaoProv.DENSO.NetwoRC", "", "conn=eth:192.168.1.10")
|
||||
self.arm = self.controller.AddRobot("Arm1", "")
|
||||
|
||||
# p_val_0 = self.controller.AddVariable("P0", "")
|
||||
self.arm_power_status = self.arm.AddVariable("@SERVO_ON", "")
|
||||
self.arm_speed_status = self.arm.AddVariable("@EXTSPEED", "")
|
||||
self.arm_current_position = self.arm.AddVariable("@CURRENT_POSITION", "")
|
||||
# self.arm_current_joint_states = self.arm.AddVariable("@CURJNT", "")
|
||||
|
||||
temp = 1
|
||||
|
||||
while self.run_thread_flag:
|
||||
|
||||
start_time = time()
|
||||
# print(self.arm_current_joint_states.Value)
|
||||
test = list(self.arm_current_position.Value)
|
||||
#
|
||||
# self.j1_set__signal.emit(j1)
|
||||
# self.j2_set__signal.emit(j2)
|
||||
# self.j3_set__signal.emit(j3)
|
||||
# self.j4_set__signal.emit(j4)
|
||||
# self.j5_set__signal.emit(j5)
|
||||
# self.j6_set__signal.emit(j6)
|
||||
|
||||
self.max_speed_label.setText(str(self.arm_speed_status.Value))
|
||||
|
||||
if self.arm_power_status.Value != self.arm_last_power_status:
|
||||
if self.arm_power_status.Value:
|
||||
self.motor_power_label.setText("MOTOR POWER ON")
|
||||
self.motor_power_label.setStyleSheet("background-color: green;")
|
||||
else:
|
||||
self.motor_power_label.setText("MOTOR POWER OFF")
|
||||
self.motor_power_label.setStyleSheet("background-color: darkred;")
|
||||
|
||||
self.arm_last_power_status = self.arm_power_status.Value
|
||||
|
||||
if self.enable_motors:
|
||||
if not self.arm_power_status.Value:
|
||||
self.arm.Execute("Motor", 1) # Enable motor power
|
||||
self.arm.Execute("TakeArm", 0)
|
||||
else:
|
||||
self.arm.Execute("Motor", 0) # Enable motor power
|
||||
|
||||
self.enable_motors = False
|
||||
|
||||
if self.set_motor_speed:
|
||||
self.arm.Execute("ExtSpeed", (self.new_motor_speed, self.new_motor_speed, self.new_motor_speed))
|
||||
self.set_motor_speed = False
|
||||
|
||||
if self.move_p0:
|
||||
test[0] += 10
|
||||
print(test)
|
||||
self.arm.Move(1, str(tuple(test)), "")
|
||||
self.move_p0 = False
|
||||
|
||||
if self.move_p1:
|
||||
self.arm.Move(1, str(P0_2), "")
|
||||
self.move_p1 = False
|
||||
|
||||
if self.move_p2:
|
||||
self.arm.Move(1, str(P2), "")
|
||||
self.move_p2 = False
|
||||
|
||||
time_diff = time() - start_time
|
||||
|
||||
self.msleep(max(int(self.wait_time - time_diff), 0))
|
||||
|
||||
def toggle_motor_power__slot(self, _):
|
||||
self.enable_motors = True
|
||||
|
||||
def set_motor_speed__slot(self):
|
||||
self.set_motor_speed = True
|
||||
self.new_motor_speed = self.speed_limit_spinbox.value()
|
||||
|
||||
def move_p0__slot(self):
|
||||
self.move_p0 = True
|
||||
|
||||
def move_p1__slot(self):
|
||||
self.move_p1 = True
|
||||
|
||||
def move_p2__slot(self):
|
||||
self.move_p2 = True
|
||||
|
||||
def connect_signals_and_slots(self):
|
||||
self.motor_power_label.mousePressEvent = self.toggle_motor_power__slot
|
||||
|
||||
self.speed_limit_apply_pushbutton.clicked.connect(self.set_motor_speed__slot)
|
||||
|
||||
self.move_p0_pushbutton.clicked.connect(self.move_p0__slot)
|
||||
self.move_p1_pushbutton.clicked.connect(self.move_p1__slot)
|
||||
self.move_p2_pushbutton.clicked.connect(self.move_p2__slot)
|
||||
|
||||
self.j1_set__signal.connect(self.j1_spinbox.setValue)
|
||||
self.j2_set__signal.connect(self.j2_spinbox.setValue)
|
||||
self.j3_set__signal.connect(self.j3_spinbox.setValue)
|
||||
self.j4_set__signal.connect(self.j4_spinbox.setValue)
|
||||
self.j5_set__signal.connect(self.j5_spinbox.setValue)
|
||||
self.j6_set__signal.connect(self.j6_spinbox.setValue)
|
||||
|
||||
def setup_signals(self, start_signal, signals_and_slots_signal, kill_signal):
|
||||
start_signal.connect(self.start)
|
||||
signals_and_slots_signal.connect(self.connect_signals_and_slots)
|
||||
kill_signal.connect(self.on_kill_threads_requested__slot)
|
||||
|
||||
def on_kill_threads_requested__slot(self):
|
||||
self.run_thread_flag = False
|
||||
@@ -0,0 +1,102 @@
|
||||
#####################################
|
||||
# Imports
|
||||
#####################################
|
||||
# Python native imports
|
||||
from PyQt5 import QtCore, QtWidgets
|
||||
import pythoncom
|
||||
import win32com.client
|
||||
import time
|
||||
from time import time
|
||||
|
||||
#####################################
|
||||
# Global Variables
|
||||
#####################################
|
||||
THREAD_HERTZ = 100
|
||||
|
||||
|
||||
#####################################
|
||||
# Controller Class Definition
|
||||
#####################################
|
||||
class CAOMonitor(QtCore.QThread):
|
||||
j1_set__signal = QtCore.pyqtSignal(float)
|
||||
j2_set__signal = QtCore.pyqtSignal(float)
|
||||
j3_set__signal = QtCore.pyqtSignal(float)
|
||||
j4_set__signal = QtCore.pyqtSignal(float)
|
||||
j5_set__signal = QtCore.pyqtSignal(float)
|
||||
j6_set__signal = QtCore.pyqtSignal(float)
|
||||
|
||||
def __init__(self, shared_objects):
|
||||
super(CAOMonitor, self).__init__()
|
||||
|
||||
# ########## Reference to class init variables ##########
|
||||
self.shared_objects = shared_objects
|
||||
self.main_screen = self.shared_objects["screens"]["main_screen"]
|
||||
self.motor_power_label = self.main_screen.motor_power_label # type: QtWidgets.QLabel
|
||||
|
||||
self.max_speed_label = self.main_screen.max_speed_label # type: QtWidgets.QLabel\
|
||||
|
||||
self.j1_spinbox = self.main_screen.j1_spinbox # type: QtWidgets.QSpinBox
|
||||
self.j2_spinbox = self.main_screen.j2_spinbox # type: QtWidgets.QSpinBox
|
||||
self.j3_spinbox = self.main_screen.j3_spinbox # type: QtWidgets.QSpinBox
|
||||
self.j4_spinbox = self.main_screen.j4_spinbox # type: QtWidgets.QSpinBox
|
||||
self.j5_spinbox = self.main_screen.j5_spinbox # type: QtWidgets.QSpinBox
|
||||
self.j6_spinbox = self.main_screen.j6_spinbox # type: QtWidgets.QSpinBox
|
||||
|
||||
# ########## Get the settings instance ##########
|
||||
self.settings = QtCore.QSettings()
|
||||
|
||||
# ########## Thread Flags ##########
|
||||
self.run_thread_flag = True
|
||||
|
||||
# ########## Class Variables ##########
|
||||
self.wait_time = 1.0 / THREAD_HERTZ
|
||||
|
||||
self.cao_engine = None
|
||||
self.controller = None
|
||||
self.arm = None
|
||||
|
||||
self.arm_power_status = None
|
||||
|
||||
def run(self):
|
||||
pythoncom.CoInitialize()
|
||||
self.cao_engine = win32com.client.Dispatch("CAO.CaoEngine")
|
||||
self.controller = self.cao_engine.Workspaces(0).AddController("RC", "CaoProv.DENSO.NetwoRC", "", "conn=eth:192.168.1.10")
|
||||
self.arm = self.controller.AddRobot("Arm1", "")
|
||||
|
||||
self.arm_power_status = self.arm.AddVariable("@SERVO_ON", "")
|
||||
self.arm_speed_status = self.arm.AddVariable("@EXTSPEED", "")
|
||||
self.arm_current_position = self.arm.AddVariable("@CURRENT_POSITION", "")
|
||||
|
||||
while self.run_thread_flag:
|
||||
|
||||
start_time = time()
|
||||
j1, j2, j3, j4, j5, j6, _ = self.arm_current_position.Value
|
||||
|
||||
self.j1_set__signal.emit(j1)
|
||||
self.j2_set__signal.emit(j2)
|
||||
self.j3_set__signal.emit(j3)
|
||||
self.j4_set__signal.emit(j4)
|
||||
self.j5_set__signal.emit(j5)
|
||||
self.j6_set__signal.emit(j6)
|
||||
|
||||
self.max_speed_label.setText(str(self.arm_speed_status.Value))
|
||||
|
||||
time_diff = time() - start_time
|
||||
|
||||
self.msleep(max(int(self.wait_time - time_diff), 0))
|
||||
|
||||
def connect_signals_and_slots(self):
|
||||
self.j1_set__signal.connect(self.j1_spinbox.setValue)
|
||||
self.j2_set__signal.connect(self.j2_spinbox.setValue)
|
||||
self.j3_set__signal.connect(self.j3_spinbox.setValue)
|
||||
self.j4_set__signal.connect(self.j4_spinbox.setValue)
|
||||
self.j5_set__signal.connect(self.j5_spinbox.setValue)
|
||||
self.j6_set__signal.connect(self.j6_spinbox.setValue)
|
||||
|
||||
def setup_signals(self, start_signal, signals_and_slots_signal, kill_signal):
|
||||
start_signal.connect(self.start)
|
||||
signals_and_slots_signal.connect(self.connect_signals_and_slots)
|
||||
kill_signal.connect(self.on_kill_threads_requested__slot)
|
||||
|
||||
def on_kill_threads_requested__slot(self):
|
||||
self.run_thread_flag = False
|
||||
@@ -0,0 +1,382 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MainWindow</class>
|
||||
<widget class="QMainWindow" name="MainWindow">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>325</width>
|
||||
<height>542</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>MainWindow</string>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="1" column="0">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_8">
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>12</pointsize>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Axis Readout/Control</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<item row="0" column="1">
|
||||
<widget class="QDoubleSpinBox" name="j1_spinbox">
|
||||
<property name="decimals">
|
||||
<number>4</number>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-10000.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>10000.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>J1</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QDoubleSpinBox" name="j2_spinbox">
|
||||
<property name="decimals">
|
||||
<number>4</number>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-10000.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>10000.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QDoubleSpinBox" name="j3_spinbox">
|
||||
<property name="decimals">
|
||||
<number>4</number>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-10000.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>10000.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QDoubleSpinBox" name="j4_spinbox">
|
||||
<property name="decimals">
|
||||
<number>4</number>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-10000.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>10000.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QDoubleSpinBox" name="j5_spinbox">
|
||||
<property name="decimals">
|
||||
<number>4</number>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-10000.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>10000.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="1">
|
||||
<widget class="QDoubleSpinBox" name="j6_spinbox">
|
||||
<property name="decimals">
|
||||
<number>4</number>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-10000.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>10000.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>J2</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>J3</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_5">
|
||||
<property name="text">
|
||||
<string>J4</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="text">
|
||||
<string>J5</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QLabel" name="label_7">
|
||||
<property name="text">
|
||||
<string>J6</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="manual_set_positions_pushbutton">
|
||||
<property name="text">
|
||||
<string>Set Positions</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_10">
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>18</pointsize>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>DENSO Pendant</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<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>
|
||||
<widget class="QLabel" name="motor_power_label">
|
||||
<property name="styleSheet">
|
||||
<string notr="true">background-color: darkred;</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>MOTOR POWER OFF</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_5">
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>12</pointsize>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Max Speed Limit</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_11">
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>10</pointsize>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Current Max Speed:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="max_speed_label">
|
||||
<property name="text">
|
||||
<string>0</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<widget class="QSpinBox" name="speed_limit_spinbox">
|
||||
<property name="minimum">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>100</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>5</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="speed_limit_apply_pushbutton">
|
||||
<property name="text">
|
||||
<string>Apply</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_9">
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>12</pointsize>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Control Mode</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="control_mode_stored_points_radiobutton">
|
||||
<property name="text">
|
||||
<string>Stored Points</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="control_mode_manual_radiobutton">
|
||||
<property name="text">
|
||||
<string>Manual Joint Control</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_12">
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>12</pointsize>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Stored Points</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="movep0_pushbutton">
|
||||
<property name="text">
|
||||
<string>Move P0</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="movep1_pushbutton">
|
||||
<property name="text">
|
||||
<string>Move P1</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="movep2_pushbutton">
|
||||
<property name="text">
|
||||
<string>Move P2</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QStatusBar" name="statusbar"/>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -0,0 +1,164 @@
|
||||
# coding:utf-8
|
||||
#####################################
|
||||
# Imports
|
||||
#####################################
|
||||
# Python native imports
|
||||
import sys
|
||||
from PyQt5 import QtWidgets, QtCore, QtGui, uic
|
||||
import signal
|
||||
import qdarkstyle
|
||||
|
||||
from Framework.cao_controller import CAOController
|
||||
from Framework.cao_monitor import CAOMonitor
|
||||
|
||||
#####################################
|
||||
# Global Variables
|
||||
#####################################
|
||||
UI_FILE = "Resources/Ui/pendant.ui"
|
||||
|
||||
|
||||
# # CAO Engine
|
||||
# eng = win32com.client.Dispatch("CAO.CaoEngine")
|
||||
#
|
||||
# ctrl = eng.Workspaces(0).AddController("RC", "CaoProv.DENSO.NetwoRC", "", "conn=eth:192.168.1.10")
|
||||
# Arm1 = ctrl.AddRobot("Arm1", "")
|
||||
#
|
||||
# # Get and print a variable
|
||||
# # p_val_0 = ctrl.AddVariable("P0", "")
|
||||
# # p_val_1 = ctrl.AddVariable("P1", "")
|
||||
# # p_val_2 = ctrl.AddVariable("P2", "")
|
||||
# # print("P0 is: ", p_val_0)
|
||||
# # print("P1 is: ", p_val_1)
|
||||
# # print("P2 is: ", p_val_2)
|
||||
#
|
||||
# ctrl.Execute("PutAutoMode", 2) # Put controller into external auto mode
|
||||
#
|
||||
# Arm1.Execute("Motor", 1) # Enable motor power
|
||||
#
|
||||
# try:
|
||||
# Arm1.Execute("TakeArm", 0)
|
||||
# except Exception:
|
||||
# Arm1.Execute("Motor", 0)
|
||||
# exit()
|
||||
#
|
||||
# Arm1.Execute("ExtSpeed", (20, 20, 20))
|
||||
#
|
||||
# while True:
|
||||
# try:
|
||||
# Arm1.Move(1, "@P P0", "")
|
||||
# Arm1.Move(1, "@P P1", "")
|
||||
# Arm1.Move(1, "@P P2", "")
|
||||
# except KeyboardInterrupt:
|
||||
# Arm1.Execute("GiveArm", )
|
||||
# Arm1.Execute("Motor", 0)
|
||||
# exit()
|
||||
|
||||
|
||||
#####################################
|
||||
# ApplicationWindow Class Definition
|
||||
#####################################
|
||||
class ApplicationWindow(QtWidgets.QMainWindow):
|
||||
exit_requested_signal = QtCore.pyqtSignal()
|
||||
|
||||
kill_threads_signal = QtCore.pyqtSignal()
|
||||
|
||||
def __init__(self, parent=None, ui_file_path=None):
|
||||
super(ApplicationWindow, self).__init__(parent)
|
||||
|
||||
uic.loadUi(ui_file_path, self)
|
||||
|
||||
QtWidgets.QShortcut(QtGui.QKeySequence("Ctrl+Q"), self, self.exit_requested_signal.emit)
|
||||
|
||||
|
||||
#####################################
|
||||
# GroundStation Class Definition
|
||||
#####################################
|
||||
class GroundStation(QtCore.QObject):
|
||||
SCREEN_ID = 0
|
||||
|
||||
exit_requested_signal = QtCore.pyqtSignal()
|
||||
|
||||
start_threads_signal = QtCore.pyqtSignal()
|
||||
connect_signals_and_slots_signal = QtCore.pyqtSignal()
|
||||
kill_threads_signal = QtCore.pyqtSignal()
|
||||
|
||||
def __init__(self, parent=None,):
|
||||
# noinspection PyArgumentList
|
||||
super(GroundStation, self).__init__(parent)
|
||||
|
||||
# ########## Get the Pick And Plate instance of the logger ##########
|
||||
# self.logger = logging.getLogger("groundstation")
|
||||
|
||||
self.shared_objects = {
|
||||
"screens": {},
|
||||
"regular_classes": {},
|
||||
"threaded_classes": {}
|
||||
}
|
||||
|
||||
# ###### Instantiate Left And Right Screens ######
|
||||
self.shared_objects["screens"]["main_screen"] = \
|
||||
self.create_application_window(UI_FILE, "Denso Pendant",
|
||||
self.SCREEN_ID) # type: ApplicationWindow
|
||||
|
||||
# ##### Instantiate Regular Classes ######
|
||||
|
||||
# ##### Instantiate Threaded Classes ######
|
||||
self.__add_thread("CAO Controller", CAOController(self.shared_objects))
|
||||
self.__add_thread("CAO Monitor", CAOMonitor(self.shared_objects))
|
||||
|
||||
self.connect_signals_and_slots_signal.emit()
|
||||
self.__connect_signals_to_slots()
|
||||
self.start_threads_signal.emit()
|
||||
|
||||
def __add_thread(self, thread_name, instance):
|
||||
self.shared_objects["threaded_classes"][thread_name] = instance
|
||||
instance.setup_signals(self.start_threads_signal, self.connect_signals_and_slots_signal,
|
||||
self.kill_threads_signal)
|
||||
|
||||
def __connect_signals_to_slots(self):
|
||||
self.shared_objects["screens"]["main_screen"].exit_requested_signal.connect(self.on_exit_requested__slot)
|
||||
|
||||
def on_exit_requested__slot(self):
|
||||
self.kill_threads_signal.emit()
|
||||
|
||||
# Wait for Threads
|
||||
for thread in self.shared_objects["threaded_classes"]:
|
||||
self.shared_objects["threaded_classes"][thread].wait()
|
||||
|
||||
QtGui.QGuiApplication.exit()
|
||||
|
||||
@staticmethod
|
||||
def create_application_window(ui_file_path, title, display_screen):
|
||||
system_desktop = QtWidgets.QDesktopWidget() # This gets us access to the desktop geometry
|
||||
|
||||
app_window = ApplicationWindow(parent=None, ui_file_path=ui_file_path) # Make a window in this application
|
||||
app_window.setWindowTitle(title) # Sets the window title
|
||||
|
||||
app_window.setWindowFlags(app_window.windowFlags() | QtCore.Qt.WindowStaysOnTopHint)
|
||||
|
||||
# app_window.setGeometry(
|
||||
# system_desktop.screenGeometry(display_screen)) # Sets the window to be on the first screen
|
||||
|
||||
app_window.show() # Shows the window in full screen mode
|
||||
|
||||
return app_window
|
||||
|
||||
|
||||
#####################################
|
||||
# Main Definition
|
||||
#####################################
|
||||
if __name__ == "__main__":
|
||||
signal.signal(signal.SIGINT, signal.SIG_DFL) # This allows the keyboard interrupt kill to work properly
|
||||
|
||||
# ########## Start the QApplication Framework ##########
|
||||
application = QtWidgets.QApplication(sys.argv) # Create the ase qt gui application
|
||||
application.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
|
||||
|
||||
# ########## Set Organization Details for QSettings ##########
|
||||
QtCore.QCoreApplication.setOrganizationName("OSURC")
|
||||
QtCore.QCoreApplication.setOrganizationDomain("http://osurobotics.club/")
|
||||
QtCore.QCoreApplication.setApplicationName("pendant")
|
||||
|
||||
# ########## Start Ground Station If Ready ##########
|
||||
ground_station = GroundStation()
|
||||
application.exec_() # Execute launching of the application
|
||||
Reference in New Issue
Block a user