fix the laser point x,y
This commit is contained in:
@@ -243,15 +243,17 @@ class LaserManager:
|
||||
logger.error(f"[LASER] BCD 解析失败: {e}")
|
||||
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
|
||||
logger = logger_manager.logger
|
||||
|
||||
if hardware_manager.distance_serial is None:
|
||||
if logger:
|
||||
logger.error("[LASER] distance_serial 未初始化")
|
||||
return 0.0
|
||||
return (0.0, 0)
|
||||
|
||||
try:
|
||||
# 清空缓冲区
|
||||
@@ -278,19 +280,19 @@ class LaserManager:
|
||||
|
||||
while True:
|
||||
# 检查是否超时
|
||||
elapsed_ms = time.ticks_diff(start_time,time.ticks_ms())
|
||||
print("elapsed_ms:", elapsed_ms)
|
||||
# 注意:使用 time.ticks_diff(start_time, time.ticks_ms()) 避免负数问题
|
||||
elapsed_ms = abs(time.ticks_diff(start_time, time.ticks_ms()))
|
||||
if elapsed_ms >= max_wait_ms:
|
||||
if logger:
|
||||
logger.warning(f"[LASER] 读取超时 ({elapsed_ms}ms),未收到完整响应")
|
||||
return 0.0
|
||||
return (0.0, 0)
|
||||
|
||||
# 尝试读取数据
|
||||
response = hardware_manager.distance_serial.read(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:
|
||||
logger.debug(f"[LASER] 收到响应 ({elapsed_ms}ms)")
|
||||
break
|
||||
@@ -305,7 +307,7 @@ class LaserManager:
|
||||
err_code = (response[7] << 8) | response[8]
|
||||
if logger:
|
||||
logger.warning(f"[LASER] 模块错误代码: {hex(err_code)}")
|
||||
return 0.0
|
||||
return (0.0, 0)
|
||||
|
||||
# 解析BCD码距离
|
||||
bcd_bytes = response[6:10]
|
||||
@@ -314,22 +316,22 @@ class LaserManager:
|
||||
|
||||
if logger:
|
||||
logger.debug(f"[LASER] 测距成功: {distance_value_m:.3f} m, 信号质量: {signal_quality}")
|
||||
return distance_value_m
|
||||
return (distance_value_m, signal_quality)
|
||||
|
||||
if logger:
|
||||
logger.warning(f"[LASER] 无效响应: {response.hex() if response else 'None'}")
|
||||
return 0.0
|
||||
return (0.0, 0)
|
||||
except Exception as e:
|
||||
logger = logger_manager.logger
|
||||
if logger:
|
||||
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),尽量不让用户觉察到
|
||||
返回距离(米),失败返回0.0
|
||||
返回: (distance_m, signal_quality) 元组,失败返回 (0.0, 0)
|
||||
"""
|
||||
logger = logger_manager.logger
|
||||
self._laser_turned_on = False
|
||||
@@ -340,14 +342,13 @@ class LaserManager:
|
||||
# 等待激光稳定(最小延迟)
|
||||
# time.sleep_ms(50)
|
||||
|
||||
# 读取距离
|
||||
distance_m = self.read_distance_from_laser_sensor()
|
||||
|
||||
return distance_m
|
||||
# 读取距离和信号质量
|
||||
result = self.read_distance_from_laser_sensor()
|
||||
return result
|
||||
except Exception as e:
|
||||
if logger:
|
||||
logger.error(f"[LASER] 快速测距异常: {e}")
|
||||
return 0.0
|
||||
return (0.0, 0)
|
||||
finally:
|
||||
# 确保激光关闭
|
||||
if self._laser_turned_on:
|
||||
|
||||
12
main.py
12
main.py
@@ -319,11 +319,18 @@ def cmd_str():
|
||||
|
||||
# 快速激光测距(激光一闪而过,约500-600ms)
|
||||
laser_distance_m = None
|
||||
laser_signal_quality = 0
|
||||
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 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:
|
||||
logger.warning("[MAIN] 激光测距失败或返回0")
|
||||
except Exception as e:
|
||||
@@ -355,6 +362,7 @@ def cmd_str():
|
||||
"r": 90.0,
|
||||
"d": round((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",
|
||||
"adc": adc_val
|
||||
}
|
||||
|
||||
@@ -209,7 +209,7 @@ def compute_laser_position(circle_center, laser_point, radius, method):
|
||||
if not all([circle_center, radius, method]):
|
||||
return None, None
|
||||
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
|
||||
dx = lx - cx
|
||||
|
||||
Reference in New Issue
Block a user