From 2f45c4c38fe500cdf043f510411bccdc0b1a07b3 Mon Sep 17 00:00:00 2001 From: chuyiwen Date: Wed, 3 Sep 2025 19:50:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9drop=EF=BC=8C=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E4=B8=A2=E5=8C=85=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + COM/__pycache__/COM_Robot.cpython-39.pyc | Bin 4545 -> 4566 bytes COM/__pycache__/COM_TCP.cpython-39.pyc | Bin 2322 -> 2343 bytes CU/Feeding.py | 184 ++++++--- CU/__pycache__/Catch.cpython-39.pyc | Bin 2066 -> 2087 bytes CU/__pycache__/Command.cpython-39.pyc | Bin 991 -> 1012 bytes CU/__pycache__/Detect.cpython-39.pyc | Bin 4576 -> 4597 bytes CU/__pycache__/EMV.cpython-39.pyc | Bin 1752 -> 1773 bytes CU/__pycache__/Feeding.cpython-39.pyc | Bin 20391 -> 20299 bytes CU/__pycache__/drop.cpython-39.pyc | Bin 4114 -> 6347 bytes CU/drop.ini | 374 +++++++++++++++--- CU/drop.py | 245 ++++++++---- CU/list.ini | 15 +- EMV/__pycache__/EMV.cpython-39.pyc | Bin 9524 -> 9538 bytes Model/__pycache__/FeedModel.cpython-39.pyc | Bin 3876 -> 3897 bytes Model/__pycache__/Position.cpython-39.pyc | Bin 2459 -> 2480 bytes Model/__pycache__/RobotModel.cpython-39.pyc | Bin 7361 -> 7382 bytes .../handeye_calibration.cpython-39.pyc | Bin 2562 -> 2583 bytes Util/__pycache__/util_ini.cpython-39.pyc | Bin 1875 -> 1896 bytes Util/__pycache__/util_log.cpython-39.pyc | Bin 3215 -> 3236 bytes Util/__pycache__/util_math.cpython-39.pyc | Bin 548 -> 569 bytes Util/__pycache__/util_pic.cpython-39.pyc | Bin 711 -> 732 bytes Util/__pycache__/util_time.cpython-39.pyc | Bin 4519 -> 4540 bytes __pycache__/Constant.cpython-39.pyc | Bin 4452 -> 4473 bytes __pycache__/Expection.cpython-39.pyc | Bin 628 -> 649 bytes __pycache__/MainRecources_rc.cpython-39.pyc | Bin 1630863 -> 1630884 bytes __pycache__/toggleswitch.cpython-39.pyc | Bin 1756 -> 1777 bytes __pycache__/ui_MainWin.cpython-39.pyc | Bin 68277 -> 68298 bytes log/log.log | 170 ++++++++ view/__pycache__/ResetView.cpython-39.pyc | Bin 942 -> 963 bytes .../ui_Dialog_Reset.cpython-39.pyc | Bin 2534 -> 2555 bytes 31 files changed, 812 insertions(+), 177 deletions(-) diff --git a/.gitignore b/.gitignore index e69de29..b42097e 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1 @@ +**/__pycache__/ \ No newline at end of file diff --git a/COM/__pycache__/COM_Robot.cpython-39.pyc b/COM/__pycache__/COM_Robot.cpython-39.pyc index 4e87f48c06edb2f3da4e4077acb04d7af7a2f860..6c514bdc53ad64ddacfbc4fba73852d14230abab 100644 GIT binary patch delta 432 zcmX@8d`+1*k(ZZ?0SIQR?Z{ZNk@pp&*;iX2*TpI(peR2pHMyiX=6T1)XLFZ6-?;h7 zj#)8|r6u{!`FSNp`8mOr#U-h^y6!Q~{=PArC73=kGDc12Vp+kcFnKe}7e@8XD_CO~ zh4g@?73l+sTdb}@LHTO^MIUk57hpR+GI*eR4D3 z1>SI=3QZ=kl|@A$vnLnx$MWicL>Y?|fK*WmSo8ybh7{N?XOLI|h)4wyX&@qCa*==z wqt@j40tSrwlP?Gu$%8D8;s%DK9uUWeI0qE50!41I7M7-#rWW~5Ruo(S0P5jy$^ZZW delta 363 zcmcbnd{CJ;k(ZZ?0SMSy8#1If^1fnJ{H3j*k)NBYpHZRjSXz?roS#=xl%Eq^SzMBu ztMBaZtG`*7=_4cKt;zB%D;O0gpJ4gIsIhr3YYd~1KG2*Z10ZpW)io%{Kd8uPvNpRC zn+8bOWOFdP6%(5oh;2T3GH0r&6^LmKB5Xi}Er_t2%*(Yw0B%l^14z(l@>wn)9(y2D zld}k9Skz=yZVg7K$$s4CjLwtWxKB$P0Yz^Kdiuw^=B5^cdH y{0&lIGh9IG6F@{Nh)4qwfs@+>bQrZKZxJwHG?@HUz=+XkvV@>4qu*pR!36*aidU!r diff --git a/COM/__pycache__/COM_TCP.cpython-39.pyc b/COM/__pycache__/COM_TCP.cpython-39.pyc index 77a6678085cb33de988a268a53c9570b952a456e..bf529ebbbac6f1b359874c5f0873cd8e297d26e7 100644 GIT binary patch delta 83 zcmbOvv|NZUk(ZZ?0SIQR?Z^=3*vPk((d?@=knds@6Ht_&m6}{q9P_+m list: + """获取动态扔包路径""" + + if self.drop_manager is None: + return [] + + path = [] + while True: + pos_model = self.drop_manager.get_next_drop_position( + self.id, + self.current_index + ) + if pos_model is None: + break + path.append(pos_model) + return path + def get_position_list(self): index_start = -1 for i in range(len(self.feed_positions)): @@ -189,20 +217,46 @@ class FeedLine: if self.feed_positions[i].status == FeedStatus.FPhoto.value: index_take = i + # 开始插入动态扔包点,按照 动态扔包中间点,扔包点,动态复位点的顺序 + for i in range(len(self.feed_positions)): + if self.feed_positions[i].status == FeedStatus.FDropBag.value: + index_drop = i + + # LineID = self.id + + # 开始插入动态扔包中间点 + + # 开始插入动态扔包点 + + # 开始插入复位中间点 + + test_path = self.get_drop_path() + self.origin_to_start = self.feed_positions[: index_start+1] 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) + # 将总list的drop部分,替换为动态路径 + self.feed_positions = self.feed_positions[:index_drop] + test_path + self.feeding_to_end = self.feed_positions[index_take:index_drop] + + print(self.feed_positions) + + # 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 + + + + + - self.feeding_to_end.insert(i, befor_position_model) - self.feeding_to_end.insert(i+2, after_position_model) - break class FeedingConfig: def __init__(self, num: int, feedLine: FeedLine, photo_locs): @@ -234,7 +288,6 @@ class Feeding(QObject): self.relay_controller = RelayController() self.sensor_thread = None self.detection_image = None - self.init_detection_image() self.pause = False self.cRis_photo = CRisOrFall() self.cRis_shake = CRisOrFall() @@ -267,8 +320,7 @@ class Feeding(QObject): self.sensor2_thread = None # --- 新增: 用于码垛模式的投料点索引 --- - self.current_drop_index = 0 - self.drop_manager = DropPositionManager("CU/drop.ini") + self.current_drop_index = 1 pass def close_feed(self): @@ -276,10 +328,6 @@ class Feeding(QObject): self.detect_thread.join() self.detect.detection.release() - def init_detection_image(self): - 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() @@ -289,7 +337,7 @@ class Feeding(QObject): self.catch.run() # 获取事件坐标 real_position = Real_Position() - self.detect.position_index = 0 + real_position.init_position(self.robotClient.status_model.world_0, self.robotClient.status_model.world_1, self.robotClient.status_model.world_2, @@ -388,7 +436,6 @@ class Feeding(QObject): self.feedConfig.feedLine.origin2start_pos_index = len(self.feedConfig.feedLine.origin_to_start) - 2 self.next_position(self.is_reverse) self.log_signal.emit(logging.INFO, Constant.str_feed_photo) - self.init_detection_image() return if not Constant.Debug: @@ -399,6 +446,7 @@ class Feeding(QObject): #self.feedConfig.feedLine.set_take_position(real_position, 0)#必须设置 '''real_position''' # 一直等待传感器2信号,永不超时 + # TODO:逻辑需改变,不能用while循环 while True: sensors = self.relay_controller.get_all_device_status('sensors') sensor2_value = sensors.get(self.relay_controller.SENSOR2, False) @@ -408,10 +456,11 @@ class Feeding(QObject): else: self.log_signal.emit(logging.INFO, "⏳ 等待传感器2料包信号...") time.sleep(1) # 每秒检查一次 + self.next_position() self.log_signal.emit(logging.INFO, Constant.str_sys_runing2) - #self.feedStatus = FeedStatus.FTake + # self.feedStatus = FeedStatus.FTake elif self.feedStatus == FeedStatus.FTake: self.log_signal.emit(logging.INFO, Constant.str_feed_take) @@ -420,9 +469,11 @@ class Feeding(QObject): self.log_signal.emit(logging.ERROR, Constant.str_feed_takePhoto_fail) return if not take_position.get_position().compare(real_position, is_action=True): - self.log_signal.emit(logging.INFO, "🟡 机器人尚未到达抓料点位") + self.log_signal.emit(logging.INFO, "机器人尚未到达抓料点位") return - self.log_signal.emit(logging.INFO, "🟢 机器人已到达抓料点位") + self.log_signal.emit(logging.INFO, "机器人已到达抓料点位") + + # 执行抓取动作 #self.catch.catch_status = CatchStatus.CTake #if self.catch.catch_status == CatchStatus.CNone: @@ -435,17 +486,14 @@ class Feeding(QObject): #self.catch.catch_status = CatchStatus.CNone # 移动到下一个抓取点 # 更新丢包点: 如果需要根据放置情况调整下次抓取 - next_drop_pos = self.drop_manager.get_next_drop_position(lineid=1) - print("next_drop_pos--------",next_drop_pos) - if next_drop_pos: - self.feedConfig.feedLine.set_drop_position(next_drop_pos) - self.log_signal.emit(logging.INFO, f"已设置放置点: X={next_drop_pos.X:.2f}") - else: - self.log_signal.emit(logging.ERROR, "获取放置点失败") - return - #self.feedConfig.feedLine.set_drop_position(real_position)#我想在这里读取我的一个ini文件值里面有很多个drop点,每一次索引递增的点 + self.relay_controller.open(clamp=True) - self.next_position() + self.next_position(self.is_reverse) + + + #self.feedConfig.feedLine.set_drop_position(real_position)#我想在这里读取我的一个ini文件值里面有很多个drop点,每一次索引递增的点 + + #return #else: #self.log_signal.emit(logging.ERROR, Constant.str_feed_takePhoto_fail) @@ -457,11 +505,13 @@ class Feeding(QObject): self.next_position() - elif self.feedStatus == FeedStatus.FBroken2: + elif self.feedStatus == FeedStatus.FDropMid: if self.get_current_position().get_position().compare(real_position): self.log_signal.emit(logging.INFO, Constant.str_feed_broken) self.next_position() + else: + self.next_position() elif self.feedStatus == FeedStatus.FShake: if self.get_current_position().get_position().compare(real_position,is_action=True): @@ -524,6 +574,12 @@ class Feeding(QObject): # next_position() 会根据当前的 feed_Mid_Status (FMid_Feed) # 调用 next_Feed()。 self.next_position() + elif self.feedStatus == FeedStatus.FDropReset: + self.next_position() + + elif self.feedStatus == None: + print(self.feedStatus) + pass def run_reset(self): real_position = Real_Position() @@ -741,11 +797,14 @@ class Feeding(QObject): 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.reset_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 - self.log_signal.emit(logging.ERROR, Constant.str_feed_angle_error) - else: - self.sendTargPosition(real_position=start_pos.get_position(),speed=self.robotClient.reset_speed,move_type=MoveType.AXIS) + 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.reset_speed, + move_type=MoveType.AXIS) + # if self.robotClient.status_model.getAnglePosition().is_error_angel_move(start_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=start_pos.get_position(),speed=self.robotClient.reset_speed,move_type=MoveType.AXIS) else: self.sendTargPosition(real_position=start_pos.get_position(),speed=self.robotClient.reset_speed) pass @@ -759,13 +818,17 @@ class Feeding(QObject): 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.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) + 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(), speed=self.robotClient.feed_speed, + move_type=MoveType.AXIS) + # 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.feed_speed) @@ -779,13 +842,20 @@ class Feeding(QObject): 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.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) + # 暂时不考虑世界坐标到关节坐标的转换,强行不判断接近 + 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(), speed=self.robotClient.feed_speed, + move_type=MoveType.AXIS) + + # 注释掉 by chuyiwen + # if self.robotClient.status_model.getAnglePosition().is_error_angel_move(feed_pos.get_position(), + # self.robotClient.max_angle_interval): + # self.feedStatus = FeedStatus.FNone + # 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) else: # if not reverse and self.feedStatus == FeedStatus.FShake: @@ -807,6 +877,8 @@ class Feeding(QObject): 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(self.is_reverse) + + def next_position(self,reverse=False): if self.feed_Mid_Status == FeedMidStatus.FMid_Start: self.next_start(reverse) diff --git a/CU/__pycache__/Catch.cpython-39.pyc b/CU/__pycache__/Catch.cpython-39.pyc index 96f8f3523d656b776a4d70be3a947f15fbfae7ca..6d4efc3e363fb568ea9dac16ee3652d1498f493a 100644 GIT binary patch delta 81 zcmbOvuv~yQk(ZZ?0SIQR?a0X9$Xml``qcu+b+L*GD9X=DO)e>pdET+{+1#biH*S8i jV^)k~X-U3weqKpYeok;@aY<^fu6vAgXw2r7jG1fzf)XDI delta 60 zcmZ23FiC(nk(ZZ?0SK5}J2E&o^42ga{8H1;$j?pHIMEG@}*&d)0;%FhX|EG|jS O)prin-@K18lMMj!ixQIn diff --git a/CU/__pycache__/Command.cpython-39.pyc b/CU/__pycache__/Command.cpython-39.pyc index 623a5c14056b998b7216bae11188d4ff48172853..0be96fbb73bf8a51e1d53a7292aa669b78476f80 100644 GIT binary patch delta 81 zcmcc5{)L@4k(ZZ?0SIQR?a1)i$jixS`qc`^b+L*GD9X=DO)e>pdET+{+1#biH*S8i jV^)k~X-U3weqKpYeok;@aY<^fu6vAgXv}6a#+6I}h@T$H delta 60 zcmeyuexIE;k(ZZ?0SMSy8!~J+@^UgN{L;|R$j?pHIMEG@}*&d)0;%FhX|EG|jS O)prin-|Wq}k_iA3loI0r diff --git a/CU/__pycache__/Detect.cpython-39.pyc b/CU/__pycache__/Detect.cpython-39.pyc index d8463ec959a85e5460f9bbe063f08a8c71a1e1c5..8eb39708740717bd0c40c3e1b4e3152a53be3898 100644 GIT binary patch delta 86 zcmaE${8gDdk(ZZ?0SIQR?byiO!D#x`63B6}iU}yn&q_@$DUNyGvGLj5rO!8RezId$ pjALm@zH@$FNl|`IaAk2xYObz(jB{wr=FN<|`513)&KD?T1ORI=A>;r6 delta 65 zcmeyW{6LvIk(ZZ?0SG!XIyQ25Fe>~~*U!k$P1Vn+(042?$#>4rD=Es)39c+INzK)F T4%Od$f^jz=W7OsrfkH+Axkwfd diff --git a/CU/__pycache__/EMV.cpython-39.pyc b/CU/__pycache__/EMV.cpython-39.pyc index 15a1bcaee37e10bd2460eb9c46004f7fb8c633da..e9657e766ed1e6aa7ca8b7728b664a2c8d2ec68d 100644 GIT binary patch delta 81 zcmcb?`<9nCk(ZZ?0SIQR?Z`N{kvEaq^s5<=>tYoXP?VpQnp{#G^Soo@v$;#3Z`}N3 j$E+B~(vp1V{JfH){G8y*;*!){UH2I0(3s7A%wEg@y{I3Y delta 60 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 Y!O|oA_2F^1*O%k7d2F7flRFJkSXVE_OC diff --git a/CU/__pycache__/drop.cpython-39.pyc b/CU/__pycache__/drop.cpython-39.pyc index 4ddfbd1c58b34de1bebfc4798ffd4dad19c4fdca..6c1ac4f9486e067d559b8be6da1aa46065577a44 100644 GIT binary patch literal 6347 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 O09Min;$A$>|9=1h3C)lI diff --git a/CU/drop.ini b/CU/drop.ini index 8c4e105..31e04f2 100644 --- a/CU/drop.ini +++ b/CU/drop.ini @@ -1,88 +1,374 @@ [DropLine1] id = 1 name = 50kg码垛路径 -current_index = 92 +current_index = 22 [DropLine2] id = 2 name = 35kg码垛路径 current_index = 0 +[DropMidPoint1-1] +x = 15.3 +y = -84 +z = -91.0 +u = 2.145 +v = 0 +w = 0 +id = 1 +order = 0 +lineid = 1 +status = 7 +linetype = 0 + +[DropMidPoint1-2] +x = 15.3 +y = -184 +z = -91.0 +u = 2.145 +v = 0 +w = 0 +id = 1 +order = 0 +lineid = 1 +status = 7 +linetype = 0 + +[DropMidPoint1-3] +x = 15.3 +y = -284 +z = -91.0 +u = 2.145 +v = 0 +w = 0 +id = 1 +order = 0 +lineid = 1 +status = 7 +linetype = 0 + [DropPoints1] +x = 15.3 +y = -384 +z = -91.0 +u = 2.145 +v = 0 +w = 0 +id = 1 +order = 1 +lineid = 1 +status = 9 +linetype = 0 + +[ResetPoint1-3] +x = 15.3 +y = -684 +z = -91.0 +u = 2.145 +v = 0 +w = 0 +id = 1 +order = 0 +lineid = 1 +status = 11 +linetype = 0 + +[ResetPoint1-2] +x = 15.3 +y = -584 +z = -91.0 +u = 2.145 +v = 0 +w = 0 +id = 1 +order = 0 +lineid = 1 +status = 11 +linetype = 0 + +[ResetPoint1-1] +x = 15.3 +y = -484 +z = -91.0 +u = 2.145 +v = 0 +w = 0 +id = 1 +order = 0 +lineid = 1 +status = 11 +linetype = 0 + +[DropMidPoint2-1] +x = 1379.783 +y = -403.215 +z = -200.0 +u = 18.350 +v = -0.985981 +w = -125.710434 +id = 2 +order = 0 +lineid = 1 +status = 7 +linetype = 0 + +[DropMidPoint2-2] +x = 1379.783 +y = -403.215 +z = -250.0 +u = 18.350 +v = -0.985981 +w = -125.710434 +id = 2 +order = 0 +lineid = 1 +status = 7 +linetype = 0 + +[DropMidPoint2-3] +x = 1379.783 +y = -403.215 +z = -300.0 +u = 18.350 +v = -0.985981 +w = -125.710434 +id = 2 +order = 0 +lineid = 1 +status = 7 +linetype = 0 + +[DropPoints2] x = 1379.783 y = -403.215 z = -334.279 u = 18.350 v = -0.985981 w = -125.710434 -id = 3 -order = 0 -lineid = 1 -status = 9 -linetype = 0 - -[DropPoints2] -x = 1377.858 -y = -215.07 -z = -334.278 -u = 18.349 -v = -0.985981 -w = -125.710434 -id = 3 +id = 2 order = 1 lineid = 1 status = 9 linetype = 0 -[DropPoints3] -x = 1377.870 -y = 190.876 -z = -334.276 -u = 18.347 +[ResetPoint2-3] +x = 1379.783 +y = -403.215 +z = -366.0 +u = 18.350 v = -0.985981 w = -125.710434 -id = 3 -order = 2 +id = 2 +order = 0 +lineid = 1 +status = 11 +linetype = 0 + +[ResetPoint2-2] +x = 1379.783 +y = -403.215 +z = -466.0 +u = 18.350 +v = -0.985981 +w = -125.710434 +id = 2 +order = 0 +lineid = 1 +status = 11 +linetype = 0 + +[ResetPoint2-1] +x = 1379.783 +y = -403.215 +z = -566.0 +u = 18.350 +v = -0.985981 +w = -125.710434 +id = 2 +order = 0 +lineid = 1 +status = 11 +linetype = 0 + +[DropMidPoint3-1] +x = 1379.783 +y = -403.215 +z = -500.0 +u = 18.350 +v = -0.985981 +w = -125.710434 +id = 1 +order = 0 +lineid = 1 +status = 7 +linetype = 0 +action = + +[DropMidPoint3-2] +x = 1379.783 +y = -403.215 +z = -400.0 +u = 18.350 +v = -0.985981 +w = -125.710434 +id = 1 +order = 0 +lineid = 1 +status = 7 +linetype = 0 + +[DropMidPoint3-3] +x = 1379.783 +y = -403.215 +z = -300.0 +u = 18.350 +v = -0.985981 +w = -125.710434 +id = 1 +order = 0 +lineid = 1 +status = 7 +linetype = 0 + +[DropPoints3] +x = 1379.783 +y = -403.215 +z = -334.279 +u = 18.350 +v = -0.985981 +w = -125.710434 +id = 1 +order = 1 lineid = 1 status = 9 linetype = 0 +[ResetPoint3-3] +x = 1379.783 +y = -403.215 +z = -200.0 +u = 18.350 +v = -0.985981 +w = -125.710434 +id = 1 +order = 0 +lineid = 1 +status = 11 +linetype = 0 + +[ResetPoint3-2] +x = 1379.783 +y = -403.215 +z = -100.0 +u = 18.350 +v = -0.985981 +w = -125.710434 +id = 1 +order = 0 +lineid = 1 +status = 11 +linetype = 0 + +[ResetPoint3-1] +x = 1379.783 +y = -403.215 +z = -50.0 +u = 18.350 +v = -0.985981 +w = -125.710434 +id = 1 +order = 0 +lineid = 1 +status = 11 +linetype = 0 + +[DropMidPoint4-1] +x = 1379.783 +y = -403.215 +z = -200.0 +u = 18.350 +v = -0.985981 +w = -125.710434 +id = 2 +order = 0 +lineid = 1 +status = 7 +linetype = 0 + +[DropMidPoint4-2] +x = 1379.783 +y = -403.215 +z = -250.0 +u = 18.350 +v = -0.985981 +w = -125.710434 +id = 2 +order = 0 +lineid = 1 +status = 7 +linetype = 0 + +[DropMidPoint4-3] +x = 1379.783 +y = -403.215 +z = -300.0 +u = 18.350 +v = -0.985981 +w = -125.710434 +id = 2 +order = 0 +lineid = 1 +status = 7 +linetype = 0 + [DropPoints4] -x = 1874.282 -y = -328.797 -z = -334.274 -u = 18.346 +x = 1379.783 +y = -403.215 +z = -334.279 +u = 18.350 v = -0.985981 w = -125.710434 -id = 3 -order = 3 +id = 2 +order = 1 lineid = 1 status = 9 linetype = 0 -[DropPoints5] -x = 1874.282 -y = -67.365 -z = -334.274 -u = 18.346 +[ResetPoint4-3] +x = 1379.783 +y = -403.215 +z = -366.0 +u = 18.350 v = -0.985981 w = -125.710434 -id = 3 -order = 4 +id = 2 +order = 0 lineid = 1 -status = 9 +status = 11 linetype = 0 -[DropPoints6] -x = 1874.282 -y = 330.375 -z = -334.274 -u = 18.346 +[ResetPoint4-2] +x = 1379.783 +y = -403.215 +z = -466.0 +u = 18.350 v = -0.985981 w = -125.710434 -id = 3 -order = 5 +id = 2 +order = 0 lineid = 1 -status = 9 +status = 11 linetype = 0 +[ResetPoint4-1] +x = 1379.783 +y = -403.215 +z = -566.0 +u = 18.350 +v = -0.985981 +w = -125.710434 +id = 2 +order = 0 +lineid = 1 +status = 11 +linetype = 0 diff --git a/CU/drop.py b/CU/drop.py index aebe62e..2904076 100644 --- a/CU/drop.py +++ b/CU/drop.py @@ -4,101 +4,214 @@ import configparser import os from typing import Optional from Model.Position import Real_Position +from Model.FeedModel import PositionModel + class DropPositionManager: - def __init__(self, config_path="drop.ini"): + def __init__(self, config_path="CU/drop.ini"): self.config_path = config_path self.config = configparser.ConfigParser() self._load_config() + # --- 本地缓存 --- + self._current_lineid: Optional[int] = None + self._current_point_id: Optional[int] = None + self._current_path: list = [] # 当前路径点列表 + self._current_index: int = 0 # 当前路径中的索引 + def _load_config(self): if not os.path.exists(self.config_path): raise FileNotFoundError(f"配置文件不存在: {self.config_path}") self.config.read(self.config_path, encoding='utf-8') - def _save_config(self): - with open(self.config_path, 'w', encoding='utf-8') as f: - self.config.write(f) + def get_next_drop_position(self, lineid: int, point: int) -> Optional[PositionModel]: + """ + 获取指定 lineid 和 point 的下一个路径点。 - def get_next_drop_position(self, lineid: int = 1) -> Optional[Real_Position]: - print(f"\n🔄 开始获取 lineid={lineid} 的下一个 drop 点...") + :param lineid: 路径组 ID(对应 DropLineX) + :param point: 投料点 ID(对应 DropPoints{point}) + :return: 下一个路径点,若无则返回 None + """ + # 如果 lineid 或 point 改变,重新加载路径 + if self._current_lineid != lineid or self._current_point_id != point: + self._load_point_path(lineid, point) + self._current_lineid = lineid + self._current_point_id = point + self._current_index = 0 - line_section = f"DropLine{lineid}" - print(f"🔍 查找路径 section: {line_section}") + # 返回当前索引的点 + if self._current_index < len(self._current_path): + next_point = self._current_path[self._current_index] + self._current_index += 1 + pos = next_point.get_position() + print(f"🎯 返回点: status={next_point.status}, linetype={next_point.lineType}, " + f"position=({pos.X:.3f}, {pos.Y:.3f}, {pos.Z:.3f})") + return next_point - if not self.config.has_section(line_section): - print(f"❌ 错误:配置文件中不存在 section [{line_section}]") - print(f"📊 所有 sections: {list(self.config.sections())}") - return None + # 路径结束 + print("✅ 当前点集合路径已结束") + return None - current_index = self.config.getint(line_section, "current_index", fallback=0) - print(f"📌 当前索引: {current_index} (fallback=0 如果未设置)") + def _load_point_path(self, lineid: int, point_id: int): + """加载指定 lineid 和 point_id 的完整路径""" + self._current_path = [] - points = [] - found_sections = [] - matched_sections = [] + # 检查是否存在 DropPoints{point_id} + drop_point_sec = f"DropPoints{point_id}" + if not self.config.has_section(drop_point_sec): + print(f"❌ 配置错误:不存在 {drop_point_sec}") + return + if self.config.getint(drop_point_sec, "lineid") != lineid: + print(f"❌ {drop_point_sec} 不属于 lineid={lineid}") + return + + try: + drop_pos = self._read_position_from_section(drop_point_sec) + except Exception as e: + print(f"❌ 读取 {drop_point_sec} 失败: {e}") + return + + # 1. 加载 DropMidPoint{point_id}-*(按 level 升序) + mid_points = [] for sec in self.config.sections(): - if sec.startswith("DropPoints"): - found_sections.append(sec) + if sec.startswith(f"DropMidPoint{point_id}-") and self.config.getint(sec, "lineid") == lineid: try: - file_lineid = self.config.getint(sec, "lineid") - print(f"🔍 {sec}: lineid={file_lineid}") - if file_lineid == lineid: - matched_sections.append(sec) - pos = Real_Position() - pos.X = self.config.getfloat(sec, "x") - pos.Y = self.config.getfloat(sec, "y") - pos.Z = self.config.getfloat(sec, "z") - pos.U = self.config.getfloat(sec, "u") - pos.V = self.config.getfloat(sec, "v") - pos.W = self.config.getfloat(sec, "w") - order = self.config.getint(sec, "order") - points.append((order, pos)) - print(f"✅ 匹配到点: {sec}, order={order}, 位置=({pos.X:.3f}, {pos.Y:.3f})") + level = int(sec.split('-')[1]) + pos = self._read_position_from_section(sec) + mid_points.append((level, pos)) except Exception as e: - print(f"❌ 读取 {sec} 失败: {e}") + print(f"❌ 解析 {sec} 失败: {e}") + mid_points.sort(key=lambda x: x[0]) - print(f"📁 找到 DropPoints: {found_sections}") - print(f"🟢 匹配 lineid={lineid} 的点: {matched_sections}") - print(f"📊 共收集 {len(points)} 个有效点") + # 2. 加载 ResetPoint{point_id}-*(按 level 升序) + reset_points = [] + for sec in self.config.sections(): + if sec.startswith(f"ResetPoint{point_id}-") and self.config.getint(sec, "lineid") == lineid: + try: + level = int(sec.split('-')[1]) + pos = self._read_position_from_section(sec) + reset_points.append((level, pos)) + except Exception as e: + print(f"❌ 解析 {sec} 失败: {e}") + reset_points.sort(key=lambda x: x[0]) - if not points: - print("❌ 没有可用的 drop 点!请检查:lineid 是否匹配,字段是否正确") - return None + # 3. 组装路径 + # a. DropMidPoint + for _, pos in mid_points: + model = PositionModel() + model.init_position(pos) + model.status = 7 # FMid + model.lineType = 4 # WORLD + self._current_path.append(model) - # 按 order 排序 - points.sort(key=lambda x: x[0]) - sorted_positions = [pos for _, pos in points] - count = len(sorted_positions) - actual_index = current_index % count + # b. DropPoints + main_model = PositionModel() + main_model.init_position(drop_pos) + main_model.status = 9 # FDropBag + main_model.lineType = 4 + self._current_path.append(main_model) - selected_pos = sorted_positions[actual_index] - print(f"🎯 选择第 {actual_index} 个点: X={selected_pos.X:.3f}, Y={selected_pos.Y:.3f}, Z={selected_pos.Z:.3f}") + # c. ResetPoint + for _, pos in reset_points: + model = PositionModel() + model.init_position(pos) + model.status = 11 # FReverse + model.lineType = 4 + self._current_path.append(model) - # 索引 +1 并保存回 ini - next_index = current_index + 1 - self.config.set(line_section, "current_index", str(next_index)) - self._save_config() - print(f"💾 已保存 current_index = {next_index} 到 [{line_section}]") + print(f"✅ 已加载 DropLine{lineid} 中 DropPoints{point_id} 的路径,共 {len(self._current_path)} 个点") - return selected_pos + def _read_position_from_section(self, section: str) -> Real_Position: + """从配置文件的 section 中读取位置信息""" + pos = Real_Position() + pos.X = self.config.getfloat(section, "x") + pos.Y = self.config.getfloat(section, "y") + pos.Z = self.config.getfloat(section, "z") + pos.U = self.config.getfloat(section, "u") + pos.V = self.config.getfloat(section, "v") + pos.W = self.config.getfloat(section, "w") + return pos +def _get_point_debug_info(manager, pos, model): + config = manager.config + for sec in config.sections(): + if sec.startswith("DropPoints"): + try: + x, y, z = config.getfloat(sec, "x"), config.getfloat(sec, "y"), config.getfloat(sec, "z") + if abs(x - pos.X) < 0.001 and abs(y - pos.Y) < 0.001 and abs(z - pos.Z) < 0.001: + point_id = config.getint(sec, "id") + return f"📌 DropPoints{point_id} | id={point_id}" + except: pass -# ✅ 主函数:用于测试 + elif sec.startswith("DropMidPoint"): + try: + parts = sec.split('-') + if len(parts) != 2: continue + point_id = int(''.join(filter(str.isdigit, parts[0]))) + level = int(parts[1]) + x, y, z = config.getfloat(sec, "x"), config.getfloat(sec, "y"), config.getfloat(sec, "z") + if abs(x - pos.X) < 0.001 and abs(y - pos.Y) < 0.001 and abs(z - pos.Z) < 0.001: + return f"📍 DropMidPoint{point_id}-{level} | id={point_id}, level={level}" + except: pass + + elif sec.startswith("ResetPoint"): + try: + parts = sec.split('-') + if len(parts) != 2: continue + point_id = int(''.join(filter(str.isdigit, parts[0]))) + level = int(parts[1]) + x, y, z = config.getfloat(sec, "x"), config.getfloat(sec, "y"), config.getfloat(sec, "z") + if abs(x - pos.X) < 0.001 and abs(y - pos.Y) < 0.001 and abs(z - pos.Z) < 0.001: + return f"🔙 ResetPoint{point_id}-{level} | id={point_id}, level={level}" + except: pass + return "❓ 未知点位" + +# 测试 if __name__ == "__main__": - # 创建管理器,加载 drop.ini manager = DropPositionManager("drop.ini") + lineid = 1 - # 获取第一个 drop 点(lineid=1) - pos = manager.get_next_drop_position(lineid=1) + print(f"\n🔁 测试:通过 point 参数切换路径集合\n") - if pos is not None: - print(f"\n🎉 成功返回点位: X={pos.X}, Y={pos.Y}, Z={pos.Z}, U={pos.U}, V={pos.V}, W={pos.W}") - else: - print("\n❌ get_next_drop_position 返回了 None,请根据上面的日志排查") - print("💡 常见原因:") - print(" 1. drop.ini 缺少 current_index") - print(" 2. lineid 不匹配") - print(" 3. Real_Position 属性名错误(应为大写 X/Y/Z)") - print(" 4. 文件路径不对") + # 先走 point=1 + print("=" * 60) + print("📦 开始执行 point=1 的路径") + print("=" * 60) + for i in range(10): + pos_model = manager.get_next_drop_position(lineid=lineid, point=1) + if pos_model is None: + print("🔚 point=1 路径结束") + break + pos = pos_model.get_position() + info = _get_point_debug_info(manager, pos, pos_model) + print(f" 🚀 {info}") + if pos_model.status == 9: + print(" 💥 执行【扔包】操作!") + + # 再走 point=2 + print("\n" + "=" * 60) + print("📦 开始执行 point=2 的路径") + print("=" * 60) + for i in range(10): + pos_model = manager.get_next_drop_position(lineid=lineid, point=2) + if pos_model is None: + print("🔚 point=2 路径结束") + break + pos = pos_model.get_position() + info = _get_point_debug_info(manager, pos, pos_model) + print(f" 🚀 {info}") + if pos_model.status == 9: + print(" 💥 执行【扔包】操作!") + + # 再切回 point=1 + print("\n" + "=" * 60) + print("🔄 切换回 point=1,从头开始") + print("=" * 60) + for i in range(3): + pos_model = manager.get_next_drop_position(lineid=lineid, point=1) + if pos_model is None: + break + pos = pos_model.get_position() + info = _get_point_debug_info(manager, pos, pos_model) + print(f" 🚀 {info}") \ No newline at end of file diff --git a/CU/list.ini b/CU/list.ini index 83febca..b86a215 100644 --- a/CU/list.ini +++ b/CU/list.ini @@ -1,12 +1,5 @@ [positions] -0 = -569.543396, -1299.659543, -1269.931256, -151.12764, 0.258, 0.258 -1 = -569.543396, -1299.659543, -1269.931256, -151.12764, 0.258, 0.258 -2 = -569.543396, -1299.659543, -1269.931256, -151.12764, 0.258, 0.258 -3 = -569.543396, -1299.659543, -1269.931256, -151.12764, 0.258, 0.258 -4 = -42.885, -1432.385, -300.451, -59.044, 7.258, 7.258 -5 = -42.885, -1432.385, -280.451, -59.044, 7.258, 7.258 -6 = -42.885, -1432.385, -410.451, -59.044, 7.258, 7.258 -7 = -42.885, -1432.385, -380.451, -59.044, 7.258, 7.258 -8 = -42.885, -1432.385, -340.451, -59.044, 7.258, 7.258 -9 = -42.885, -1432.385, -300.451, -59.044, 7.258, 7.258 -10 = -42.885, -1432.385, -280.451, -59.044, 7.258, 7.258 \ No newline at end of file +0 = -569.543396, -1299.659543, -1069.931256, -151.12764, 0.258, 0.258 +1 = -569.543396, -1299.659543, -1069.931256, -151.12764, 0.258, 0.258 +2 = -569.543396, -1299.659543, -1069.931256, -151.12764, 0.258, 0.258 +3 = -569.543396, -1299.659543, -1069.931256, -151.12764, 0.258, 0.258 \ No newline at end of file diff --git a/EMV/__pycache__/EMV.cpython-39.pyc b/EMV/__pycache__/EMV.cpython-39.pyc index aa84c29a552c121584360ec0dfb6baa0a9a6c406..1438e17cdfc930ddaabb23fc283ef392468a335d 100644 GIT binary patch delta 2098 zcmb7_OKcle6ox&qW5@9$8QXc=c{*vFCZ%oqOem!)ZD}DTB?T1|I(2d)tct zFHe1YDw2yt8a?#;aOn2pm5s<)U8Qc#qlMQLVq^_+lm&=Qtby3ff<%=y5@RexjI%H? z!6L+#HP2ELi?Sxx{1JIBH8YjPHf5E?Sz=R;u@=_4DaTnGYlmE@rwFaAqry5_7u>Zr z87?UUrHCr)CdQbb7-v1wp`GLe!=4tFD!{9QSEi-H_1F}lO8Qa50BQ(hFNA2A$!=!rqnC9^&z3w&$bf>q$SNfGoH+-u)O2q zmiH&c5x;s9;+C)8m8#$Su6U34(J}LW!c7mKpvQ0f2~SPTPIGffpSP{qd+Qr_KmPRI zM)l6^8?#4Bwt3VvY;La1lr39d9Xm05Z0f~XQEB*0NmPe}c}0nfYmFEDZd~zu;~C|k zcseu~c7k(dTi005&N-qS8VMnrOvxw37oqQx(z( z_#x8Tc^3932={}8tas;ux%+?9kE_?Cd-iW9o8!&vHb+$cvQ$@egO5TT19kw9VWGZ2 zjaZp5KPZ-?U49w)oOm}n^-zg-qRUFGI^A?b>3IdNG2lF)0T%$&!w-v~nrzOIc)tO9 z9AILvI#@wjTn8SM#TTF+1*U-0fGjXiQYPY_$0Do+z^#rXC&+cHXd0Go@t2_cjNGcu zmm&Jig#}Buvw^vStrbnn@!{;9xZkpKcFA&2-96sw&+2(4i6Sy}Zmx4AZ`~ml;=epA zyG18wk7q*s7?OAkGzZ<-+zMEL?5zxG9Owbg0M8R{24sS)_$1NYZ@`LF*^pb5Hg7V0 zYu@UQi4<=8&z2{%o0-EhGk*=fGIKkmT4s5wGW{MbJe;1t4%?QgBh_gayINYSpSNCD zPOe~CHZTAQGs8!K2MzE}sA-@J7zBoZB(RN;p&rG0d#ahkvL#vdtM=W>;aX6c<9|i= zyOFmJW%YFD9lUVk$xD@;NcaXY49L)XA?*Wtfhd5Ra2tt0l8vMw)%usmC@=LnEVL0a zKKJgz^Cix8!`AEq4V!E-i#-$gUc3EHR*$3%<(#bNO;|GkJ}Yhk2O!DZwf5yb%49Nk z2W|Ox9NqBnk*7IX4fOOWei?mQ?C5RVS;5*a;3BY_;MCJhahuP=u;mh24u8;VL5Bly-yhWSnYHMC^!}StSOMe;ae^ZLD`{xn~tQ;a_6t23Dm>3;6 zRC$#YCuZn6(@b8-7YxlRQ$2Kg0}mx|+Y0#paJly}6nbjJ%$y-`{%mic?w=>y&&WE8Q`>*ZGJm77Hf(q z5<@V?pHIYq4@TvI2eUpHBZ)C4K4|;{_QCi-4aD$bVoZF|^F6b67mW|j!)MO#%sJT6}cf{_e)i-cKW28djQ@efjXRMvN>s5TjxpF(!h6cgJLsrh&@^1d(NkC zQKiPwU;*Q#YoGe4@t1e~8EsVU^>>uN@?UAp^^srp6K?tBPP+XDJ2z9Dw{kNt=k9)f z_1>L3In$mq?c9?SCvxiAx=*xZc}K9IX$f_sEB_FVX8b2TitX&6o7B98*itt^k*w zRM(>u5B2zK^hGURJ{!BP9eM$&alimh0jB{pB=-;&V}w(yZ{J+~`0A>Of+61>H&$SnF0!VYweT1RMsq?`g91h&LwzuLXEblT`^ytF%yb zN>)i8$J+0h^OnSBR|3WJ=S!ArG*8)XexX=0{MeI9Do}Dwcd_K{hBx-|ABnSCH=58J zJgrHx>m!t#dT^MBfH#?ZN)O2c5NWg>S9T*f4LAV5n+xj^pa(bt93|XpW`T;jo$ei+ zg%?sr$ZIM;T@+TmZuvpF2d5y^y6<>ZIn2s(5xK0~3ah5fQ)T%_@!(;3`4W6}r?LD& z>uqgi243!a02WS=+z71oE!(ji1Ui5rAPaN?!vx)XHOU)}gDUY4lOZ4s%ma1WSVjo< z%HOx^TA`-OP5dwEfVXY`DP5;pKHYg2AMXC{%PU*a!V<6^V98Nf+ksvn3Sj5F37}tZ z0$s3bgX6KM;hO+51l`YF8R6+gDJ{p%yEYw8p27*l?Bw}yYvbi3J&tyg`?-K;8-T|E zZeRy2)~=0(_npO9yNyErKE7UgL!TgCG~p$?;~p!IkV!QE!qyJ{wqg)IPmkXS1FTDNiFLlO1%cuYBjV5Pteql+zg&;rh iCW2a~i}cqi&dpg;vfxqmQ?@O`vbAkuYg~ngcl-tYjmFXd diff --git a/Model/__pycache__/FeedModel.cpython-39.pyc b/Model/__pycache__/FeedModel.cpython-39.pyc index 2f4d07661b8207383fe38f2514f0ba02e084dc3f..78f136add2ca83e50ab95fdf9635e5b2a74c26c9 100644 GIT binary patch delta 85 zcmZ1?w^NQUk(ZZ?0SIQR?Z}81*vMDIXz|q^$ak@d2`I|XN=+^)j(Og(@!8y^&o^#< nvSU_^V`)jgbADb)QGQNvWpPPruC9BGZ+=Q@PR!=DjODxl0Tm$2 delta 64 zcmdlfw?vLFk(ZZ?0SK<>HD`R{-^f?PsQgP;KO;XkRX?Lb-?6kL-#I_8q$ocpxU#q; SHCNv^KP5FsfAb;6a$W$I2o?VT diff --git a/Model/__pycache__/Position.cpython-39.pyc b/Model/__pycache__/Position.cpython-39.pyc index 7227f03f79aa8363d0feb451a997a4423ecbaf3e..b102787f78f16c28fa8f11bc8313b418624e025d 100644 GIT binary patch delta 85 zcmbO&yg`^Rk(ZZ?0SIQR?a1)p-pDtZ(c-Heknds@6Ht_&m6}{q9P_+m+Aq`02SN- diff --git a/Model/__pycache__/RobotModel.cpython-39.pyc b/Model/__pycache__/RobotModel.cpython-39.pyc index 86ae7b3c7503416cde5a0a47fcaa1429fe55eb7c..19e7655553883b0125983c2e9de02d8dfe6130e9 100644 GIT binary patch delta 84 zcmX?TdCihHk(ZZ?0SIQR?Z~*fk++1=;;RFY>tYoXP?VpQnp{#G^Soo@v$;#3Z`}N3 m$E+B~(vp1V{JfH){G8y*;*!){UH2H@{FKz3n9WNVWu*Z*VIfBV delta 63 zcmca+dC-zKk(ZZ?0SMSy8#079@|G|v|I*XX$j?pHIMEG@}*&d)0;%FhX|EG|jS R)%VR$NzKvUypvH@8USXS6sZ6J diff --git a/Trace/__pycache__/handeye_calibration.cpython-39.pyc b/Trace/__pycache__/handeye_calibration.cpython-39.pyc index 68ac997831b7adfb4441e41b9d92c742f1c8f492..3af6d85f25c16ea6036594f1b331ca87131c524d 100644 GIT binary patch delta 297 zcmZn?nJ&VY$ji&c00gtuc4R2=ZRFd-Xz|q($ak@d2`I|XN=+^)j(Og(@!8y^&o^#< zvSU_^V`)jgbADb)QGQNvWpPPruC9AbNKs;PYRu-hj9(a8Z!r~B+?xE1xrx{$ji&c00cQN8Z&nDZsgm;sQk-ZKO;XkRX?Lb-?6kL-#I_8q$ocpxU#q; zHCI2RC^0!ze=`%)7e>}7rlN|d$-kMq7!@|Rv2Zgpnopj@-mj(zG_FVqL?{D^OrC%L z{}+h>S(>axtRPW!5TP;IokLz!3&hk05jr43A4C{TF65A%JcGl4(PHvRj@jHuY9{A% asxw+np3Z3{pa4>84k9c-gyrOioMr$T?KHvw diff --git a/Util/__pycache__/util_ini.cpython-39.pyc b/Util/__pycache__/util_ini.cpython-39.pyc index 76d7c05b6cc7d03dfc675b42730d396a3d802588..1b021e4c0031c450c15a1742e0a589d84771b69a 100644 GIT binary patch delta 172 zcmcc2_kxc%k(ZZ?0SIQR?Z|k)kvD=Z=oVXYeqLH;`Yq<{)XH0|Wr;bZsVf9UGs`UHW|E<|jL5#Wd&^o6y;~7CYKb)Jnz`}Z0^$M8#h1M zF)PNgv?Sj-Kd+=HKPR}dxFj`K*F7e*Br_*w^A5)QER44{&tUUmak2**QKSqa96*F4 zh)@I(N+7}+NZjIdtw>HSD9OyvyTw{il$lqe$x;MzNs%jvaGR{gT`p<|V!D6`ClJ8_ RBCIBF;*Mmrp3KA33;+oQID-HH delta 148 zcmZ1?*)PeP$ji&c00hjf4H+^Uc{>@EerfAxv%f7MG;v z>W7wO=IC!e%XpuKF>3Q#HXjywJD}zwWe{NxA{;=3B8X4|5l)jOxMkT~Kup)k*4*Wy awjic6h;RfE93aAS@^S7+Mytt+Jk0=<4pdET+{+1#biH*S8i kV^)k~X-U3weqKpYeok;@aY<^fu6s;qNoG#WWKYK10DTP~U;qFB delta 61 zcmdnVvV?^$S+7A#}l$Xm?N zZxu~T%SD$`D^^xd@fD#MkRg>wszBQPCR`GHNL{*>xGFxK^5geo2*(i|2$*h*xy%FA z!Fs?>iuuKOH5LCUt`1UW2gY|I1Q4p(v(7?{V#s|&TzaP)qPI)zw(EXIFK9Kn0aqdz zgb-C=UC297Prl{4S`MJP8(u$feU0@YgNIclR*E22%B1SB9EMs{C+p#V-9t5f3Q4gg z4@Tg$m=B>B;RHfI!XUyB!Z1Pzq0$SoB)n7j8>wGV_=If0dL&bQBIx|+4F>9m0-+$|m-lw~Ff58U)W9=n)yH$g zw{>k4JfMgIsGOsu8l9faOx7w1m5oBlYScN`9&I|wv-o^Vu@Uel;Fvf_5bKnkEOI!* z5dYIYIf|RMEhJ%*t8p#2(Vzs}p!~YBIeiYyn!RTJP?hf^Mg$R?n=W&WaLW|4jaE=G&ygGF1=^h^=9&6c6o1pV+Z-FAcTX4Y&` z`Jg{OPD~=3#ww-|XmIs2BL{!wf4qDiOx49=ctfqNBq4_?R&A;G4wltoIrYwP)1lG( zEr&J0@!SbMnqgwzU-hC$Eo)Oat)| zz$rj$^=JNSM#KpBQQ^irCnhKVSm=cSk?r?kY56Ydx0KvQC zb)WhpGl&X7=C$aN5LHE{UIshX_GEX*Umv;249qZH=vw1IegOUNJKU$yUPF&ULj z;^qQCymubf6u=}vBe2K#=ip$}<05E`^Pj==^=>WoWS*d6%XAz+0WlA-gy6f^pX6^t zi&q3EYJ$A=pq<~iTXnOQow`n@y;dmUOUH^(EOjL752u>hDcp#GreU>DfWOpVCnm^4 z&4~cP_9)3~c_!SY<+X77R=1XC@Kn#fljL2c<6v;qw_o$KWK*dG*NwSJY}vk)3)uPf zY|(z)!J6FE<)-m;;UbwwB+1U{tmNb?EdQubF4t97bgE^yWpA2V#rjjJX;kr4^ft;O z$2OfqU1Vl8bt$cg{Z|^AK!}^ga-jxQG~&7{esoB$tK_>^a(XbIi)53clFa78Vh$ig zYS%|N_(5dv_9Ze+g)QJljMhs+4O4C|C)v5sCTQi|l6~wyK&0{)(W$PYiT8VoHcQDh zI)|buB-$+h6`dIqi{@ikVkQIHXUZ32!%G?Rm|7#ihbXKy!%u)=9~h>_@CZX>XN~u< FiT_)T=9mBg diff --git a/__pycache__/Constant.cpython-39.pyc b/__pycache__/Constant.cpython-39.pyc index abe7677bd0aa9b6465da14d625ac4e1fccad0ac0..2fa51c729fbb120dd09a305cd2c86aa1a7c358d7 100644 GIT binary patch delta 78 zcmaE&^izp1k(ZZ?0SIQR?Z{9U*vOYEVD!}j$ak@d2`I|XN=+^)j(Og(@!8y^&o^#< gvSU_^V`)jgbADb)QGQNvWpPPruC9B`-06HBW+W-In delta 57 zcmeyV^hAj-k(ZZ?0SJyqwq)$%-^iCLAp1*AKO;XkRX?Lb-?6kL-#I_8q$ocpxU#q; LHCKP~Qh_S~8}t-k diff --git a/__pycache__/Expection.cpython-39.pyc b/__pycache__/Expection.cpython-39.pyc index b8688d8aca123058d69c807f782a047bc277b8f6..6bf6631683aba3dfe1a6debbe3316133e460c6d4 100644 GIT binary patch delta 79 zcmeyu(#gt~$ji&c00gtuc4P=JZsg-pdET+{+1#biH*S8iV^)k~X-U3weqKpYeok;@aY<^fu6xXOh1(MO F>;Q$SGFkut delta 134 zcmWN{Jr2QO0LNjUEv0_GN*7n~P7WZ(j!qy=lMd=lsDzE-Kf8o0h!b>i1g>E+=`%m~ zBEA(d8{hXTB}bR^6+~A=Rn$aXG(=N4!WAvi7M|#cuJA=ql({bkVkkypECMkR(+A=A hJ^Rf~YO}pdET+{+1#biH*S8i gV^)k~X-U3weqKpYeok;@aY<^fu6xYp2<8@M07B*-FaQ7m delta 57 zcmey!dxw`dk(ZZ?0SMSz8#44a^6D|m{?gLV$j?pHIMEG@}*&d)0;%FhX|EG|jS L)!&@U+`b8n5(uUBlPk{KE+!`U#)Q2+n{ delta 60 zcmX>#m1XNx7QRGYUM>b8=xb@nC_cQAPw|%QFAe>S{M=Oij0%0n(vp1V{JfH){G8y* O;*!){{mqHDG7SK9aTYlM diff --git a/log/log.log b/log/log.log index 8068bfb..207361f 100644 --- a/log/log.log +++ b/log/log.log @@ -9807,3 +9807,173 @@ 2025-08-15 12:55:24 - ERROR - 无回复 2025-08-15 12:55:34 - ERROR - 无回复 2025-08-15 12:55:45 - ERROR - 无回复 +2025-09-03 19:35:41 - INFO - ϵͳ +2025-09-03 19:35:46 - INFO - {"dsID":"www.hc-system.com.RemoteMonitor","reqType":"command","cmdData":["switchTool","2"]} +2025-09-03 19:35:46 - INFO - л +2025-09-03 19:35:47 - INFO - {"dsID":"www.hc-system.com.RemoteMonitor","reqType":"command","cmdData":["startButton","1"]} +2025-09-03 19:35:47 - INFO - лԶ״̬ +2025-09-03 19:35:48 - ERROR - 42 +2025-09-03 19:35:48 - ERROR - 42 +2025-09-03 19:35:48 - ERROR - 42 +2025-09-03 19:35:48 - ERROR - 42 +2025-09-03 19:35:48 - ERROR - 42 +2025-09-03 19:35:49 - ERROR - 42 +2025-09-03 19:35:49 - ERROR - 42 +2025-09-03 19:35:49 - ERROR - 42 +2025-09-03 19:35:49 - ERROR - 42 +2025-09-03 19:35:49 - ERROR - 42 +2025-09-03 19:35:50 - ERROR - 42 +2025-09-03 19:35:50 - ERROR - 42 +2025-09-03 19:35:50 - ERROR - 42 +2025-09-03 19:35:50 - ERROR - 42 +2025-09-03 19:35:50 - ERROR - 42 +2025-09-03 19:35:51 - ERROR - 42 +2025-09-03 19:35:51 - ERROR - 42 +2025-09-03 19:35:51 - ERROR - 42 +2025-09-03 19:35:51 - ERROR - 42 +2025-09-03 19:35:51 - ERROR - 42 +2025-09-03 19:35:52 - ERROR - 42 +2025-09-03 19:35:52 - ERROR - 42 +2025-09-03 19:35:52 - ERROR - 42 +2025-09-03 19:35:52 - ERROR - ¼ʧ +2025-09-03 19:35:52 - ERROR - 'str' object has no attribute 'release' +2025-09-03 19:36:47 - INFO - ϵͳ +2025-09-03 19:36:48 - ERROR - 42 +2025-09-03 19:36:48 - ERROR - 42 +2025-09-03 19:36:48 - ERROR - 42 +2025-09-03 19:36:48 - ERROR - 42 +2025-09-03 19:36:48 - ERROR - 42 +2025-09-03 19:36:49 - ERROR - 42 +2025-09-03 19:36:49 - ERROR - 42 +2025-09-03 19:36:49 - ERROR - 42 +2025-09-03 19:36:49 - ERROR - 42 +2025-09-03 19:36:49 - ERROR - 42 +2025-09-03 19:36:50 - ERROR - 42 +2025-09-03 19:36:50 - ERROR - 42 +2025-09-03 19:36:50 - ERROR - 42 +2025-09-03 19:36:50 - ERROR - 42 +2025-09-03 19:36:50 - ERROR - 42 +2025-09-03 19:36:51 - ERROR - 42 +2025-09-03 19:36:51 - ERROR - 42 +2025-09-03 19:36:51 - ERROR - 42 +2025-09-03 19:36:51 - ERROR - 42 +2025-09-03 19:36:51 - ERROR - 42 +2025-09-03 19:36:52 - ERROR - 42 +2025-09-03 19:36:52 - ERROR - 42 +2025-09-03 19:36:52 - ERROR - 42 +2025-09-03 19:36:52 - ERROR - 42 +2025-09-03 19:36:53 - ERROR - 42 +2025-09-03 19:36:53 - ERROR - 42 +2025-09-03 19:36:53 - ERROR - 42 +2025-09-03 19:36:53 - ERROR - 42 +2025-09-03 19:36:53 - ERROR - 42 +2025-09-03 19:36:54 - ERROR - 42 +2025-09-03 19:36:54 - ERROR - 42 +2025-09-03 19:36:54 - ERROR - 42 +2025-09-03 19:36:54 - ERROR - 42 +2025-09-03 19:36:54 - ERROR - 42 +2025-09-03 19:36:55 - ERROR - 42 +2025-09-03 19:36:55 - ERROR - 42 +2025-09-03 19:36:55 - ERROR - 42 +2025-09-03 19:36:55 - ERROR - 42 +2025-09-03 19:36:55 - ERROR - 42 +2025-09-03 19:36:56 - ERROR - 42 +2025-09-03 19:36:56 - ERROR - 42 +2025-09-03 19:36:56 - ERROR - 42 +2025-09-03 19:36:56 - ERROR - 42 +2025-09-03 19:36:56 - ERROR - 42 +2025-09-03 19:36:57 - ERROR - 42 +2025-09-03 19:36:57 - ERROR - 42 +2025-09-03 19:36:57 - ERROR - 42 +2025-09-03 19:36:57 - ERROR - 42 +2025-09-03 19:36:57 - ERROR - 42 +2025-09-03 19:36:58 - ERROR - 42 +2025-09-03 19:36:58 - ERROR - 42 +2025-09-03 19:36:58 - ERROR - 42 +2025-09-03 19:36:58 - ERROR - 42 +2025-09-03 19:36:59 - ERROR - 42 +2025-09-03 19:36:59 - ERROR - 42 +2025-09-03 19:36:59 - ERROR - 42 +2025-09-03 19:36:59 - ERROR - 42 +2025-09-03 19:36:59 - ERROR - 42 +2025-09-03 19:37:00 - ERROR - 42 +2025-09-03 19:37:00 - ERROR - 42 +2025-09-03 19:37:00 - ERROR - 42 +2025-09-03 19:37:00 - ERROR - 42 +2025-09-03 19:37:00 - ERROR - 42 +2025-09-03 19:37:01 - ERROR - 42 +2025-09-03 19:37:01 - ERROR - 42 +2025-09-03 19:37:01 - ERROR - 42 +2025-09-03 19:37:01 - ERROR - 42 +2025-09-03 19:37:01 - ERROR - 42 +2025-09-03 19:37:02 - ERROR - 42 +2025-09-03 19:37:02 - ERROR - 42 +2025-09-03 19:37:02 - ERROR - 42 +2025-09-03 19:37:02 - ERROR - 42 +2025-09-03 19:37:02 - ERROR - 42 +2025-09-03 19:37:03 - ERROR - 42 +2025-09-03 19:37:03 - ERROR - 42 +2025-09-03 19:37:03 - ERROR - 42 +2025-09-03 19:37:03 - ERROR - 42 +2025-09-03 19:37:03 - ERROR - 42 +2025-09-03 19:37:04 - ERROR - 42 +2025-09-03 19:37:04 - ERROR - 42 +2025-09-03 19:37:04 - ERROR - 42 +2025-09-03 19:37:04 - ERROR - 42 +2025-09-03 19:37:04 - ERROR - 42 +2025-09-03 19:37:05 - ERROR - 42 +2025-09-03 19:37:05 - ERROR - 42 +2025-09-03 19:37:05 - ERROR - 42 +2025-09-03 19:37:05 - ERROR - 42 +2025-09-03 19:37:05 - ERROR - 42 +2025-09-03 19:37:06 - ERROR - 42 +2025-09-03 19:37:06 - ERROR - 42 +2025-09-03 19:37:06 - ERROR - 42 +2025-09-03 19:37:06 - ERROR - 42 +2025-09-03 19:37:06 - ERROR - 42 +2025-09-03 19:37:07 - ERROR - 42 +2025-09-03 19:37:07 - ERROR - 42 +2025-09-03 19:37:07 - ERROR - 42 +2025-09-03 19:37:07 - ERROR - 42 +2025-09-03 19:37:07 - ERROR - 42 +2025-09-03 19:37:08 - ERROR - 42 +2025-09-03 19:37:08 - ERROR - 42 +2025-09-03 19:37:08 - ERROR - 42 +2025-09-03 19:37:08 - ERROR - 42 +2025-09-03 19:37:09 - ERROR - 42 +2025-09-03 19:37:09 - ERROR - 42 +2025-09-03 19:37:09 - ERROR - 42 +2025-09-03 19:37:09 - ERROR - 42 +2025-09-03 19:37:09 - ERROR - 42 +2025-09-03 19:37:10 - ERROR - 42 +2025-09-03 19:37:10 - ERROR - 42 +2025-09-03 19:37:10 - ERROR - 42 +2025-09-03 19:37:10 - ERROR - 42 +2025-09-03 19:37:10 - ERROR - 42 +2025-09-03 19:37:11 - ERROR - 42 +2025-09-03 19:37:11 - ERROR - 42 +2025-09-03 19:37:11 - ERROR - 42 +2025-09-03 19:37:11 - ERROR - 42 +2025-09-03 19:37:11 - ERROR - 42 +2025-09-03 19:37:12 - ERROR - 42 +2025-09-03 19:37:12 - ERROR - 42 +2025-09-03 19:37:12 - ERROR - 42 +2025-09-03 19:37:12 - ERROR - 42 +2025-09-03 19:37:12 - ERROR - 42 +2025-09-03 19:37:13 - ERROR - 42 +2025-09-03 19:37:13 - ERROR - 42 +2025-09-03 19:37:13 - ERROR - 42 +2025-09-03 19:37:13 - ERROR - 42 +2025-09-03 19:37:13 - ERROR - 42 +2025-09-03 19:37:14 - ERROR - 42 +2025-09-03 19:37:14 - ERROR - 42 +2025-09-03 19:37:14 - ERROR - 42 +2025-09-03 19:37:14 - ERROR - 42 +2025-09-03 19:37:14 - ERROR - 42 +2025-09-03 19:37:15 - ERROR - 42 +2025-09-03 19:37:15 - ERROR - 42 +2025-09-03 19:37:15 - ERROR - 42 +2025-09-03 19:37:15 - ERROR - 42 +2025-09-03 19:37:16 - ERROR - 42 +2025-09-03 19:37:16 - ERROR - ¼ʧ +2025-09-03 19:37:16 - ERROR - 'str' object has no attribute 'release' diff --git a/view/__pycache__/ResetView.cpython-39.pyc b/view/__pycache__/ResetView.cpython-39.pyc index 98e306df2d18e61d29537e6b127c15b13fdfac16..afe491b44e139e57b48bd3a0fa4e2a928f14d898 100644 GIT binary patch delta 84 zcmZ3-ewdvvk(ZZ?0SM-*?a1I`+Q_$-(fq3&knds@6Ht_&m6}{q9P_+mtYoXP?VpQnp{#G^Soo@v$;#3Z`}N3 m$E+B~(vp1V{JfH){G8y*;*!){UH6!>%+&Ij&2QL#F#!M&P$BmK delta 62 zcmew@{7jfPk(ZZ?0SK5|8!}`z^6q6*`eme_k)NBYpHZRjSXz?roS#=xl%Eq^SzMBu Qt6!FxTCTsDk^L7F0AL0b+5i9m