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 epoch,CNN-GRU 网络,验证准确率 100%(合成数据过拟合属预期现象) 23: • ONNX 导出:gunshot_classifier.onnx(1.9MB,opset 13) 24: • ONNX 验证:枪声识别置信度 97.92% 25: 2.3 临时方案与最终方案分离 26: 已实现 source_type 配置切换机制: 27: • mobile_phone:手机单通道麦克风通过 UDP → ROS 话题传输,仅做分类 28: • mic_array:4 通道麦克风阵列(最终方案),完整分类+定位+距离估计 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//miniconda3/Library),CMake 已适配 34: • ONNX Runtime C++ v1.20.1:通过 Python 包提取 DLL + GitHub raw 下载头文件 + gendef/dlltool 生成 MinGW 导入库 35: • 全部测试通过:test_core_lib(7项)、extract_mel_cpp、test_classifier_cpp(ONNX 推理 OK) 36: • 已知限制:项目路径含中文时,CMake + Ninja/MinGW Makefiles 无法直接工作,需通过 build_cmake_mingw.bat 自动复制到临时英文目录构建 37: 2.5 代码 Bug 修复记录 38: 搭建过程中发现并修复的问题: 39: • gcc_phat_localizer.cpp:缺少 #include ,导致 BDCSVD 不完整类型错误 40: • threat_tracker.cpp:数据关联更新检测时丢失原有 threat_id,导致多帧跟踪失败 41: • test_core_lib.cpp:audio_buffer_wraparound 测试期望值错误(5 应为 6);gcc_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: 三、架构设计 45: 模块采用三层构件化架构,核心算法层完全独立于 ROS,确保可分离、可测试、可移植: 47: ┌─────────────────────────────────────────┐ 48: │ ROS 层(acoustic_node / threat_publisher)│ ← 话题订阅/发布 49: ├─────────────────────────────────────────┤ 50: │ IO 层(WavFileSource / MobilePhoneSource)│ ← 音频源抽象 51: ├─────────────────────────────────────────┤ 52: │ Core 层(Pipeline 编排以下模块) │ ← 零 ROS 依赖 53: │ • FeatureExtractor (Mel Spectrogram) │ 54: │ • GunshotClassifier (ONNX Runtime) │ 55: │ • GccPhatLocalizer (GCC-PHAT + TDOA) │ 56: │ • DistanceEstimator (能量衰减 + 卡尔曼) │ 57: │ • ThreatTracker (多帧关联跟踪) │ 58: └─────────────────────────────────────────┘ 60: 四、当前环境与依赖 61: 4.1 Python 训练环境(Windows 已验证) 63: 4.2 C++ 编译环境(Windows 已配置) 64: • 编译器:g++ (MinGW-W64 15.2.0) 已安装 ✅ 65: • CMake:4.1.0 已安装 ✅ 66: • Eigen3:bundled third_party/eigen-3.4.0 ✅ 67: • ONNX Runtime C++:v1.20.1 已配置(头文件 + DLL + MinGW 导入库)✅ 68: • yaml-cpp:conda 0.8.0 已检测,CMake 自动链接 ✅ 69: • 构建方式: 70: – 快速命令行:build_core_test.bat(一键编译全部测试) 71: – 标准 CMake:build_cmake_mingw.bat(自动处理中文路径问题) 72: 五、待办事项与下一步计划 74: 六、关键配置参数速查 75: config/acoustic_params.yaml 核心参数: 76: source: 77: type: "mobile_phone" # 临时方案:mobile_phone / wav_file / mic_array 78: audio: 79: sample_rate: 16000 80: chunk_duration: 2.0 # 分析窗口 2 秒 81: hop_duration: 0.5 # 步进 0.5 秒 82: features: 83: n_mels: 64, n_fft: 2048, hop_length: 512 84: mic_array: 85: num_mics: 1 # [TEMP] 1=手机; [FINAL] 4=阵列 86: layout: "cross", spacing: 0.15 87: classifier: 88: model_path: ".../gunshot_classifier.onnx" 89: threshold: 0.7 90: 七、文件路径索引 91: 项目根目录:software/src/drone-software/src/acoustic/ 92: • 核心算法:include/acoustic_analyzer/core/ & src/core/ 93: • IO 抽象:include/acoustic_analyzer/io/ & src/io/ 94: • ROS 封装:include/acoustic_analyzer/ros/ & src/ros/ 95: • 训练脚本:scripts/train_classifier.py, export_onnx.py, verify_onnx.py 96: • 手机桥接:scripts/mobile_audio_bridge.py, android_audio_sender.py 97: • 测试程序:tests/test_core_lib.cpp, extract_mel_cpp.cpp, test_classifier_cpp.cpp 98: • 配置文件:config/acoustic_params.yaml 99: • 模型权重:models/gunshot_classifier.onnx, train_output/best_model.pth 100: • 数据集:dataset/{train,val}/{ambient,gunshot,artillery,explosion}/ 101: 八、新增构建脚本说明 102: • build_core_test.bat:一键命令行编译,适用于快速验证核心算法和 ONNX 推理 103: 编译目标:test_core_lib.exe / extract_mel_cpp.exe / test_classifier_cpp.exe 104: • build_cmake_mingw.bat:标准 CMake + MinGW Makefiles 构建流程 105: 自动将源码复制到 C:/temp/acoustic_src(规避中文路径问题),在 C:/temp/acoustic_build 构建, 106: 完成后将可执行文件复制回原目录。适用于需要标准 CMake 流程的场景。 108: AI 助手将读取本文档及项目代码,基于当前状态继续推进。