2026-01-12 11:39:27 +08:00
|
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
"""
|
|
|
|
|
|
系统配置常量
|
|
|
|
|
|
这些值在程序运行期间基本不变,或只在配置时改变
|
|
|
|
|
|
"""
|
|
|
|
|
|
from version import VERSION
|
|
|
|
|
|
|
|
|
|
|
|
# ==================== 应用配置 ====================
|
|
|
|
|
|
APP_VERSION = VERSION
|
|
|
|
|
|
APP_DIR = "/maixapp/apps/t11"
|
|
|
|
|
|
LOCAL_FILENAME = "/maixapp/apps/t11/main_tmp.py"
|
|
|
|
|
|
|
|
|
|
|
|
# ==================== 服务器配置 ====================
|
2026-01-22 17:55:11 +08:00
|
|
|
|
# SERVER_IP = "stcp.shelingxingqiu.com"
|
|
|
|
|
|
SERVER_IP = "www.shelingxingqiu.com"
|
2026-01-12 11:39:27 +08:00
|
|
|
|
SERVER_PORT = 50005
|
|
|
|
|
|
HEARTBEAT_INTERVAL = 15 # 心跳间隔(秒)
|
|
|
|
|
|
|
2026-04-03 11:24:29 +08:00
|
|
|
|
# WiFi 质量评估(开机先尝试 WiFi;质量差且 4G 可用则切到 4G,本次上电直至关机锁定 4G)
|
|
|
|
|
|
WIFI_QUALITY_RTT_SAMPLES = 3 # 到业务服务器 TCP 建连耗时采样次数,取中位数
|
|
|
|
|
|
WIFI_QUALITY_RTT_BAD_MS = 600.0 # 中位数超过此值认为延迟过高
|
|
|
|
|
|
WIFI_QUALITY_RTT_WARN_MS = 350.0 # 与 RSSI 联合:超过此值且信号弱也判为差
|
|
|
|
|
|
WIFI_QUALITY_RSSI_BAD_DBM = -80.0 # 低于此 dBm(更负更差)视为信号弱
|
|
|
|
|
|
WIFI_QUALITY_USE_RSSI = True # 是否把 RSSI 纳入综合判定(False 则仅看 RTT)
|
|
|
|
|
|
|
2026-04-03 15:40:07 +08:00
|
|
|
|
# WiFi 热点配网(手机连设备 AP,浏览器提交路由器 SSID/密码;仅 GET/POST,标准库 socket)
|
2026-04-07 17:29:24 +08:00
|
|
|
|
WIFI_CONFIG_AP_FALLBACK = True # # WiFi 配网失败时,是否退回热点模式,并等待重新配网
|
|
|
|
|
|
WIFI_AP_FALLBACK_WAIT_SEC = 5 # 等待5秒后再检测STA/4G
|
|
|
|
|
|
WIFI_CONFIG_AP_TIMEOUT = 5 # 热点模式超时时间(秒)
|
|
|
|
|
|
WIFI_CONFIG_AP_ENABLED = True # True=启动时开热点并起迷你 HTTP 配网服务
|
2026-04-03 15:40:07 +08:00
|
|
|
|
WIFI_CONFIG_AP_SSID = "ArcherySetup" # 设备发出的热点名称
|
|
|
|
|
|
WIFI_CONFIG_AP_PASSWORD = "12345678" # 热点密码(WPA2 通常至少 8 位)
|
|
|
|
|
|
WIFI_CONFIG_HTTP_HOST = "0.0.0.0" # HTTP 监听地址
|
|
|
|
|
|
WIFI_CONFIG_HTTP_PORT = 8080 # 默认 8080,避免占用 80 需 root
|
|
|
|
|
|
WIFI_CONFIG_AP_IP = "192.168.66.1" # 与 MaixPy Wifi.start_ap 默认一致,手机访问 http://192.168.66.1:8080/
|
|
|
|
|
|
|
2026-01-20 18:40:54 +08:00
|
|
|
|
# ===== TCP over SSL(TLS) 配置 =====
|
2026-01-22 17:55:11 +08:00
|
|
|
|
USE_TCP_SSL = False # True=按手册走 MSSLCFG/MIPCFG 绑定 SSL
|
|
|
|
|
|
TCP_LINK_ID = 2 #
|
2026-01-20 18:40:54 +08:00
|
|
|
|
TCP_SSL_PORT = 443 # TLS 端口(不一定必须 443,以服务器为准)
|
|
|
|
|
|
|
|
|
|
|
|
# SSL profile
|
|
|
|
|
|
SSL_ID = 1 # ssl_id=1
|
2026-04-03 11:24:29 +08:00
|
|
|
|
SSL_AUTH_MODE = 0 # 1=单向认证(验证服务器),2=双向
|
|
|
|
|
|
SSL_VERIFY_MODE = 1 # 0=不验(仅测试用);1=写入并使用 CA 证书
|
2026-01-20 18:40:54 +08:00
|
|
|
|
|
2026-04-03 11:24:29 +08:00
|
|
|
|
SSL_CERT_FILENAME = "www.shelingxingqiu.com.crt" # 模组里证书名(MSSLCERTWR / MSSLCFG="cert" 用)
|
|
|
|
|
|
SSL_CERT_PATH = "/root/www.shelingxingqiu.com.crt" # 设备文件系统里 CA 证书路径(你自己放进去)
|
2026-01-20 18:40:54 +08:00
|
|
|
|
# MIPOPEN 末尾的参数在不同固件里含义可能不同;按你手册例子保留
|
|
|
|
|
|
MIPOPEN_TAIL = ",,0"
|
|
|
|
|
|
|
2026-01-12 11:39:27 +08:00
|
|
|
|
# ==================== 文件路径配置 ====================
|
|
|
|
|
|
CONFIG_FILE = "/root/laser_config.json"
|
|
|
|
|
|
LOG_FILE = "/maixapp/apps/t11/app.log"
|
|
|
|
|
|
BACKUP_BASE = "/maixapp/apps/t11/backups"
|
|
|
|
|
|
|
|
|
|
|
|
# ==================== 硬件配置 ====================
|
2026-01-20 11:25:17 +08:00
|
|
|
|
# WiFi模块开关(True=有WiFi模块,False=无WiFi模块)
|
2026-01-24 11:05:03 +08:00
|
|
|
|
HAS_WIFI_MODULE = True # 根据实际硬件情况设置
|
2026-01-20 11:25:17 +08:00
|
|
|
|
|
2026-01-12 11:39:27 +08:00
|
|
|
|
# UART配置
|
|
|
|
|
|
UART4G_DEVICE = "/dev/ttyS2"
|
|
|
|
|
|
UART4G_BAUDRATE = 115200
|
|
|
|
|
|
DISTANCE_SERIAL_DEVICE = "/dev/ttyS1"
|
|
|
|
|
|
DISTANCE_SERIAL_BAUDRATE = 9600
|
|
|
|
|
|
|
2026-01-20 11:25:17 +08:00
|
|
|
|
# I2C配置(根据WiFi模块开关自动选择)
|
|
|
|
|
|
# 无WiFi模块:I2C_BUS_NUM = 1,引脚:P18(I2C1_SCL), P21(I2C1_SDA)
|
|
|
|
|
|
# 有WiFi模块:I2C_BUS_NUM = 5,引脚:A15(I2C5_SCL), A27(I2C5_SDA)
|
|
|
|
|
|
I2C_BUS_NUM = 5 if HAS_WIFI_MODULE else 1
|
2026-03-11 18:19:17 +08:00
|
|
|
|
|
2026-01-12 11:39:27 +08:00
|
|
|
|
INA226_ADDR = 0x40
|
|
|
|
|
|
REG_CONFIGURATION = 0x00
|
|
|
|
|
|
REG_BUS_VOLTAGE = 0x02
|
|
|
|
|
|
REG_CURRENT = 0x04 # 电流寄存器
|
|
|
|
|
|
REG_CALIBRATION = 0x05
|
|
|
|
|
|
CALIBRATION_VALUE = 0x1400
|
|
|
|
|
|
|
2026-02-07 17:09:39 +08:00
|
|
|
|
# ==================== 空气传感器配置 ====================
|
2026-03-11 18:19:17 +08:00
|
|
|
|
ADC_TRIGGER_THRESHOLD = 2700 # TODO:4096只是用于测试,因为最大值是4095,这个值是永远不会触发的,最终需要改为正常值
|
2026-02-07 17:09:39 +08:00
|
|
|
|
AIR_PRESSURE_lOG = False # TODO: 在正式环境中关闭
|
2026-03-31 11:54:58 +08:00
|
|
|
|
AIR_PRESSURE_HARDWARE_MAX = 10
|
2026-01-12 11:39:27 +08:00
|
|
|
|
# ADC配置
|
|
|
|
|
|
ADC_CHANNEL = 0
|
|
|
|
|
|
ADC_LASER_THRESHOLD = 3000
|
|
|
|
|
|
|
|
|
|
|
|
# ==================== 激光配置 ====================
|
|
|
|
|
|
MODULE_ADDR = 0x00
|
|
|
|
|
|
LASER_ON_CMD = bytes([0xAA, MODULE_ADDR, 0x01, 0xBE, 0x00, 0x01, 0x00, 0x01, 0xC1])
|
|
|
|
|
|
LASER_OFF_CMD = bytes([0xAA, MODULE_ADDR, 0x01, 0xBE, 0x00, 0x01, 0x00, 0x00, 0xC0])
|
2026-01-12 18:06:04 +08:00
|
|
|
|
DISTANCE_QUERY_CMD = bytes([0xAA, MODULE_ADDR, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x21]) # 激光测距查询命令
|
|
|
|
|
|
DISTANCE_RESPONSE_LEN = 13 # 激光测距响应数据长度(字节)
|
2026-03-31 11:54:58 +08:00
|
|
|
|
DEFAULT_LASER_POINT = (320, 245) # 默认激光中心点
|
2026-01-20 11:25:17 +08:00
|
|
|
|
|
|
|
|
|
|
# 硬编码激光点配置
|
|
|
|
|
|
HARDCODE_LASER_POINT = True # 是否使用硬编码的激光点(True=使用硬编码值,False=使用校准值)
|
2026-03-31 11:54:58 +08:00
|
|
|
|
HARDCODE_LASER_POINT_VALUE = (320, 245) # 硬编码的激光点坐标(315, 245) # # 硬编码的激光点坐标 (x, y)
|
2026-01-20 11:25:17 +08:00
|
|
|
|
|
|
|
|
|
|
# 激光点检测配置
|
|
|
|
|
|
LASER_DETECTION_THRESHOLD = 140 # 红色通道阈值(默认120,可调整,范围建议:100-150)
|
|
|
|
|
|
LASER_RED_RATIO = 1.5 # 红色相对于绿色/蓝色的倍数要求(默认1.5,可调整,范围建议:1.3-2.0)
|
|
|
|
|
|
LASER_SEARCH_RADIUS = 50 # 搜索半径(像素),从图像中心开始搜索(默认20,限制激光点不能偏离中心太远)
|
|
|
|
|
|
LASER_MAX_DISTANCE_FROM_CENTER = 50 # 激光点距离中心的最大允许距离(像素),超过此距离则拒绝(默认20)
|
|
|
|
|
|
LASER_OVEREXPOSED_THRESHOLD = 200 # 过曝红色判断阈值(默认200,接近白色时的阈值)
|
|
|
|
|
|
LASER_OVEREXPOSED_DIFF = 10 # 过曝红色时,r 与 g/b 的最小差值(默认10)
|
|
|
|
|
|
LASER_REQUIRE_IN_ELLIPSE = False # 是否要求激光点必须在黄心椭圆内(True=必须,False=不要求)
|
|
|
|
|
|
LASER_USE_ELLIPSE_FITTING = True # 是否使用椭圆拟合方法查找激光点(True=椭圆拟合更准确,False=最亮点方法)
|
|
|
|
|
|
LASER_MIN_AREA = 5 # 激光点区域的最小面积(像素),小于此值认为是噪声(默认5)
|
|
|
|
|
|
LASER_DRAW_ELLIPSE = True # 是否在图像上绘制激光点的拟合椭圆(True=绘制,False=不绘制)
|
2026-01-12 11:39:27 +08:00
|
|
|
|
|
|
|
|
|
|
# ==================== 视觉检测配置 ====================
|
|
|
|
|
|
FOCAL_LENGTH_PIX = 2250.0 # 焦距(像素)
|
|
|
|
|
|
REAL_RADIUS_CM = 20 # 靶心实际半径(厘米)
|
|
|
|
|
|
|
2026-01-20 11:25:17 +08:00
|
|
|
|
# 图像清晰度检测配置
|
|
|
|
|
|
IMAGE_SHARPNESS_THRESHOLD = 100.0 # 清晰度阈值,低于此值认为图像模糊
|
|
|
|
|
|
# 清晰图像通常 > 200,模糊图像通常 < 100
|
|
|
|
|
|
|
|
|
|
|
|
# 激光与摄像头物理位置配置
|
|
|
|
|
|
LASER_CAMERA_OFFSET_CM = 1.4 # 激光在摄像头下方的物理距离(厘米),正值表示激光在摄像头下方
|
|
|
|
|
|
IMAGE_CENTER_X = 320 # 图像中心 X 坐标
|
|
|
|
|
|
IMAGE_CENTER_Y = 240 # 图像中心 Y 坐标
|
|
|
|
|
|
|
2026-02-10 17:52:55 +08:00
|
|
|
|
FLASH_LASER_WHILE_SHOOTING = True # 是否在拍摄时闪一下激光(True=闪,False=不闪)
|
|
|
|
|
|
FLASH_LASER_DURATION_MS = 1000 # 闪一下激光的持续时间(毫秒)
|
|
|
|
|
|
|
2026-01-12 11:39:27 +08:00
|
|
|
|
# ==================== 显示配置 ====================
|
2026-01-20 11:25:17 +08:00
|
|
|
|
LASER_COLOR = (0, 255, 0) # RGB颜色
|
2026-01-12 11:39:27 +08:00
|
|
|
|
LASER_THICKNESS = 1
|
|
|
|
|
|
LASER_LENGTH = 2
|
|
|
|
|
|
|
|
|
|
|
|
# ==================== 图像保存配置 ====================
|
|
|
|
|
|
SAVE_IMAGE_ENABLED = True # 是否保存图像(True=保存,False=不保存)
|
|
|
|
|
|
PHOTO_DIR = "/root/phot" # 照片存储目录
|
2026-01-24 11:05:03 +08:00
|
|
|
|
MAX_IMAGES = 1000
|
2026-01-12 11:39:27 +08:00
|
|
|
|
|
2026-04-07 17:29:24 +08:00
|
|
|
|
SHOW_CAMERA_PHOTO_WHILE_SHOOTING = False # 是否在拍摄时显示摄像头图像(True=显示,False=不显示),建议在连着USB测试过程中打开
|
2026-02-07 17:09:39 +08:00
|
|
|
|
|
2026-01-12 11:39:27 +08:00
|
|
|
|
# ==================== OTA配置 ====================
|
|
|
|
|
|
MAX_BACKUPS = 5
|
|
|
|
|
|
LOG_MAX_BYTES = 10 * 1024 * 1024 # 10MB
|
|
|
|
|
|
LOG_BACKUP_COUNT = 5
|
|
|
|
|
|
|
|
|
|
|
|
# ==================== 引脚映射配置 ====================
|
2026-01-20 11:25:17 +08:00
|
|
|
|
# 无WiFi模块的引脚映射(I2C1)
|
|
|
|
|
|
PIN_MAPPINGS_NO_WIFI = {
|
2026-01-12 11:39:27 +08:00
|
|
|
|
"A18": "UART1_RX",
|
|
|
|
|
|
"A19": "UART1_TX",
|
|
|
|
|
|
"A29": "UART2_RX",
|
|
|
|
|
|
"A28": "UART2_TX",
|
|
|
|
|
|
"P18": "I2C1_SCL",
|
|
|
|
|
|
"P21": "I2C1_SDA",
|
|
|
|
|
|
}
|
2026-01-20 11:25:17 +08:00
|
|
|
|
|
|
|
|
|
|
# 有WiFi模块的引脚映射(I2C5)
|
|
|
|
|
|
PIN_MAPPINGS_WITH_WIFI = {
|
|
|
|
|
|
"A18": "UART1_RX",
|
|
|
|
|
|
"A19": "UART1_TX",
|
|
|
|
|
|
"A29": "UART2_RX",
|
|
|
|
|
|
"A28": "UART2_TX",
|
|
|
|
|
|
"A15": "I2C5_SCL",
|
|
|
|
|
|
"A27": "I2C5_SDA",
|
2026-03-11 18:19:17 +08:00
|
|
|
|
"A24": "GPIOA24", # 电源板的引脚
|
2026-01-20 11:25:17 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 根据WiFi模块开关选择引脚映射
|
|
|
|
|
|
PIN_MAPPINGS = PIN_MAPPINGS_WITH_WIFI if HAS_WIFI_MODULE else PIN_MAPPINGS_NO_WIFI
|
2026-03-11 18:19:17 +08:00
|
|
|
|
|
2026-03-24 10:18:48 +08:00
|
|
|
|
# ==================== ArUco标定配置 ====================
|
|
|
|
|
|
USE_ARUCO = False # 是否使用ArUco标定(True=使用ArUco,False=使用传统黄色靶心检测)
|
|
|
|
|
|
|
|
|
|
|
|
# ArUco标记配置
|
|
|
|
|
|
if USE_ARUCO:
|
|
|
|
|
|
import cv2
|
|
|
|
|
|
ARUCO_DICT_TYPE = cv2.aruco.DICT_4X4_50 # ArUco字典类型
|
|
|
|
|
|
ARUCO_MARKER_SIZE_MM = 40 # ArUco标记边长(毫米)
|
|
|
|
|
|
ARUCO_MARKER_IDS = [0, 1, 2, 3] # 四个角的ArUco标记ID
|
|
|
|
|
|
|
|
|
|
|
|
# 靶纸物理尺寸(毫米)
|
|
|
|
|
|
TARGET_PAPER_SIZE_MM = 400 # 靶纸边长 400mm x 400mm
|
|
|
|
|
|
|
|
|
|
|
|
# ArUco标记在靶纸上的中心坐标(毫米,以靶纸中心为原点)
|
|
|
|
|
|
# 靶纸坐标系:中心(0,0),X向右,Y向下(图像坐标系)
|
|
|
|
|
|
# 四个角位置:(20,20), (20,380), (380,380), (380,20)
|
|
|
|
|
|
# 转换为以中心为原点的坐标:
|
|
|
|
|
|
# 左上角(0): (-180, -180) -> 实际(20,20)相对于中心(200,200) = (-180,-180)
|
|
|
|
|
|
# 右上角(1): (180, -180) -> 实际(380,20)相对于中心 = (180,-180)
|
|
|
|
|
|
# 右下角(2): (180, 180) -> 实际(380,380)相对于中心 = (180,180)
|
|
|
|
|
|
# 左下角(3): (-180, 180) -> 实际(20,380)相对于中心 = (-180,180)
|
|
|
|
|
|
ARUCO_MARKER_POSITIONS_MM = {
|
|
|
|
|
|
0: (-180, -180), # 左上角
|
|
|
|
|
|
1: (180, -180), # 右上角
|
|
|
|
|
|
2: (180, 180), # 右下角
|
|
|
|
|
|
3: (-180, 180), # 左下角
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 靶心(黄心)在靶纸上的位置(毫米,相对于靶纸中心)
|
|
|
|
|
|
# 标准靶纸靶心就在正中心
|
|
|
|
|
|
TARGET_CENTER_OFFSET_MM = (0, 0)
|
|
|
|
|
|
|
|
|
|
|
|
# ArUco检测参数
|
|
|
|
|
|
ARUCO_MIN_MARKER_PERIMETER_RATE = 0.03 # 最小标记周长比例(相对于图像)
|
|
|
|
|
|
ARUCO_CORNER_REFINEMENT_METHOD = cv2.aruco.CORNER_REFINE_SUBPIX # 角点精修方法
|
|
|
|
|
|
|
2026-03-11 18:19:17 +08:00
|
|
|
|
# ==================== 电源配置 ====================
|
|
|
|
|
|
AUTO_POWER_OFF_IN_SECONDS = 10 * 60 # 自动关机时间(秒),0表示不自动关机
|
|
|
|
|
|
|