diff --git a/base_move/move_base_hori_line.py b/base_move/move_base_hori_line.py index 9adb1f0..403a390 100644 --- a/base_move/move_base_hori_line.py +++ b/base_move/move_base_hori_line.py @@ -7,7 +7,10 @@ import sys import os sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from utils.detect_track import detect_horizontal_track_edge, detect_dual_track_lines, detect_left_side_track +from utils.detect_track import ( + detect_horizontal_track_edge, detect_horizontal_track_edge_v2, + detect_dual_track_lines, detect_left_side_track +) from base_move.turn_degree import turn_degree from base_move.go_straight import go_straight from utils.log_helper import LogHelper, get_logger, section, info, debug, warning, error, success, timing @@ -15,7 +18,7 @@ from utils.log_helper import LogHelper, get_logger, section, info, debug, warnin # 创建此模块特定的日志记录器 logger = get_logger("横线移动") -def align_to_horizontal_line(ctrl, msg, observe=False, max_attempts=3): +def align_to_horizontal_line(ctrl, msg, observe=False, max_attempts=3, detect_func_version=1): """ 控制机器人旋转到横向线水平的位置 @@ -41,9 +44,15 @@ def align_to_horizontal_line(ctrl, msg, observe=False, max_attempts=3): while attempts < max_attempts and not aligned: section(f"尝试校准横线 {attempts+1}/{max_attempts}", "校准") - # 检测横向线边缘 - edge_point, edge_info = detect_horizontal_track_edge(ctrl.image_processor.get_current_image(), observe=observe, delay=1000 if observe else 0, save_log=True) - + # 检测横向线边缘; 不同版本 + if detect_func_version == 1: + edge_point, edge_info = detect_horizontal_track_edge(ctrl.image_processor.get_current_image(), observe=observe, delay=1000 if observe else 0, save_log=True) + elif detect_func_version == 2: + edge_point, edge_info = detect_horizontal_track_edge_v2(ctrl.image_processor.get_current_image(), observe=observe, delay=1000 if observe else 0, save_log=True) + else: + error("未指定检测版本,请检查参数", "失败") + return False + print('😺', edge_info) if edge_point is None or edge_info is None: @@ -291,7 +300,7 @@ def go_straight_by_hori_line(ctrl, msg, distance=0.5, speed=0.5, observe=False): """ # 首先校准到水平 section("校准到横向线水平", "校准") - aligned = align_to_horizontal_line(ctrl, msg, observe=observe) + aligned = align_to_horizontal_line(ctrl, msg, detect_func_version=2, observe=observe) if not aligned: error("无法校准到横向线水平,停止移动", "停止") @@ -301,7 +310,7 @@ def go_straight_by_hori_line(ctrl, msg, distance=0.5, speed=0.5, observe=False): go_straight(ctrl, msg, distance=distance, speed=speed, observe=observe) -def move_to_hori_line(ctrl, msg, target_distance=0.5, observe=False): +def move_to_hori_line(ctrl, msg, target_distance=0.5, absolute_deg=200, observe=False): """ 控制机器人校准并移动到横向线前的指定距离 @@ -316,7 +325,10 @@ def move_to_hori_line(ctrl, msg, target_distance=0.5, observe=False): """ # 首先校准到水平 section("校准到横向线水平", "校准") - aligned = align_to_horizontal_line(ctrl, msg, observe=observe) + if absolute_deg < 200: + aligned = turn_degree(ctrl, msg, absolute_deg, absolute=True) + else: + aligned = align_to_horizontal_line(ctrl, msg, observe=observe) if not aligned: error("无法校准到横向线水平,停止移动", "停止") @@ -425,11 +437,14 @@ def move_to_hori_line(ctrl, msg, target_distance=0.5, observe=False): def arc_turn_around_hori_line(ctrl, msg, angle_deg=90, target_distance=0.2, pass_align=False, - radius=None, + radius=None, + min_radius=0.1, + max_radius=5, scan_qrcode=False, qr_check_interval=0.3, observe=False, - bad_big_angle_corret=False): + bad_big_angle_corret=False, + no_end_reset=False,): """ 对准前方横线,然后以计算出来的距离为半径,做一个向左或向右的圆弧旋转。 参数: @@ -443,6 +458,7 @@ def arc_turn_around_hori_line(ctrl, msg, angle_deg=90, target_distance=0.2, qr_check_interval: QR码检查间隔时间(秒),默认为0.3秒 bad_big_angle_corret: 是否对大角度错误进行修正,默认为False # TODO clear + no_end_reset: 是否在旋转完成后不进行位置重置,默认为False 返回: bool或元组: 如果scan_qrcode为False,返回bool表示是否成功完成操作; 如果scan_qrcode为True,返回(bool, str)元组,表示(是否成功完成操作, QR码扫描结果) @@ -538,8 +554,7 @@ def arc_turn_around_hori_line(ctrl, msg, angle_deg=90, target_distance=0.2, w = math.copysign(base_w, angle_deg) # 保持角速度与角度同号 # 确保r有一个最小值,避免速度过低 - min_radius = 0.2 # 最小半径,单位:米 - effective_r = max(r, min_radius) + effective_r = min(max_radius, max(r, min_radius)) # 线速度,必须与角速度和半径的关系一致:v = w * r # 这样才能保证走圆弧 @@ -548,7 +563,7 @@ def arc_turn_around_hori_line(ctrl, msg, angle_deg=90, target_distance=0.2, info(f"开始移动圆弧,半径: {effective_r:.3f}米, 线速度: {v:.3f}m/s, 角速度: {w:.3f}rad/s") if observe: if effective_r != r: - warning(f"注意: 实际半径 {r:.3f}米 太小,使用最小半径 {effective_r:.3f}米 计算速度", "警告") + warning(f"注意: 实际半径 {r:.3f}米,使用半径 {effective_r:.3f}米 计算速度", "警告") t = abs(angle_rad / w) # 运动时间,取绝对值保证为正 @@ -855,7 +870,7 @@ def arc_turn_around_hori_line(ctrl, msg, angle_deg=90, target_distance=0.2, if abs_angle_deg >= 170: adjustment_threshold = 10.0 # 大角度旋转使用更大的微调阈值,因为初步旋转已经确保大致方向正确 - if angle_error > adjustment_threshold: # 如果误差超过阈值 + if angle_error > adjustment_threshold and not no_end_reset: # 如果误差超过阈值 if observe: warning(f"角度误差: {angle_error:.2f}度,进行微调", "角度") diff --git a/logs/robot_2025-05-19.log b/logs/robot_2025-05-19.log deleted file mode 100644 index ca67f07..0000000 --- a/logs/robot_2025-05-19.log +++ /dev/null @@ -1,67 +0,0 @@ -2025-05-19 20:41:09 | INFO | utils.log_helper - ℹ️ 保存横向边缘检测结果图像到: logs/image/horizontal_edge_20250519_204109_537087.jpg -2025-05-19 20:41:09 | INFO | utils.log_helper - ℹ️ 横向边缘检测结果: {'timestamp': '20250519_204109_537087', 'edge_point': (397, 816), 'distance_to_center': -563, 'slope': 0.0, 'distance_to_bottom': 264.0, 'intersection_point': (960, 816), 'is_truncated': False} -2025-05-19 20:44:06 | DEBUG | utils.log_helper - 🐞 步骤1: 原始图像已加载 -2025-05-19 20:44:07 | DEBUG | utils.log_helper - 🐞 步骤2: 创建黄色掩码 -2025-05-19 20:44:08 | DEBUG | utils.log_helper - 🐞 步骤3: 提取黄色部分 -2025-05-19 20:44:09 | DEBUG | utils.log_helper - 🐞 检测底部和顶部边缘点 -2025-05-19 20:44:10 | DEBUG | utils.log_helper - 🐞 步骤4: 边缘检测 -2025-05-19 20:44:11 | DEBUG | utils.log_helper - 🐞 步骤5: 检测到 15 条直线 -2025-05-19 20:44:12 | DEBUG | utils.log_helper - 🐞 步骤6: 找到 13 条水平线 -2025-05-19 20:44:13 | DEBUG | utils.log_helper - 👁️ 步骤7: 找到边缘点 (397, 816) -2025-05-19 20:44:14 | DEBUG | utils.log_helper - 🐞 显示边缘斜率和中线交点 -2025-05-19 20:44:15 | INFO | utils.log_helper - ℹ️ 保存横向边缘检测结果图像到: logs/image/horizontal_edge_20250519_204415_945888.jpg -2025-05-19 20:44:15 | INFO | utils.log_helper - ℹ️ 横向边缘检测结果: {'timestamp': '20250519_204415_945888', 'edge_point': (397, 816), 'distance_to_center': -563, 'slope': 0.0, 'distance_to_bottom': 264.0, 'intersection_point': (960, 816), 'is_truncated': False} -2025-05-19 20:44:57 | DEBUG | utils.log_helper - 🐞 步骤1: 原始图像已加载 -2025-05-19 20:44:58 | DEBUG | utils.log_helper - 🐞 步骤2: 创建黄色掩码 -2025-05-19 20:44:59 | DEBUG | utils.log_helper - 🐞 步骤3: 提取黄色部分 -2025-05-19 20:45:00 | DEBUG | utils.log_helper - 🐞 检测底部和顶部边缘点 -2025-05-19 20:45:01 | DEBUG | utils.log_helper - 🐞 步骤4: 边缘检测 -2025-05-19 20:45:02 | DEBUG | utils.log_helper - 🐞 步骤5: 检测到 10 条直线 -2025-05-19 20:45:03 | DEBUG | utils.log_helper - 🐞 步骤6: 找到 8 条水平线 -2025-05-19 20:45:04 | DEBUG | utils.log_helper - 👁️ 步骤7: 找到边缘点 (831, 971) -2025-05-19 20:45:05 | DEBUG | utils.log_helper - 🐞 显示边缘斜率和中线交点 -2025-05-19 20:45:06 | INFO | utils.log_helper - ℹ️ 保存横向边缘检测结果图像到: logs/image/horizontal_edge_20250519_204506_674753.jpg -2025-05-19 20:45:06 | INFO | utils.log_helper - ℹ️ 横向边缘检测结果: {'timestamp': '20250519_204506_674753', 'edge_point': (831, 971), 'distance_to_center': -129, 'slope': -0.07004830917874397, 'distance_to_bottom': 118.036231884058, 'intersection_point': (960, 961), 'is_truncated': False} -2025-05-19 20:45:37 | DEBUG | utils.log_helper - 🐞 步骤1: 原始图像已加载 -2025-05-19 20:45:39 | DEBUG | utils.log_helper - 🐞 步骤2: 创建黄色掩码 -2025-05-19 20:45:40 | DEBUG | utils.log_helper - 🐞 步骤3: 提取黄色部分 -2025-05-19 20:45:41 | DEBUG | utils.log_helper - 🐞 检测底部和顶部边缘点 -2025-05-19 20:45:42 | DEBUG | utils.log_helper - 🐞 步骤4: 边缘检测 -2025-05-19 20:45:43 | DEBUG | utils.log_helper - 🐞 步骤5: 检测到 17 条直线 -2025-05-19 20:45:44 | DEBUG | utils.log_helper - 🐞 步骤6: 找到 12 条水平线 -2025-05-19 20:45:45 | DEBUG | utils.log_helper - 👁️ 步骤7: 找到边缘点 (923, 849) -2025-05-19 20:45:46 | DEBUG | utils.log_helper - 🐞 显示边缘斜率和中线交点 -2025-05-19 20:45:47 | INFO | utils.log_helper - ℹ️ 保存横向边缘检测结果图像到: logs/image/horizontal_edge_20250519_204547_188654.jpg -2025-05-19 20:45:47 | INFO | utils.log_helper - ℹ️ 横向边缘检测结果: {'timestamp': '20250519_204547_188654', 'edge_point': (923, 849), 'distance_to_center': -37, 'slope': 0.0, 'distance_to_bottom': 231.0, 'intersection_point': (960, 849), 'is_truncated': False} -2025-05-19 20:47:53 | DEBUG | utils.log_helper - 🐞 步骤1: 原始图像已加载 -2025-05-19 20:47:55 | DEBUG | utils.log_helper - 🐞 步骤2: 创建黄色掩码 -2025-05-19 20:47:56 | DEBUG | utils.log_helper - 🐞 步骤3: 提取黄色部分 -2025-05-19 20:47:57 | DEBUG | utils.log_helper - 🐞 检测底部和顶部边缘点 -2025-05-19 20:47:58 | DEBUG | utils.log_helper - 🐞 步骤4: 边缘检测 -2025-05-19 20:47:59 | DEBUG | utils.log_helper - 🐞 步骤5: 检测到 17 条直线 -2025-05-19 20:48:00 | DEBUG | utils.log_helper - 🐞 步骤6: 找到 12 条水平线 -2025-05-19 20:48:01 | DEBUG | utils.log_helper - 👁️ 步骤7: 找到边缘点 (923, 849) -2025-05-19 20:48:02 | DEBUG | utils.log_helper - 🐞 显示边缘斜率和中线交点 -2025-05-19 20:48:03 | INFO | utils.log_helper - ℹ️ 保存横向边缘检测结果图像到: logs/image/horizontal_edge_20250519_204803_276122.jpg -2025-05-19 20:48:03 | INFO | utils.log_helper - ℹ️ 横向边缘检测结果: {'timestamp': '20250519_204803_276122', 'edge_point': (923, 849), 'distance_to_center': -37, 'slope': 0.0, 'distance_to_bottom': 231.0, 'intersection_point': (960, 849), 'is_truncated': False} -2025-05-19 20:50:32 | DEBUG | utils.log_helper - 🐞 步骤1: 原始图像已加载 -2025-05-19 20:50:33 | DEBUG | utils.log_helper - 🐞 步骤2: 创建黄色掩码 -2025-05-19 20:50:34 | DEBUG | utils.log_helper - 🐞 步骤3: 提取黄色部分 -2025-05-19 20:50:35 | DEBUG | utils.log_helper - 🐞 检测底部和顶部边缘点 -2025-05-19 20:50:36 | DEBUG | utils.log_helper - 🐞 步骤4: 边缘检测 -2025-05-19 20:50:37 | DEBUG | utils.log_helper - 🐞 步骤5: 检测到 25 条直线 -2025-05-19 20:50:38 | DEBUG | utils.log_helper - 🐞 步骤6: 找到 18 条水平线 -2025-05-19 20:50:39 | DEBUG | utils.log_helper - 👁️ 步骤7: 找到边缘点 (92, 1077) -2025-05-19 20:50:40 | DEBUG | utils.log_helper - 🐞 显示边缘斜率和中线交点 -2025-05-19 20:50:41 | INFO | utils.log_helper - ℹ️ 保存横向边缘检测结果图像到: logs/image/horizontal_edge_20250519_205041_583040.jpg -2025-05-19 20:50:41 | INFO | utils.log_helper - ℹ️ 横向边缘检测结果: {'timestamp': '20250519_205041_583040', 'edge_point': (92, 1077), 'distance_to_center': -868, 'slope': -0.07008086253369272, 'distance_to_bottom': 63.83018867924534, 'intersection_point': (960, 1016), 'is_truncated': False} -2025-05-19 21:24:41 | DEBUG | utils.log_helper - 🐞 步骤1: 原始图像已加载 -2025-05-19 21:24:42 | DEBUG | utils.log_helper - 🐞 步骤2: 创建黄色掩码 -2025-05-19 21:24:43 | DEBUG | utils.log_helper - 🐞 步骤3: 提取黄色部分 -2025-05-19 21:24:44 | DEBUG | utils.log_helper - 🐞 检测底部和顶部边缘点 -2025-05-19 21:24:45 | DEBUG | utils.log_helper - 🐞 步骤4: 边缘检测 -2025-05-19 21:24:46 | DEBUG | utils.log_helper - 🐞 步骤5: 检测到 18 条直线 -2025-05-19 21:24:47 | DEBUG | utils.log_helper - 🐞 步骤6: 找到 3 条水平线 -2025-05-19 21:24:48 | DEBUG | utils.log_helper - 🐞 显示边缘斜率和中线交点 -2025-05-19 21:24:49 | INFO | utils.log_helper - ℹ️ 保存横向边缘检测结果图像到: logs/image/horizontal_edge_20250519_212449_369767.jpg -2025-05-19 21:24:49 | INFO | utils.log_helper - ℹ️ 横向边缘检测结果: {'timestamp': '20250519_212449_369767', 'edge_point': (540, 907), 'distance_to_center': -420, 'slope': -0.12202852614896989, 'distance_to_bottom': 224.25198098256737, 'intersection_point': (960, 855), 'score': 0.5611365011519962, 'valid': True, 'reason': ''} diff --git a/logs/robot_2025-05-20.log b/logs/robot_2025-05-20.log deleted file mode 100644 index a5017c5..0000000 --- a/logs/robot_2025-05-20.log +++ /dev/null @@ -1,10 +0,0 @@ -2025-05-20 09:24:31 | DEBUG | utils.log_helper - 🐞 步骤1: 原始图像已加载 -2025-05-20 09:24:32 | DEBUG | utils.log_helper - 🐞 步骤2: 创建黄色掩码 -2025-05-20 09:24:33 | DEBUG | utils.log_helper - 🐞 步骤3: 提取黄色部分 -2025-05-20 09:24:34 | DEBUG | utils.log_helper - 🐞 检测底部和顶部边缘点 -2025-05-20 09:24:35 | DEBUG | utils.log_helper - 🐞 步骤4: 边缘检测 -2025-05-20 09:24:36 | DEBUG | utils.log_helper - 🐞 步骤5: 检测到 18 条直线 -2025-05-20 09:24:37 | DEBUG | utils.log_helper - 🐞 步骤6: 找到 3 条水平线 -2025-05-20 09:24:38 | DEBUG | utils.log_helper - 🐞 显示边缘斜率和中线交点 -2025-05-20 09:24:39 | INFO | utils.log_helper - ℹ️ 保存横向边缘检测结果图像到: logs/image/horizontal_edge_20250520_092439_823936.jpg -2025-05-20 09:24:39 | INFO | utils.log_helper - ℹ️ 横向边缘检测结果: {'timestamp': '20250520_092439_823936', 'edge_point': (540, 907), 'distance_to_center': -420, 'slope': -0.12202852614896989, 'distance_to_bottom': 224.25198098256737, 'intersection_point': (960, 855), 'score': 0.5611365011519962, 'valid': True, 'reason': ''} diff --git a/logs/robot_2025-05-22.log b/logs/robot_2025-05-22.log deleted file mode 100644 index 87f4a92..0000000 --- a/logs/robot_2025-05-22.log +++ /dev/null @@ -1,90 +0,0 @@ -2025-05-22 12:20:16 | DEBUG | utils.log_helper - 🐞 步骤1: 原始图像已加载 -2025-05-22 12:20:18 | DEBUG | utils.log_helper - 🐞 步骤2: 创建黄色掩码 -2025-05-22 12:20:19 | DEBUG | utils.log_helper - 🐞 步骤3: 提取黄色部分 -2025-05-22 12:20:20 | DEBUG | utils.log_helper - 🐞 检测底部和顶部边缘点 -2025-05-22 12:20:21 | DEBUG | utils.log_helper - 🐞 步骤4: 边缘检测 -2025-05-22 12:20:22 | DEBUG | utils.log_helper - 🐞 步骤5: 检测到 8 条直线 -2025-05-22 12:20:23 | DEBUG | utils.log_helper - 🐞 步骤6: 找到 5 条水平线 (下方: 5, 上方: 0) -2025-05-22 12:20:24 | DEBUG | utils.log_helper - 🐞 选择下方水平线 -2025-05-22 12:20:24 | DEBUG | utils.log_helper - 🐞 显示边缘斜率和中线交点 -2025-05-22 12:20:25 | INFO | utils.log_helper - ℹ️ 保存横向边缘检测结果图像到: logs/image/horizontal_edge_20250522_122025_111891.jpg -2025-05-22 12:20:25 | INFO | utils.log_helper - ℹ️ 横向边缘检测结果: {'timestamp': '20250522_122025_111891', 'edge_point': (1919, 862), 'distance_to_center': 959, 'slope': 0.03486394557823129, 'distance_to_bottom': 251.43452380952385, 'intersection_point': (960, 828), 'score': 0.6679311933106575, 'valid': True, 'reason': '', 'is_lower_line': array([ True, True, True, True])} -2025-05-22 12:20:38 | DEBUG | utils.log_helper - 🐞 步骤1: 原始图像已加载 -2025-05-22 12:20:39 | DEBUG | utils.log_helper - 🐞 步骤2: 创建黄色掩码 -2025-05-22 12:20:40 | DEBUG | utils.log_helper - 🐞 步骤3: 提取黄色部分 -2025-05-22 12:20:41 | DEBUG | utils.log_helper - 🐞 检测底部和顶部边缘点 -2025-05-22 12:20:42 | DEBUG | utils.log_helper - 🐞 步骤4: 边缘检测 -2025-05-22 12:20:43 | DEBUG | utils.log_helper - 🐞 步骤5: 检测到 8 条直线 -2025-05-22 12:20:44 | DEBUG | utils.log_helper - 🐞 步骤6: 找到 5 条水平线 (下方: 5, 上方: 0) -2025-05-22 12:20:45 | DEBUG | utils.log_helper - 🐞 选择下方水平线 -2025-05-22 12:20:45 | DEBUG | utils.log_helper - 🐞 显示边缘斜率和中线交点 -2025-05-22 12:20:47 | INFO | utils.log_helper - ℹ️ 保存横向边缘检测结果图像到: logs/image/horizontal_edge_20250522_122046_987809.jpg -2025-05-22 12:20:47 | INFO | utils.log_helper - ℹ️ 横向边缘检测结果: {'timestamp': '20250522_122046_987809', 'edge_point': (1919, 862), 'distance_to_center': 959, 'slope': 0.03486394557823129, 'distance_to_bottom': 251.43452380952385, 'intersection_point': (960, 828), 'score': 0.6679311933106575, 'valid': True, 'reason': '', 'is_lower_line': array([ True, True, True, True])} -2025-05-22 12:21:15 | DEBUG | utils.log_helper - 🐞 步骤1: 原始图像已加载 -2025-05-22 12:21:16 | DEBUG | utils.log_helper - 🐞 步骤2: 创建黄色掩码 -2025-05-22 12:21:17 | DEBUG | utils.log_helper - 🐞 步骤3: 提取黄色部分 -2025-05-22 12:21:18 | DEBUG | utils.log_helper - 🐞 检测底部和顶部边缘点 -2025-05-22 12:21:19 | DEBUG | utils.log_helper - 🐞 步骤4: 边缘检测 -2025-05-22 12:21:20 | DEBUG | utils.log_helper - 🐞 步骤5: 检测到 8 条直线 -2025-05-22 12:21:21 | DEBUG | utils.log_helper - 🐞 步骤6: 找到 5 条水平线 (下方: 5, 上方: 0) -2025-05-22 12:21:22 | DEBUG | utils.log_helper - 🐞 选择下方水平线 -2025-05-22 12:21:22 | DEBUG | utils.log_helper - 🐞 显示边缘斜率和中线交点 -2025-05-22 12:21:23 | INFO | utils.log_helper - ℹ️ 保存横向边缘检测结果图像到: logs/image/horizontal_edge_20250522_122123_802326.jpg -2025-05-22 12:21:23 | INFO | utils.log_helper - ℹ️ 横向边缘检测结果: {'timestamp': '20250522_122123_802326', 'edge_point': (1919, 862), 'distance_to_center': 959, 'slope': 0.03486394557823129, 'distance_to_bottom': 251.43452380952385, 'intersection_point': (960, 828), 'score': 0.6679311933106575, 'valid': True, 'reason': '', 'is_lower_line': array([ True, True, True, True])} -2025-05-22 12:22:26 | DEBUG | utils.log_helper - 🐞 步骤1: 原始图像已加载 -2025-05-22 12:22:28 | DEBUG | utils.log_helper - 🐞 步骤2: 创建黄色掩码 -2025-05-22 12:22:29 | DEBUG | utils.log_helper - 🐞 步骤3: 提取黄色部分 -2025-05-22 12:22:30 | DEBUG | utils.log_helper - 🐞 检测底部和顶部边缘点 -2025-05-22 12:22:31 | DEBUG | utils.log_helper - 🐞 步骤4: 边缘检测 -2025-05-22 12:22:32 | DEBUG | utils.log_helper - 🐞 步骤5: 检测到 8 条直线 -2025-05-22 12:22:33 | DEBUG | utils.log_helper - 🐞 步骤6: 找到 5 条水平线 (下方: 5, 上方: 0) -2025-05-22 12:22:34 | DEBUG | utils.log_helper - 🐞 选择下方水平线 -2025-05-22 12:22:34 | DEBUG | utils.log_helper - 🐞 显示边缘斜率和中线交点 -2025-05-22 12:22:35 | INFO | utils.log_helper - ℹ️ 保存横向边缘检测结果图像到: logs/image/horizontal_edge_20250522_122235_241410.jpg -2025-05-22 12:22:35 | INFO | utils.log_helper - ℹ️ 横向边缘检测结果: {'timestamp': '20250522_122235_241410', 'edge_point': (1919, 862), 'distance_to_center': 959, 'slope': 0.03486394557823129, 'distance_to_bottom': 251.43452380952385, 'intersection_point': (960, 828), 'score': 0.6679311933106575, 'valid': True, 'reason': '', 'is_lower_line': array([ True, True, True, True])} -2025-05-22 12:24:10 | DEBUG | utils.log_helper - 🐞 步骤1: 原始图像已加载 -2025-05-22 12:24:11 | DEBUG | utils.log_helper - 🐞 步骤2: 创建黄色掩码 -2025-05-22 12:24:12 | DEBUG | utils.log_helper - 🐞 步骤3: 提取黄色部分 -2025-05-22 12:24:13 | DEBUG | utils.log_helper - 🐞 检测底部和顶部边缘点 -2025-05-22 12:24:14 | DEBUG | utils.log_helper - 🐞 步骤4: 边缘检测 -2025-05-22 12:24:15 | DEBUG | utils.log_helper - 🐞 步骤5: 检测到 28 条直线 -2025-05-22 12:24:16 | DEBUG | utils.log_helper - 🐞 步骤6: 找到 6 条水平线 (下方: 6, 上方: 0) -2025-05-22 12:24:17 | DEBUG | utils.log_helper - 🐞 选择下方水平线 -2025-05-22 12:24:17 | DEBUG | utils.log_helper - 🐞 显示边缘斜率和中线交点 -2025-05-22 12:24:18 | INFO | utils.log_helper - ℹ️ 保存横向边缘检测结果图像到: logs/image/horizontal_edge_20250522_122418_738782.jpg -2025-05-22 12:24:18 | INFO | utils.log_helper - ℹ️ 横向边缘检测结果: {'timestamp': '20250522_122418_738782', 'edge_point': (91, 1078), 'distance_to_center': -869, 'slope': -0.07092198581560284, 'distance_to_bottom': 63.631205673758814, 'intersection_point': (960, 1016), 'score': 0.8014868667518458, 'valid': True, 'reason': '', 'is_lower_line': array([ True, True, True, True])} -2025-05-22 12:24:54 | DEBUG | utils.log_helper - 🐞 步骤1: 原始图像已加载 -2025-05-22 12:24:55 | DEBUG | utils.log_helper - 🐞 步骤2: 创建黄色掩码 -2025-05-22 12:24:56 | DEBUG | utils.log_helper - 🐞 步骤3: 提取黄色部分 -2025-05-22 12:24:57 | DEBUG | utils.log_helper - 🐞 检测底部和顶部边缘点 -2025-05-22 12:24:58 | DEBUG | utils.log_helper - 🐞 步骤4: 边缘检测 -2025-05-22 12:24:59 | DEBUG | utils.log_helper - 🐞 步骤5: 检测到 11 条直线 -2025-05-22 12:25:00 | DEBUG | utils.log_helper - 🐞 步骤6: 找到 1 条水平线 (下方: 1, 上方: 0) -2025-05-22 12:25:01 | DEBUG | utils.log_helper - 🐞 选择下方水平线 -2025-05-22 12:25:01 | DEBUG | utils.log_helper - 🐞 显示边缘斜率和中线交点 -2025-05-22 12:25:02 | INFO | utils.log_helper - ℹ️ 保存横向边缘检测结果图像到: logs/image/horizontal_edge_20250522_122502_339369.jpg -2025-05-22 12:25:02 | INFO | utils.log_helper - ℹ️ 横向边缘检测结果: {'timestamp': '20250522_122502_339369', 'edge_point': (1439, 899), 'distance_to_center': 479, 'slope': -0.07083333333333333, 'distance_to_bottom': 147.07083333333333, 'intersection_point': (960, 932), 'score': 0.5594172208352652, 'valid': True, 'reason': '', 'is_lower_line': array([ True, True, True, True])} -2025-05-22 12:33:02 | INFO | utils.log_helper - ℹ️ 保存横向边缘检测结果图像到: logs/image/horizontal_edge_20250522_123302_872381.jpg -2025-05-22 12:33:02 | INFO | utils.log_helper - ℹ️ 横向边缘检测结果: {'timestamp': '20250522_123302_872381', 'edge_point': (320, 1009), 'distance_to_center': -640, 'slope': -0.07331047777324741, 'distance_to_bottom': 117.91870577487839, 'intersection_point': (960, 962)} -2025-05-22 12:33:26 | INFO | utils.log_helper - ℹ️ 保存横向边缘检测结果图像到: logs/image/horizontal_edge_20250522_123326_235741.jpg -2025-05-22 12:33:26 | INFO | utils.log_helper - ℹ️ 横向边缘检测结果: {'timestamp': '20250522_123326_235741', 'edge_point': (320, 1009), 'distance_to_center': -640, 'slope': -0.07331047777324741, 'distance_to_bottom': 117.91870577487839, 'intersection_point': (960, 962)} -2025-05-22 12:34:09 | DEBUG | utils.log_helper - 🐞 步骤1: 原始图像已加载 -2025-05-22 12:34:10 | DEBUG | utils.log_helper - 🐞 步骤2: 创建黄色掩码 -2025-05-22 12:34:10 | DEBUG | utils.log_helper - 🐞 步骤3: 提取黄色部分 -2025-05-22 12:34:11 | DEBUG | utils.log_helper - 🐞 正在处理底部边缘点 -2025-05-22 12:34:12 | DEBUG | utils.log_helper - 🐞 显示拟合线段 -2025-05-22 12:34:13 | DEBUG | utils.log_helper - 👁️ 步骤5: 找到边缘点 (320, 1009) -2025-05-22 12:34:14 | DEBUG | utils.log_helper - 🐞 显示边缘斜率和中线交点 -2025-05-22 12:34:14 | INFO | utils.log_helper - ℹ️ 保存横向边缘检测结果图像到: logs/image/horizontal_edge_20250522_123414_979258.jpg -2025-05-22 12:34:14 | INFO | utils.log_helper - ℹ️ 横向边缘检测结果: {'timestamp': '20250522_123414_979258', 'edge_point': (320, 1009), 'distance_to_center': -640, 'slope': -0.07331047777324741, 'distance_to_bottom': 117.91870577487839, 'intersection_point': (960, 962)} -2025-05-22 12:34:34 | DEBUG | utils.log_helper - 🐞 步骤1: 原始图像已加载 -2025-05-22 12:34:35 | DEBUG | utils.log_helper - 🐞 步骤2: 创建黄色掩码 -2025-05-22 12:34:36 | DEBUG | utils.log_helper - 🐞 步骤3: 提取黄色部分 -2025-05-22 12:34:36 | DEBUG | utils.log_helper - 🐞 检测底部和顶部边缘点 -2025-05-22 12:34:37 | DEBUG | utils.log_helper - 🐞 步骤4: 边缘检测 -2025-05-22 12:34:38 | DEBUG | utils.log_helper - 🐞 步骤5: 检测到 11 条直线 -2025-05-22 12:34:39 | DEBUG | utils.log_helper - 🐞 步骤6: 找到 1 条水平线 (下方: 1, 上方: 0) -2025-05-22 12:34:40 | DEBUG | utils.log_helper - 🐞 选择下方水平线 -2025-05-22 12:34:40 | DEBUG | utils.log_helper - 🐞 显示边缘斜率和中线交点 -2025-05-22 12:34:41 | INFO | utils.log_helper - ℹ️ 保存横向边缘检测结果图像到: logs/image/horizontal_edge_20250522_123441_043307.jpg -2025-05-22 12:34:41 | INFO | utils.log_helper - ℹ️ 横向边缘检测结果: {'timestamp': '20250522_123441_043307', 'edge_point': (1439, 899), 'distance_to_center': 479, 'slope': -0.07083333333333333, 'distance_to_bottom': 147.07083333333333, 'intersection_point': (960, 932), 'score': 0.5594172208352652, 'valid': True, 'reason': '', 'is_lower_line': array([ True, True, True, True])} diff --git a/task_1/task_1.py b/task_1/task_1.py index 4a79069..3761ae3 100644 --- a/task_1/task_1.py +++ b/task_1/task_1.py @@ -50,7 +50,7 @@ def run_task_1(ctrl, msg): section('任务1-2:移动到横线', "移动") # 执行常规的移动操作,不需要 QR 码扫描 - move_to_hori_line(ctrl, msg, target_distance=1, observe=observe) + move_to_hori_line(ctrl, msg, target_distance=1.1, observe=observe) section('任务1-3:转弯', "旋转") direction = False # if res['qr_result'] == 'A-2' else True @@ -58,12 +58,14 @@ def run_task_1(ctrl, msg): ctrl=ctrl, msg=msg, angle_deg=-170, # 负值表示右转 - target_distance=0.8, + target_distance=0.6, + min_radius=0.3, + max_radius=0.4, # pass_align=True, observe=observe, # TODO clear - bad_big_angle_corret=True + bad_big_angle_corret=True, ) if turn_success: @@ -73,7 +75,7 @@ def run_task_1(ctrl, msg): return section('任务1-4:直线移动', "移动") - move_distance = 0.5 + move_distance = 0.3 move_speed = 0.5 if not direction: # TODO to check @@ -93,7 +95,7 @@ def run_task_1(ctrl, msg): ctrl.base_msg.stand_up() section('任务1-6:返回', "移动") - go_straight(ctrl, msg, distance=-(move_distance + res['radius'] + 0.2), speed=0.3, observe=observe) + go_straight(ctrl, msg, distance=-(move_distance + res['radius'] + 0.3), observe=observe) # turn and back turn_degree(ctrl, msg, degree=-90) @@ -102,15 +104,16 @@ def run_task_1(ctrl, msg): turn_success, res = arc_turn_around_hori_line( ctrl=ctrl, msg=msg, - radius=res['radius'] * 2, - angle_deg=85, + radius=res['radius'] * 2 + 0.3, + angle_deg=90, # pass_align=True, - observe=observe + observe=observe, + no_end_reset=True, ) section('任务1-8:直线移动', "移动") - move_to_hori_line(ctrl, msg, target_distance=0.4, observe=observe) + move_to_hori_line(ctrl, msg, target_distance=0.35, absolute_deg=90, observe=observe) section('任务1-9:90度旋转', "旋转") turn_degree(ctrl, msg, degree=0, absolute=True) # TODO @@ -119,4 +122,3 @@ def run_task_1(ctrl, msg): # TODO success("任务1完成", "完成") - diff --git a/utils/detect_track.py b/utils/detect_track.py index 63d830c..41e57fb 100644 --- a/utils/detect_track.py +++ b/utils/detect_track.py @@ -19,7 +19,7 @@ def detect_horizontal_track_edge(image, observe=False, delay=1000, save_log=True edge_point: 赛道前方边缘点的坐标 (x, y) edge_info: 边缘信息字典 """ - # observe = False # TSET + observe = False # TEST # 如果输入是字符串(文件路径),则加载图像 if isinstance(image, str): img = cv2.imread(image) @@ -311,6 +311,12 @@ def detect_horizontal_track_edge(image, observe=False, delay=1000, save_log=True timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S_%f") log_dir = "logs/image" os.makedirs(log_dir, exist_ok=True) + + # origin image + origin_image_path = os.path.join(log_dir, f"origin_horizontal_edge_{timestamp}.jpg") + cv2.imwrite(origin_image_path, img) + info(f"保存原始图像到: {origin_image_path}", "日志") + img_path = os.path.join(log_dir, f"horizontal_edge_{timestamp}.jpg") cv2.imwrite(img_path, result_img) info(f"保存横向边缘检测结果图像到: {img_path}", "日志")