Merge remote-tracking branch 'origin/master'
This commit is contained in:
@ -35,9 +35,10 @@ class RobotClient(TCPClient):
|
||||
self.feed_speed = 10
|
||||
self.reset_speed = 10
|
||||
self.max_angle_interval = 0
|
||||
self.smooth = 0
|
||||
def add_sendQuene(self,command): #后面 命令分等级,紧急命令直接执行
|
||||
self.command_quene.put(command)
|
||||
|
||||
log.log_message(logging.INFO, f'{Constant.str_sys_command}{command}')
|
||||
return
|
||||
|
||||
def send_Command(self):
|
||||
|
||||
13
CU/Catch.py
13
CU/Catch.py
@ -31,21 +31,22 @@ class Catch:
|
||||
if self.catch_status == CatchStatus.CDrop:
|
||||
self.robotClient.sendIOControl(self.robotClient.con_ios[0],0)
|
||||
self.robotClient.sendIOControl(self.robotClient.con_ios[1],1)
|
||||
if Constant.Debug or self.robotClient.check_outputQ(self.robotClient.con_ios[1]) and not self.robotClient.check_outputQ(self.robotClient.con_ios[0]):
|
||||
# if Constant.Debug or self.robotClient.check_outputQ(self.robotClient.con_ios[1]) and not self.robotClient.check_outputQ(self.robotClient.con_ios[0]):
|
||||
self.catch_status = CatchStatus.COk
|
||||
if self.catch_status == CatchStatus.CShake:
|
||||
if not self.shake_continue.Q(True, 2000):
|
||||
shakeQ = self.shakePulse.Q(True, 100, 100)
|
||||
self.robotClient.sendIOControl(self.robotClient.con_ios[2], shakeQ)
|
||||
if not self.shake_continue.Q(True, 1500):
|
||||
shakeQ = self.shakePulse.Q(True, 50, 50)
|
||||
self.robotClient.sendIOControl(self.robotClient.con_ios[2], 1 if shakeQ else 0)
|
||||
print("正在震动" if shakeQ else "震动结束")
|
||||
else:
|
||||
self.shake_continue.SetReset()
|
||||
self.catch_status = CatchStatus.COk
|
||||
if Constant.Debug or self.robotClient.check_outputQ(self.robotClient.con_ios[2]):
|
||||
self.robotClient.sendIOControl(self.robotClient.con_ios[2], False)
|
||||
#if Constant.Debug or self.robotClient.check_outputQ(self.robotClient.con_ios[2]):
|
||||
self.robotClient.sendIOControl(self.robotClient.con_ios[2], 0)
|
||||
print("震动结束")
|
||||
|
||||
if self.catch_status == CatchStatus.COk:
|
||||
self.robotClient.sendIOControl(self.robotClient.con_ios[1], 0)
|
||||
pass
|
||||
|
||||
|
||||
|
||||
46
CU/Detect.py
Normal file
46
CU/Detect.py
Normal file
@ -0,0 +1,46 @@
|
||||
from enum import Enum
|
||||
|
||||
import numpy as np
|
||||
from PySide6.QtCore import Signal
|
||||
import Constant
|
||||
from Model.Position import Real_Position
|
||||
from Trace.handeye_calibration import getPosition
|
||||
from Vision.camera_coordinate_dete import Detection
|
||||
|
||||
|
||||
class DetectStatus(Enum):
|
||||
DNone = 0
|
||||
DDetect = 1
|
||||
DOk = 2
|
||||
|
||||
class Detect:
|
||||
update_detect_image = Signal(np.ndarray)
|
||||
def __init__(self):
|
||||
self.detection = Detection(alignmentType='depth2color')
|
||||
self.detect_status = DetectStatus.DNone
|
||||
self.detect_position = None
|
||||
def run(self):
|
||||
if self.detect_status == DetectStatus.DNone:
|
||||
return
|
||||
if self.detect_status == DetectStatus.DDetect:
|
||||
if Constant.Debug:
|
||||
self.detect_status = DetectStatus.DOk
|
||||
return
|
||||
_, img, xyz, uvw, points = self.detection.get_position(Point_isVision=False, Box_isPoint=True,
|
||||
First_Depth=True, Iter_Max_Pixel=30,
|
||||
save_img_point=0, Height_reduce=30, width_reduce=30)
|
||||
|
||||
self.detection_image = img.copy()
|
||||
if xyz == None or uvw == None or points == None:
|
||||
self.detect_position = None
|
||||
self.detect_status = DetectStatus.DOk
|
||||
return
|
||||
target_position, noraml_base = getPosition(*xyz, *uvw, None, points)
|
||||
|
||||
position = Real_Position().init_position(*target_position[:3], *noraml_base[:3])
|
||||
position.Z = position.Z + 200
|
||||
self.detect_position = position
|
||||
self.detect_status = DetectStatus.DOk
|
||||
|
||||
if self.detect_status == DetectStatus.DOk:
|
||||
return
|
||||
276
CU/Feeding.py
276
CU/Feeding.py
@ -1,13 +1,18 @@
|
||||
import copy
|
||||
import logging
|
||||
import threading
|
||||
import time
|
||||
|
||||
import cv2
|
||||
import numpy as np
|
||||
from PyQt5.QtWidgets import QMessageBox
|
||||
from PySide6.QtCore import Signal, QObject
|
||||
from PySide6.QtGui import QPixmap
|
||||
|
||||
import Constant
|
||||
import Expection
|
||||
from CU.Catch import Catch, CatchStatus
|
||||
from CU.Detect import Detect, DetectStatus
|
||||
from Model.FeedModel import PositionModel
|
||||
from Model.Position import Real_Position, Detection_Position
|
||||
from enum import Enum, IntEnum
|
||||
@ -61,7 +66,7 @@ class FeedPosition:
|
||||
|
||||
class FeedLine:
|
||||
def __init__(self, id, name, feed_positions:list):
|
||||
self.feed_positions = feed_positions
|
||||
self.feed_positions = copy.deepcopy(feed_positions)
|
||||
self.feeding2end_pos_index = 0
|
||||
self.origin2start_pos_index = 0
|
||||
self.start2take_pos_index = 0
|
||||
@ -70,14 +75,14 @@ class FeedLine:
|
||||
|
||||
|
||||
|
||||
def get_current_feed_position(self):
|
||||
pos = self.feeding_to_end[self.feeding2end_pos_index-1]
|
||||
def get_current_feed_position(self,is_reverse):
|
||||
pos = self.feeding_to_end[ (self.feeding2end_pos_index+1)%len(self.feeding_to_end) if is_reverse else self.feeding2end_pos_index-1]
|
||||
return pos
|
||||
def get_current_take_position(self):
|
||||
pos = self.start_to_take[self.start2take_pos_index-1]
|
||||
def get_current_take_position(self,is_reverse):
|
||||
pos = self.start_to_take[ (self.start2take_pos_index+1)%len(self.start_to_take) if is_reverse else self.start2take_pos_index-1]
|
||||
return pos
|
||||
def get_current_start_position(self):
|
||||
pos = self.origin_to_start[self.origin2start_pos_index-1]
|
||||
def get_current_start_position(self,is_reverse):
|
||||
pos = self.origin_to_start[(self.origin2start_pos_index+1)%len(self.origin_to_start) if is_reverse else self.origin2start_pos_index-1]
|
||||
return pos
|
||||
|
||||
def get_next_feed_position(self,reverse:bool=False):
|
||||
@ -126,8 +131,25 @@ class FeedLine:
|
||||
def set_take_position(self,position:Real_Position):
|
||||
for i in range(len(self.feeding_to_end)):
|
||||
if self.feeding_to_end[i].status == FeedStatus.FTake.value:
|
||||
if position != None:
|
||||
befor_take_position = Real_Position().init_position(position.X,
|
||||
position.Y,
|
||||
position.Z,
|
||||
position.U,
|
||||
position.V,
|
||||
position.W)
|
||||
after_take_position = Real_Position().init_position(position.X,
|
||||
position.Y,
|
||||
position.Z,
|
||||
position.U,
|
||||
position.V,
|
||||
position.W)
|
||||
self.feeding_to_end[i - 1].set_position(befor_take_position)
|
||||
self.feeding_to_end[i + 1].set_position(after_take_position)
|
||||
|
||||
self.feeding_to_end[i].set_position(position)
|
||||
|
||||
|
||||
def get_position_list(self):
|
||||
index_start = -1
|
||||
for i in range(len(self.feed_positions)):
|
||||
@ -142,6 +164,17 @@ class FeedLine:
|
||||
self.start_to_take = self.feed_positions[index_start:index_take+1]
|
||||
self.feeding_to_end = self.feed_positions[index_take:]
|
||||
|
||||
for i in range(len(self.feeding_to_end)): #插入动态中间点
|
||||
if self.feeding_to_end[i].status == FeedStatus.FTake.value:
|
||||
befor_position_model = PositionModel()
|
||||
befor_position_model.init_position(None)
|
||||
after_position_model = PositionModel()
|
||||
after_position_model.init_position(None)
|
||||
|
||||
self.feeding_to_end.insert(i, befor_position_model)
|
||||
self.feeding_to_end.insert(i+2, after_position_model)
|
||||
break
|
||||
|
||||
|
||||
|
||||
class FeedingConfig:
|
||||
@ -161,13 +194,15 @@ class FeedingConfig:
|
||||
|
||||
class Feeding(QObject):
|
||||
need_origin_signal = Signal(str)
|
||||
take_no_photo_sigal = Signal(str)
|
||||
def __init__(self, robotClient: RobotClient, detection: Detection):
|
||||
take_no_photo_sigal = Signal()
|
||||
update_detect_image = Signal(np.ndarray)
|
||||
log_signal = Signal(int,str)
|
||||
def __init__(self, robotClient: RobotClient):
|
||||
super().__init__()
|
||||
self.feedConfig = None
|
||||
self.feedStatus = FeedStatus.FNone
|
||||
self.robotClient = robotClient
|
||||
self.detection = detection
|
||||
|
||||
self.detection_image = None
|
||||
self.init_detection_image()
|
||||
self.pause = False
|
||||
@ -180,14 +215,30 @@ class Feeding(QObject):
|
||||
self.reset_status = ResetStatus.RNone
|
||||
self.reversed_positions = []
|
||||
self.current_position = None
|
||||
|
||||
self.index=1
|
||||
self.pos_index = -1
|
||||
self.pos_near_index = -1
|
||||
self.catch = Catch(self.robotClient)
|
||||
self.detect = Detect()
|
||||
self.is_detected = True
|
||||
self.detect_thread = threading.Thread(target=self.run_detect)
|
||||
self.detect_thread.start()
|
||||
self.onekey = False
|
||||
pass
|
||||
|
||||
def close_feed(self):
|
||||
self.is_detected = False
|
||||
self.detect_thread.join()
|
||||
self.detect.detection.release()
|
||||
|
||||
def init_detection_image(self):
|
||||
self.detection_image = cv2.imread(Constant.feed_sign_path)
|
||||
detection_image = cv2.imread(Constant.feed_sign_path)
|
||||
self.update_detect_image.emit(detection_image)
|
||||
|
||||
def run_detect(self):
|
||||
while self.is_detected:
|
||||
self.detect.run()
|
||||
time.sleep(0.02)
|
||||
|
||||
def run(self):
|
||||
self.catch.run()
|
||||
@ -206,18 +257,25 @@ class Feeding(QObject):
|
||||
# 0,
|
||||
# 0);
|
||||
|
||||
# img_path = f'Image/{self.index}.png'
|
||||
# img = cv2.imread(img_path)
|
||||
# self.index += 1
|
||||
# self.index = self.index % 4
|
||||
# self.detection_image = img
|
||||
|
||||
if self.feedConfig == None:
|
||||
self.feedStatus = FeedStatus.FNone
|
||||
|
||||
if self.feedConfig !=None and self.feedConfig.num == 0 and self.is_reverse and self.robotClient.origin_position.compare(real_position):
|
||||
if self.feedConfig !=None and self.feedConfig.num == 0 and self.is_reverse and self.robotClient.origin_position.compare(real_position,is_action=True):
|
||||
self.feedStatus = FeedStatus.FNone
|
||||
self.is_reverse = False
|
||||
self.log_signal.emit(logging.INFO, Constant.str_feed_reverse)
|
||||
|
||||
if self.feedStatus == FeedStatus.FNone or self.pause:
|
||||
return
|
||||
|
||||
elif self.feedStatus == FeedStatus.FCheck:
|
||||
log.log_message(logging.INFO, Constant.str_feed_check)
|
||||
self.log_signal.emit(logging.INFO, Constant.str_feed_check)
|
||||
# 1, 检查是否是三列
|
||||
# 2, 检查是否有人
|
||||
# if self.safe_check_columns() and self.safe_check_person():
|
||||
@ -238,9 +296,10 @@ class Feeding(QObject):
|
||||
self.next_position(self.is_reverse)
|
||||
|
||||
elif self.feedStatus == FeedStatus.FStart:
|
||||
log.log_message(logging.INFO, Constant.str_feed_start)
|
||||
self.log_signal.emit(logging.INFO, Constant.str_feed_start)
|
||||
if not self.robotClient.origin_position.compare(real_position) and not self.is_reverse:
|
||||
# QMessageBox.information(None, "提示", Constant.str_feed_start_error) # Fuck 引起异常
|
||||
self.log_signal.emit(logging.ERROR, Constant.str_feed_start_error)
|
||||
self.need_origin_signal.emit(Constant.str_feed_start_error)
|
||||
self.feedStatus = FeedStatus.FNone
|
||||
return
|
||||
@ -250,41 +309,60 @@ class Feeding(QObject):
|
||||
return
|
||||
|
||||
self.feedConfig.feedLine.get_position_list()
|
||||
|
||||
# = self.detection.get_position(Point_isVision=False, Box_isPoint=True, First_Depth=True, Iter_Max_Pixel=30,
|
||||
# # save_img_point=0, Height_reduce=30, width_reduce=30)
|
||||
|
||||
|
||||
self.feedConfig.feedLine.set_take_position(self.get_take_position())
|
||||
# TODO 获取目标位置
|
||||
#
|
||||
self.detect.detect_status = DetectStatus.DNone
|
||||
self.feed_Mid_Status = FeedMidStatus.FMid_Start
|
||||
self.next_position(self.is_reverse)
|
||||
|
||||
|
||||
elif self.feedStatus == FeedStatus.FMid:
|
||||
log.log_message(logging.INFO, Constant.str_feed_mid)
|
||||
feed_pos = self.get_current_position()
|
||||
self.log_signal.emit(logging.INFO, Constant.str_feed_mid)
|
||||
feed_pos = self.get_current_position(self.is_reverse)
|
||||
if feed_pos.get_position().compare(real_position):
|
||||
self.next_position(self.is_reverse)
|
||||
|
||||
|
||||
|
||||
elif self.feedStatus == FeedStatus.FPhoto:
|
||||
log.log_message(logging.INFO, Constant.str_feed_photo)
|
||||
self.log_signal.emit(logging.INFO, Constant.str_feed_photo)
|
||||
if self.feedConfig.num == 0:
|
||||
log.log_message(logging.INFO, Constant.str_feed_finish)
|
||||
self.log_signal.emit(logging.INFO, Constant.str_feed_finish)
|
||||
self.is_reverse = True
|
||||
self.feed_Mid_Status = FeedMidStatus.FMid_Take
|
||||
self.feedConfig.feedLine.start2take_pos_index = len(self.feedConfig.feedLine.start_to_take) -2
|
||||
self.feedConfig.feedLine.origin2start_pos_index = len(self.feedConfig.feedLine.origin_to_start) - 2
|
||||
self.next_position(self.is_reverse)
|
||||
self.init_detection_image()
|
||||
return
|
||||
|
||||
if self.robotClient.type_detection == DetectType.EyeOutHand:
|
||||
self.feed_Mid_Status = FeedMidStatus.FMid_Feed
|
||||
if self.detect.detect_status == DetectStatus.DNone:
|
||||
self.detect.detect_status = DetectStatus.DDetect
|
||||
elif self.detect.detect_status == DetectStatus.DOk:
|
||||
if Constant.Debug:
|
||||
if self.feedConfig.num == 990 and self.onekey:
|
||||
self.feedConfig.num = 0
|
||||
self.log_signal.emit(logging.ERROR, Constant.str_feed_finish)
|
||||
return
|
||||
self.detect.detect_status = DetectStatus.DNone
|
||||
self.feedConfig.feedLine.set_take_position(real_position)
|
||||
self.next_position()
|
||||
return
|
||||
|
||||
if self.detect.detect_position != None:
|
||||
self.log_signal.emit(logging.INFO, Constant.str_feed_takePhoto_success)
|
||||
self.feedConfig.feedLine.set_take_position(self.detect.detect_position)
|
||||
self.update_detect_image.emit(self.detect.detection_image)
|
||||
self.next_position()
|
||||
self.detect.detect_status = DetectStatus.DNone
|
||||
else:
|
||||
if self.onekey:
|
||||
self.feedConfig.num = 0
|
||||
self.log_signal.emit(logging.ERROR, Constant.str_feed_finish)
|
||||
else:
|
||||
self.log_signal.emit(logging.ERROR, Constant.str_feed_takePhoto_fail)
|
||||
self.take_no_photo_sigal.emit()
|
||||
return
|
||||
detect_pos_list = []
|
||||
if not Constant.Debug:
|
||||
try:
|
||||
@ -292,7 +370,7 @@ class Feeding(QObject):
|
||||
if self.cRis_photo.Q(self.error_photo_count >= 5, True):
|
||||
QMessageBox.information(None, "提示", Constant.str_feed_photo_error_msgbox)
|
||||
self.error_photo_count = 0
|
||||
log.log_message(logging.INFO, Constant.str_feed_photo_confirm)
|
||||
self.log_signal.emit(logging.INFO, Constant.str_feed_photo_confirm)
|
||||
|
||||
# TODO 返回初始状态
|
||||
for pos in self.feedConfig.photo_locs:
|
||||
@ -304,7 +382,7 @@ class Feeding(QObject):
|
||||
code, img, xyz, uvw, mng = self.detection.get_position() # 检测结果
|
||||
self.detection_image = img
|
||||
if xyz != None:
|
||||
log.log_message(logging.INFO, Constant.str_feed_takePhoto_success)
|
||||
self.log_signal.emit(logging.INFO, Constant.str_feed_takePhoto_success)
|
||||
# dp = Detection_Position().init_position(*xyz, *uvw)
|
||||
from Trace.handeye_calibration import R_matrix, getPosition
|
||||
rotation = R_matrix(self.robotClient.status_model.world_0,
|
||||
@ -317,9 +395,9 @@ class Feeding(QObject):
|
||||
# 黄老师给我的xyz和法向量
|
||||
target_position, noraml_base = getPosition(*xyz, *uvw, rotation, *mng)
|
||||
detect_pos_list.append(Real_Position().init_position(*target_position[:3], *noraml_base))
|
||||
log.log_message(logging.INFO, Constant.str_feed_takePhoto_success)
|
||||
self.log_signal.emit(logging.INFO, Constant.str_feed_takePhoto_success)
|
||||
else:
|
||||
log.log_message(logging.ERROR, Constant.str_feed_takePhoto_fail + real_position.to_string())
|
||||
self.log_signal.emit(logging.ERROR, Constant.str_feed_takePhoto_fail + real_position.to_string())
|
||||
z_diff, max_z_index = (lambda pts: (
|
||||
max(pts, key=lambda p: p.Z).Z - min(pts, key=lambda p: p.Z).Z,
|
||||
pts.index(max(pts, key=lambda p: p.Z))
|
||||
@ -330,40 +408,39 @@ class Feeding(QObject):
|
||||
# 拍照位置从五个变为三个
|
||||
self.feedConfig.photo_locs = [detect_pos_list[0], detect_pos_list[2], detect_pos_list[4]]
|
||||
take_position = detect_pos_list[0]
|
||||
log.log_message(logging.INFO, Constant.str_feed_takePhoto_front_finish)
|
||||
self.log_signal.emit(logging.INFO, Constant.str_feed_takePhoto_front_finish)
|
||||
else:
|
||||
take_position = detect_pos_list[max_z_index]
|
||||
log.log_message(logging.INFO, Constant.str_feed_takePhoto_front)
|
||||
self.log_signal.emit(logging.INFO, Constant.str_feed_takePhoto_front)
|
||||
else:
|
||||
if z_diff < Constant.bag_height:
|
||||
take_position = detect_pos_list[0]
|
||||
log.log_message(logging.INFO, Constant.str_feed_takePhoto_new_line)
|
||||
self.log_signal.emit(logging.INFO, Constant.str_feed_takePhoto_new_line)
|
||||
else:
|
||||
take_position = detect_pos_list[max_z_index]
|
||||
log.log_message(logging.INFO, Constant.str_feed_takePhoto_line)
|
||||
self.log_signal.emit(logging.INFO, Constant.str_feed_takePhoto_line)
|
||||
|
||||
self.feedConfig.feedLine.set_take_position(take_position) ##TODO 检查有没有异常
|
||||
self.next_position()
|
||||
except:
|
||||
log.log_message(logging.ERROR, Constant.str_feed_takePhoto_fail)
|
||||
self.log_signal.emit(logging.ERROR, Constant.str_feed_takePhoto_fail)
|
||||
self.error_photo_count += 1
|
||||
else:
|
||||
self.feedConfig.feedLine.set_take_position(real_position) ##TODO 检查有没有异常
|
||||
self.next_position()
|
||||
log.log_message(logging.INFO, Constant.str_feed_takePhoto_move)
|
||||
self.log_signal.emit(logging.INFO, Constant.str_feed_takePhoto_move)
|
||||
|
||||
elif self.feedStatus == FeedStatus.FTake:
|
||||
log.log_message(logging.INFO, Constant.str_feed_take)
|
||||
self.log_signal.emit(logging.INFO, Constant.str_feed_take)
|
||||
if self.feedConfig.feedLine.get_take_position().get_position() != None:
|
||||
# self.take_no_photo = False
|
||||
if self.feedConfig.feedLine.get_take_position().get_position().compare(real_position):
|
||||
if self.feedConfig.feedLine.get_take_position().get_position().compare(real_position, is_action=True):
|
||||
# 打开吸嘴并返回
|
||||
# self.sendIOControl(self.robotClient.con_ios[0], 1)
|
||||
# self.sendIOControl(self.robotClient.con_ios[1], 1)
|
||||
# self.sendIOControl(self.robotClient.con_ios[2], 1)
|
||||
|
||||
|
||||
|
||||
self.log_signal.emit(logging.INFO, "到达抓料点位")
|
||||
if self.catch.catch_status == CatchStatus.CNone :
|
||||
self.catch.catch_status = CatchStatus.CTake
|
||||
return
|
||||
@ -371,35 +448,36 @@ class Feeding(QObject):
|
||||
return
|
||||
if self.catch.catch_status == CatchStatus.COk :
|
||||
self.catch.catch_status = CatchStatus.CNone
|
||||
self.feedConfig.feedLine.set_take_position(None)
|
||||
#self.feedConfig.feedLine.set_take_position(None)
|
||||
time.sleep(self.robotClient.time_delay_take)
|
||||
log.log_message(logging.INFO, Constant.str_feed_take_success)
|
||||
self.log_signal.emit(logging.INFO, Constant.str_feed_take_success)
|
||||
self.next_position()
|
||||
|
||||
else:
|
||||
log.log_message(logging.ERROR, Constant.str_feed_takePhoto_fail)
|
||||
self.log_signal.emit(logging.ERROR, Constant.str_feed_takePhoto_fail)
|
||||
# self.take_no_photo = True
|
||||
self.take_no_photo_sigal.emit()
|
||||
|
||||
# 继续获取图像
|
||||
# TODO
|
||||
# self.feedConfig.feedLine.set_take_position(self.get_take_position())
|
||||
|
||||
|
||||
|
||||
|
||||
elif self.feedStatus == FeedStatus.FBroken1:
|
||||
log.log_message(logging.INFO, Constant.str_feed_broken)
|
||||
self.log_signal.emit(logging.INFO, Constant.str_feed_broken)
|
||||
if self.get_current_position().get_position().compare(real_position):
|
||||
self.next_position()
|
||||
|
||||
|
||||
elif self.feedStatus == FeedStatus.FBroken2:
|
||||
log.log_message(logging.INFO, Constant.str_feed_broken)
|
||||
self.log_signal.emit(logging.INFO, Constant.str_feed_broken)
|
||||
if self.get_current_position().get_position().compare(real_position):
|
||||
self.next_position()
|
||||
|
||||
elif self.feedStatus == FeedStatus.FShake:
|
||||
log.log_message(logging.INFO, Constant.str_feed_shake)
|
||||
if self.get_current_position().get_position().compare(real_position):
|
||||
self.log_signal.emit(logging.INFO, Constant.str_feed_shake)
|
||||
if self.get_current_position().get_position().compare(real_position,is_action=True):
|
||||
# TODO 震动方案
|
||||
|
||||
|
||||
@ -414,9 +492,9 @@ class Feeding(QObject):
|
||||
self.next_position()
|
||||
|
||||
elif self.feedStatus == FeedStatus.FDropBag:
|
||||
log.log_message(logging.INFO, Constant.str_feed_drop)
|
||||
self.log_signal.emit(logging.INFO, Constant.str_feed_drop)
|
||||
|
||||
if self.get_current_position().get_position().compare(real_position):
|
||||
if self.get_current_position().get_position().compare(real_position,is_action=True):
|
||||
# self.sendIOControl(self.robotClient.con_ios[0], 0)
|
||||
# self.sendIOControl(self.robotClient.con_ios[1], 0)
|
||||
# self.sendIOControl(self.robotClient.con_ios[2], 0)
|
||||
@ -430,9 +508,11 @@ class Feeding(QObject):
|
||||
self.catch.catch_status = CatchStatus.CNone
|
||||
time.sleep(self.robotClient.time_delay_put)
|
||||
# self.detection.get_position(Point_isVision=False, Box_isPoint=True, First_Depth=True, Iter_Max_Pixel=30, save_img_point=0, Height_reduce=30, width_reduce=30)
|
||||
self.feedConfig.feedLine.set_take_position(self.get_take_position())
|
||||
# self.feedConfig.feedLine.set_take_position(self.get_take_position())
|
||||
if self.detect.detect_status == DetectStatus.DNone:
|
||||
self.detect.detect_status = DetectStatus.DDetect
|
||||
self.feedConfig.num = self.feedConfig.num - 1
|
||||
log.log_message(logging.INFO, f'{Constant.str_feed_feed_num}{self.feedConfig.num}')
|
||||
self.log_signal.emit(logging.INFO, f'{Constant.str_feed_feed_num}{self.feedConfig.num}')
|
||||
self.next_position()
|
||||
|
||||
|
||||
@ -462,7 +542,7 @@ class Feeding(QObject):
|
||||
break
|
||||
|
||||
if self.pos_index == -1:
|
||||
log.log_message(logging.ERROR, Constant.str_feed_return_original_position_fail)
|
||||
self.log_signal.emit(logging.ERROR, Constant.str_feed_return_original_position_fail)
|
||||
min_distance = 99999999
|
||||
for index, pos_model in enumerate(self.feedConfig.feedLine.feed_positions):
|
||||
if get_distance(pos_model.get_position(), real_position) < min_distance:
|
||||
@ -482,11 +562,10 @@ class Feeding(QObject):
|
||||
self.reset_status = ResetStatus.RRunging
|
||||
|
||||
if self.reset_status == ResetStatus.RRunging:
|
||||
if not real_position.compare(self.current_position.get_position()):
|
||||
if not real_position.compare(self.current_position.get_position(),is_action=True):
|
||||
return
|
||||
pos_model = self.reversed_positions[self.reverse_index]
|
||||
if pos_model.status == FeedStatus.FTake.value: # 跳过取袋节点
|
||||
print('跳过抓袋点位')
|
||||
pos_model = self.reversed_positions[self.reverse_index + 1]
|
||||
self.reverse_index = self.reverse_index+1
|
||||
|
||||
@ -534,7 +613,7 @@ class Feeding(QObject):
|
||||
break
|
||||
|
||||
if pos_index == -1:
|
||||
log.log_message(logging.ERROR, Constant.str_feed_return_original_position_fail)
|
||||
self.log_signal.emit(logging.ERROR, Constant.str_feed_return_original_position_fail)
|
||||
min_distance = 99999999
|
||||
for index, pos_model in enumerate(self.feedConfig.feedLine.feed_positions):
|
||||
if get_distance(pos_model.get_position(), real_position)<min_distance:
|
||||
@ -554,10 +633,10 @@ class Feeding(QObject):
|
||||
while self.run_reverse and self.reverse_index!=len(reversed_positions):
|
||||
if self.reverse_index!=0 and not real_position.compare(current_position.get_position()):
|
||||
continue
|
||||
print(f'复位第{self.reverse_index}') #todo 缺少比对
|
||||
#todo 缺少比对
|
||||
pos_model = reversed_positions[self.reverse_index]
|
||||
if pos_model.status == FeedStatus.FTake.value: # 跳过取袋节点
|
||||
print('跳过抓袋点位')
|
||||
|
||||
pos_model = reversed_positions[self.reverse_index + 1]
|
||||
# TODO take节点判断
|
||||
|
||||
@ -589,7 +668,7 @@ class Feeding(QObject):
|
||||
IO_command.dsID = 'HCRemoteCommand'
|
||||
IO_command.instructions.append(io_instruction)
|
||||
self.robotClient.add_sendQuene(IO_command.toString())
|
||||
log.log_message(logging.INFO, f'{Constant.str_feed_io_control}{IO_bit},{IO_Status}')
|
||||
self.log_signal.emit(logging.INFO, f'{Constant.str_feed_io_control}{IO_bit},{IO_Status}')
|
||||
pass
|
||||
|
||||
def sendTargPosition(self, real_position, move_type: MoveType = MoveType.WORLD, speed=5,real_position1=None):
|
||||
@ -601,6 +680,7 @@ class Feeding(QObject):
|
||||
position_instruction.m3 = real_position.U
|
||||
position_instruction.m4 = real_position.V
|
||||
position_instruction.m5 = real_position.W
|
||||
position_instruction.smooth = self.robotClient.smooth
|
||||
|
||||
position_instruction.action = move_type.value
|
||||
if position_instruction.action == 17:
|
||||
@ -621,75 +701,91 @@ class Feeding(QObject):
|
||||
f'U:{position_instruction.m3}-' \
|
||||
f'V:{position_instruction.m4}-' \
|
||||
f'W:{position_instruction.m5}'
|
||||
print(log_str)
|
||||
|
||||
|
||||
try:
|
||||
log.log_message(logging.INFO, log_str)
|
||||
self.log_signal.emit(logging.INFO, log_str)
|
||||
except:
|
||||
print("error")
|
||||
return
|
||||
|
||||
self.robotClient.add_sendQuene(request_command)
|
||||
pass
|
||||
def get_take_position(self):
|
||||
if Constant.Debug:
|
||||
return self.robotClient.status_model.getRealPosition()
|
||||
_, img, xyz, uvw, points = self.detection.get_position(Point_isVision=False, Box_isPoint=True, First_Depth=True, Iter_Max_Pixel=30,save_img_point=0, Height_reduce=30, width_reduce=30)
|
||||
self.detection_image = img
|
||||
if xyz ==None or uvw==None or points==None:
|
||||
return None
|
||||
target_position,noraml_base = getPosition(*xyz,*uvw,None,points)
|
||||
|
||||
position = Real_Position().init_position(*target_position[:3],*noraml_base[:3])
|
||||
position.Z = position.Z+40
|
||||
return position
|
||||
# def get_take_position(self):
|
||||
# if Constant.Debug:
|
||||
# return self.robotClient.status_model.getRealPosition()
|
||||
# _, img, xyz, uvw, points = self.detection.get_position(Point_isVision=False, Box_isPoint=True, First_Depth=True, Iter_Max_Pixel=30,save_img_point=0, Height_reduce=30, width_reduce=30)
|
||||
# self.detection_image = img.copy()
|
||||
# if xyz ==None or uvw==None or points==None:
|
||||
# return None
|
||||
# target_position,noraml_base = getPosition(*xyz,*uvw,None,points)
|
||||
#
|
||||
# position = Real_Position().init_position(*target_position[:3],*noraml_base[:3])
|
||||
# position.Z = position.Z+200
|
||||
# return position
|
||||
def next_start(self,reverse=False):
|
||||
print(f'原点到初始位置的第{self.feedConfig.feedLine.origin2start_pos_index}')
|
||||
start_pos = self.feedConfig.feedLine.get_next_start_position(reverse)
|
||||
self.feedStatus = FeedStatus(start_pos.status) if self.feedStatus != FeedStatus.FNone else FeedStatus.FNone
|
||||
if start_pos.lineType == LineType.CureMid.value:
|
||||
start_pos1 = self.feedConfig.feedLine.get_next_start_position(reverse)
|
||||
self.feedStatus = FeedStatus(start_pos1.status) if self.feedStatus != FeedStatus.FNone else FeedStatus.FNone
|
||||
self.sendTargPosition(real_position=start_pos.get_position(),speed=self.robotClient.debug_speed, move_type=MoveType.Cure, real_position1=start_pos1.get_position())
|
||||
self.sendTargPosition(real_position=start_pos.get_position(),speed=self.robotClient.feed_speed, move_type=MoveType.Cure, real_position1=start_pos1.get_position())
|
||||
elif start_pos.lineType == LineType.WORLD.value:
|
||||
if self.robotClient.status_model.getAnglePosition().is_error_angel_move(start_pos.get_position(),self.robotClient.max_angle_interval):
|
||||
self.feedStatus = None
|
||||
log.log_message(logging.ERROR, Constant.str_feed_angle_error)
|
||||
self.log_signal.emit(logging.ERROR, Constant.str_feed_angle_error)
|
||||
else:
|
||||
self.sendTargPosition(real_position=start_pos.get_position(),speed=self.robotClient.debug_speed,move_type=MoveType.WORLD)
|
||||
self.sendTargPosition(real_position=start_pos.get_position(),speed=self.robotClient.feed_speed,move_type=MoveType.AXIS)
|
||||
else:
|
||||
self.sendTargPosition(real_position=start_pos.get_position(),speed=self.robotClient.debug_speed)
|
||||
self.sendTargPosition(real_position=start_pos.get_position(),speed=self.robotClient.feed_speed)
|
||||
pass
|
||||
|
||||
def next_take(self,reverse=False):
|
||||
print(f'初始位置到拍照点的第{self.feedConfig.feedLine.start2take_pos_index}')
|
||||
|
||||
take_pos = self.feedConfig.feedLine.get_next_take_position(reverse)
|
||||
self.feedStatus = FeedStatus(take_pos.status) if self.feedStatus != FeedStatus.FNone else FeedStatus.FNone
|
||||
if take_pos.lineType == LineType.CureMid.value:
|
||||
take_pos1 = self.feedConfig.feedLine.get_next_take_position(reverse)
|
||||
self.feedStatus = FeedStatus(take_pos1.status) if self.feedStatus != FeedStatus.FNone else FeedStatus.FNone
|
||||
self.sendTargPosition(real_position=take_pos.get_position(), move_type=MoveType.Cure, real_position1=take_pos1.get_position(),speed=self.robotClient.debug_speed)
|
||||
self.sendTargPosition(real_position=take_pos.get_position(), move_type=MoveType.Cure, real_position1=take_pos1.get_position(),speed=self.robotClient.feed_speed)
|
||||
elif take_pos.lineType == LineType.WORLD.value:
|
||||
if self.robotClient.status_model.getAnglePosition().is_error_angel_move(take_pos.get_position(),
|
||||
self.robotClient.max_angle_interval):
|
||||
self.feedStatus = None
|
||||
self.log_signal.emit(logging.ERROR, Constant.str_feed_angle_error)
|
||||
else:
|
||||
self.sendTargPosition(real_position=take_pos.get_position(),speed=self.robotClient.debug_speed)
|
||||
self.sendTargPosition(real_position=take_pos.get_position(), speed=self.robotClient.feed_speed,
|
||||
move_type=MoveType.AXIS)
|
||||
|
||||
else:
|
||||
self.sendTargPosition(real_position=take_pos.get_position(),speed=self.robotClient.feed_speed)
|
||||
pass
|
||||
|
||||
def next_Feed(self,reverse=False):
|
||||
print(f'拍照到抛料回来的第{self.feedConfig.feedLine.feeding2end_pos_index}')
|
||||
feed_pos = self.feedConfig.feedLine.get_next_feed_position(reverse)
|
||||
self.feedStatus = FeedStatus(feed_pos.status) if self.feedStatus != FeedStatus.FNone else FeedStatus.FNone
|
||||
if feed_pos.lineType == LineType.CureMid.value:
|
||||
feed_pos1 = self.feedConfig.feedLine.get_next_feed_position(reverse)
|
||||
self.feedStatus = FeedStatus(feed_pos1.status) if self.feedStatus != FeedStatus.FNone else FeedStatus.FNone
|
||||
self.sendTargPosition(real_position=feed_pos.get_position(), move_type=MoveType.Cure, real_position1=feed_pos1.get_position(),speed=self.robotClient.debug_speed)
|
||||
self.sendTargPosition(real_position=feed_pos.get_position(), move_type=MoveType.Cure, real_position1=feed_pos1.get_position(),speed=self.robotClient.feed_speed)
|
||||
elif feed_pos.lineType == LineType.WORLD.value:
|
||||
if self.robotClient.status_model.getAnglePosition().is_error_angel_move(feed_pos.get_position(),
|
||||
self.robotClient.max_angle_interval):
|
||||
self.feedStatus = None
|
||||
self.log_signal.emit(logging.ERROR, Constant.str_feed_angle_error)
|
||||
else:
|
||||
self.sendTargPosition(real_position=feed_pos.get_position(),speed=self.robotClient.debug_speed)
|
||||
self.sendTargPosition(real_position=feed_pos.get_position(), speed=self.robotClient.feed_speed,
|
||||
move_type=MoveType.AXIS)
|
||||
|
||||
def get_current_position(self):
|
||||
else:
|
||||
self.sendTargPosition(real_position=feed_pos.get_position(),speed=self.robotClient.feed_speed)
|
||||
|
||||
def get_current_position(self,is_reverse=False):
|
||||
if self.feed_Mid_Status == FeedMidStatus.FMid_Start:
|
||||
return self.feedConfig.feedLine.get_current_start_position()
|
||||
return self.feedConfig.feedLine.get_current_start_position(self.is_reverse)
|
||||
elif self.feed_Mid_Status == FeedMidStatus.FMid_Take:
|
||||
return self.feedConfig.feedLine.get_current_take_position()
|
||||
return self.feedConfig.feedLine.get_current_take_position(self.is_reverse)
|
||||
elif self.feed_Mid_Status == FeedMidStatus.FMid_Feed:
|
||||
return self.feedConfig.feedLine.get_current_feed_position()
|
||||
return self.feedConfig.feedLine.get_current_feed_position(self.is_reverse)
|
||||
def next_position(self,reverse=False):
|
||||
if self.feed_Mid_Status == FeedMidStatus.FMid_Start:
|
||||
self.next_start(reverse)
|
||||
|
||||
@ -2,150 +2,163 @@
|
||||
id = 1
|
||||
name = 反应釜1
|
||||
|
||||
[Position2]
|
||||
x = 421.397
|
||||
y = 2095.76
|
||||
z = 1403.803
|
||||
u = 2.787
|
||||
v = 17.14
|
||||
w = -95.084
|
||||
id = 2
|
||||
order = 0
|
||||
lineid = 1
|
||||
status = 3
|
||||
linetype = 2
|
||||
|
||||
[FeedLine2]
|
||||
id = 2
|
||||
name = 未定义
|
||||
name = 反应釜2
|
||||
|
||||
[Position3]
|
||||
x = 1.0
|
||||
y = 2.0
|
||||
z = 0.0
|
||||
u = 0.0
|
||||
v = 0.0
|
||||
w = 0.0
|
||||
x = 1882.882568
|
||||
y = 786.492737
|
||||
z = 1203.552246
|
||||
u = 11.403661
|
||||
v = -0.985981
|
||||
w = -125.710434
|
||||
id = 3
|
||||
order = 0
|
||||
lineid = 2
|
||||
status = 3
|
||||
linetype = 0
|
||||
|
||||
[Position5]
|
||||
x = 7.0
|
||||
y = 50.0
|
||||
z = 1.0
|
||||
u = 12.0
|
||||
v = 0.0
|
||||
w = 1.0
|
||||
id = 5
|
||||
[Position4]
|
||||
x = 1868.06311
|
||||
y = 872.854065
|
||||
z = 1265.651855
|
||||
u = 12.479004
|
||||
v = 1.611398
|
||||
w = -127.729263
|
||||
id = 4
|
||||
order = 2
|
||||
lineid = 1
|
||||
status = 4
|
||||
linetype = 0
|
||||
|
||||
[Position4]
|
||||
x = 7.0
|
||||
y = 50.0
|
||||
z = 1.0
|
||||
u = 12.0
|
||||
v = 0.0
|
||||
w = 1.0
|
||||
id = 4
|
||||
order = 3
|
||||
lineid = 1
|
||||
status = 2
|
||||
linetype = 0
|
||||
|
||||
[Position1]
|
||||
x = 7.0
|
||||
y = 50.0
|
||||
z = 1.0
|
||||
u = 12.0
|
||||
v = 0.0
|
||||
w = 1.0
|
||||
x = 348.84654634488436
|
||||
y = 1836.958560527403
|
||||
z = 223.84778176988266
|
||||
u = 2.3775411141593388
|
||||
v = -0.7172354339862681
|
||||
w = 95.0492701673298
|
||||
id = 1
|
||||
order = 4
|
||||
lineid = 1
|
||||
status = 5
|
||||
linetype = 0
|
||||
|
||||
[Position6]
|
||||
x = 7.0
|
||||
y = 50.0
|
||||
z = 1.0
|
||||
u = 12.0
|
||||
v = 0.0
|
||||
w = 1.0
|
||||
id = 6
|
||||
order = 1
|
||||
[Position7]
|
||||
x = 2218.886475
|
||||
y = 483.322144
|
||||
z = 1371.784302
|
||||
u = 8.190439
|
||||
v = 7.692511
|
||||
w = -143.628922
|
||||
id = 7
|
||||
order = 0
|
||||
lineid = 1
|
||||
status = 2
|
||||
status = 3
|
||||
linetype = 0
|
||||
|
||||
[Position7]
|
||||
x = 7.0
|
||||
y = 50.0
|
||||
z = 1.0
|
||||
u = 12.0
|
||||
v = 0.0
|
||||
w = 1.0
|
||||
id = 7
|
||||
[Position8]
|
||||
x = 807.391785
|
||||
y = 2337.584473
|
||||
z = 1852.736816
|
||||
u = -0.412497
|
||||
v = 9.080836
|
||||
w = -110.687553
|
||||
id = 8
|
||||
order = 5
|
||||
lineid = 1
|
||||
status = 6
|
||||
linetype = 0
|
||||
|
||||
[Position8]
|
||||
x = 7.0
|
||||
y = 50.0
|
||||
z = 1.0
|
||||
u = 12.0
|
||||
v = 0.0
|
||||
w = 1.0
|
||||
id = 8
|
||||
[Position9]
|
||||
x = 1759.061523
|
||||
y = 1738.14978
|
||||
z = 1852.472412
|
||||
u = 0.723375
|
||||
v = 9.708878
|
||||
w = -126.572548
|
||||
id = 9
|
||||
order = 6
|
||||
lineid = 1
|
||||
status = 7
|
||||
linetype = 0
|
||||
|
||||
[Position9]
|
||||
x = 7.0
|
||||
y = 50.0
|
||||
z = 1.0
|
||||
u = 12.0
|
||||
v = 0.0
|
||||
w = 1.0
|
||||
id = 9
|
||||
[Position10]
|
||||
x = 1759.061523
|
||||
y = 1738.14978
|
||||
z = 1852.472412
|
||||
u = 0.723375
|
||||
v = 9.708878
|
||||
w = -126.572548
|
||||
id = 10
|
||||
order = 7
|
||||
lineid = 1
|
||||
status = 8
|
||||
linetype = 0
|
||||
|
||||
[Position10]
|
||||
x = 7.0
|
||||
y = 50.0
|
||||
z = 1.0
|
||||
u = 12.0
|
||||
v = 0.0
|
||||
w = 1.0
|
||||
id = 10
|
||||
order = 8
|
||||
lineid = 1
|
||||
status = 9
|
||||
linetype = 0
|
||||
|
||||
[Position11]
|
||||
x = 7.0
|
||||
y = 50.0
|
||||
z = 1.0
|
||||
u = 12.0
|
||||
v = 0.0
|
||||
w = 1.0
|
||||
x = 1960.667847
|
||||
y = 837.290405
|
||||
z = 1688.202637
|
||||
u = -0.347183
|
||||
v = 0.356827
|
||||
w = -147.846161
|
||||
id = 11
|
||||
order = 9
|
||||
order = 8
|
||||
lineid = 1
|
||||
status = 3
|
||||
linetype = 0
|
||||
|
||||
[Position12]
|
||||
x = 1643.540039
|
||||
y = -24.557989
|
||||
z = 995.504272
|
||||
u = 0.167181
|
||||
v = 2.42627
|
||||
w = 177.088989
|
||||
id = 12
|
||||
order = 9
|
||||
lineid = 1
|
||||
status = 9
|
||||
linetype = 0
|
||||
|
||||
[Position2]
|
||||
x = 762.708984
|
||||
y = 1915.674561
|
||||
z = 1265.639648
|
||||
u = 12.478849
|
||||
v = 1.611004
|
||||
w = -84.483177
|
||||
id = 2
|
||||
order = 3
|
||||
lineid = 1
|
||||
status = 3
|
||||
linetype = 0
|
||||
|
||||
[Position5]
|
||||
x = 1868.06311
|
||||
y = 872.854065
|
||||
z = 1265.651855
|
||||
u = 12.479004
|
||||
v = 1.611398
|
||||
w = -127.729263
|
||||
id = 5
|
||||
order = 1
|
||||
lineid = 1
|
||||
status = 2
|
||||
linetype = 0
|
||||
|
||||
[Position6]
|
||||
x = 1425.824829
|
||||
y = 952.627869
|
||||
z = 1364.459839
|
||||
u = -5.591513
|
||||
v = -38.629269
|
||||
w = -114.406639
|
||||
id = 6
|
||||
order = 1
|
||||
lineid = 2
|
||||
status = 2
|
||||
linetype = 0
|
||||
|
||||
|
||||
@ -3,7 +3,8 @@ import os
|
||||
Debug = True
|
||||
IO_EmergencyPoint = 3
|
||||
bag_height = 10 # 一袋的高度
|
||||
position_accuracy = 0.05
|
||||
position_accuracy_action = 0.1 #动作时的位置精度6 这个精度要高 必须到位置才做动作
|
||||
position_accuracy_command = 6#命令时的位置精度
|
||||
manual_adjust_accuracy = 1
|
||||
# speed = 10
|
||||
# shake_speed = 20
|
||||
@ -61,6 +62,8 @@ str_feed_start_error = '请先复位到原点'
|
||||
str_feed_return_original_position_fail = '机械臂未按照实际路线点移动,未能寻找到适配路径点位'
|
||||
str_feed_reset_no_line_error = '未定义的线段'
|
||||
str_feed_angle_error = '角度差距过大,停止运行'
|
||||
str_feed_reset_start = '开始复位'
|
||||
str_feed_reverse = '复位成功'
|
||||
str_sys_start = '进入系统'
|
||||
str_sys_exit = '退出系统'
|
||||
str_sys_switch_tool = '切换到工具坐标'
|
||||
@ -78,6 +81,7 @@ str_sys_log_IO_error = 'IO更新失败'
|
||||
str_sys_log_alarm_error = '发生报警:'
|
||||
str_sys_log_move_error = '请填写全部坐标'
|
||||
str_sys_set_position_error = '未选中行'
|
||||
str_sys_command = '发送命令'
|
||||
str_tcp_robot_connect_fail = '连接失败'
|
||||
str_tcp_robot_connect_success = '连接成功'
|
||||
str_tcp_robot_data_error = '数据解析错误'
|
||||
|
||||
223
MainWin.ui
223
MainWin.ui
@ -4143,7 +4143,7 @@ background-color: #197971;
|
||||
<string notr="true">color: rgb(255, 255, 255);</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>放取延时:</string>
|
||||
<string>抛袋延时:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -4243,7 +4243,7 @@ background-color: #499c8a;
|
||||
<string notr="true">color: rgb(255, 255, 255);</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>收放点位:</string>
|
||||
<string>抓取点位:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -4272,7 +4272,7 @@ background-color: #499c8a;
|
||||
<string notr="true">color: rgb(255, 255, 255);</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>按压点位:</string>
|
||||
<string>抛袋点位:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -4306,7 +4306,7 @@ background-color: #499c8a;
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QLineEdit" name="lineEdit_timedelay_shake">
|
||||
<widget class="QLineEdit" name="lineEdit_timedelay_take">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
@ -4330,12 +4330,12 @@ background-color: #499c8a;
|
||||
<string notr="true">color: rgb(255, 255, 255);</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>震动延时:</string>
|
||||
<string>抓取延时:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="3">
|
||||
<widget class="QLineEdit" name="lineEdit_timedelay_take">
|
||||
<widget class="QLineEdit" name="lineEdit_timedelay_shake">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
@ -4359,7 +4359,36 @@ background-color: #499c8a;
|
||||
<string notr="true">color: rgb(255, 255, 255);</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>吸取延时:</string>
|
||||
<string>摇晃延时:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="2">
|
||||
<widget class="QLabel" name="label_89">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">color: rgb(255, 255, 255);</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>平滑系数:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="3">
|
||||
<widget class="QLineEdit" name="lineEdit_setting_smooth">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">color: rgb(255, 255, 255);</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -5597,9 +5626,9 @@ background-color: #499c8a;
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Shadow::Raised</enum>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_2" rowstretch="1,1,1" columnstretch="1,1,0" rowminimumheight="2,2,2">
|
||||
<item row="0" column="0">
|
||||
<widget class="QPushButton" name="pushButton_startFeed">
|
||||
<layout class="QGridLayout" name="gridLayout_2" rowstretch="1,1,1,1" columnstretch="1,1,0" rowminimumheight="2,2,2,0">
|
||||
<item row="2" column="1" colspan="2">
|
||||
<widget class="QPushButton" name="pushButton_reset">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
@ -5608,54 +5637,25 @@ background-color: #499c8a;
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">*{
|
||||
background-color: #499C54;
|
||||
font: 9pt "楷体";
|
||||
|
||||
border-radius: 10px;
|
||||
}
|
||||
*:pressed
|
||||
{
|
||||
background-color: #499c8a;
|
||||
}
|
||||
</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>启动</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="QIcon::ThemeIcon::MediaPlaybackStart"/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1" colspan="2">
|
||||
<widget class="QPushButton" name="pushButton_pauseFeed">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">*{
|
||||
background-color: #2196F3;
|
||||
background-color: #FFFFBF;
|
||||
font: 9pt "楷体";
|
||||
border-radius: 10px;
|
||||
}
|
||||
*:pressed
|
||||
{
|
||||
background-color: #499c8a;
|
||||
background-color: #FFF000;
|
||||
}
|
||||
</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>暂停</string>
|
||||
<string>复位</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="QIcon::ThemeIcon::MediaPlaybackPause"/>
|
||||
<iconset theme="media-optical"/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<item row="3" column="0">
|
||||
<widget class="QPushButton" name="pushButton_emergency">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
|
||||
@ -5684,36 +5684,7 @@ background-color: #ff6e00;
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1" colspan="2">
|
||||
<widget class="QPushButton" name="pushButton_clearAlarm">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">*{
|
||||
background-color: #1CB2B1;
|
||||
font: 9pt "楷体";
|
||||
border-radius: 10px;
|
||||
}
|
||||
*:pressed
|
||||
{
|
||||
background-color:#1cb052;
|
||||
}
|
||||
|
||||
</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>清除报警</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="QIcon::ThemeIcon::SystemReboot"/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<item row="2" column="0">
|
||||
<widget class="QPushButton" name="pushButton_stopFeed">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
|
||||
@ -5742,7 +5713,7 @@ background-color: #499c8a;
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1" colspan="2">
|
||||
<widget class="QPushButton" name="pushButton_reset">
|
||||
<widget class="QPushButton" name="pushButton_pauseFeed">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
@ -5751,21 +5722,115 @@ background-color: #499c8a;
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">*{
|
||||
background-color: #FFFFBF;
|
||||
background-color: #2196F3;
|
||||
font: 9pt "楷体";
|
||||
border-radius: 10px;
|
||||
}
|
||||
*:pressed
|
||||
{
|
||||
background-color: #FFF000;
|
||||
background-color: #499c8a;
|
||||
}
|
||||
</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>复位</string>
|
||||
<string>暂停</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="media-optical"/>
|
||||
<iconset theme="QIcon::ThemeIcon::MediaPlaybackPause"/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QPushButton" name="pushButton_startFeed">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">*{
|
||||
background-color: #499C54;
|
||||
font: 9pt "楷体";
|
||||
|
||||
border-radius: 10px;
|
||||
}
|
||||
*:pressed
|
||||
{
|
||||
background-color: #499c8a;
|
||||
}
|
||||
</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>启动</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="QIcon::ThemeIcon::MediaPlaybackStart"/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1" colspan="2">
|
||||
<widget class="QPushButton" name="pushButton_clearAlarm">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">*{
|
||||
background-color: #1CB2B1;
|
||||
font: 9pt "楷体";
|
||||
border-radius: 10px;
|
||||
}
|
||||
*:pressed
|
||||
{
|
||||
background-color:#1cb052;
|
||||
}
|
||||
|
||||
</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>清除报警</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="QIcon::ThemeIcon::SystemReboot"/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0" colspan="2">
|
||||
<widget class="QPushButton" name="pushButton_onekeyfeed">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">*{
|
||||
background-color: rgb(0, 170, 0);
|
||||
|
||||
font: 9pt "楷体";
|
||||
border-radius: 10px;
|
||||
}
|
||||
*:pressed
|
||||
{
|
||||
background-color:#1cb052;
|
||||
}
|
||||
|
||||
</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>一键投料</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="QIcon::ThemeIcon::DocumentSend"/>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
||||
@ -1,4 +1,7 @@
|
||||
from Constant import position_accuracy
|
||||
import math
|
||||
|
||||
from Constant import position_accuracy_command
|
||||
from Constant import position_accuracy_action
|
||||
class Position:
|
||||
def __init__(self):
|
||||
self.X = 0.0
|
||||
@ -7,17 +10,31 @@ class Position:
|
||||
self.U = 0.0
|
||||
self.V = 0.0
|
||||
self.W = 0.0
|
||||
def compare(self,position):
|
||||
if self.X-position.X<position_accuracy and \
|
||||
self.Y-position.Y<position_accuracy and \
|
||||
self.Z - position.Z < position_accuracy and \
|
||||
self.U - position.U < position_accuracy and \
|
||||
self.V - position.V < position_accuracy and \
|
||||
self.W - position.W < position_accuracy:
|
||||
|
||||
def compare(self,position,is_action=False):
|
||||
distance = math.sqrt((self.X-position.X)**2+
|
||||
(self.Y-position.Y)**2+
|
||||
(self.Z - position.Z)**2+
|
||||
(self.U - position.U)**2+
|
||||
(self.V - position.V)**2+
|
||||
(self.W - position.W) ** 2)
|
||||
if distance<=(position_accuracy_action if is_action else position_accuracy_command):
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
pass
|
||||
|
||||
|
||||
# def compare(self,position):
|
||||
# if self.X-position.X<position_accuracy and \
|
||||
# self.Y-position.Y<position_accuracy and \
|
||||
# self.Z - position.Z < position_accuracy and \
|
||||
# self.U - position.U < position_accuracy and \
|
||||
# self.V - position.V < position_accuracy and \
|
||||
# self.W - position.W < position_accuracy:
|
||||
# return True
|
||||
# else:
|
||||
# return False
|
||||
# pass
|
||||
|
||||
def is_error_angel_move(self,position,interval):
|
||||
if self.X - position.X >= interval or \
|
||||
@ -59,5 +76,8 @@ class Real_Position(Position):
|
||||
self.W = W
|
||||
return self
|
||||
|
||||
# def init_position(self, position):
|
||||
# return self.init_position(position.X,position.Y,position.Z,position.U,position.V,position.W)
|
||||
|
||||
def to_string(self):
|
||||
return "X:{:.3f},Y:{:.3f},Z:{:.3f},U:{:.3f},V:{:.3f},W:{:.3f}".format(self.X,self.Y,self.Z,self.U,self.V,self.W)
|
||||
@ -189,8 +189,7 @@ class CMDInstructRequest:
|
||||
if len(self.instructions) != 0:
|
||||
model_str = model_str+',"instructions":'+"[{"+self.instructions[0].toString()+"}]"+"}"
|
||||
else:
|
||||
model_str = model_str+',"instructions":'+"[{""}]"+"}" #model_str+"}"
|
||||
print(model_str)
|
||||
model_str = model_str+',"instructions":'+"[]"+"}" #model_str+"}"
|
||||
return model_str
|
||||
|
||||
class CMDInstructReply:
|
||||
|
||||
@ -47,10 +47,10 @@ photo_v5 = 0.0
|
||||
photo_w5 = 1.0
|
||||
linecount = 2
|
||||
remain_linename = 1
|
||||
remain_count = 0
|
||||
io_take_addr = 3
|
||||
io_zip_addr = 2
|
||||
io_shake_addr = 10
|
||||
remain_count = 998
|
||||
io_take_addr = 8
|
||||
io_zip_addr = 11
|
||||
io_shake_addr = 12
|
||||
takedelay = 0.2
|
||||
putdelay = 0.1
|
||||
shakedelay = 1.0
|
||||
|
||||
@ -63,15 +63,21 @@ def getPosition(x,y,z,a,b,c,rotation,points):
|
||||
|
||||
corner_points_camera = np.asarray(points)
|
||||
corner_points_base = np.dot(camera2robot[:3, :3], corner_points_camera.T).T + camera2robot[:3, 3]
|
||||
edges = np.array([corner_points_base[i] - corner_points_base[i - 1] for i in range(len(corner_points_base))])
|
||||
edge_lengths = np.linalg.norm(edges, axis=1)
|
||||
min_edge_idx = np.argmin(edge_lengths)
|
||||
short_edge_direction = edges[min_edge_idx] / edge_lengths[min_edge_idx] # 单位化方向向量
|
||||
# 按照 x 轴排序
|
||||
sorted_points = corner_points_base[np.argsort(corner_points_base[:, 0])]
|
||||
# 选出x轴较大的两个点
|
||||
point_1 = sorted_points[-1] # x值较大的点
|
||||
point_2 = sorted_points[-2] # x值较小的点
|
||||
# 根据 y 值选择差值方向
|
||||
if point_1[1] < point_2[1]:
|
||||
edge_vector = point_1 - point_2
|
||||
else:
|
||||
edge_vector = point_2 - point_1
|
||||
# 单位化方向向量
|
||||
short_edge_direction = edge_vector / np.linalg.norm(edge_vector)
|
||||
|
||||
angle = np.asarray([a,b,c])
|
||||
noraml = camera2robot[:3, :3]@angle
|
||||
noraml_base = vec2rpy(noraml,short_edge_direction)
|
||||
|
||||
print("111",target_position, noraml_base)
|
||||
|
||||
return target_position,noraml_base
|
||||
|
||||
@ -29,43 +29,65 @@ T_AB = np.array([[-9.36910568e-01,-4.37100341e-03, 3.49541818e-01, 5.04226000e+0
|
||||
[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 1.00000000e+00]])
|
||||
|
||||
# B 到 C 的齐次转换矩阵 (相机到工具)
|
||||
T_BC = np.loadtxt('./cam_pose.txt', delimiter=' ')
|
||||
T_BC = np.loadtxt('./com_pose.txt', delimiter=' ')
|
||||
|
||||
# 计算 A 到 C 的齐次转换矩阵
|
||||
T_AC = T_AB @ T_BC
|
||||
# T_AC = T_AB @ T_BC
|
||||
|
||||
# 输入四个角点的空间坐标 (相机坐标系下)
|
||||
# corner_points_camera = np.array([
|
||||
# [-605.3829, 288.2771, 1710.0],
|
||||
# [-364.94568, 300.40274, 1634.0],
|
||||
# [-301.4996, -253.04178, 1645.0],
|
||||
# [-548.8065, -297.23093, 1748.0]
|
||||
# ])
|
||||
#
|
||||
# # 将角点从相机坐标系转换到基坐标系
|
||||
#
|
||||
# corner_points_base = np.dot(T_BC[:3, :3], corner_points_camera.T).T + T_BC[:3, 3]
|
||||
# edges = np.array([corner_points_base[1] - corner_points_base[0]])# for i in range(len(corner_points_base))])
|
||||
# edge_lengths = np.linalg.norm(edges, axis=1)
|
||||
# min_edge_idx = np.argmin(edge_lengths)
|
||||
# short_edge_direction = edges[min_edge_idx] / edge_lengths[min_edge_idx] # 单位化方向向量
|
||||
|
||||
|
||||
corner_points_camera = np.array([
|
||||
[-0.07010334103611927, -0.007624093814835717, 0.638128259308727],
|
||||
[0.03136683809654154, 0.003582437967995489, 0.6478950644491274],
|
||||
[0.02505911529466708, 0.04860494901872052, 0.625793874394482],
|
||||
[-0.07246355234803807, 0.03687307395179221, 0.6171704935761987]
|
||||
[-548.8065, -297.23093, 1748.0],
|
||||
[-301.4996, -253.04178, 1645.0],
|
||||
[-364.94568, 300.40274, 1634.0],
|
||||
[-605.3829, 288.2771, 1710.0]
|
||||
])
|
||||
|
||||
# 将角点从相机坐标系转换到法兰坐标系
|
||||
corner_points_flange = np.dot(T_BC[:3, :3], corner_points_camera.T).T + T_BC[:3, 3]
|
||||
# 将角点从相机坐标系转换到基坐标系
|
||||
corner_points_base = np.dot(T_BC[:3, :3], corner_points_camera.T).T + T_BC[:3, 3]
|
||||
|
||||
# 将角点从法兰坐标系转换到基坐标系
|
||||
corner_points_base = np.dot(T_AB[:3, :3], corner_points_flange.T).T + T_AB[:3, 3]
|
||||
# 按照 x 轴排序
|
||||
sorted_points = corner_points_base[np.argsort(corner_points_base[:, 0])]
|
||||
|
||||
# 计算每两个相邻角点之间的边向量
|
||||
edges = np.array([corner_points_base[i] - corner_points_base[i - 1] for i in range(len(corner_points_base))])
|
||||
# 选出x轴较大的两个点
|
||||
point_1 = sorted_points[-1] # x值较大的点
|
||||
point_2 = sorted_points[-2] # x值较小的点
|
||||
|
||||
# 计算每条边的长度
|
||||
edge_lengths = np.linalg.norm(edges, axis=1)
|
||||
# 根据 y 值选择差值方向,y值较大的点减去 y 值较小的点
|
||||
if point_1[1] > point_2[1]:
|
||||
edge_vector = point_1 - point_2
|
||||
else:
|
||||
edge_vector = point_2 - point_1
|
||||
|
||||
# 单位化方向向量
|
||||
short_edge_direction = edge_vector / np.linalg.norm(edge_vector)
|
||||
|
||||
print("方向向量(单位化):", short_edge_direction)
|
||||
|
||||
# 找到最长的边
|
||||
max_edge_idx = np.argmax(edge_lengths)
|
||||
long_edge_direction = edges[max_edge_idx] / edge_lengths[max_edge_idx] # 单位化方向向量
|
||||
|
||||
# 假设法向量 (a, b, c) 在相机坐标系下
|
||||
normal_vector_camera = np.array([-0.1305,0.38402,0.91404, 0]) # 最后一个元素为0,因为它是方向矢量
|
||||
normal_vector_camera = np.array([0.2694268969253701, 0.033645691818738714, 0.9624329143556991, 0]) # 最后一个元素为0,因为它是方向矢量
|
||||
|
||||
# 将法向量从相机坐标系转换到法兰坐标系
|
||||
normal_vector_flange = T_BC @ normal_vector_camera
|
||||
|
||||
# 将法向量从法兰坐标系转换到基坐标系
|
||||
normal_vector_base = T_AB @ normal_vector_flange
|
||||
# normal_vector_base = T_AB @ normal_vector_flange
|
||||
|
||||
# 创建 3D 图形对象
|
||||
fig = plt.figure()
|
||||
@ -80,19 +102,19 @@ ax.set_zlim([-1000, 1000])
|
||||
plot_coordinate_system(ax, np.eye(4), 'O', 'k', ['x', 'y', 'z'])
|
||||
|
||||
# 绘制法兰坐标系 B
|
||||
plot_coordinate_system(ax, T_AB, 'B', 'm', ["x'", "y'", "z'"])
|
||||
# plot_coordinate_system(ax, T_AB, 'B', 'm', ["x'", "y'", "z'"])
|
||||
|
||||
# 绘制相机坐标系 C
|
||||
plot_coordinate_system(ax, T_AC, 'C', 'b', ["x''", "y''", "z''"])
|
||||
plot_coordinate_system(ax, T_BC, 'C', 'b', ["x''", "y''", "z''"])
|
||||
|
||||
# 绘制长边方向向量 (基坐标系下)
|
||||
origin = np.zeros(3) # 基坐标系的原点
|
||||
long_edge_endpoint = long_edge_direction * 300
|
||||
ax.quiver(*origin, *(long_edge_endpoint), color='orange', length=1, arrow_length_ratio=0.2, linewidth=2)
|
||||
ax.text(*long_edge_endpoint, 'Long Edge', color='orange', fontsize=12)
|
||||
short_edge_endpoint = short_edge_direction * 300
|
||||
ax.quiver(*origin, *(short_edge_endpoint), color='orange', length=1, arrow_length_ratio=0.2, linewidth=2)
|
||||
ax.text(*short_edge_endpoint, 'Short Edge', color='orange', fontsize=12)
|
||||
|
||||
# 绘制法向量 (基坐标系下)
|
||||
normal_vector_endpoint = normal_vector_base[:3] * 300
|
||||
normal_vector_endpoint = normal_vector_flange[:3] * 300
|
||||
ax.quiver(*origin, *(normal_vector_endpoint), color='purple', length=1, arrow_length_ratio=0.2, linewidth=2)
|
||||
ax.text(*normal_vector_endpoint, 'Normal Vector', color='purple', fontsize=12)
|
||||
|
||||
|
||||
@ -1,13 +1,25 @@
|
||||
import logging
|
||||
|
||||
import cv2
|
||||
from PIL.ImageQt import QImage, QPixmap
|
||||
from PySide6.QtGui import QPixmap, QImage
|
||||
|
||||
from Util.util_log import log
|
||||
|
||||
|
||||
def cv2_to_qpixmap(cv_img):
|
||||
"""将OpenCV图像转换为QPixmap"""
|
||||
# img = cv_img.copy()
|
||||
# cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB)
|
||||
try:
|
||||
height, width, channel = cv_img.shape
|
||||
bytes_per_line = 3 * width
|
||||
q_img = QImage(cv_img.data, width, height, bytes_per_line, QImage.Format_RGB888)
|
||||
return QPixmap.fromImage(q_img)
|
||||
bytes_per_line = channel * width
|
||||
q_image = QImage(cv_img.data, width, height, bytes_per_line, QImage.Format_RGB888)
|
||||
pixmap = QPixmap.fromImage(q_image)
|
||||
return pixmap
|
||||
except Exception as e:
|
||||
print(e)
|
||||
log.log_message(logging.ERROR,e)
|
||||
return None
|
||||
|
||||
# def cv2_to_qpixmap(cv_img):
|
||||
# """将OpenCV图像转换为QPixmap"""
|
||||
|
||||
@ -15,7 +15,8 @@ import time
|
||||
import os
|
||||
|
||||
from Vision.tool.CameraRVC import camera_rvc
|
||||
from Vision.tool.CameraPe_color2depth import camera_pe
|
||||
from Vision.tool.CameraPe_color2depth import camera_pe as camera_pe_color2depth
|
||||
from Vision.tool.CameraPe_depth2color import camera_pe as camera_pe_depth2color
|
||||
from Vision.yolo.yolov8_pt_seg import yolov8_segment
|
||||
from Vision.yolo.yolov8_openvino import yolov8_segment_openvino
|
||||
from Vision.tool.utils import find_position
|
||||
@ -28,15 +29,17 @@ from Vision.tool.utils import uv_to_XY
|
||||
|
||||
class Detection:
|
||||
|
||||
def __init__(self, use_openvino_model=False, cameraType = 'Pe'): # cameraType = 'RVC' or cameraType = 'Pe'
|
||||
def __init__(self, use_openvino_model=False, cameraType = 'Pe', alignmentType = 'color2depth'): # cameraType = 'RVC' or cameraType = 'Pe'
|
||||
"""
|
||||
初始化相机及模型
|
||||
:param use_openvino_model: 选择模型,默认使用openvino
|
||||
:param cameraType: 选择相机 如本相机 'RVC', 图漾相机 'Pe'
|
||||
:param alignmentType: 相机对齐方式 color2depth:彩色图对齐深度图 ;depth2color:深度图对齐彩色图
|
||||
|
||||
"""
|
||||
self.use_openvino_model = use_openvino_model
|
||||
self.cameraType = cameraType
|
||||
self.alignmentType= alignmentType
|
||||
if self.use_openvino_model == False:
|
||||
model_path = ''.join([os.getcwd(), '/Vision/model/pt/one_bag.pt'])
|
||||
device = 'cpu'
|
||||
@ -44,7 +47,10 @@ class Detection:
|
||||
self.camera_rvc = camera_rvc()
|
||||
self.seg_distance_threshold = 10 # 1厘米
|
||||
elif self.cameraType == 'Pe':
|
||||
self.camera_rvc = camera_pe()
|
||||
if self.alignmentType=='color2depth':
|
||||
self.camera_rvc = camera_pe_color2depth()
|
||||
else:
|
||||
self.camera_rvc = camera_pe_depth2color()
|
||||
self.seg_distance_threshold = 15 # 2厘米
|
||||
else:
|
||||
print('相机参数错误')
|
||||
@ -58,7 +64,10 @@ class Detection:
|
||||
self.camera_rvc = camera_rvc()
|
||||
self.seg_distance_threshold = 10
|
||||
elif self.cameraType == 'Pe':
|
||||
self.camera_rvc = camera_pe()
|
||||
if self.alignmentType == 'color2depth':
|
||||
self.camera_rvc = camera_pe_color2depth()
|
||||
else:
|
||||
self.camera_rvc = camera_pe_depth2color()
|
||||
self.seg_distance_threshold = 20
|
||||
else:
|
||||
print('相机参数错误')
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
description: Ultralytics YOLOv8n-seg model trained on D:\work\ultralytics-main\ultralytics\cfg\datasets\coco8-seg-dy.yaml
|
||||
author: Ultralytics
|
||||
date: '2024-12-02T17:16:53.470305'
|
||||
date: '2024-12-19T09:48:12.419566'
|
||||
version: 8.2.86
|
||||
license: AGPL-3.0 License (https://ultralytics.com/license)
|
||||
docs: https://docs.ultralytics.com
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@ -124,7 +124,7 @@ class camera_pe():
|
||||
:return: ret , img, point_map
|
||||
'''
|
||||
if self.caminit_isok == False or self.event.IsOffline():
|
||||
return 0, None, None
|
||||
return 0, None, None, None
|
||||
else:
|
||||
image_list = self.cl.DeviceStreamRead(self.handle, 2000)
|
||||
if len(image_list) == 2:
|
||||
|
||||
@ -80,6 +80,7 @@ class camera_pe():
|
||||
# print('\t{} -size[{}x{}]\t-\t desc:{}'.format(idx, cl.Width(fmt), cl.Height(fmt), fmt.getDesc()))
|
||||
self.cl.DeviceStreamFormatConfig(self.handle, PERCIPIO_STREAM_DEPTH, depth_fmt_list[2]) # 深度图大小
|
||||
self.depth_calib_data = self.cl.DeviceReadCalibData(self.handle, PERCIPIO_STREAM_DEPTH)
|
||||
self.color_calib_data = self.cl.DeviceReadCalibData(self.handle, PERCIPIO_STREAM_COLOR)
|
||||
|
||||
err = self.cl.DeviceLoadDefaultParameters(self.handle)
|
||||
if err:
|
||||
@ -124,7 +125,7 @@ class camera_pe():
|
||||
:return: ret , img, point_map
|
||||
'''
|
||||
if self.caminit_isok == False or self.event.IsOffline():
|
||||
return 0, None, None
|
||||
return 0, None, None, None
|
||||
else:
|
||||
image_list = self.cl.DeviceStreamRead(self.handle, 2000)
|
||||
if len(image_list) == 2:
|
||||
@ -140,7 +141,7 @@ class camera_pe():
|
||||
|
||||
self.cl.DeviceStreamDepthRender(self.img_registration_depth, self.img_registration_render)
|
||||
mat_depth_render = self.img_registration_render.as_nparray()
|
||||
self.cl.DeviceStreamMapDepthImageToPoint3D(self.img_registration_depth, self.depth_calib_data, self.scale_unit,
|
||||
self.cl.DeviceStreamMapDepthImageToPoint3D(self.img_registration_depth, self.color_calib_data, self.scale_unit,
|
||||
self.pointcloud_data_arr)
|
||||
p3d_nparray = self.pointcloud_data_arr.as_nparray()
|
||||
|
||||
|
||||
3
app.py
3
app.py
@ -910,7 +910,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
else:
|
||||
pause_command.cmdData.append("0")
|
||||
request_command = pause_command.toString()
|
||||
print(request_command)
|
||||
self.robotClient.add_sendQuene(request_command)
|
||||
|
||||
def send_clear_alarm_command(self, pause: bool):
|
||||
@ -918,7 +917,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
pause_command.cmdData.append("clearAlarmContinue")
|
||||
pause_command.cmdData.append("1")
|
||||
request_command = pause_command.toString()
|
||||
print(request_command)
|
||||
log_str = f'暂停:{pause}'
|
||||
self.robotClient.add_sendQuene(request_command)
|
||||
|
||||
@ -927,7 +925,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
switch_command.cmdData.append("switchTool")
|
||||
switch_command.cmdData.append("2")
|
||||
request_command = switch_command.toString()
|
||||
print(request_command)
|
||||
|
||||
self.robotClient.add_sendQuene(request_command)
|
||||
|
||||
|
||||
15062
log/log.log
Normal file
15062
log/log.log
Normal file
File diff suppressed because it is too large
Load Diff
110
main.py
110
main.py
@ -1,6 +1,7 @@
|
||||
import configparser
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
import queue
|
||||
import sys
|
||||
import threading
|
||||
@ -8,6 +9,8 @@ from multiprocessing import Process
|
||||
import traceback
|
||||
|
||||
import PySide6
|
||||
import cv2
|
||||
import numpy as np
|
||||
from PyQt5.uic.properties import QtWidgets
|
||||
from PySide6 import QtCore
|
||||
from PySide6.QtCore import QThread, Signal, Slot, QObject, QEvent, QTimer
|
||||
@ -46,6 +49,7 @@ from view.ResetView import StopDialog
|
||||
|
||||
|
||||
class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
updateUI_seting = Signal()
|
||||
def __init__(self):
|
||||
super(MainWindow, self).__init__()
|
||||
self.setupUi(self)
|
||||
@ -396,8 +400,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
continue
|
||||
position_model = PositionModel(i)
|
||||
break
|
||||
if position_model.id == 999:
|
||||
print("d")
|
||||
if self.tableWidget_line_positions.currentRow()==-1:
|
||||
row_i = self.tableWidget_line_positions.rowCount()
|
||||
else:
|
||||
@ -448,7 +450,9 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
combox.addItem("初始化点", 2)
|
||||
combox.addItem("中间点", 3)
|
||||
combox.addItem("相机/待抓点",4)
|
||||
combox.addItem("抓取前点", 3)
|
||||
combox.addItem("抓取",5)
|
||||
combox.addItem("抓取后点", 3)
|
||||
combox.addItem("破带点1",6)
|
||||
combox.addItem("破带点2",7)
|
||||
combox.addItem("震动点",8)
|
||||
@ -562,7 +566,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
self.pushButton_leftmenu_baseSeting.clicked.connect(lambda _, index=3: self.send_click_change_stackView(index))
|
||||
self.pushButton_leftmenu_posDebug.clicked.connect(lambda _, index=4: self.send_click_change_stackView(index))
|
||||
self.pushButton_exit.clicked.connect(self.send_exit_button_click)
|
||||
|
||||
self.pushButton_onekeyfeed.clicked.connect(self.send_onekeyfeed_button_click)
|
||||
|
||||
int_validator = QIntValidator(0, 100, self.lineEdit_num)
|
||||
self.lineEdit_num.setValidator(int_validator)
|
||||
@ -581,14 +585,14 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
def init_Run(self):
|
||||
self.robotClient = None
|
||||
self.configReader = configparser.ConfigParser()
|
||||
self.detection =Detection() #TODO 关闭图像
|
||||
#TODO 关闭图像
|
||||
self.command_position_quene = Queue()
|
||||
self.status_address = DataAddress()
|
||||
self.feedLine_dict = {}
|
||||
self.command_quene = Queue()
|
||||
self.main_threading = None
|
||||
self.detection_person = None # DetectionPerson()
|
||||
self.cton_take_no_photo = CRisOrFall()
|
||||
self.index = 1
|
||||
|
||||
self.configReader.read(Constant.set_ini)
|
||||
ip = self.configReader.get('Robot_Feed', 'IPAddress')
|
||||
@ -629,6 +633,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
time_delay_put = float(self.configReader.get('Robot_Feed', 'putDelay'))
|
||||
time_delay_shake = float(self.configReader.get('Robot_Feed', 'shakeDelay'))
|
||||
max_angle_interval = float(self.configReader.get('Robot_Feed', 'max_angle_interval'))
|
||||
smooth = float(self.configReader.get('Robot_Feed', 'smooth'))
|
||||
#TODO
|
||||
#dropDelay_time = int(self.configReader.get('Robot_Feed', 'dropDelay_time'))
|
||||
self.robotClient = RobotClient(ip, port, photo_locs, self.command_position_quene, self.status_address,[io_take_addr, io_zip_addr, io_shake_addr],time_delay_take,time_delay_put,time_delay_shake,origin_position)
|
||||
@ -636,12 +641,16 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
self.robotClient.feed_speed = feed_speed
|
||||
self.robotClient.reset_speed = reset_speed
|
||||
self.robotClient.max_angle_interval = max_angle_interval
|
||||
self.feeding = Feeding(self.robotClient, self.detection) # 临时
|
||||
self.robotClient.smooth = smooth
|
||||
self.feeding = Feeding(self.robotClient) # 临时
|
||||
self.feeding.need_origin_signal.connect(self.show_infomessage_box)
|
||||
self.feeding.take_no_photo_sigal.emit(self.show_no_photo_message_box)
|
||||
self.feeding.take_no_photo_sigal.connect(self.show_no_photo_message_box)
|
||||
self.feeding.update_detect_image.connect(self.updateUI_label_detection)
|
||||
self.feeding.log_signal.connect(self.log_message)
|
||||
self.last_time = time.time()
|
||||
self.remain_lineName = self.configReader.get('Robot_Feed', 'remain_lineName')
|
||||
self.remain_Count = int(self.configReader.get('Robot_Feed', 'remain_Count'))
|
||||
self.updateUI_seting.connect(self.update_seting_frame)
|
||||
try:
|
||||
self.robotClient.CreatConnect()
|
||||
except:
|
||||
@ -812,12 +821,13 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
def start_Runing(self):
|
||||
self.main_threading = Thread(target=self.run)
|
||||
self.robot_connect_threading = Thread(target=self.robotClient.run)
|
||||
self.main_UI_threading = Thread(target=self.updateUI)
|
||||
|
||||
self.detect_person_thread = Thread(target=self.run_detect_persion)
|
||||
|
||||
self.main_threading.start()
|
||||
self.robot_connect_threading.start()
|
||||
|
||||
self.main_UI_threading = Thread(target=self.updateUI)
|
||||
self.main_UI_threading.start()
|
||||
self.detect_person_thread = Thread(target=self.run_detect_persion)
|
||||
self.detect_person_thread.start()
|
||||
pass
|
||||
def check_continue(self):
|
||||
@ -895,6 +905,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
# self.stackedWidget_num.setCurrentIndex(1)
|
||||
self.set_run_status_button(True)
|
||||
self.feeding.pause = False
|
||||
self.feeding.onekey = False
|
||||
log.log_message(logging.INFO, f'{self.feedLine_dict[line_head].name}:{Constant.str_feed_start}')
|
||||
|
||||
def send_num_button_click(self):
|
||||
@ -1020,6 +1031,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
self.robotClient.feed_speed = int(self.lineEdit_speed_run.text())
|
||||
self.robotClient.debug_speed = int(self.lineEdit_speed_debug.text())
|
||||
self.robotClient.reset_speed = int(self.lineEdit_speed_reset.text())
|
||||
self.robotClient.smooth = int(self.lineEdit_setting_smooth.text())
|
||||
try:
|
||||
take_addr = int(self.lineEdit_take_addr.text())
|
||||
press_addr = int(self.lineEdit_press_addr.text())
|
||||
@ -1035,15 +1047,16 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
self.robotClient.time_delay_shake = time_delay_shake
|
||||
self.configReader = configparser.ConfigParser()
|
||||
self.configReader.read(Constant.set_ini)
|
||||
self.configReader.set('Robot_Feed', 'solenoid_valve1_addr', str(take_addr))
|
||||
self.configReader.set('Robot_Feed', 'solenoid_valve2_addr', str(press_addr))
|
||||
self.configReader.set('Robot_Feed', 'solenoid_valve3_addr', str(shake_addr))
|
||||
self.configReader.set('Robot_Feed', 'io_take_addr', str(take_addr))
|
||||
self.configReader.set('Robot_Feed', 'io_zip_addr', str(press_addr))
|
||||
self.configReader.set('Robot_Feed', 'io_shake_addr', str(shake_addr))
|
||||
self.configReader.set('Robot_Feed', 'takeDelay', str(time_delay_take))
|
||||
self.configReader.set('Robot_Feed', 'putDelay', str(time_delay_put))
|
||||
self.configReader.set('Robot_Feed', 'shakeDelay', str(time_delay_shake))
|
||||
self.configReader.set('Speed', 'feed_speed', str(self.robotClient.feed_speed))
|
||||
self.configReader.set('Speed', 'debug_speed', str(self.robotClient.debug_speed))
|
||||
self.configReader.set('Speed', 'reset_speed', str(self.robotClient.reset_speed))
|
||||
self.configReader.set('Robot_Feed', 'smooth', str(self.robotClient.smooth))
|
||||
self.configReader.write(open(Constant.set_ini, 'w', encoding='utf-8'))
|
||||
except Exception as e:
|
||||
log.log_message(logging.ERROR, Constant.str_sys_set_error+e)
|
||||
@ -1177,8 +1190,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
self.send_start_tool_command()
|
||||
|
||||
def send_reset_button_click(self):
|
||||
# TODO 清楚痕迹
|
||||
# TODO 开启自动
|
||||
# 触发自动运行
|
||||
if self.robotClient.status_model.curMode != 7:
|
||||
self.send_switch_tool_command()
|
||||
@ -1189,6 +1200,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
|
||||
line_head = self.comboBox_lineIndex.currentData()
|
||||
self.send_clear_auto_command()
|
||||
log.log_message(logging.INFO, Constant.str_feed_reset_start)
|
||||
#safe_position = self.feedLine_dict[line_head].safe_position
|
||||
# self.send_position_command(safe_position.X, safe_position.Y, safe_position.Z, safe_position.U, safe_position.V, safe_position.W,move_type=MoveType.WORLD)
|
||||
if self.remain_lineName != '':
|
||||
@ -1205,8 +1217,8 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
log.log_message(logging.ERROR, Constant.str_feed_reset_no_line_error)
|
||||
return
|
||||
self.feeding.reset_status = ResetStatus.RStart
|
||||
dialog_reset = StopDialog()
|
||||
dialog_reset.stop_thread_signal.connect(self.stop_reset_thread)
|
||||
# dialog_reset = StopDialog()
|
||||
# dialog_reset.stop_thread_signal.connect(self.stop_reset_thread)
|
||||
else:
|
||||
log.log_message(logging.ERROR, Constant.str_feed_reset_no_line_error)
|
||||
return
|
||||
@ -1315,8 +1327,8 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
try:
|
||||
self.feeding.run()
|
||||
self.feeding.run_reset()
|
||||
except:
|
||||
print(Error_Code.SYS_NONEPoint)
|
||||
except Exception as e:
|
||||
log.log_message(logging.ERROR, e)
|
||||
|
||||
|
||||
# pass #主线程
|
||||
@ -1364,14 +1376,14 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
self.label_date.setText(datetime.now().strftime("%Y-%m-%d"))
|
||||
self.label_time.setText(datetime.now().strftime("%H:%M:%S"))
|
||||
|
||||
self.updateUI_seting.emit()
|
||||
|
||||
def update_seting_frame(self):
|
||||
self.updateUI_Position()
|
||||
self.updateUI_label_detection()
|
||||
self.updateUI_label_status()
|
||||
self.updateUI_frame_sign(self.feeding.feedStatus)
|
||||
self.updateUI_IOPanel()
|
||||
|
||||
|
||||
|
||||
def updateRobotSeting(self):
|
||||
self.lineEdit_origin_x.setText(str(self.robotClient.origin_position.X))
|
||||
self.lineEdit_origin_y.setText(str(self.robotClient.origin_position.Y))
|
||||
@ -1380,7 +1392,9 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
self.lineEdit_origin_v.setText(str(self.robotClient.origin_position.V))
|
||||
self.lineEdit_origin_w.setText(str(self.robotClient.origin_position.W))
|
||||
|
||||
@Slot()
|
||||
def show_no_photo_message_box(self):
|
||||
print("显示弹窗图片")
|
||||
self.feeding.pause = True
|
||||
self.send_pause_command(pause=1)
|
||||
msg_box_person = QMessageBox()
|
||||
@ -1407,12 +1421,20 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
except Exception as e:
|
||||
log.log_message(logging.ERROR, Constant.str_sys_log_IO_error)
|
||||
pass
|
||||
def updateUI_label_detection(self):
|
||||
backgroud_img = Util.util_pic.cv2_to_qpixmap(self.feeding.detection_image)
|
||||
@Slot()
|
||||
def updateUI_label_detection(self,img:np.ndarray):
|
||||
img_copy = np.copy(img)
|
||||
backgroud_img = Util.util_pic.cv2_to_qpixmap(img_copy)
|
||||
if backgroud_img == None:
|
||||
return
|
||||
backgroud_img = backgroud_img.scaled(self.label_showDetection.size().width(),self.label_showDetection.size().height(), Qt.AspectRatioMode.IgnoreAspectRatio,Qt.TransformationMode.SmoothTransformation)
|
||||
self.label_showDetection.setPixmap(backgroud_img)
|
||||
|
||||
|
||||
@Slot()
|
||||
def log_message(self,level,message):
|
||||
log.log_message(level,message)
|
||||
|
||||
def updateUI_Select_Line(self):
|
||||
self.comboBox_lineIndex.clear()
|
||||
for key, value in self.feedLine_dict.items():
|
||||
@ -1560,7 +1582,8 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
clear_command = CMDInstructRequest()
|
||||
request_command = clear_command.toString()
|
||||
log.log_message(logging.INFO, Constant.str_sys_clearAlarm)
|
||||
self.command_quene.put(request_command)
|
||||
self.robotClient.add_sendQuene(request_command)
|
||||
# self.command_quene.put(request_command)
|
||||
|
||||
def send_position_command(self, x1, x2, x3, x4, x5, x6, move_type: MoveType = MoveType.WORLD):
|
||||
|
||||
@ -1594,12 +1617,11 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
else:
|
||||
pause_command.cmdData.append("0")
|
||||
request_command = pause_command.toString()
|
||||
print(request_command)
|
||||
self.robotClient.add_sendQuene(request_command)
|
||||
|
||||
def send_emergency_alarm_command(self):
|
||||
self.feeding.feedStatus = FeedStatus.FNone
|
||||
self.feeding.feedConfig.num = 0
|
||||
|
||||
stop_command = CMDRequest()
|
||||
stop_command.cmdData.append("actionStop")
|
||||
stop_command.cmdData.append("1")
|
||||
@ -1607,18 +1629,17 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
self.send_clear_auto_command()
|
||||
self.robotClient.add_sendQuene(request_command)
|
||||
self.feeding.send_emergency_sound()
|
||||
self.feeding.feedConfig.num = 0
|
||||
log.log_message(logging.INFO, Constant.str_sys_emergencyStop)
|
||||
#TODO
|
||||
|
||||
|
||||
def send_clear_alarm_command(self, pause: bool):
|
||||
self.send_start_tool_command()
|
||||
self.send_clear_auto_command()
|
||||
pause_command = CMDRequest()
|
||||
pause_command.cmdData.append("StopButton")
|
||||
pause_command.cmdData.append("1")
|
||||
request_command = pause_command.toString()
|
||||
print(request_command)
|
||||
log_str = f'暂停:{pause}'
|
||||
self.robotClient.add_sendQuene(request_command)
|
||||
|
||||
def send_switch_tool_command(self):
|
||||
@ -1626,8 +1647,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
switch_command.cmdData.append("switchTool")
|
||||
switch_command.cmdData.append("2")
|
||||
request_command = switch_command.toString()
|
||||
print(request_command)
|
||||
|
||||
self.robotClient.add_sendQuene(request_command)
|
||||
|
||||
def send_start_tool_command(self):
|
||||
@ -1635,8 +1654,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
switch_command.cmdData.append("startButton")
|
||||
switch_command.cmdData.append("1")
|
||||
request_command = switch_command.toString()
|
||||
print(request_command)
|
||||
|
||||
self.robotClient.add_sendQuene(request_command)
|
||||
|
||||
def show_messagebox_of_person(self):
|
||||
@ -1841,6 +1858,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
self.configReader.write(open(Constant.set_ini, 'w', encoding='utf-8'))
|
||||
log.log_message(logging.INFO, f'设置原点:{x},{y},{z}')
|
||||
except:
|
||||
log.log_message(logging.ERROR, f'设置原点失败')
|
||||
self.show_infomessage_box("设置原点失败")
|
||||
|
||||
|
||||
@ -1884,11 +1902,13 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
self.lineEdit_take_addr.setText(str(self.robotClient.con_ios[0]))
|
||||
self.lineEdit_press_addr.setText(str(self.robotClient.con_ios[1]))
|
||||
self.lineEdit_shake_addr.setText(str(self.robotClient.con_ios[2]))
|
||||
self.lineEdit_setting_smooth.setText(str(self.robotClient.smooth))
|
||||
self.lineEdit_timedelay_take.setText(str(self.robotClient.time_delay_take))
|
||||
self.lineEdit_timedelay_put.setText(str(self.robotClient.time_delay_put))
|
||||
self.lineEdit_timedelay_shake.setText(str(self.robotClient.time_delay_shake))
|
||||
|
||||
def show_infomessage_box(self,message):
|
||||
print('显示弹窗')
|
||||
msg_box = QMessageBox(self)
|
||||
msg_box.setWindowTitle("提示")
|
||||
msg_box.setText(message)
|
||||
@ -1905,6 +1925,18 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
if index == 3:
|
||||
self.updateUI_Base_Set()
|
||||
|
||||
def send_onekeyfeed_button_click(self):
|
||||
# if self.feeding.feedStatus != FeedStatus.FNone:
|
||||
# self.show_infomessage_box("正在执行")
|
||||
# return
|
||||
|
||||
self.horizontalSlider_feedingNum.setMaximum(999)
|
||||
self.label_maxNum.setText(str(999))
|
||||
self.horizontalSlider_feedingNum.setValue(0)
|
||||
|
||||
self.send_startFeed_button_click()
|
||||
self.feeding.onekey = True
|
||||
|
||||
def send_exit_button_click(self):
|
||||
self.closeEvent(None)
|
||||
QApplication.quit()
|
||||
@ -1932,7 +1964,9 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
|
||||
def closeEvent(self, event):
|
||||
self.record_remain_num()
|
||||
self.detection.release()
|
||||
# self.feeding.is_detected = False
|
||||
# self.feeding.detect_thread.join()
|
||||
self.feeding.close_feed()
|
||||
self.thread_signal = False
|
||||
self.robotClient.close()
|
||||
log.log_message(logging.INFO, Constant.str_sys_exit)
|
||||
@ -1966,14 +2000,16 @@ def handle_exception(exc_type, exc_value, exc_tb):
|
||||
log.log_message(logging.INFO, "用户主动退出程序")
|
||||
return
|
||||
log.log_message(logging.ERROR, exc_value)
|
||||
print("未处理的异常:", exc_type, exc_value)
|
||||
traceback.print_exception(exc_type, exc_value, exc_tb)
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = MyApplication(sys.argv)
|
||||
window = MainWindow()
|
||||
window.show()
|
||||
sys.excepthook = handle_exception # 你的 PySide 应用程序代码 pass
|
||||
sys.excepthook = handle_exception
|
||||
try :
|
||||
sys.exit(app.exec())
|
||||
except Exception as e:
|
||||
log.log_message(logging.ERROR, e)
|
||||
|
||||
|
||||
|
||||
127
test.py
127
test.py
@ -1,100 +1,51 @@
|
||||
from PySide6.QtWidgets import QApplication, QPushButton, QMainWindow, QMessageBox
|
||||
from PySide6.QtCore import QPropertyAnimation, QPoint, QParallelAnimationGroup, QEasingCurve, Property
|
||||
from PySide6.QtGui import QColor, QPainter, QBrush
|
||||
from PySide6.QtCore import Qt
|
||||
from PySide6.QtCore import QThread, Signal, Slot
|
||||
from PySide6.QtWidgets import QApplication, QDialog, QLabel, QVBoxLayout, QPushButton
|
||||
import sys
|
||||
import time
|
||||
|
||||
import Constant
|
||||
# 定义子线程类
|
||||
class WorkerThread(QThread):
|
||||
# 创建信号,子线程处理完成后通知主线程弹窗
|
||||
show_dialog_signal = Signal(str)
|
||||
|
||||
def run(self):
|
||||
# 模拟子线程的工作
|
||||
time.sleep(3) # 假设任务执行需要 3 秒钟
|
||||
self.show_dialog_signal.emit("任务完成,弹出对话框") # 发出信号,通知主线程弹窗
|
||||
print("子线程")
|
||||
|
||||
class RippleButton(QPushButton):
|
||||
def __init__(self, text, parent=None):
|
||||
super().__init__(text, parent)
|
||||
self._ripple_radius = 0
|
||||
self._ripple_opacity = 1.0
|
||||
self.ripple_position = QPoint()
|
||||
self.animation_group = QParallelAnimationGroup(self) # 设置父对象
|
||||
self.setStyleSheet("background-color: #3498db; color: white; border-radius: 5px; padding: 10px;")
|
||||
self.setAttribute(Qt.WA_StaticContents)
|
||||
|
||||
def paintEvent(self, event):
|
||||
super().paintEvent(event)
|
||||
if self._ripple_radius > 0:
|
||||
painter = QPainter(self)
|
||||
painter.setRenderHint(QPainter.Antialiasing)
|
||||
color = QColor(255, 255, 255)
|
||||
color.setAlphaF(self._ripple_opacity)
|
||||
painter.setBrush(QBrush(color))
|
||||
painter.setPen(Qt.NoPen)
|
||||
painter.drawEllipse(self.ripple_position, self._ripple_radius, self._ripple_radius)
|
||||
|
||||
def mousePressEvent(self, event):
|
||||
if event.button() == Qt.LeftButton:
|
||||
self.ripple_position = event.pos()
|
||||
self.startRippleEffect()
|
||||
super().mousePressEvent(event)
|
||||
|
||||
def startRippleEffect(self):
|
||||
# 取消之前的动画
|
||||
self.animation_group.stop()
|
||||
self.animation_group.clear()
|
||||
|
||||
# 创建半径动画
|
||||
radius_animation = QPropertyAnimation(self, b"rippleRadius")
|
||||
radius_animation.setDuration(600)
|
||||
radius_animation.setStartValue(0)
|
||||
# 计算最大半径,确保覆盖按钮
|
||||
max_radius = max(self.width(), self.height()) * 1.5
|
||||
radius_animation.setEndValue(max_radius)
|
||||
radius_animation.setEasingCurve(QEasingCurve.OutQuad)
|
||||
|
||||
# 创建透明度动画
|
||||
opacity_animation = QPropertyAnimation(self, b"rippleOpacity")
|
||||
opacity_animation.setDuration(600)
|
||||
opacity_animation.setStartValue(0.5) # 初始透明度可以调整
|
||||
opacity_animation.setEndValue(0.0)
|
||||
opacity_animation.setEasingCurve(QEasingCurve.OutQuad)
|
||||
|
||||
# 将动画添加到动画组
|
||||
self.animation_group.addAnimation(radius_animation)
|
||||
self.animation_group.addAnimation(opacity_animation)
|
||||
self.animation_group.start()
|
||||
|
||||
# 使用 @Property 装饰器正确定义属性
|
||||
def getRippleRadius(self):
|
||||
return self._ripple_radius
|
||||
|
||||
def setRippleRadius(self, radius):
|
||||
self._ripple_radius = radius
|
||||
self.update()
|
||||
|
||||
rippleRadius = Property(float, getRippleRadius, setRippleRadius)
|
||||
|
||||
def getRippleOpacity(self):
|
||||
return self._ripple_opacity
|
||||
|
||||
def setRippleOpacity(self, opacity):
|
||||
self._ripple_opacity = opacity
|
||||
self.update()
|
||||
|
||||
rippleOpacity = Property(float, getRippleOpacity, setRippleOpacity)
|
||||
|
||||
class MainWindow(QMainWindow):
|
||||
# 定义主窗口类
|
||||
class MainWindow(QDialog):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.setWindowTitle("水滴扩散按钮示例")
|
||||
self.setFixedSize(400, 300)
|
||||
self.setWindowTitle("主窗口")
|
||||
self.setGeometry(100, 100, 300, 200)
|
||||
|
||||
self.button = RippleButton("点击我", self)
|
||||
self.button.setGeometry(150, 130, 100, 40)
|
||||
self.button.clicked.connect(self.on_button_click)
|
||||
def on_button_click(self):
|
||||
print("按钮被点击了!")
|
||||
QMessageBox.information(None, "提示", Constant.str_feed_photo_error_msgbox)
|
||||
print("sadf")
|
||||
self.button = QPushButton("开始任务", self)
|
||||
self.button.clicked.connect(self.start_task)
|
||||
|
||||
if __name__ == "__main__":
|
||||
layout = QVBoxLayout(self)
|
||||
layout.addWidget(self.button)
|
||||
|
||||
@Slot(str)
|
||||
def show_dialog(self, message):
|
||||
# 接收到信号后显示弹窗
|
||||
dialog = QDialog(self)
|
||||
dialog.setWindowTitle("子线程通知")
|
||||
label = QLabel(message, dialog)
|
||||
dialog_layout = QVBoxLayout(dialog)
|
||||
dialog_layout.addWidget(label)
|
||||
dialog.exec()
|
||||
|
||||
def start_task(self):
|
||||
# 创建并启动子线程
|
||||
self.thread = WorkerThread()
|
||||
self.thread.show_dialog_signal.connect(self.show_dialog) # 连接信号到主线程的槽函数
|
||||
self.thread.start()
|
||||
|
||||
# 创建应用程序
|
||||
app = QApplication(sys.argv)
|
||||
window = MainWindow()
|
||||
window.show()
|
||||
|
||||
sys.exit(app.exec())
|
||||
|
||||
215
ui_MainWin.py
215
ui_MainWin.py
@ -2602,13 +2602,13 @@ class Ui_MainWindow(object):
|
||||
|
||||
self.gridLayout_6.addWidget(self.lineEdit_shake_addr, 2, 3, 1, 1)
|
||||
|
||||
self.lineEdit_timedelay_shake = QLineEdit(self.frame_29)
|
||||
self.lineEdit_timedelay_shake.setObjectName(u"lineEdit_timedelay_shake")
|
||||
sizePolicy1.setHeightForWidth(self.lineEdit_timedelay_shake.sizePolicy().hasHeightForWidth())
|
||||
self.lineEdit_timedelay_shake.setSizePolicy(sizePolicy1)
|
||||
self.lineEdit_timedelay_shake.setStyleSheet(u"color: rgb(255, 255, 255);")
|
||||
self.lineEdit_timedelay_take = QLineEdit(self.frame_29)
|
||||
self.lineEdit_timedelay_take.setObjectName(u"lineEdit_timedelay_take")
|
||||
sizePolicy1.setHeightForWidth(self.lineEdit_timedelay_take.sizePolicy().hasHeightForWidth())
|
||||
self.lineEdit_timedelay_take.setSizePolicy(sizePolicy1)
|
||||
self.lineEdit_timedelay_take.setStyleSheet(u"color: rgb(255, 255, 255);")
|
||||
|
||||
self.gridLayout_6.addWidget(self.lineEdit_timedelay_shake, 3, 1, 1, 1)
|
||||
self.gridLayout_6.addWidget(self.lineEdit_timedelay_take, 3, 1, 1, 1)
|
||||
|
||||
self.label_87 = QLabel(self.frame_29)
|
||||
self.label_87.setObjectName(u"label_87")
|
||||
@ -2618,13 +2618,13 @@ class Ui_MainWindow(object):
|
||||
|
||||
self.gridLayout_6.addWidget(self.label_87, 3, 0, 1, 1)
|
||||
|
||||
self.lineEdit_timedelay_take = QLineEdit(self.frame_29)
|
||||
self.lineEdit_timedelay_take.setObjectName(u"lineEdit_timedelay_take")
|
||||
sizePolicy1.setHeightForWidth(self.lineEdit_timedelay_take.sizePolicy().hasHeightForWidth())
|
||||
self.lineEdit_timedelay_take.setSizePolicy(sizePolicy1)
|
||||
self.lineEdit_timedelay_take.setStyleSheet(u"color: rgb(255, 255, 255);")
|
||||
self.lineEdit_timedelay_shake = QLineEdit(self.frame_29)
|
||||
self.lineEdit_timedelay_shake.setObjectName(u"lineEdit_timedelay_shake")
|
||||
sizePolicy1.setHeightForWidth(self.lineEdit_timedelay_shake.sizePolicy().hasHeightForWidth())
|
||||
self.lineEdit_timedelay_shake.setSizePolicy(sizePolicy1)
|
||||
self.lineEdit_timedelay_shake.setStyleSheet(u"color: rgb(255, 255, 255);")
|
||||
|
||||
self.gridLayout_6.addWidget(self.lineEdit_timedelay_take, 3, 3, 1, 1)
|
||||
self.gridLayout_6.addWidget(self.lineEdit_timedelay_shake, 3, 3, 1, 1)
|
||||
|
||||
self.label_85 = QLabel(self.frame_29)
|
||||
self.label_85.setObjectName(u"label_85")
|
||||
@ -2634,6 +2634,22 @@ class Ui_MainWindow(object):
|
||||
|
||||
self.gridLayout_6.addWidget(self.label_85, 3, 2, 1, 1)
|
||||
|
||||
self.label_89 = QLabel(self.frame_29)
|
||||
self.label_89.setObjectName(u"label_89")
|
||||
sizePolicy4.setHeightForWidth(self.label_89.sizePolicy().hasHeightForWidth())
|
||||
self.label_89.setSizePolicy(sizePolicy4)
|
||||
self.label_89.setStyleSheet(u"color: rgb(255, 255, 255);")
|
||||
|
||||
self.gridLayout_6.addWidget(self.label_89, 4, 2, 1, 1)
|
||||
|
||||
self.lineEdit_setting_smooth = QLineEdit(self.frame_29)
|
||||
self.lineEdit_setting_smooth.setObjectName(u"lineEdit_setting_smooth")
|
||||
sizePolicy1.setHeightForWidth(self.lineEdit_setting_smooth.sizePolicy().hasHeightForWidth())
|
||||
self.lineEdit_setting_smooth.setSizePolicy(sizePolicy1)
|
||||
self.lineEdit_setting_smooth.setStyleSheet(u"color: rgb(255, 255, 255);")
|
||||
|
||||
self.gridLayout_6.addWidget(self.lineEdit_setting_smooth, 4, 3, 1, 1)
|
||||
|
||||
self.gridLayout_6.setRowStretch(0, 1)
|
||||
self.gridLayout_6.setRowStretch(1, 1)
|
||||
self.gridLayout_6.setRowStretch(2, 1)
|
||||
@ -3510,44 +3526,24 @@ class Ui_MainWindow(object):
|
||||
self.frame_21.setFrameShadow(QFrame.Shadow.Raised)
|
||||
self.gridLayout_2 = QGridLayout(self.frame_21)
|
||||
self.gridLayout_2.setObjectName(u"gridLayout_2")
|
||||
self.pushButton_startFeed = QPushButton(self.frame_21)
|
||||
self.pushButton_startFeed.setObjectName(u"pushButton_startFeed")
|
||||
sizePolicy5.setHeightForWidth(self.pushButton_startFeed.sizePolicy().hasHeightForWidth())
|
||||
self.pushButton_startFeed.setSizePolicy(sizePolicy5)
|
||||
self.pushButton_startFeed.setStyleSheet(u"*{\n"
|
||||
"background-color: #499C54;\n"
|
||||
"font: 9pt \"\u6977\u4f53\";\n"
|
||||
"\n"
|
||||
"border-radius: 10px;\n"
|
||||
"}\n"
|
||||
"*:pressed\n"
|
||||
"{\n"
|
||||
"background-color: #499c8a;\n"
|
||||
"}\n"
|
||||
"")
|
||||
icon8 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackStart))
|
||||
self.pushButton_startFeed.setIcon(icon8)
|
||||
|
||||
self.gridLayout_2.addWidget(self.pushButton_startFeed, 0, 0, 1, 1)
|
||||
|
||||
self.pushButton_pauseFeed = QPushButton(self.frame_21)
|
||||
self.pushButton_pauseFeed.setObjectName(u"pushButton_pauseFeed")
|
||||
sizePolicy5.setHeightForWidth(self.pushButton_pauseFeed.sizePolicy().hasHeightForWidth())
|
||||
self.pushButton_pauseFeed.setSizePolicy(sizePolicy5)
|
||||
self.pushButton_pauseFeed.setStyleSheet(u"*{\n"
|
||||
"background-color: #2196F3;\n"
|
||||
self.pushButton_reset = QPushButton(self.frame_21)
|
||||
self.pushButton_reset.setObjectName(u"pushButton_reset")
|
||||
sizePolicy5.setHeightForWidth(self.pushButton_reset.sizePolicy().hasHeightForWidth())
|
||||
self.pushButton_reset.setSizePolicy(sizePolicy5)
|
||||
self.pushButton_reset.setStyleSheet(u"*{\n"
|
||||
"background-color: #FFFFBF;\n"
|
||||
"font: 9pt \"\u6977\u4f53\";\n"
|
||||
"border-radius: 10px;\n"
|
||||
"}\n"
|
||||
"*:pressed\n"
|
||||
"{\n"
|
||||
"background-color: #499c8a;\n"
|
||||
"background-color: #FFF000;\n"
|
||||
"}\n"
|
||||
"")
|
||||
icon9 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackPause))
|
||||
self.pushButton_pauseFeed.setIcon(icon9)
|
||||
icon8 = QIcon(QIcon.fromTheme(u"media-optical"))
|
||||
self.pushButton_reset.setIcon(icon8)
|
||||
|
||||
self.gridLayout_2.addWidget(self.pushButton_pauseFeed, 0, 1, 1, 2)
|
||||
self.gridLayout_2.addWidget(self.pushButton_reset, 2, 1, 1, 2)
|
||||
|
||||
self.pushButton_emergency = QPushButton(self.frame_21)
|
||||
self.pushButton_emergency.setObjectName(u"pushButton_emergency")
|
||||
@ -3564,10 +3560,68 @@ class Ui_MainWindow(object):
|
||||
"}\n"
|
||||
"\n"
|
||||
"")
|
||||
icon10 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.WindowClose))
|
||||
self.pushButton_emergency.setIcon(icon10)
|
||||
icon9 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.WindowClose))
|
||||
self.pushButton_emergency.setIcon(icon9)
|
||||
|
||||
self.gridLayout_2.addWidget(self.pushButton_emergency, 2, 0, 1, 1)
|
||||
self.gridLayout_2.addWidget(self.pushButton_emergency, 3, 0, 1, 1)
|
||||
|
||||
self.pushButton_stopFeed = QPushButton(self.frame_21)
|
||||
self.pushButton_stopFeed.setObjectName(u"pushButton_stopFeed")
|
||||
sizePolicy5.setHeightForWidth(self.pushButton_stopFeed.sizePolicy().hasHeightForWidth())
|
||||
self.pushButton_stopFeed.setSizePolicy(sizePolicy5)
|
||||
self.pushButton_stopFeed.setStyleSheet(u"*{\n"
|
||||
"background-color: #FF0000;\n"
|
||||
"font: 9pt \"\u6977\u4f53\";\n"
|
||||
"border-radius: 10px;\n"
|
||||
"}\n"
|
||||
"*:pressed\n"
|
||||
"{\n"
|
||||
"background-color: #499c8a;\n"
|
||||
"}\n"
|
||||
"")
|
||||
icon10 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.SystemShutdown))
|
||||
self.pushButton_stopFeed.setIcon(icon10)
|
||||
|
||||
self.gridLayout_2.addWidget(self.pushButton_stopFeed, 2, 0, 1, 1)
|
||||
|
||||
self.pushButton_pauseFeed = QPushButton(self.frame_21)
|
||||
self.pushButton_pauseFeed.setObjectName(u"pushButton_pauseFeed")
|
||||
sizePolicy5.setHeightForWidth(self.pushButton_pauseFeed.sizePolicy().hasHeightForWidth())
|
||||
self.pushButton_pauseFeed.setSizePolicy(sizePolicy5)
|
||||
self.pushButton_pauseFeed.setStyleSheet(u"*{\n"
|
||||
"background-color: #2196F3;\n"
|
||||
"font: 9pt \"\u6977\u4f53\";\n"
|
||||
"border-radius: 10px;\n"
|
||||
"}\n"
|
||||
"*:pressed\n"
|
||||
"{\n"
|
||||
"background-color: #499c8a;\n"
|
||||
"}\n"
|
||||
"")
|
||||
icon11 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackPause))
|
||||
self.pushButton_pauseFeed.setIcon(icon11)
|
||||
|
||||
self.gridLayout_2.addWidget(self.pushButton_pauseFeed, 1, 1, 1, 2)
|
||||
|
||||
self.pushButton_startFeed = QPushButton(self.frame_21)
|
||||
self.pushButton_startFeed.setObjectName(u"pushButton_startFeed")
|
||||
sizePolicy5.setHeightForWidth(self.pushButton_startFeed.sizePolicy().hasHeightForWidth())
|
||||
self.pushButton_startFeed.setSizePolicy(sizePolicy5)
|
||||
self.pushButton_startFeed.setStyleSheet(u"*{\n"
|
||||
"background-color: #499C54;\n"
|
||||
"font: 9pt \"\u6977\u4f53\";\n"
|
||||
"\n"
|
||||
"border-radius: 10px;\n"
|
||||
"}\n"
|
||||
"*:pressed\n"
|
||||
"{\n"
|
||||
"background-color: #499c8a;\n"
|
||||
"}\n"
|
||||
"")
|
||||
icon12 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackStart))
|
||||
self.pushButton_startFeed.setIcon(icon12)
|
||||
|
||||
self.gridLayout_2.addWidget(self.pushButton_startFeed, 1, 0, 1, 1)
|
||||
|
||||
self.pushButton_clearAlarm = QPushButton(self.frame_21)
|
||||
self.pushButton_clearAlarm.setObjectName(u"pushButton_clearAlarm")
|
||||
@ -3584,52 +3638,37 @@ class Ui_MainWindow(object):
|
||||
"}\n"
|
||||
"\n"
|
||||
"")
|
||||
icon11 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.SystemReboot))
|
||||
self.pushButton_clearAlarm.setIcon(icon11)
|
||||
icon13 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.SystemReboot))
|
||||
self.pushButton_clearAlarm.setIcon(icon13)
|
||||
|
||||
self.gridLayout_2.addWidget(self.pushButton_clearAlarm, 2, 1, 1, 2)
|
||||
self.gridLayout_2.addWidget(self.pushButton_clearAlarm, 3, 1, 1, 2)
|
||||
|
||||
self.pushButton_stopFeed = QPushButton(self.frame_21)
|
||||
self.pushButton_stopFeed.setObjectName(u"pushButton_stopFeed")
|
||||
sizePolicy5.setHeightForWidth(self.pushButton_stopFeed.sizePolicy().hasHeightForWidth())
|
||||
self.pushButton_stopFeed.setSizePolicy(sizePolicy5)
|
||||
self.pushButton_stopFeed.setStyleSheet(u"*{\n"
|
||||
"background-color: #FF0000;\n"
|
||||
self.pushButton_onekeyfeed = QPushButton(self.frame_21)
|
||||
self.pushButton_onekeyfeed.setObjectName(u"pushButton_onekeyfeed")
|
||||
sizePolicy5.setHeightForWidth(self.pushButton_onekeyfeed.sizePolicy().hasHeightForWidth())
|
||||
self.pushButton_onekeyfeed.setSizePolicy(sizePolicy5)
|
||||
self.pushButton_onekeyfeed.setStyleSheet(u"*{\n"
|
||||
"background-color: rgb(0, 170, 0);\n"
|
||||
"\n"
|
||||
"font: 9pt \"\u6977\u4f53\";\n"
|
||||
"border-radius: 10px;\n"
|
||||
"}\n"
|
||||
"*:pressed\n"
|
||||
"{\n"
|
||||
"background-color: #499c8a;\n"
|
||||
"background-color:#1cb052;\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"")
|
||||
icon12 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.SystemShutdown))
|
||||
self.pushButton_stopFeed.setIcon(icon12)
|
||||
icon14 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.DocumentSend))
|
||||
self.pushButton_onekeyfeed.setIcon(icon14)
|
||||
self.pushButton_onekeyfeed.setIconSize(QSize(20, 20))
|
||||
|
||||
self.gridLayout_2.addWidget(self.pushButton_stopFeed, 1, 0, 1, 1)
|
||||
|
||||
self.pushButton_reset = QPushButton(self.frame_21)
|
||||
self.pushButton_reset.setObjectName(u"pushButton_reset")
|
||||
sizePolicy5.setHeightForWidth(self.pushButton_reset.sizePolicy().hasHeightForWidth())
|
||||
self.pushButton_reset.setSizePolicy(sizePolicy5)
|
||||
self.pushButton_reset.setStyleSheet(u"*{\n"
|
||||
"background-color: #FFFFBF;\n"
|
||||
"font: 9pt \"\u6977\u4f53\";\n"
|
||||
"border-radius: 10px;\n"
|
||||
"}\n"
|
||||
"*:pressed\n"
|
||||
"{\n"
|
||||
"background-color: #FFF000;\n"
|
||||
"}\n"
|
||||
"")
|
||||
icon13 = QIcon(QIcon.fromTheme(u"media-optical"))
|
||||
self.pushButton_reset.setIcon(icon13)
|
||||
|
||||
self.gridLayout_2.addWidget(self.pushButton_reset, 1, 1, 1, 2)
|
||||
self.gridLayout_2.addWidget(self.pushButton_onekeyfeed, 0, 0, 1, 2)
|
||||
|
||||
self.gridLayout_2.setRowStretch(0, 1)
|
||||
self.gridLayout_2.setRowStretch(1, 1)
|
||||
self.gridLayout_2.setRowStretch(2, 1)
|
||||
self.gridLayout_2.setRowStretch(3, 1)
|
||||
self.gridLayout_2.setColumnStretch(0, 1)
|
||||
self.gridLayout_2.setColumnStretch(1, 1)
|
||||
self.gridLayout_2.setRowMinimumHeight(0, 2)
|
||||
@ -3925,14 +3964,15 @@ class Ui_MainWindow(object):
|
||||
self.label_17.setText(QCoreApplication.translate("MainWindow", u"Z2:", None))
|
||||
self.label_28.setText(QCoreApplication.translate("MainWindow", u"\u751f\u4ea7\u901f\u5ea6\uff1a", None))
|
||||
self.label_94.setText(QCoreApplication.translate("MainWindow", u"\u590d\u4f4d\u901f\u5ea6\uff1a", None))
|
||||
self.label_86.setText(QCoreApplication.translate("MainWindow", u"\u653e\u53d6\u5ef6\u65f6\uff1a", None))
|
||||
self.label_86.setText(QCoreApplication.translate("MainWindow", u"\u629b\u888b\u5ef6\u65f6\uff1a", None))
|
||||
self.pushButton_saveSeting.setText(QCoreApplication.translate("MainWindow", u"\u4fdd\u5b58\u8bbe\u7f6e", None))
|
||||
self.label_29.setText(QCoreApplication.translate("MainWindow", u"\u8c03\u8bd5\u901f\u5ea6\uff1a", None))
|
||||
self.label_51.setText(QCoreApplication.translate("MainWindow", u"\u6536\u653e\u70b9\u4f4d:", None))
|
||||
self.label_52.setText(QCoreApplication.translate("MainWindow", u"\u6309\u538b\u70b9\u4f4d\uff1a", None))
|
||||
self.label_51.setText(QCoreApplication.translate("MainWindow", u"\u6293\u53d6\u70b9\u4f4d:", None))
|
||||
self.label_52.setText(QCoreApplication.translate("MainWindow", u"\u629b\u888b\u70b9\u4f4d\uff1a", None))
|
||||
self.label_54.setText(QCoreApplication.translate("MainWindow", u"\u6447\u6643\u70b9\u4f4d:", None))
|
||||
self.label_87.setText(QCoreApplication.translate("MainWindow", u"\u9707\u52a8\u5ef6\u65f6\uff1a", None))
|
||||
self.label_85.setText(QCoreApplication.translate("MainWindow", u"\u5438\u53d6\u5ef6\u65f6\uff1a", None))
|
||||
self.label_87.setText(QCoreApplication.translate("MainWindow", u"\u6293\u53d6\u5ef6\u65f6\uff1a", None))
|
||||
self.label_85.setText(QCoreApplication.translate("MainWindow", u"\u6447\u6643\u5ef6\u65f6\uff1a", None))
|
||||
self.label_89.setText(QCoreApplication.translate("MainWindow", u"\u5e73\u6ed1\u7cfb\u6570\uff1a", None))
|
||||
self.pushButton_j3_add.setText("")
|
||||
self.pushButton_j5_add.setText("")
|
||||
self.pushButton_j6_sub.setText("")
|
||||
@ -3993,12 +4033,13 @@ class Ui_MainWindow(object):
|
||||
self.pushButton_num_confirm.setText(QCoreApplication.translate("MainWindow", u"\u786e\u5b9a", None))
|
||||
self.pushButton_AddNum.setText(QCoreApplication.translate("MainWindow", u"\u8865\u4e00\u888b", None))
|
||||
self.pushButton_SubNum.setText(QCoreApplication.translate("MainWindow", u"\u6263\u4e00\u888b", None))
|
||||
self.pushButton_startFeed.setText(QCoreApplication.translate("MainWindow", u"\u542f\u52a8", None))
|
||||
self.pushButton_pauseFeed.setText(QCoreApplication.translate("MainWindow", u"\u6682\u505c", None))
|
||||
self.pushButton_emergency.setText(QCoreApplication.translate("MainWindow", u"\u6025\u505c", None))
|
||||
self.pushButton_clearAlarm.setText(QCoreApplication.translate("MainWindow", u"\u6e05\u9664\u62a5\u8b66", None))
|
||||
self.pushButton_stopFeed.setText(QCoreApplication.translate("MainWindow", u"\u505c\u6b62", None))
|
||||
self.pushButton_reset.setText(QCoreApplication.translate("MainWindow", u"\u590d\u4f4d", None))
|
||||
self.pushButton_emergency.setText(QCoreApplication.translate("MainWindow", u"\u6025\u505c", None))
|
||||
self.pushButton_stopFeed.setText(QCoreApplication.translate("MainWindow", u"\u505c\u6b62", None))
|
||||
self.pushButton_pauseFeed.setText(QCoreApplication.translate("MainWindow", u"\u6682\u505c", None))
|
||||
self.pushButton_startFeed.setText(QCoreApplication.translate("MainWindow", u"\u542f\u52a8", None))
|
||||
self.pushButton_clearAlarm.setText(QCoreApplication.translate("MainWindow", u"\u6e05\u9664\u62a5\u8b66", None))
|
||||
self.pushButton_onekeyfeed.setText(QCoreApplication.translate("MainWindow", u"\u4e00\u952e\u6295\u6599", None))
|
||||
self.label_4.setText(QCoreApplication.translate("MainWindow", u"\u76ee\u6807\u888b\u6570\uff1a", None))
|
||||
self.label_maxNum.setText(QCoreApplication.translate("MainWindow", u"0", None))
|
||||
self.label_6.setText(QCoreApplication.translate("MainWindow", u"\u5269\u4f59\u888b\u6570\uff1a", None))
|
||||
|
||||
Reference in New Issue
Block a user