From 25e3b60cd8d54b8e1ba295cf8c833866583311c5 Mon Sep 17 00:00:00 2001 From: bmy <2583236812@qq.com> Date: Tue, 6 Aug 2024 15:20:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=89=AB=E9=BB=91?= =?UTF-8?q?=E9=99=A4=E6=9A=B4=E5=81=87=E5=8A=A8=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- subtask.py | 85 +++++++++++++++++++++++++++++++---------- test/test_action.py | 16 ++++---- test/test_filter.py | 9 +++-- test/test_ocr_camera.py | 17 +++++++++ utils.py | 8 +++- 5 files changed, 100 insertions(+), 35 deletions(-) create mode 100644 test/test_ocr_camera.py diff --git a/subtask.py b/subtask.py index 382ee0c..478e599 100644 --- a/subtask.py +++ b/subtask.py @@ -2,7 +2,7 @@ from enum import Enum from loguru import logger from utils import label_filter from utils import tlabel -from utils import LLM +# from utils import LLM from utils import LLM_deepseek from utils import CountRecord import utils @@ -769,7 +769,8 @@ class get_rball(): # 靠近塔 by_cmd.send_angle_scoop(20) # 上古參數 - by_cmd.send_distance_y(-15, 50) # 50 # 70 + # by_cmd.send_distance_y(-15, 50) # 50 # 70 + by_cmd.send_distance_y(-15, 40) # 50 # 70 # 6_9 參數 # by_cmd.send_distance_y(-15, 35) # time.sleep(2) @@ -1236,8 +1237,10 @@ class put_hanoi3(): def nexec(self): pass def after(self): + by_cmd.send_angle_storage(20) by_cmd.send_position_axis_x(1, 150) - var.pid_turning.set(cfg["put_hanoi3"]["pid_kp"], cfg["put_hanoi3"]["pid_ki"], cfg["put_hanoi3"]["pid_kd"]) + var.pid_turning.set(cfg["put_hanoi3"]["pid_kp"] - 0.2, cfg["put_hanoi3"]["pid_ki"], cfg["put_hanoi3"]["pid_kd"]) + # FIXME 此处 -0.2 在 `2e6ce3e1f7d326d6ce8110855e2339ebc03ab2da` 前没有 # 应急避险 第一阶段 找目标牌 class move_area1(): @@ -1257,7 +1260,7 @@ class move_area1(): car_stop() time.sleep(1) # calibrate_new(tlabel.SIGN, offset = 8, run = True) - calibrate_new(tlabel.SIGN, offset = -30, run = True, run_speed = 5) + calibrate_new(tlabel.SIGN, offset = -1, run = True, run_speed = 5) time.sleep(1) by_cmd.send_position_axis_x(1, 50) @@ -1290,11 +1293,14 @@ class move_area1(): return logger.error(f"OCR 检出字符:\"{var.llm_text}\"") - llm_bot.request(var.llm_text) + - if len(var.llm_text) < 3: + if len(var.llm_text) < 5: var.skip_llm_task_flag = True return + else: + # 当有效字符大于 5 个文字时 才请求大模型 + llm_bot.request(var.llm_text) else: # 不需要文字识别 直接使用传入的参数执行 action pass @@ -1356,6 +1362,7 @@ class move_area2(): return 5000 return False def add_item(self, item): + # FIXME 没有对传入参数的范围进行校验,如果出现单位错误,可能会导致无法回位的问题 try: return self.action_dict[item.get('action')](item.get('time')) except: @@ -1449,22 +1456,22 @@ class move_area2(): speed_time_y = int(abs(_dis_y) * 750) by_cmd.send_distance_x(10 * direct_x, speed_time_x) by_cmd.send_distance_y(10 * direct_y, speed_time_y) - time.sleep(max(speed_time_x, speed_time_y) / 100) #FIXME 除以 100 是否正确 + time.sleep(max(speed_time_x, speed_time_y) / 150) #FIXME 除以 100 是否正确 return True def go_left_rotate(self, _time): self.abs_w += math.radians(_time) # 弧度制 logger.info(f"向左旋转:[目标位置 ({self.abs_y:.2f}, {self.abs_x:.2f}) - 角度 {math.degrees(self.abs_w)} ]") self.sum_rotate_angle -= _time - speed_time = int(abs(_time) * 7.25) - by_cmd.send_angle_omega(30, speed_time) + speed_time = int(abs(_time) * 3.8) + by_cmd.send_angle_omega(50, speed_time) time.sleep(speed_time / 200 + 0.5) return True def go_right_rotate(self, _time): self.abs_w -= math.radians(_time) # 弧度制 logger.info(f"向右旋转:[目标位置 ({self.abs_y:.2f}, {self.abs_x:.2f}) - 角度 {math.degrees(self.abs_w)} ]") self.sum_rotate_angle += _time - speed_time = int(abs(_time) * 7.25) - by_cmd.send_angle_omega(-30, speed_time) + speed_time = int(abs(_time) * 3.8) + by_cmd.send_angle_omega(-50, speed_time) time.sleep(speed_time / 200 + 0.5) return True def go_sleep(self, _time): @@ -1497,12 +1504,23 @@ class move_area2(): calibrate_new(tlabel.SHELTER, offset = 30, run = True) time.sleep(0.5) if cfg_move_area == None: + resp = None # 调用大模型 然后执行动作 try: - resp = llm_bot.get_command_json(var.llm_text) - logger.info(f"llm 返回原数据 {resp}") + logger.info("llm 阻塞等待服务器返回中") + start_wait_time = time.perf_counter() + while True: + if llm_bot.success_status.isSet(): + resp = llm_bot.response.choices[0].message.content + logger.info(f"llm 返回原数据 {resp}") + break + now_time = time.perf_counter() + if llm_bot.error_status.isSet() or (now_time - start_wait_time) > 6.5 : + logger.error("大模型 llm_bot 超时,跳过任务") + return + except: - logger.error("大模型 llm_bot 超时,跳过任务") + logger.error("大模型 llm_bot 未知错误,跳过任务") return try: @@ -1583,15 +1601,40 @@ class kick_ass(): by_cmd.send_position_axis_z(30, 80) by_cmd.send_position_axis_x(1, 130) + # 移动到中间 + by_cmd.send_distance_x(10, 295) + time.sleep(4) if self.target_person == 1: - target_distance = self.pos_gap1 + by_cmd.send_distance_x(-10, 150) + time.sleep(1.5) + car_stop() + elif self.target_person == 2: + by_cmd.send_distance_x(-10, 50) + time.sleep(1.5) + car_stop() + elif self.target_person == 3: + by_cmd.send_distance_x(10, 50) + time.sleep(1.5) + car_stop() else: - target_distance = self.pos_gap1 + (self.target_person - 1) * self.pos_gap2 + (self.target_person - 1) * 10 - by_cmd.send_distance_x(10, target_distance) - - logger.info(f"target distance {target_distance}") - time.sleep(1.5 + (self.target_person - 1) * 0.7 ) - car_stop() + by_cmd.send_distance_x(10, 150) + time.sleep(1.5) + car_stop() + + # 先移动到第一个人的地方 假动作 + # by_cmd.send_distance_x(10, self.pos_gap1) + # time.sleep(1.5) + + # if self.target_person == 1: + # # target_distance = self.pos_gap1 + # pass + # else: + # # target_distance = self.pos_gap1 + (self.target_person - 1) * self.pos_gap2 + (self.target_person - 1) * 10 + # target_distance = (self.target_person - 1) * self.pos_gap2 + (self.target_person - 1) * 10 + # by_cmd.send_distance_x(10, target_distance) + # logger.info(f"target distance {target_distance}") + # time.sleep(1.5 + (self.target_person - 1) * 0.7 ) + # car_stop() # by_cmd.send_angle_claw_arm(225) # time.sleep(0.5) diff --git a/test/test_action.py b/test/test_action.py index 21bb8e8..c480ce0 100644 --- a/test/test_action.py +++ b/test/test_action.py @@ -147,8 +147,8 @@ class LLM_Action: self.abs_w += math.radians(_time) # 弧度制 print(f"abs postion ({self.abs_y:.2f}, {self.abs_x:.2f}) - angle {math.degrees(self.abs_w)} drgee") self.sum_rotate_angle -= _time - speed_time = int(abs(_time) * 7.25) - self.by_cmd.send_angle_omega(30, speed_time) + speed_time = int(abs(_time) * 4.35) + self.by_cmd.send_angle_omega(50, speed_time) time.sleep(speed_time / 200 + 0.5) # time.sleep(speed_time / _time / 2) return True @@ -156,8 +156,8 @@ class LLM_Action: self.abs_w -= math.radians(_time) # 弧度制 print(f"abs postion ({self.abs_y:.2f}, {self.abs_x:.2f}) - angle {math.degrees(self.abs_w)} drgee") self.sum_rotate_angle += _time - speed_time = int(abs(_time) * 7.25) - self.by_cmd.send_angle_omega(-30, speed_time) + speed_time = int(abs(_time) * 4.35) + self.by_cmd.send_angle_omega(-50, speed_time) time.sleep(speed_time / 200 + 0.5) # time.sleep(speed_time / _time / 2) return True @@ -167,10 +167,10 @@ class LLM_Action: def reset(self): print(f"开始复位:[当前位置 ({self.abs_y:.2f}, {self.abs_x:.2f}) - 角度 {math.degrees(self.abs_w)}]") # 先复位角度 - if self.sum_rotate_angle > 0: - self.sum_rotate_angle = self.sum_rotate_angle % 360 - else: - self.sum_rotate_angle = -(abs(self.sum_rotate_angle) % 360) + # if self.sum_rotate_angle > 0: + # self.sum_rotate_angle = self.sum_rotate_angle % 360 + # else: + # self.sum_rotate_angle = -(abs(self.sum_rotate_angle) % 360) # if self.sum_rotate_angle > 0: # # 采用左转回正 # self.go_left_rotate(self.sum_rotate_angle) diff --git a/test/test_filter.py b/test/test_filter.py index c9825e5..99a4998 100644 --- a/test/test_filter.py +++ b/test/test_filter.py @@ -25,12 +25,13 @@ filter.switch_camera(1) # label = tlabel.TPLATFORM while True: time.sleep(0.2) - ret, box = filter.get(tlabel.SHELTER) + ret, box = filter.get(tlabel.SIGN) if ret: error = (box[0][2] + box[0][0] - 320) / 2 - if abs(error) < 30 and abs(box[0][2] - box[0][0]) > 180: - # height = box[0][3] - box[0][1] - logger.error(111) + logger.error(error) + # if abs(error) < 30 and abs(box[0][2] - box[0][0]) > 180: + # # height = box[0][3] - box[0][1] + # logger.error(111) # label = tlabel.HOSPITAL # ret, box = filter.get(label) diff --git a/test/test_ocr_camera.py b/test/test_ocr_camera.py new file mode 100644 index 0000000..5cd5d42 --- /dev/null +++ b/test/test_ocr_camera.py @@ -0,0 +1,17 @@ +import cv2 +import time + +cap = cv2.VideoCapture(20) +cap.set(cv2.CAP_PROP_AUTOFOCUS, 0) +cap.set(cv2.CAP_PROP_FOCUS, 280) +cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) +cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) + + +while True: + ret, frame = cap.read() + if ret: + cv2.imshow('src', frame) + time.sleep(0.2) + if cv2.waitKey(25) & 0xFF == ord('q'): + break \ No newline at end of file diff --git a/utils.py b/utils.py index 4d5835c..bbc2f06 100644 --- a/utils.py +++ b/utils.py @@ -376,7 +376,10 @@ class label_filter: class LLM_deepseek: def __init__(self): self.response = None - self.status = False + self.success_status = threading.Event() + self.error_status = threading.Event() + self.success_status.clear() + self.error_status.clear() self.chat = '' self.client = OpenAI(api_key="sk-c2e1073883304143981a9750b97c3518", base_url="https://api.deepseek.com") self.prompt = ''' @@ -437,9 +440,10 @@ class LLM_deepseek: temperature=0.7 ) logger.info("llm 远程服务器正常返回 (request_thread)") + self.success_status.set() except: logger.warning("llm 请求失败或返回异常,先检查网络连接 (request_thread)") - self.status = True + self.error_status.set() def request(self, _chat): self.chat = _chat thread = threading.Thread(target=self.request_thread, daemon=True)