网站网站怎么做代理咸阳市网站建设
2026/4/17 6:32:42 网站建设 项目流程
网站网站怎么做代理,咸阳市网站建设,建设网站需要哪些人,邢台中高风险地区查询视障人士防撞预警系统一、实际应用场景与痛点应用场景视障用户李先生在户外使用导盲杖行走。虽然导盲杖能探测地面障碍#xff0c;但无法检测空中障碍物#xff08;如低垂树枝、广告牌、打开的窗户#xff09;和前方较远障碍。在一次行走中#xff0c;他不慎撞到低矮的伸缩…视障人士防撞预警系统一、实际应用场景与痛点应用场景视障用户李先生在户外使用导盲杖行走。虽然导盲杖能探测地面障碍但无法检测空中障碍物如低垂树枝、广告牌、打开的窗户和前方较远障碍。在一次行走中他不慎撞到低矮的伸缩门导致头部受伤。他急需一款能实时探测前方障碍物并语音预警的智能辅助设备。核心痛点1. 探测盲区导盲杖主要探测地面对空中和前方障碍探测不足2. 反应延迟发现障碍时已距离过近来不及避让3. 预警不直观传统振动反馈无法表达障碍物的距离和方位4. 环境适应性差不同光照、天气条件下探测准确性下降5. 操作复杂多设备配合使用对视障用户不友好6. 续航问题长时间户外使用需要持续供电二、核心逻辑设计1. 初始化传感器超声波/雷达/深度摄像头2. 实时扫描前方区域获取距离数据3. 处理原始数据滤除噪声干扰4. 划分安全区域近、中、远距离警告区5. 根据距离计算危险等级6. 生成多级别语音警报7. 通过骨传导耳机输出警报8. 记录行走路径和障碍信息三、模块化代码实现主程序文件obstacle_detection_system.py#!/usr/bin/env python3# -*- coding: utf-8 -*-视障人士防撞预警系统实时检测前方障碍物语音预警避免碰撞版本2.0.0作者无障碍智能助手import osimport sysimport timeimport threadingimport queueimport jsonimport mathfrom datetime import datetimefrom typing import Dict, List, Tuple, Optional, Anyfrom dataclasses import dataclass, asdictfrom enum import Enumimport warningswarnings.filterwarnings(ignore)# 硬件接口try:import RPi.GPIO as GPIORASPBERRY_PI_AVAILABLE Trueexcept ImportError:RASPBERRY_PI_AVAILABLE Falseprint(提示: 非树莓派平台使用模拟传感器)try:import numpy as npNUMPY_AVAILABLE Trueexcept ImportError:NUMPY_AVAILABLE Falseprint(警告: numpy未安装部分功能受限)# 音频处理try:import pyaudioimport waveimport simpleaudio as saAUDIO_AVAILABLE Trueexcept ImportError:AUDIO_AVAILABLE Falseprint(警告: 音频模块未安装语音提示功能受限)# 语音合成try:import pyttsx3TTS_AVAILABLE Trueexcept ImportError:TTS_AVAILABLE Falseprint(警告: 语音合成未安装使用蜂鸣器提示)class AlertLevel(Enum):警报级别枚举SAFE 0 # 安全CAUTION 1 # 注意WARNING 2 # 警告DANGER 3 # 危险CRITICAL 4 # 紧急dataclassclass DetectionZone:探测区域定义name: strangle_start: float # 起始角度度angle_end: float # 结束角度度distance_min: float # 最小探测距离米distance_max: float # 最大探测距离米alert_thresholds: Dict[AlertLevel, float] # 各级别警报阈值dataclassclass Obstacle:障碍物信息timestamp: floatdistance: float # 距离米angle: float # 角度度width: float # 宽度米估计值height: float # 高度米估计值confidence: float # 置信度alert_level: AlertLevelposition_x: float # 相对位置Xposition_y: float # 相对位置Yclass SensorInterface:传感器接口基类def __init__(self, config: Dict):初始化传感器Args:config: 传感器配置self.config configself.is_connected Falseself.calibration_data {}def connect(self) - bool:连接传感器raise NotImplementedErrordef disconnect(self) - None:断开连接raise NotImplementedErrordef get_distance(self, angle: float 0.0) - Optional[float]:获取指定角度的距离Args:angle: 探测角度度Returns:距离米None表示无效raise NotImplementedErrordef scan_sector(self, start_angle: float, end_angle: float,step: float 1.0) - List[Tuple[float, float]]:扫描扇形区域Args:start_angle: 起始角度end_angle: 结束角度step: 扫描步长Returns:角度-距离对列表raise NotImplementedErrordef calibrate(self) - Dict:校准传感器raise NotImplementedErrorclass UltrasonicSensor(SensorInterface):超声波传感器实现def __init__(self, config: Dict):初始化超声波传感器Args:config: 配置字典trigger_pin: 触发引脚echo_pin: 回声引脚max_distance: 最大探测距离temperature: 环境温度用于声速校准super().__init__(config)self.trigger_pin config.get(trigger_pin, 23)self.echo_pin config.get(echo_pin, 24)self.max_distance config.get(max_distance, 4.0) # 米self.temperature config.get(temperature, 25.0) # 摄氏度# 计算声速米/秒self.sound_speed 331.3 0.606 * self.temperature# 伺服控制如果支持扫描self.servo_pin config.get(servo_pin)self.current_angle 0.0self.setup_pins()def setup_pins(self):设置GPIO引脚if RASPBERRY_PI_AVAILABLE:GPIO.setmode(GPIO.BCM)GPIO.setup(self.trigger_pin, GPIO.OUT)GPIO.setup(self.echo_pin, GPIO.IN)GPIO.output(self.trigger_pin, GPIO.LOW)if self.servo_pin:GPIO.setup(self.servo_pin, GPIO.OUT)self.servo GPIO.PWM(self.servo_pin, 50) # 50Hz PWMself.servo.start(0)def connect(self) - bool:连接传感器try:# 测试传感器distance self.get_distance()if distance and 0 distance self.max_distance:self.is_connected Trueprint(超声波传感器连接成功)return Trueexcept Exception as e:print(f超声波传感器连接失败: {e})self.is_connected Falsereturn Falsedef disconnect(self) - None:断开连接if RASPBERRY_PI_AVAILABLE:if hasattr(self, servo):self.servo.stop()GPIO.cleanup()self.is_connected Falsedef set_angle(self, angle: float) - bool:设置伺服角度Args:angle: 目标角度-90到90度Returns:是否成功if not self.servo_pin or not RASPBERRY_PI_AVAILABLE:return False# 限制角度范围angle max(-90, min(90, angle))# 转换为PWM占空比假设伺服角度范围0.5ms-2.5ms对应0-180度duty_cycle 2.5 (angle 90) * (10.0 / 180.0) # 映射到2.5-12.5%self.servo.ChangeDutyCycle(duty_cycle)time.sleep(0.1) # 给伺服时间转动self.servo.ChangeDutyCycle(0) # 停止PWM信号防止抖动self.current_angle anglereturn Truedef get_distance(self, angle: float 0.0) - Optional[float]:获取指定角度的距离Args:angle: 探测角度Returns:距离米None表示无效if not self.is_connected and not self.connect():return None# 设置角度if angle ! self.current_angle:self.set_angle(angle)if RASPBERRY_PI_AVAILABLE:try:# 发送触发脉冲GPIO.output(self.trigger_pin, GPIO.HIGH)time.sleep(0.00001) # 10微秒GPIO.output(self.trigger_pin, GPIO.LOW)# 等待回声引脚变高start_time time.time()while GPIO.input(self.echo_pin) GPIO.LOW:if time.time() - start_time 0.1: # 超时100msreturn Nonestart_time time.time()pulse_start time.time()# 等待回声引脚变低while GPIO.input(self.echo_pin) GPIO.HIGH:pulse_end time.time()if pulse_end - pulse_start 0.1: # 超时100msreturn None# 计算距离pulse_duration pulse_end - pulse_startdistance (pulse_duration * self.sound_speed) / 2# 有效性检查if 0.02 distance self.max_distance: # 2cm到最大距离return distanceexcept Exception as e:print(f超声波测距错误: {e})else:# 模拟模式用于测试import randomtime.sleep(0.05) # 模拟测量延迟# 模拟障碍物距离随角度变化base_distance 2.0angle_factor 1.0 abs(angle) / 90.0 # 角度越大距离越小noise random.uniform(-0.1, 0.1)distance base_distance / angle_factor noisedistance max(0.1, min(self.max_distance, distance))return distancereturn Nonedef scan_sector(self, start_angle: float, end_angle: float,step: float 1.0) - List[Tuple[float, float]]:扫描扇形区域Args:start_angle: 起始角度end_angle: 结束角度step: 扫描步长Returns:角度-距离对列表measurements []if start_angle end_angle:start_angle, end_angle end_angle, start_anglecurrent_angle start_anglewhile current_angle end_angle:distance self.get_distance(current_angle)if distance:measurements.append((current_angle, distance))current_angle steptime.sleep(0.05) # 防止扫描过快return measurementsdef calibrate(self) - Dict:校准传感器print(开始超声波传感器校准...)calibration_results {temperature: self.temperature,sound_speed: self.sound_speed,measurements: []}# 测量已知距离test_distances [0.5, 1.0, 1.5, 2.0, 2.5, 3.0]for known_distance in test_distances:print(f请将障碍物放置在 {known_distance} 米处按Enter继续...)input()measurements []for _ in range(5):distance self.get_distance(0)if distance:measurements.append(distance)time.sleep(0.1)if measurements:avg_measured sum(measurements) / len(measurements)error avg_measured - known_distancecalibration_results[measurements].append({known: known_distance,measured: avg_measured,error: error,error_percent: (error / known_distance) * 100})print(f已知距离: {known_distance:.2f}m, 测量: {avg_measured:.2f}m, f误差: {error:.3f}m ({error/known_distance*100:.1f}%))# 计算校准系数if calibration_results[measurements]:total_error sum(m[error] for m in calibration_results[measurements])avg_error total_error / len(calibration_results[measurements])calibration_results[calibration_offset] -avg_errorcalibration_results[calibration_factor] 1.0print(f校准完成建议偏移量: {-avg_error:.3f}m)return calibration_resultsclass RadarSensor(SensorInterface):毫米波雷达传感器模拟def __init__(self, config: Dict):super().__init__(config)# 雷达特定初始化self.resolution config.get(resolution, 0.05) # 距离分辨率self.fov config.get(fov, 120) # 视场角self.connected Falsedef connect(self) - bool:连接雷达# 模拟连接time.sleep(0.5)self.connected Trueprint(雷达传感器连接成功模拟)return Truedef get_distance(self, angle: float 0.0) - Optional[float]:雷达测距if not self.connected:return None# 模拟雷达数据time.sleep(0.01)return 1.5 0.5 * math.sin(time.time()) # 模拟动态距离class DepthCameraSensor(SensorInterface):深度摄像头传感器模拟def __init__(self, config: Dict):super().__init__(config)self.width config.get(width, 640)self.height config.get(height, 480)self.connected Falsedef connect(self) - bool:连接深度摄像头# 模拟连接time.sleep(0.5)self.connected Trueprint(深度摄像头连接成功模拟)return Truedef get_distance(self, angle: float 0.0) - Optional[float]:深度摄像头测距if not self.connected:return None# 模拟深度数据time.sleep(0.02)return 2.0 0.3 * math.cos(time.time() * 2) # 模拟动态距离class SensorManager:传感器管理器支持多传感器融合def __init__(self, config: Dict):初始化传感器管理器Args:config: 传感器配置self.config configself.sensors {}self.data_history []self.history_size 100# 初始化传感器self.init_sensors()def init_sensors(self):初始化所有传感器sensor_configs self.config.get(sensors, {})# 超声波传感器if ultrasonic in sensor_configs and sensor_configs[ultrasonic].get(enabled, True):try:self.sensors[ultrasonic] UltrasonicSensor(sensor_configs[ultrasonic])print(超声波传感器初始化完成)except Exception as e:print(f超声波传感器初始化失败: {e})# 雷达传感器if radar in sensor_configs and sensor_configs[radar].get(enabled, False):try:self.sensors[radar] RadarSensor(sensor_configs[radar])print(雷达传感器初始化完成)except Exception as e:print(f雷达传感器初始化失败: {e})# 深度摄像头if depth_camera in sensor_configs and sensor_configs[depth_camera].get(enabled, False):try:self.sensors[depth_camera] DepthCameraSensor(sensor_configs[depth_camera])print(深度摄像头初始化完成)except Exception as e:print(f深度摄像头初始化失败: {e})if not self.sensors:print(警告: 没有可用的传感器使用模拟传感器)self.sensors[simulated] UltrasonicSensor({trigger_pin: None,echo_pin: None,max_distance: 4.0})def connect_all(self) - bool:连接所有传感器connected Falsefor name, sensor in self.sensors.items():if sensor.connect():connected Trueprint(f{name}传感器连接成功)else:print(f{name}传感器连接失败)return connecteddef get_fused_distance(self, angle: float 0.0) - Optional[float]:获取融合后的距离数据Args:angle: 探测角度Returns:融合后的距离distances []weights []for name, sensor in self.sensors.items():if sensor.is_connected:distance sensor.get_distance(angle)if distance:distances.append(distance)# 根据传感器类型设置权重if name ultrasonic:weight 0.6elif name radar:weight 0.8elif name depth_camera:weight 1.0else:weight 0.5weights.append(weight)if not distances:return None# 加权平均weighted_sum sum(d * w for d, w in zip(distances, weights))total_weight sum(weights)fused_distance weighted_sum / total_weight# 记录到历史数据self.data_history.append({timestamp: time.time(),angle: angle,distance: fused_distance,sensor_readings: distances})# 限制历史数据大小if len(self.data_history) self.history_size:self.data_history.pop(0)return fused_distancedef scan_fused_sector(self, start_angle: float, end_angle: float,step: float 1.0) - List[Tuple[float, float]]:扫描融合扇形区域Args:start_angle: 起始角度end_angle: 结束角度step: 扫描步长Returns:角度-距离对列表measurements []if start_angle end_angle:start_angle, end_angle end_angle, start_angle# 使用主传感器扫描main_sensor next(iter(self.sensors.values()))current_angle start_anglewhile current_angle end_angle:distance self.get_fused_distance(current_angle)if distance:measurements.append((current_angle, distance))current_angle stepreturn measurementsdef disconnect_all(self):断开所有传感器for sensor in self.sensors.values():sensor.disconnect()class ObstacleDetector:障碍物检测器def __init__(self, config: Dict):初始化障碍物检测器Args:config: 检测器配置self.config configself.zones self.setup_detection_zones()self.obstacle_history []self.history_size 50# 滤波参数self.filter_window config.get(filter_window, 5)self.distance_history {}def setup_detection_zones(self) - List[DetectionZone]:设置探测区域zones_config self.config.get(zones, [{name: center,angle_start: -15,angle_end: 15,distance_min: 0.1,distance_max: 4.0,alert_thresholds: {AlertLevel.SAFE: 2.0,AlertLevel.CAUTION: 1.5,AlertLevel.WARNING: 1.0,AlertLevel.DANGER: 0.5,AlertLevel.CRITICAL: 0.3}},{name: left,angle_start: -60,angle_end: -15,distance_min: 0.1,distance_max: 3.0,alert_thresholds: {AlertLevel.SAFE: 1.5,AlertLevel.CAUTION: 1.0,AlertLevel.WARNING: 0.7,AlertLevel.DANGER: 0.4,AlertLevel.CRITICAL: 0.25}},{name: right,angle_start: 15,angle_end: 60,distance_min: 0.1,distance_max: 3.0,alert_thresholds: {AlertLevel.SAFE: 1.5,AlertLevel.CAUTION: 1.0,AlertLevel.WARNING: 0.7,AlertLevel.DANGER: 0.4,AlertLevel.CRITICAL: 0.25}}])zones []for zone_config in zones_config:thresholds {AlertLevel[key.upper()]: valuefor key, value in zone_config[alert_thresholds].items()}zone DetectionZone(namezone_config[name],angle_startzone_config[angle_start],angle_endzone_config[angle_end],distance_minzone_config[distance_min],distance_maxzone_config[distance_max],alert_thresholdsthresholds)zones.append(zone)return zonesdef apply_filter(self, angle: float, distance: float) - float:应用滤波器去除噪声Args:如果你觉得这个工具好用欢迎关注我

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询