Compare commits
2 Commits
5ecc0f2bf5
...
ui
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f4a5a0a584 | ||
| 520b8818cd |
40
config.json
40
config.json
@@ -4,31 +4,31 @@
|
|||||||
"name": "服务器",
|
"name": "服务器",
|
||||||
"serial_port": "COM17",
|
"serial_port": "COM17",
|
||||||
"serial_baudrate": 9600,
|
"serial_baudrate": 9600,
|
||||||
"camera_index": 2,
|
|
||||||
"camera_width": 1920,
|
|
||||||
"camera_height": 1080,
|
|
||||||
"move_velocity": 470,
|
|
||||||
"active": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "2号机",
|
|
||||||
"serial_port": "COM14",
|
|
||||||
"serial_baudrate": 9600,
|
|
||||||
"camera_index": 0,
|
|
||||||
"camera_width": 1920,
|
|
||||||
"camera_height": 1080,
|
|
||||||
"move_velocity": 420,
|
|
||||||
"active": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "3号机",
|
|
||||||
"serial_port": "COM18",
|
|
||||||
"serial_baudrate": 9600,
|
|
||||||
"camera_index": 1,
|
"camera_index": 1,
|
||||||
"camera_width": 1920,
|
"camera_width": 1920,
|
||||||
"camera_height": 1080,
|
"camera_height": 1080,
|
||||||
"move_velocity": 470,
|
"move_velocity": 470,
|
||||||
"active": true
|
"active": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "2号机",
|
||||||
|
"serial_port": "COM14",
|
||||||
|
"serial_baudrate": 9600,
|
||||||
|
"camera_index": 2,
|
||||||
|
"camera_width": 1920,
|
||||||
|
"camera_height": 1080,
|
||||||
|
"move_velocity": 360,
|
||||||
|
"active": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "3号机",
|
||||||
|
"serial_port": "COM16",
|
||||||
|
"serial_baudrate": 9600,
|
||||||
|
"camera_index": 0,
|
||||||
|
"camera_width": 1920,
|
||||||
|
"camera_height": 1080,
|
||||||
|
"move_velocity": 360,
|
||||||
|
"active": false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"display": {
|
"display": {
|
||||||
|
|||||||
125
main_single.py
125
main_single.py
@@ -133,25 +133,76 @@ def run_automation_for_group(group_index):
|
|||||||
best_point = p
|
best_point = p
|
||||||
return best_point
|
return best_point
|
||||||
|
|
||||||
|
def safe_keyboard_send(data, max_retries=3):
|
||||||
|
"""安全的键盘发送函数,带重试机制"""
|
||||||
|
nonlocal keyboard
|
||||||
|
for attempt in range(max_retries):
|
||||||
|
try:
|
||||||
|
keyboard.send_data(data)
|
||||||
|
return True
|
||||||
|
except (serial.serialutil.SerialException, PermissionError, OSError) as e:
|
||||||
|
if attempt < max_retries - 1:
|
||||||
|
print(f"⚠️ 键盘发送失败 (尝试 {attempt + 1}/{max_retries}): {e}")
|
||||||
|
time.sleep(0.1 * (attempt + 1)) # 递增延迟
|
||||||
|
# 尝试重新初始化串口
|
||||||
|
try:
|
||||||
|
if serial.ser and serial.ser.is_open:
|
||||||
|
serial.ser.close()
|
||||||
|
time.sleep(0.2)
|
||||||
|
init_mouse_keyboard(group)
|
||||||
|
# 重新创建keyboard对象
|
||||||
|
keyboard = ch9329Comm.keyboard.DataComm()
|
||||||
|
except Exception as init_e:
|
||||||
|
print(f"⚠️ 重新初始化串口失败: {init_e}")
|
||||||
|
else:
|
||||||
|
print(f"❌ 键盘发送失败,已重试 {max_retries} 次: {e}")
|
||||||
|
raise
|
||||||
|
return False
|
||||||
|
|
||||||
|
def safe_keyboard_release(max_retries=3):
|
||||||
|
"""安全的键盘释放函数,带重试机制"""
|
||||||
|
nonlocal keyboard
|
||||||
|
for attempt in range(max_retries):
|
||||||
|
try:
|
||||||
|
keyboard.release()
|
||||||
|
return True
|
||||||
|
except (serial.serialutil.SerialException, PermissionError, OSError) as e:
|
||||||
|
if attempt < max_retries - 1:
|
||||||
|
time.sleep(0.1 * (attempt + 1))
|
||||||
|
# 尝试重新初始化串口
|
||||||
|
try:
|
||||||
|
if serial.ser and serial.ser.is_open:
|
||||||
|
serial.ser.close()
|
||||||
|
time.sleep(0.2)
|
||||||
|
init_mouse_keyboard(group)
|
||||||
|
keyboard = ch9329Comm.keyboard.DataComm()
|
||||||
|
except Exception as init_e:
|
||||||
|
print(f"⚠️ 重新初始化串口失败: {init_e}")
|
||||||
|
else:
|
||||||
|
print(f"⚠️ 键盘释放失败: {e}")
|
||||||
|
# 释放失败不算致命错误,继续执行
|
||||||
|
return False
|
||||||
|
return False
|
||||||
|
|
||||||
def move_randomly(rw, k):
|
def move_randomly(rw, k):
|
||||||
k = k % 4
|
k = k % 4
|
||||||
suiji_t = float(random.randint(10, 13) / 10)
|
suiji_t = float(random.randint(10, 13) / 10)
|
||||||
if k == 0:
|
if k == 0:
|
||||||
keyboard.send_data("66")
|
if safe_keyboard_send("66"):
|
||||||
time.sleep(suiji_t)
|
time.sleep(suiji_t)
|
||||||
keyboard.release()
|
safe_keyboard_release()
|
||||||
elif k == 1:
|
elif k == 1:
|
||||||
keyboard.send_data("88")
|
if safe_keyboard_send("88"):
|
||||||
time.sleep(suiji_t)
|
time.sleep(suiji_t)
|
||||||
keyboard.release()
|
safe_keyboard_release()
|
||||||
elif k == 2:
|
elif k == 2:
|
||||||
keyboard.send_data("44")
|
if safe_keyboard_send("44"):
|
||||||
time.sleep(suiji_t)
|
time.sleep(suiji_t)
|
||||||
keyboard.release()
|
safe_keyboard_release()
|
||||||
elif k == 3:
|
elif k == 3:
|
||||||
keyboard.send_data("22")
|
if safe_keyboard_send("22"):
|
||||||
time.sleep(suiji_t)
|
time.sleep(suiji_t)
|
||||||
keyboard.release()
|
safe_keyboard_release()
|
||||||
return k + 1
|
return k + 1
|
||||||
|
|
||||||
def move_to(rw, mb):
|
def move_to(rw, mb):
|
||||||
@@ -159,22 +210,22 @@ def run_automation_for_group(group_index):
|
|||||||
nonlocal v
|
nonlocal v
|
||||||
v = group['move_velocity']
|
v = group['move_velocity']
|
||||||
if rw[0] >= mb[0]:
|
if rw[0] >= mb[0]:
|
||||||
keyboard.send_data("44")
|
if safe_keyboard_send("44"):
|
||||||
time.sleep(float(abs(rw[0] - mb[0]) / v))
|
time.sleep(float(abs(rw[0] - mb[0]) / v))
|
||||||
keyboard.release()
|
safe_keyboard_release()
|
||||||
else:
|
else:
|
||||||
keyboard.send_data("66")
|
if safe_keyboard_send("66"):
|
||||||
time.sleep(float(abs(rw[0] - mb[0]) / v))
|
time.sleep(float(abs(rw[0] - mb[0]) / v))
|
||||||
keyboard.release()
|
safe_keyboard_release()
|
||||||
|
|
||||||
if rw[1] >= mb[1]:
|
if rw[1] >= mb[1]:
|
||||||
keyboard.send_data("88")
|
if safe_keyboard_send("88"):
|
||||||
time.sleep(float(abs(rw[1] - mb[1]) / v))
|
time.sleep(float(abs(rw[1] - mb[1]) / v))
|
||||||
keyboard.release()
|
safe_keyboard_release()
|
||||||
else:
|
else:
|
||||||
keyboard.send_data("22")
|
if safe_keyboard_send("22"):
|
||||||
time.sleep(float(abs(rw[1] - mb[1]) / v))
|
time.sleep(float(abs(rw[1] - mb[1]) / v))
|
||||||
keyboard.release()
|
safe_keyboard_release()
|
||||||
|
|
||||||
# 主循环
|
# 主循环
|
||||||
print(f"🔄 配置组 {group['name']} 开始自动化循环...")
|
print(f"🔄 配置组 {group['name']} 开始自动化循环...")
|
||||||
@@ -225,9 +276,9 @@ def run_automation_for_group(group_index):
|
|||||||
elif detections['npc4'] is not None:
|
elif detections['npc4'] is not None:
|
||||||
if sq(detections['npc4'], rw) < 50:
|
if sq(detections['npc4'], rw) < 50:
|
||||||
print(f"[{group['name']}] 离npc4很近 直接进入")
|
print(f"[{group['name']}] 离npc4很近 直接进入")
|
||||||
keyboard.send_data("DD")
|
if safe_keyboard_send("DD"):
|
||||||
time.sleep(0.15)
|
time.sleep(0.15)
|
||||||
keyboard.release()
|
safe_keyboard_release()
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
im_opencv = get_image.get_frame()
|
im_opencv = get_image.get_frame()
|
||||||
if im_opencv and shizi.daoying(im_opencv[0]):
|
if im_opencv and shizi.daoying(im_opencv[0]):
|
||||||
@@ -271,9 +322,9 @@ def run_automation_for_group(group_index):
|
|||||||
if len(detections['daojv']) != 0:
|
if len(detections['daojv']) != 0:
|
||||||
move_to(rw, process_points(detections['daojv']))
|
move_to(rw, process_points(detections['daojv']))
|
||||||
for i in range(3 + len(detections['daojv'])):
|
for i in range(3 + len(detections['daojv'])):
|
||||||
keyboard.send_data("AA")
|
if safe_keyboard_send("AA"):
|
||||||
time.sleep(0.15)
|
time.sleep(0.15)
|
||||||
keyboard.release()
|
safe_keyboard_release()
|
||||||
continue
|
continue
|
||||||
if shizi.tuichu(im_opencv[0]) and detections['next'] is None and len(detections['daojv']) == 0 and len(detections['gw']) == 0 and boss_pd:
|
if shizi.tuichu(im_opencv[0]) and detections['next'] is None and len(detections['daojv']) == 0 and len(detections['gw']) == 0 and boss_pd:
|
||||||
print(f"[{group['name']}] 识别到可以退出挑战!!!!!!!!!!!!!!!!!!")
|
print(f"[{group['name']}] 识别到可以退出挑战!!!!!!!!!!!!!!!!!!")
|
||||||
@@ -328,9 +379,9 @@ def run_automation_for_group(group_index):
|
|||||||
panduan = True
|
panduan = True
|
||||||
move_to(rw, detections['next'])
|
move_to(rw, detections['next'])
|
||||||
for i in range(2):
|
for i in range(2):
|
||||||
keyboard.send_data("DD")
|
if safe_keyboard_send("DD"):
|
||||||
time.sleep(0.15)
|
time.sleep(0.15)
|
||||||
keyboard.release()
|
safe_keyboard_release()
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
k = move_randomly(rw, k)
|
k = move_randomly(rw, k)
|
||||||
@@ -347,6 +398,14 @@ def run_automation_for_group(group_index):
|
|||||||
import traceback
|
import traceback
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
|
# 清理资源
|
||||||
|
try:
|
||||||
|
if serial.ser and serial.ser.is_open:
|
||||||
|
serial.ser.close()
|
||||||
|
print(f"✅ 配置组 {group['name']} 串口已关闭")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"⚠️ 关闭串口时出错: {e}")
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
if len(sys.argv) > 1:
|
if len(sys.argv) > 1:
|
||||||
|
|||||||
Reference in New Issue
Block a user