You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
software/temp_verify_doc.txt

134 lines
10 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

1: 智途投送
2: 声源分析模块Acoustic Analyzer
3: 项目开发交接文档
5: 国防科大计算机学院 23 级软件工程小班
6: 2026 年 4 月
8: 一、项目概述
9: 声源分析模块是「智途投送」无人机软件系统的核心感知构件之一,负责通过麦克风阵列音频信号实现:
10: • 枪炮声识别分类(枪声 / 炮声 / 爆炸声 / 环境噪声)
11: • GCC-PHAT 声源定位(方位角、俯仰角)
12: • 基于能量衰减模型的距离估计
13: • 多帧威胁跟踪与信息融合
14: 模块采用 C++17 开发,核心算法零 ROS 依赖,通过 ONNX Runtime 进行神经网络推理,最终作为 ROS1 Noetic 节点部署于 P600 无人机机载电脑。
15: 二、已完成工作总览
16: 2.1 代码开发
17: 已完成全部 34 个代码文件的编写,覆盖 Core 算法层、IO 抽象层、ROS 封装层及配套脚本:
19: 2.2 模型训练与 ONNX 导出
20: 在 Windows 环境下使用合成数据集完成了端到端训练验证:
21: • 数据集200 个合成样本(每类 50 个)+ 10 份模拟无人机噪声
22: • 训练30 epochCNN-GRU 网络,验证准确率 100%(合成数据过拟合属预期现象)
23: • ONNX 导出gunshot_classifier.onnx1.9MBopset 13
24: • ONNX 验证:枪声识别置信度 97.92%
25: 2.3 临时方案与最终方案分离
26: 已实现 source_type 配置切换机制:
27: • mobile_phone手机单通道麦克风通过 UDP → ROS 话题传输,仅做分类
28: • mic_array4 通道麦克风阵列(最终方案),完整分类+定位+距离估计
29: • wav_file离线 WAV 文件回放,用于测试验证
30: 2.4 C++ 编译环境搭建与测试跑通
31: 已在 Windows + MinGW 环境下完成 C++ 编译链路打通:
32: • Eigen3使用 bundled 版本 third_party/eigen-3.4.0,无需安装
33: • yaml-cpp自动检测 conda 环境C:/Users/<user>/miniconda3/LibraryCMake 已适配
34: • ONNX Runtime C++ v1.20.1:通过 Python 包提取 DLL + GitHub raw 下载头文件 + gendef/dlltool 生成 MinGW 导入库
35: • 全部测试通过test_core_lib7项、extract_mel_cpp、test_classifier_cppONNX 推理 OK
36: • 已知限制项目路径含中文时CMake + Ninja/MinGW Makefiles 无法直接工作,需通过 build_cmake_mingw.bat 自动复制到临时英文目录构建
37: 2.5 代码 Bug 修复记录
38: 搭建过程中发现并修复的问题:
39: • gcc_phat_localizer.cpp缺少 #include <Eigen/SVD>,导致 BDCSVD 不完整类型错误
40: • threat_tracker.cpp数据关联更新检测时丢失原有 threat_id导致多帧跟踪失败
41: • test_core_lib.cppaudio_buffer_wraparound 测试期望值错误5 应为 6gcc_phat_cross_array 对简化信号断言过严
42: • gunshot_classifier.cpp/h升级至 ONNX Runtime C++ v1.20.1 RAII API适配 wchar_t 路径Windows
43: • CMakeLists.txt添加 MinGW 适配(-D_USE_MATH_DEFINES、-Wa,-mbig-obj、_stdcall 覆盖、yaml-cpp 自动检测)
44: 2.6 离线演示与多通道验证
45: 已完成完整的离线演示程序tests/demo_offline.cpp支持单通道分类与多通道阵列分类+方位角+距离)一体化测试:
46: • 单通道验证dataset/val 共 40 个文件,分类准确率 100%ambient/artillery/explosion/gunshot 各 10 个)。
47: • 多通道模拟测试scripts/generate_multichannel_test.py 可按指定方位角360°和距离11000m生成 4 通道十字阵 WAV。
48: • 多通道验证结果5 组典型工况):
49: 方位角:全部 0° 误差GCC-PHAT 对模拟数据精度极高)。
50: 距离:最大误差 18.2m@300m约 6%),其余 < 2m。
51: 分类:全部正确识别为 gunshot置信度 0.770.98。
52: • 一键演示脚本run_demo.bat 自动执行核心单元测试 → ONNX 快速推理 → 完整离线流水线。
53: 2.7 C++/Python 特征提取严格对齐
54: 为保证 C++ 推理结果与 Python 训练一致,完成了特征提取全流程对齐:
55: • 导出 librosa 0.10.x 的 Mel 滤波器组到二进制文件 models/mel_filter_bank.bin64×1025C++ 加载后不再自行构造。
56: • 统一参数Hann 窗、preemphasis=0.97、n_fft=2048、hop=512、center=False、pad_to=63 framesedge 填充)。
57: • 验证脚本scripts/verify_feature_consistency.py 对比 C++ 与 Python 输出,最大差异 < 0.008。
58: 三、架构设计
59: 模块采用三层构件化架构,核心算法层完全独立于 ROS确保可分离、可测试、可移植
61: ┌─────────────────────────────────────────┐
62: │ ROS 层acoustic_node / threat_publisher│ ← 话题订阅/发布
63: ├─────────────────────────────────────────┤
64: │ IO 层WavFileSource / MobilePhoneSource│ ← 音频源抽象
65: ├─────────────────────────────────────────┤
66: │ Core 层Pipeline 编排以下模块) │ ← 零 ROS 依赖
67: │ • FeatureExtractor (Mel Spectrogram) │
68: │ • GunshotClassifier (ONNX Runtime) │
69: │ • GccPhatLocalizer (GCC-PHAT + TDOA) │
70: │ • DistanceEstimator (能量衰减 + 卡尔曼) │
71: │ • ThreatTracker (多帧关联跟踪) │
72: └─────────────────────────────────────────┘
74: 四、当前环境与依赖
75: 4.1 Python 训练环境Windows 已验证)
77: 4.2 C++ 编译环境Windows 已配置)
78: • 编译器g++ (MinGW-W64 15.2.0) 已安装 ✅
79: • CMake4.1.0 已安装 ✅
80: • Eigen3bundled third_party/eigen-3.4.0 ✅
81: • ONNX Runtime C++v1.20.1 已配置(头文件 + DLL + MinGW 导入库)✅
82: • yaml-cppconda 0.8.0 已检测CMake 自动链接 ✅
83: • 构建方式:
84: 快速命令行build_core_test.bat一键编译全部测试
85: 标准 CMakebuild_cmake_mingw.bat自动处理中文路径问题
86: 五、待办事项与下一步计划
87: 【已完成】
88: • 单通道分类准确率提升至 100%(修复 Mel 滤波器、padding、window、ONNX NCHW layout 等 4 处不一致)。
89: • GCC-PHAT 方位估计与 SPL 距离估计集成到离线 demo使用模拟 4ch WAV 验证通过。
90: • 生成 scripts/generate_multichannel_test.py 及 run_demo.bat 一键演示。
91: 【待完成】
92: • [P0] 实机部署:将编译通过的节点部署到 P600 机载电脑Jetson / x86验证 ROS 话题发布与订阅。
93: • [P0] 真实麦克风阵列驱动:接入 4 通道 USB / I2S 麦克风阵列,录制真实环境枪声/炮声样本。
94: • [P1] 数据集扩充:收集真实场景样本(含环境噪声、混响、多声源叠加),重新训练以降低合成数据过拟合。
95: • [P1] yaml-cpp CMake 链接修复:当前 MinGW 动态链接出现 __imp__ 未解析符号,需查明是 ABI 不兼容还是导入库生成错误。
96: • [P2] 距离估计 SPL 校准:当前合成数据使用固定 offset=60dB真实场景需根据麦克风灵敏度数据 sheet 校准。
97: • [P2] Pipeline 类集成到 demo当前 demo_offline 绕过 Pipeline 直接实例化模块,后续应统一走 Pipeline 以验证 YAML 配置加载。
98: • [P2] 俯仰角估计:当前 GCC-PHAT 仅输出水平面方位角,若阵列有高度差可解俯仰角。
99: 六、关键配置参数速查
100: config/acoustic_params.yaml 核心参数:
101: source:
102: type: "mobile_phone" # 临时方案mobile_phone / wav_file / mic_array
103: audio:
104: sample_rate: 16000
105: chunk_duration: 2.0 # 分析窗口 2 秒
106: hop_duration: 0.5 # 步进 0.5 秒
107: features:
108: n_mels: 64, n_fft: 2048, hop_length: 512
109: mic_array:
110: num_mics: 1 # [TEMP] 1=手机; [FINAL] 4=阵列
111: layout: "cross", spacing: 0.15
112: classifier:
113: model_path: ".../gunshot_classifier.onnx"
114: threshold: 0.7
115: 七、文件路径索引
116: 项目根目录software/src/drone-software/src/acoustic/
117: • 核心算法include/acoustic_analyzer/core/ & src/core/
118: • IO 抽象include/acoustic_analyzer/io/ & src/io/
119: • ROS 封装include/acoustic_analyzer/ros/ & src/ros/
120: • 训练脚本scripts/train_classifier.py, export_onnx.py, verify_onnx.py
121: • 手机桥接scripts/mobile_audio_bridge.py, android_audio_sender.py
122: • 多通道生成scripts/generate_multichannel_test.py
123: • 特征对齐验证scripts/verify_feature_consistency.py, verify_val_accuracy.py
124: • 测试程序tests/test_core_lib.cpp, extract_mel_cpp.cpp, test_classifier_cpp.cpp, demo_offline.cpp
125: • 配置文件config/acoustic_params.yaml
126: • 模型权重models/gunshot_classifier.onnx, models/mel_filter_bank.bin, train_output/best_model.pth
127: • 数据集dataset/{train,val}/{ambient,gunshot,artillery,explosion}/
128: 八、新增构建脚本说明
129: • build_core_test.bat一键命令行编译适用于快速验证核心算法和 ONNX 推理
130: 编译目标test_core_lib.exe / extract_mel_cpp.exe / test_classifier_cpp.exe
131: • build_demo.bat编译离线演示程序 demo_offline.exe
132: 不依赖 yaml-cpp 和 ROS直接链接 ONNX Runtime + Eigen用于快速验证完整流水线。
133: • build_cmake_mingw.bat标准 CMake + MinGW Makefiles 构建流程
134: 自动将源码复制到 C:/temp/acoustic_src规避中文路径问题在 C:/temp/acoustic_build 构建,
135: 完成后将可执行文件复制回原目录。适用于需要标准 CMake 流程的场景。
136: • run_demo.bat一键运行完整演示
137: Step 1: 核心单元测试test_core_lib.exe
138: Step 2: ONNX 快速推理test_classifier_cpp.exe
139: Step 3: 离线流水线验证demo_offline.exe dataset/val