fix the laser point x,y
This commit is contained in:
@@ -243,15 +243,17 @@ class LaserManager:
|
|||||||
logger.error(f"[LASER] BCD 解析失败: {e}")
|
logger.error(f"[LASER] BCD 解析失败: {e}")
|
||||||
return 0.0
|
return 0.0
|
||||||
|
|
||||||
def read_distance_from_laser_sensor(self) -> float:
|
def read_distance_from_laser_sensor(self):
|
||||||
"""发送测距指令并返回距离(米)"""
|
"""发送测距指令并返回距离(米)和信号质量
|
||||||
|
返回: (distance_m, signal_quality) 元组,失败返回 (0.0, 0)
|
||||||
|
"""
|
||||||
from hardware import hardware_manager
|
from hardware import hardware_manager
|
||||||
logger = logger_manager.logger
|
logger = logger_manager.logger
|
||||||
|
|
||||||
if hardware_manager.distance_serial is None:
|
if hardware_manager.distance_serial is None:
|
||||||
if logger:
|
if logger:
|
||||||
logger.error("[LASER] distance_serial 未初始化")
|
logger.error("[LASER] distance_serial 未初始化")
|
||||||
return 0.0
|
return (0.0, 0)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# 清空缓冲区
|
# 清空缓冲区
|
||||||
@@ -278,19 +280,19 @@ class LaserManager:
|
|||||||
|
|
||||||
while True:
|
while True:
|
||||||
# 检查是否超时
|
# 检查是否超时
|
||||||
elapsed_ms = time.ticks_diff(start_time,time.ticks_ms())
|
# 注意:使用 time.ticks_diff(start_time, time.ticks_ms()) 避免负数问题
|
||||||
print("elapsed_ms:", elapsed_ms)
|
elapsed_ms = abs(time.ticks_diff(start_time, time.ticks_ms()))
|
||||||
if elapsed_ms >= max_wait_ms:
|
if elapsed_ms >= max_wait_ms:
|
||||||
if logger:
|
if logger:
|
||||||
logger.warning(f"[LASER] 读取超时 ({elapsed_ms}ms),未收到完整响应")
|
logger.warning(f"[LASER] 读取超时 ({elapsed_ms}ms),未收到完整响应")
|
||||||
return 0.0
|
return (0.0, 0)
|
||||||
|
|
||||||
# 尝试读取数据
|
# 尝试读取数据
|
||||||
response = hardware_manager.distance_serial.read(config.DISTANCE_RESPONSE_LEN)
|
response = hardware_manager.distance_serial.read(config.DISTANCE_RESPONSE_LEN)
|
||||||
|
|
||||||
# 如果读到完整数据,立即返回
|
# 如果读到完整数据,立即返回
|
||||||
if response and len(response) == config.DISTANCE_RESPONSE_LEN:
|
if response and len(response) == config.DISTANCE_RESPONSE_LEN:
|
||||||
elapsed_ms = time.ticks_diff(start_time,time.ticks_ms())
|
elapsed_ms = abs(time.ticks_diff(start_time, time.ticks_ms()))
|
||||||
if logger:
|
if logger:
|
||||||
logger.debug(f"[LASER] 收到响应 ({elapsed_ms}ms)")
|
logger.debug(f"[LASER] 收到响应 ({elapsed_ms}ms)")
|
||||||
break
|
break
|
||||||
@@ -305,7 +307,7 @@ class LaserManager:
|
|||||||
err_code = (response[7] << 8) | response[8]
|
err_code = (response[7] << 8) | response[8]
|
||||||
if logger:
|
if logger:
|
||||||
logger.warning(f"[LASER] 模块错误代码: {hex(err_code)}")
|
logger.warning(f"[LASER] 模块错误代码: {hex(err_code)}")
|
||||||
return 0.0
|
return (0.0, 0)
|
||||||
|
|
||||||
# 解析BCD码距离
|
# 解析BCD码距离
|
||||||
bcd_bytes = response[6:10]
|
bcd_bytes = response[6:10]
|
||||||
@@ -314,22 +316,22 @@ class LaserManager:
|
|||||||
|
|
||||||
if logger:
|
if logger:
|
||||||
logger.debug(f"[LASER] 测距成功: {distance_value_m:.3f} m, 信号质量: {signal_quality}")
|
logger.debug(f"[LASER] 测距成功: {distance_value_m:.3f} m, 信号质量: {signal_quality}")
|
||||||
return distance_value_m
|
return (distance_value_m, signal_quality)
|
||||||
|
|
||||||
if logger:
|
if logger:
|
||||||
logger.warning(f"[LASER] 无效响应: {response.hex() if response else 'None'}")
|
logger.warning(f"[LASER] 无效响应: {response.hex() if response else 'None'}")
|
||||||
return 0.0
|
return (0.0, 0)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger = logger_manager.logger
|
logger = logger_manager.logger
|
||||||
if logger:
|
if logger:
|
||||||
logger.error(f"[LASER] 读取激光测距失败: {e}")
|
logger.error(f"[LASER] 读取激光测距失败: {e}")
|
||||||
return 0.0
|
return (0.0, 0)
|
||||||
|
|
||||||
def quick_measure_distance(self) -> float:
|
def quick_measure_distance(self):
|
||||||
"""
|
"""
|
||||||
快速激光测距:打开激光 → 测距 → 关闭激光
|
快速激光测距:打开激光 → 测距 → 关闭激光
|
||||||
激光开启时间最小化(约500-600ms),尽量不让用户觉察到
|
激光开启时间最小化(约500-600ms),尽量不让用户觉察到
|
||||||
返回距离(米),失败返回0.0
|
返回: (distance_m, signal_quality) 元组,失败返回 (0.0, 0)
|
||||||
"""
|
"""
|
||||||
logger = logger_manager.logger
|
logger = logger_manager.logger
|
||||||
self._laser_turned_on = False
|
self._laser_turned_on = False
|
||||||
@@ -340,14 +342,13 @@ class LaserManager:
|
|||||||
# 等待激光稳定(最小延迟)
|
# 等待激光稳定(最小延迟)
|
||||||
# time.sleep_ms(50)
|
# time.sleep_ms(50)
|
||||||
|
|
||||||
# 读取距离
|
# 读取距离和信号质量
|
||||||
distance_m = self.read_distance_from_laser_sensor()
|
result = self.read_distance_from_laser_sensor()
|
||||||
|
return result
|
||||||
return distance_m
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
if logger:
|
if logger:
|
||||||
logger.error(f"[LASER] 快速测距异常: {e}")
|
logger.error(f"[LASER] 快速测距异常: {e}")
|
||||||
return 0.0
|
return (0.0, 0)
|
||||||
finally:
|
finally:
|
||||||
# 确保激光关闭
|
# 确保激光关闭
|
||||||
if self._laser_turned_on:
|
if self._laser_turned_on:
|
||||||
|
|||||||
12
main.py
12
main.py
@@ -319,11 +319,18 @@ def cmd_str():
|
|||||||
|
|
||||||
# 快速激光测距(激光一闪而过,约500-600ms)
|
# 快速激光测距(激光一闪而过,约500-600ms)
|
||||||
laser_distance_m = None
|
laser_distance_m = None
|
||||||
|
laser_signal_quality = 0
|
||||||
try:
|
try:
|
||||||
laser_distance_m = laser_manager.quick_measure_distance()
|
result = laser_manager.quick_measure_distance()
|
||||||
|
if isinstance(result, tuple) and len(result) == 2:
|
||||||
|
laser_distance_m, laser_signal_quality = result
|
||||||
|
else:
|
||||||
|
# 向后兼容:如果返回的是单个值
|
||||||
|
laser_distance_m = result if isinstance(result, (int, float)) else 0.0
|
||||||
|
laser_signal_quality = 0
|
||||||
if logger:
|
if logger:
|
||||||
if laser_distance_m > 0:
|
if laser_distance_m > 0:
|
||||||
logger.info(f"[MAIN] 激光测距成功: {laser_distance_m:.3f} m")
|
logger.info(f"[MAIN] 激光测距成功: {laser_distance_m:.3f} m, 信号质量: {laser_signal_quality}")
|
||||||
else:
|
else:
|
||||||
logger.warning("[MAIN] 激光测距失败或返回0")
|
logger.warning("[MAIN] 激光测距失败或返回0")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -355,6 +362,7 @@ def cmd_str():
|
|||||||
"r": 90.0,
|
"r": 90.0,
|
||||||
"d": round((distance_m or 0.0) * 100), # 视觉测距值(厘米)
|
"d": round((distance_m or 0.0) * 100), # 视觉测距值(厘米)
|
||||||
"d_laser": round((laser_distance_m or 0.0) * 100), # 激光测距值(厘米)
|
"d_laser": round((laser_distance_m or 0.0) * 100), # 激光测距值(厘米)
|
||||||
|
"d_laser_quality": laser_signal_quality, # 激光测距信号质量
|
||||||
"m": method if method else "no_target",
|
"m": method if method else "no_target",
|
||||||
"adc": adc_val
|
"adc": adc_val
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -209,7 +209,7 @@ def compute_laser_position(circle_center, laser_point, radius, method):
|
|||||||
if not all([circle_center, radius, method]):
|
if not all([circle_center, radius, method]):
|
||||||
return None, None
|
return None, None
|
||||||
cx, cy = circle_center
|
cx, cy = circle_center
|
||||||
lx, ly = laser_point
|
lx, ly = 320, 230
|
||||||
# 根据检测方法动态调整靶心物理半径(简化模型)
|
# 根据检测方法动态调整靶心物理半径(简化模型)
|
||||||
circle_r = (radius / 4.0) * 20.0 if method == "模糊" else (68 / 16.0) * 20.0
|
circle_r = (radius / 4.0) * 20.0 if method == "模糊" else (68 / 16.0) * 20.0
|
||||||
dx = lx - cx
|
dx = lx - cx
|
||||||
|
|||||||
Reference in New Issue
Block a user