Merge remote-tracking branch 'origin/master'

This commit is contained in:
hjw
2024-12-21 21:41:15 +08:00
24 changed files with 15947 additions and 565 deletions

View File

@ -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):

View File

@ -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]):
self.catch_status = CatchStatus.COk
# 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)
print("震动结束")
#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
View 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

View File

@ -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,40 +309,59 @@ 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
self.next_position()
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:
@ -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.feed_speed,
move_type=MoveType.AXIS)
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)
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)
else:
self.sendTargPosition(real_position=feed_pos.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.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)

View File

@ -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

View File

@ -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 = '数据解析错误'

View File

@ -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 &quot;楷体&quot;;
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 &quot;楷体&quot;;
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 &quot;楷体&quot;;
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 &quot;楷体&quot;;
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 &quot;楷体&quot;;
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 &quot;楷体&quot;;
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 &quot;楷体&quot;;
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>

View File

@ -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)

View File

@ -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:

View File

@ -47,14 +47,14 @@ 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
max_angle_interval=20
max_angle_interval = 20
[Speed]
debug_speed = 50

View File

@ -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

View File

@ -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)

View File

@ -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"""
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)
# img = cv_img.copy()
# cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB)
try:
height, width, channel = cv_img.shape
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"""

View File

@ -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('相机参数错误')

View File

@ -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.

View File

@ -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:

View File

@ -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
View File

@ -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

File diff suppressed because it is too large Load Diff

118
main.py
View File

@ -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,13 +1376,13 @@ 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_Position()
self.updateUI_label_detection()
self.updateUI_label_status()
self.updateUI_frame_sign(self.feeding.feedStatus)
self.updateUI_IOPanel()
self.updateUI_seting.emit()
def update_seting_frame(self):
self.updateUI_Position()
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))
@ -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.exit(app.exec())
sys.excepthook = handle_exception
try :
sys.exit(app.exec())
except Exception as e:
log.log_message(logging.ERROR, e)

135
test.py
View File

@ -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__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
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())

View File

@ -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))