在多个函数中添加了 save_log 参数以增强日志记录功能,确保在检测横向和双轨道线时保存相关图像和日志信息。更新了 detect_horizontal_track_edge 和 detect_dual_track_lines 函数,提升了调试信息的可追踪性和可读性。同时,删除了旧的日志文件,优化了代码结构。

This commit is contained in:
Havoc 2025-05-18 15:53:07 +08:00
parent 0534261b80
commit 9e0692dca4
9 changed files with 71 additions and 117 deletions

View File

@ -35,7 +35,7 @@ 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)
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 edge_point is None or edge_info is None:
error("未检测到横向线,无法进行校准", "失败")
@ -254,7 +254,7 @@ def move_to_hori_line(ctrl, msg, target_distance=0.5, observe=False):
# 检测横向线
image = ctrl.image_processor.get_current_image()
edge_point, edge_info = detect_horizontal_track_edge(image, observe=observe)
edge_point, edge_info = detect_horizontal_track_edge(image, observe=observe, save_log=True)
if edge_point is None or edge_info is None:
error("无法检测到横向线,停止移动", "停止")
@ -411,7 +411,7 @@ def arc_turn_around_hori_line(ctrl, msg, angle_deg=90, left=True, target_distanc
# 2. 检测横线并计算距离
image = ctrl.image_processor.get_current_image()
edge_point, edge_info = detect_horizontal_track_edge(image, observe=observe)
edge_point, edge_info = detect_horizontal_track_edge(image, observe=observe, save_log=True)
if edge_point is None or edge_info is None:
error("无法检测到横向线,停止动作", "停止")
if scan_qrcode:
@ -933,7 +933,7 @@ def follow_dual_tracks(ctrl, msg, speed=0.5, max_time=30, target_distance=None,
# 检测双轨道线
detection_total_count += 1
center_info, left_info, right_info = detect_dual_track_lines(image, observe=observe)
center_info, left_info, right_info = detect_dual_track_lines(image, observe=observe, save_log=True)
# 使用帧间滤波增强稳定性
if center_info is not None:

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

View File

@ -1,97 +0,0 @@
2025-05-17 11:56:11 | INFO | utils.log_helper - ================== 🔑 日志模块测试 🔑 ==================
2025-05-17 11:56:11 | INFO | utils.log_helper - ================== 基本日志测试 ==================
2025-05-17 11:56:11 | DEBUG | utils.log_helper - 这是一条调试信息
2025-05-17 11:56:11 | INFO | utils.log_helper - 这是一条普通信息
2025-05-17 11:56:11 | WARNING | utils.log_helper - ⚠️ 这是一条警告信息
2025-05-17 11:56:11 | ERROR | utils.log_helper - 🚫 这是一条错误信息
2025-05-17 11:56:11 | SUCCESS | utils.log_helper - ✅ 这是一条成功信息
2025-05-17 11:56:11 | DEBUG | utils.log_helper - 不带emoji的调试信息
2025-05-17 11:56:11 | INFO | utils.log_helper - 不带emoji的普通信息
2025-05-17 11:56:11 | INFO | utils.log_helper - ================== ⏱️ 计时日志测试 ⏱️ ==================
2025-05-17 11:56:11 | INFO | utils.log_helper - ⏱️ 求和计算耗时: 31.7毫秒
2025-05-17 11:56:11 | INFO | utils.log_helper - ⏱️ 计算正弦耗时: 0.0毫秒
2025-05-17 11:56:11 | INFO | utils.log_helper - ================== 🔄 旋转操作开始 🔄 ==================
2025-05-17 11:56:11 | DEBUG | utils.log_helper - 🐞 准备旋转
2025-05-17 11:56:11 | INFO | utils.log_helper - 🔄 开始执行旋转
2025-05-17 11:56:11 | INFO | utils.log_helper - 📐 旋转角度: 90度
2025-05-17 11:56:11 | SUCCESS | utils.log_helper - 🏁 旋转完成
2025-05-17 11:56:11 | INFO | utils.log_helper - ====================== 👁️ 检测横线 👁️ ======================
2025-05-17 11:56:11 | INFO | utils.log_helper - 👁️ 开始检测横线
2025-05-17 11:56:11 | INFO | utils.log_helper - 📏 检测到横线,距离: 0.5米
2025-05-17 11:56:11 | SUCCESS | utils.log_helper - 🏁 检测完成
2025-05-17 11:56:11 | INFO | utils.log_helper - ============== 🔑 Rich功能测试 🔑 ==============
2025-05-17 11:56:11 | INFO | utils.log_helper - 机器人状态参数 - 表格数据共4行
2025-05-17 11:57:04 | INFO | utils.log_helper - ================== 🔑 日志模块测试 🔑 ==================
2025-05-17 11:57:04 | INFO | utils.log_helper - ================== 基本日志测试 ==================
2025-05-17 11:57:04 | DEBUG | utils.log_helper - 这是一条调试信息
2025-05-17 11:57:04 | INFO | utils.log_helper - 这是一条普通信息
2025-05-17 11:57:04 | WARNING | utils.log_helper - ⚠️ 这是一条警告信息
2025-05-17 11:57:04 | ERROR | utils.log_helper - 🚫 这是一条错误信息
2025-05-17 11:57:04 | SUCCESS | utils.log_helper - ✅ 这是一条成功信息
2025-05-17 11:57:04 | DEBUG | utils.log_helper - 不带emoji的调试信息
2025-05-17 11:57:04 | INFO | utils.log_helper - 不带emoji的普通信息
2025-05-17 11:57:04 | INFO | utils.log_helper - ================== ⏱️ 计时日志测试 ⏱️ ==================
2025-05-17 11:57:04 | INFO | utils.log_helper - ⏱️ 求和计算耗时: 33.8毫秒
2025-05-17 11:57:04 | INFO | utils.log_helper - ⏱️ 计算正弦耗时: 0.0毫秒
2025-05-17 11:57:04 | INFO | utils.log_helper - ================== 🔄 旋转操作开始 🔄 ==================
2025-05-17 11:57:04 | DEBUG | utils.log_helper - 🐞 准备旋转
2025-05-17 11:57:04 | INFO | utils.log_helper - 🔄 开始执行旋转
2025-05-17 11:57:04 | INFO | utils.log_helper - 📐 旋转角度: 90度
2025-05-17 11:57:04 | SUCCESS | utils.log_helper - 🏁 旋转完成
2025-05-17 11:57:04 | INFO | utils.log_helper - ====================== 👁️ 检测横线 👁️ ======================
2025-05-17 11:57:04 | INFO | utils.log_helper - 👁️ 开始检测横线
2025-05-17 11:57:04 | INFO | utils.log_helper - 📏 检测到横线,距离: 0.5米
2025-05-17 11:57:04 | SUCCESS | utils.log_helper - 🏁 检测完成
2025-05-17 11:57:04 | INFO | utils.log_helper - ============== 🔑 Rich功能测试 🔑 ==============
2025-05-17 11:57:04 | INFO | utils.log_helper - 机器人状态参数 - 表格数据共4行
2025-05-17 11:57:06 | SUCCESS | utils.log_helper - 🏁 所有测试完成!
2025-05-17 12:32:58 | INFO | utils.log_helper - ================== 基本日志测试 ==================
2025-05-17 12:32:58 | DEBUG | utils.log_helper - 🐞 这是一条调试信息
2025-05-17 12:32:58 | INFO | utils.log_helper - 这是一条普通信息
2025-05-17 12:32:58 | WARNING | utils.log_helper - ⚠️ 这是一条警告信息
2025-05-17 12:32:58 | ERROR | utils.log_helper - 🚫 这是一条错误信息
2025-05-17 12:32:58 | SUCCESS | utils.log_helper - ✅ 这是一条成功信息
2025-05-17 12:32:58 | INFO | utils.log_helper - 这是一条没有emoji的普通信息
2025-05-17 12:32:58 | WARNING | utils.log_helper - 这是一条没有emoji的警告信息
2025-05-17 12:32:58 | INFO | utils.log_helper - ⏱️ 耗时操作耗时: 0.500秒
2025-05-17 12:32:58 | INFO | utils.log_helper - ============== Rich功能测试 ==============
2025-05-17 12:32:58 | INFO | utils.log_helper - 系统状态 - 表格数据共4行
2025-05-17 12:32:59 | INFO | utils.log_helper - ========== 自定义日志记录器测试 ==========
2025-05-17 12:32:59 | INFO | utils.log_helper - 🚀 机器人初始化完成
2025-05-17 12:32:59 | WARNING | utils.log_helper - ⚠️ 光照条件不佳
2025-05-17 12:32:59 | SUCCESS | utils.log_helper - 📍 到达目标位置
2025-05-17 12:32:59 | ERROR | utils.log_helper - 🚫 处理图像时出错: 传感器数据异常
2025-05-17 12:32:59 | INFO | utils.log_helper - ====================== 🏁 测试完成 🏁 ======================
2025-05-17 12:32:59 | SUCCESS | utils.log_helper - 🏁 日志系统功能测试全部完成
2025-05-17 12:33:06 | INFO | utils.log_helper - ====================== 🚀 系统启动 🚀 ======================
2025-05-17 12:33:07 | SUCCESS | utils.log_helper - ✅ 视觉系统初始化完成
2025-05-17 12:33:07 | SUCCESS | utils.log_helper - ✅ 导航模块初始化完成
2025-05-17 12:33:07 | SUCCESS | utils.log_helper - ✅ 电机控制器初始化完成
2025-05-17 12:33:07 | WARNING | utils.log_helper - ⚠️ 传感器阵列初始化出现延迟
2025-05-17 12:33:07 | SUCCESS | utils.log_helper - ✅ 通信模块初始化完成
2025-05-17 12:33:08 | SUCCESS | utils.log_helper - ✅ 决策系统初始化完成
2025-05-17 12:33:08 | SUCCESS | utils.log_helper - ✅ 电源管理初始化完成
2025-05-17 12:33:08 | SUCCESS | utils.log_helper - ✅ 安全模块初始化完成
2025-05-17 12:33:08 | INFO | utils.log_helper - ⏱️ 系统初始化耗时: 1.559秒
2025-05-17 12:33:08 | INFO | utils.log_helper - ================== 👁️ 系统状态检查 👁️ ==================
2025-05-17 12:33:08 | INFO | utils.log_helper - 系统状态 - 表格数据共4行
2025-05-17 12:33:08 | INFO | utils.log_helper - 系统温度正常: 25.1°C
2025-05-17 12:33:08 | INFO | utils.log_helper - ====================== 🚶 开始移动 🚶 ======================
2025-05-17 12:33:08 | INFO | utils.log_helper - 🧮 开始规划路径
2025-05-17 12:33:09 | INFO | utils.log_helper - 🚶 移动到航点 1: (1.0, 0.0)
2025-05-17 12:33:09 | WARNING | utils.log_helper - 👁️ 检测到障碍物,调整路径
2025-05-17 12:33:09 | SUCCESS | utils.log_helper - 📍 到达航点 1
2025-05-17 12:33:09 | INFO | utils.log_helper - 🚶 移动到航点 2: (1.0, 1.0)
2025-05-17 12:33:10 | WARNING | utils.log_helper - 👁️ 检测到障碍物,调整路径
2025-05-17 12:33:10 | SUCCESS | utils.log_helper - 📍 到达航点 2
2025-05-17 12:33:10 | INFO | utils.log_helper - 🚶 移动到航点 3: (0.0, 1.0)
2025-05-17 12:33:11 | WARNING | utils.log_helper - 👁️ 检测到障碍物,调整路径
2025-05-17 12:33:11 | SUCCESS | utils.log_helper - 📍 到达航点 3
2025-05-17 12:33:11 | INFO | utils.log_helper - 🚶 移动到航点 4: (0.0, 0.0)
2025-05-17 12:33:11 | SUCCESS | utils.log_helper - 📍 到达航点 4
2025-05-17 12:33:11 | INFO | utils.log_helper - ⏱️ 路径执行耗时: 2.913秒
2025-05-17 12:33:11 | INFO | utils.log_helper - ================== 🐞 错误处理测试 🐞 ==================
2025-05-17 12:33:11 | INFO | utils.log_helper - 🧮 执行复杂计算
2025-05-17 12:33:12 | SUCCESS | utils.log_helper - 🏁 计算完成
2025-05-17 12:33:12 | INFO | utils.log_helper - ====================== 🏁 演示完成 🏁 ======================
2025-05-17 12:33:12 | SUCCESS | utils.log_helper - 🏁 机器人日志系统演示完成

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

View File

@ -88,7 +88,8 @@ def align_to_horizontal_line(ctrl, msg, observe=False):
# 检测横向线边缘
edge_point, edge_info = detect_horizontal_track_edge(
ctrl.image_processor.get_current_image(),
observe=observe
observe=observe,
save_log=True
)
if edge_point is None:

View File

@ -17,7 +17,7 @@ def process_image(image_path, save_dir=None, show_steps=False):
# 检测赛道并估算距离
start_time = time.time()
edge_point, edge_info = detect_horizontal_track_edge(image_path, observe=show_steps)
edge_point, edge_info = detect_horizontal_track_edge(image_path, observe=show_steps, save_log=True)
processing_time = time.time() - start_time
# 输出结果

View File

@ -107,7 +107,7 @@ def process_image(image_path, save_dir=None, show_steps=False):
# 测试双轨道线检测
print("\n执行双轨道线检测...")
start_time = time.time()
center_info, left_info, right_info = detect_dual_track_lines(image, observe=show_steps)
center_info, left_info, right_info = detect_dual_track_lines(image, observe=show_steps, save_log=True)
processing_time = time.time() - start_time
print(f"处理时间: {processing_time:.4f}")

View File

@ -1,22 +1,24 @@
import cv2
import numpy as np
import os
import datetime
from sklearn import linear_model
from utils.log_helper import get_logger, debug, info, warning, error, success
def detect_horizontal_track_edge(image, observe=False, delay=1000):
observe = False # TSET
def detect_horizontal_track_edge(image, observe=False, delay=1000, save_log=True):
"""
检测正前方横向黄色赛道的边缘并返回y值最大的边缘点
参数:
image: 输入图像可以是文件路径或者已加载的图像数组
observe: 是否输出中间状态信息和可视化结果默认为False
delay: 展示每个步骤的等待时间(毫秒)
delay: 展示每个步骤的等待时间(毫秒)
save_log: 是否保存日志和图像
返回:
edge_point: 赛道前方边缘点的坐标 (x, y)
edge_info: 边缘信息字典
"""
observe = False # TSET
# 如果输入是字符串(文件路径),则加载图像
if isinstance(image, str):
img = cv2.imread(image)
@ -272,8 +274,8 @@ def detect_horizontal_track_edge(image, observe=False, delay=1000):
# 计算交点到图像底部的距离(以像素为单位)
distance_to_bottom = height - intersection_y
if observe:
debug("显示边缘斜率和中线交点", "显示")
result_img = None
if observe or save_log:
slope_img = img.copy()
# 画出检测到的线
cv2.line(slope_img, (x1, y1), (x2, y2), (0, 255, 0), 2)
@ -295,9 +297,33 @@ def detect_horizontal_track_edge(image, observe=False, delay=1000):
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.putText(slope_img, f"中线交点: ({intersection_point[0]}, {intersection_point[1]})", (10, 150),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.imshow("边缘斜率和中线交点", slope_img)
cv2.imwrite("res/path/test/edge_img.png", slope_img)
cv2.waitKey(delay)
if observe:
debug("显示边缘斜率和中线交点", "显示")
cv2.imshow("边缘斜率和中线交点", slope_img)
cv2.waitKey(delay)
result_img = slope_img
# 保存日志图像
if save_log and result_img is not None:
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S_%f")
log_dir = "logs/image"
os.makedirs(log_dir, exist_ok=True)
img_path = os.path.join(log_dir, f"horizontal_edge_{timestamp}.jpg")
cv2.imwrite(img_path, result_img)
info(f"保存横向边缘检测结果图像到: {img_path}", "日志")
# 保存文本日志信息
log_info = {
"timestamp": timestamp,
"edge_point": bottom_edge_point,
"distance_to_center": distance_to_center,
"slope": selected_slope,
"distance_to_bottom": distance_to_bottom,
"intersection_point": intersection_point
}
info(f"横向边缘检测结果: {log_info}", "日志")
# 创建边缘信息字典
edge_info = {
@ -318,7 +344,7 @@ def detect_horizontal_track_edge(image, observe=False, delay=1000):
if __name__ == "__main__":
pass
def detect_dual_track_lines(image, observe=False, delay=1000):
def detect_dual_track_lines(image, observe=False, delay=1000, save_log=True):
"""
检测左右两条平行的黄色轨道线
@ -326,6 +352,7 @@ def detect_dual_track_lines(image, observe=False, delay=1000):
image: 输入图像可以是文件路径或者已加载的图像数组
observe: 是否输出中间状态信息和可视化结果默认为False
delay: 展示每个步骤的等待时间(毫秒)
save_log: 是否保存日志和图像
返回:
tuple: (中心线信息, 左轨迹线信息, 右轨迹线信息)
@ -518,7 +545,8 @@ def detect_dual_track_lines(image, observe=False, delay=1000):
# 计算中心线与图像中心线的偏差
deviation = bottom_x - center_x
if observe:
result_img = None
if observe or save_log:
result_img = img.copy()
# 绘制左右轨迹线
cv2.line(result_img, (left_x1, left_y1), (left_x2, left_y2), (255, 0, 0), 2)
@ -535,8 +563,30 @@ def detect_dual_track_lines(image, observe=False, delay=1000):
cv2.putText(result_img, f"Deviation: {deviation}px", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.imshow("轨迹线检测结果", result_img)
cv2.waitKey(delay)
if observe:
cv2.imshow("轨迹线检测结果", result_img)
cv2.waitKey(delay)
# 保存日志图像
if save_log and result_img is not None:
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S_%f")
log_dir = "logs/image"
os.makedirs(log_dir, exist_ok=True)
img_path = os.path.join(log_dir, f"dual_track_{timestamp}.jpg")
cv2.imwrite(img_path, result_img)
info(f"保存双轨迹线检测结果图像到: {img_path}", "日志")
# 保存文本日志信息
log_info = {
"timestamp": timestamp,
"center_point": center_point,
"deviation": deviation,
"left_track_mid_x": left_line[1],
"right_track_mid_x": right_line[1],
"track_width": right_line[1] - left_line[1],
"center_slope": center_slope
}
info(f"双轨迹线检测结果: {log_info}", "日志")
# 创建左右轨迹线和中心线信息
left_track_info = {