更新控制

This commit is contained in:
FrankCV2048
2024-11-03 23:25:05 +08:00
parent e31f7632e8
commit 5df4e7cadb
11 changed files with 824 additions and 209 deletions

View File

@ -2,12 +2,15 @@ import logging
import time
import cv2
from PyQt5.QtWidgets import QMessageBox
import Constant
import Expection
from Model.Position import Real_Position, Detection_Position
from enum import Enum, IntEnum
from COM.COM_Robot import RobotClient
from Model.RobotModel import CMDInstructRequest, MoveType
from Util.util_time import CRisOrFall
from Vision.camera_coordinate_dete import Detection
from Util.util_log import log
@ -38,6 +41,7 @@ class FeedLine:
self.name = name
self.id=id
class FeedingConfig:
def __init__(self, num:int, feedLine:FeedLine,photo_locs):
self.num = num
@ -62,6 +66,7 @@ class Feeding :
self.detection_image = None
self.init_detection_image()
self.pause = False
self.cRis_photo = CRisOrFall()
pass
def init_detection_image(self):
@ -108,6 +113,7 @@ class Feeding :
elif self.feedStatus==FeedStatus.FSafeP:
log.log_message(logging.INFO,Constant.str_feed_safe)
if self.feedConfig.feedLine.safe_position.compare(real_position):
self.error_photo_count=0
self.feedStatus = FeedStatus.FPhoto
#self.sendTargPosition(self.feedConfig.feedLine.photo_position)
#判断是哪一个问题
@ -115,51 +121,67 @@ class Feeding :
elif self.feedStatus == FeedStatus.FPhoto:
log.log_message(logging.INFO, Constant.str_feed_photo)
detect_pos_list = []
for pos in self.feedConfig.photo_locs:
self.sendTargPosition(pos)
while not pos.compare(real_position): #可以优化 TODO
time.sleep(0.1)
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)
# dp = Detection_Position().init_position(*xyz, *uvw)
from Trace.handeye_calibration import R_matrix, getPosition
rotation = R_matrix(self.robotClient.status_model.world_0,
self.robotClient.status_model.world_1,
self.robotClient.status_model.world_2 - 10, #TODO 这个10 需要确定
self.robotClient.status_model.world_3,
self.robotClient.status_model.world_4,
self.robotClient.status_model.world_5)
if not Constant.Debug:
try:
from Util.util_time import CRisOrFall
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)
for pos in self.feedConfig.photo_locs:
self.sendTargPosition(pos)
while not pos.compare(real_position) : #可以优化 TODO
if self.feedStatus == FeedStatus.FNone or not self.pause :
return
time.sleep(0.1)
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)
# dp = Detection_Position().init_position(*xyz, *uvw)
from Trace.handeye_calibration import R_matrix, getPosition
rotation = R_matrix(self.robotClient.status_model.world_0,
self.robotClient.status_model.world_1,
self.robotClient.status_model.world_2 - 10, #TODO 这个10 需要确定
self.robotClient.status_model.world_3,
self.robotClient.status_model.world_4,
self.robotClient.status_model.world_5)
# 黄老师给我的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)
else:
log.log_message(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))
))(detect_pos_list)
if len(self.feedConfig.photo_locs) == 5:
if z_diff < Constant.bag_height and len(detect_pos_list)==3: # 第一次检测到没有高度差距开始三列拍照 TODO 保留全部的开关
# 拍照位置从五个变为三个
self.feedConfig.photo_locs = [detect_pos_list[0],detect_pos_list[2],detect_pos_list[4]]
self.feedConfig.feedLine.take_position = detect_pos_list[0]
log.log_message(logging.INFO, Constant.str_feed_takePhoto_front_finish)
else:
self.feedConfig.feedLine.take_position = detect_pos_list[max_z_index]
log.log_message(logging.INFO, Constant.str_feed_takePhoto_front)
# 黄老师给我的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)
else:
log.log_message(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))
))(detect_pos_list)
if len(self.feedConfig.photo_locs) == 5:
if z_diff < Constant.bag_height and len(detect_pos_list)==3: # 第一次检测到没有高度差距开始三列拍照 TODO 保留全部的开关
# 拍照位置从五个变为三个
self.feedConfig.photo_locs = [detect_pos_list[0],detect_pos_list[2],detect_pos_list[4]]
self.feedConfig.feedLine.take_position = detect_pos_list[0]
log.log_message(logging.INFO, Constant.str_feed_takePhoto_front_finish)
else:
self.feedConfig.feedLine.take_position = detect_pos_list[max_z_index]
log.log_message(logging.INFO, Constant.str_feed_takePhoto_front)
else:
if z_diff < Constant.bag_height:
self.feedConfig.feedLine.take_position = detect_pos_list[0]
log.log_message(logging.INFO, Constant.str_feed_takePhoto_new_line)
else:
self.feedConfig.feedLine.take_position = detect_pos_list[max_z_index]
log.log_message(logging.INFO, Constant.str_feed_takePhoto_line)
self.feedStatus = FeedStatus.FTake
self.sendTargPosition(self.feedConfig.feedLine.take_position)
except:
log.log_message(logging.ERROR, Constant.str_feed_takePhoto_fail)
self.error_photo_count +=1
else:
if z_diff < Constant.bag_height:
self.feedConfig.feedLine.take_position = detect_pos_list[0]
log.log_message(logging.INFO, Constant.str_feed_takePhoto_new_line)
else:
self.feedConfig.feedLine.take_position = detect_pos_list[max_z_index]
log.log_message(logging.INFO, Constant.str_feed_takePhoto_line)
self.feedStatus = FeedStatus.FTake
self.sendTargPosition(self.feedConfig.feedLine.take_position)
self.feedConfig.feedLine.take_position = self.feedConfig.feedLine.safe_position
self.sendTargPosition(self.feedConfig.feedLine.safe_position)
self.feedStatus = FeedStatus.FTake
log.log_message(logging.INFO, Constant.str_feed_takePhoto_move)
elif self.feedStatus == FeedStatus.FTake:
@ -170,7 +192,7 @@ class Feeding :
self.sendIOControl(self.robotClient.con_ios[1],1)
self.sendIOControl(self.robotClient.con_ios[2],1)
# TODO 检测是否通 不然报警
time.sleep(2)
time.sleep(self.robotClient.time_delay_take)
self.feedStatus = FeedStatus.FSafeF
log.log_message(logging.INFO, Constant.str_feed_take_success)
self.sendTargPosition(self.feedConfig.feedLine.safe_position)
@ -198,7 +220,7 @@ class Feeding :
self.sendTargPosition(self.feedConfig.feedLine.shake_position)
if self.feedConfig.feedLine.shake_position.compare(real_position): # 延迟判断如果最后点位延迟1s则认为阶段完成
# TODO 震动方案
time.sleep(2)
time.sleep(self.robotClient.time_delay_shake)
self.feedStatus = FeedStatus.FDropBag
self.sendTargPosition(self.feedConfig.feedLine.safe_position)
@ -212,7 +234,7 @@ class Feeding :
self.sendIOControl(self.robotClient.con_ios[1], 0)
self.sendIOControl(self.robotClient.con_ios[2], 0)
# TODO 检测是否断 不然报警
time.sleep(2)
time.sleep(self.robotClient.time_delay_put)
self.feedConfig.num = self.feedConfig.num - 1
log.log_message(logging.INFO, f'{Constant.str_feed_feed_num}{self.feedConfig.num}')
if self.feedConfig.num == 0: # 投料次数为0直接返回