Compare commits

..

26 Commits

Author SHA1 Message Date
pg6wepubk aa14a5f616 Merge pull request '新增闪光检测模块及优化单兵终端APP系统设置' (#8) from mc_branch into master
3 hours ago
camelliamc 711ab614e2 Merge remote-tracking branch 'origin/master' into mc_branch
3 hours ago
camelliamc 945651ca14 添加闪光检测模块以及优化单兵终端APP
3 hours ago
pkx2w7qjn 735f46766b Merge pull request '添加声源分析模块' (#7) from zhaochang_branch into master
5 hours ago
赵昌 ed014e08a0 chore: cleanup CMakeLists, expand .gitignore, add CHANGELOG
15 hours ago
赵昌 e451d75ab5 feat(demo): Add --help, fix run_demo.bat path, add iostream to classifier
16 hours ago
赵昌 31e2470090 feat(tests): Add boundary tests, model error messages, gitattributes
16 hours ago
赵昌 6abe18d417 style(acoustic): Complete size_t -> std::size_t cleanup across all files
16 hours ago
赵昌 25ce259113 feat(classifier): Add JSON label map support, fix encapsulation
16 hours ago
赵昌 c5c16ad74b style(acoustic): Unify size_t to std::size_t, fix hardcoded SPL, add threshold CLI
16 hours ago
赵昌 4a6908df18 fix(ros): Update ROS wrapper to match current Pipeline API
16 hours ago
赵昌 81879be4bc perf(fft): Replace DFT with Cooley-Tukey FFT (33x speedup)
16 hours ago
赵昌 9911ad279d fix(tests): Rewrite all test files to match current API
16 hours ago
赵昌 40379d174f perf(acoustic): Optimize classifier and demo, remove dead code
16 hours ago
赵昌 8dddc3fd48 refactor(acoustic): Add docs, gitignore, cleanup deps, enhance WAV reader
16 hours ago
赵昌 6928e85232 refactor(acoustic): Multiple quality improvements
16 hours ago
赵昌 e589cdd874 feat(acoustic): Recover full acoustic analyzer module with buildable demo
16 hours ago
p5vjqsb6e 36ee57ecdd Merge pull request '修改px4 , 新添加自主路径规划模块(offline_task_manager)' (#6) from luogang_branch into master
17 hours ago
AetherPendragon b13a8121fb 新增离线任务管理模块 offline_task_manager,实现无人机自主任务规划与执行
17 hours ago
camelliamc b65beebb67 修改app.py
22 hours ago
pkx2w7qjn 5b519ee358 Merge pull request '完成单兵终端初始版本' (#5) from zhaochang_branch into master
1 day ago
赵昌 c80538a00e 更新单兵终端APP
6 days ago
赵昌 8f2f100cb1 单兵终端APP初次提交
6 days ago
p82feo7wg 9937ca64c5 Merge pull request '提交电脑端初期设计和所有ui设计供参考' (#4) from wangjiaqi23 into master
7 days ago
p82feo7wg d5080c4aac Merge pull request '修改需求报告' (#3) from wangjiaqi23 into master
7 days ago
p82feo7wg 1d9c2c8ddd 新增软件前端初版
3 weeks ago

@ -0,0 +1,4 @@
# Mark binary files
*.onnx binary
*.bin binary
*.wav binary

@ -0,0 +1,42 @@
# Build artifacts
build/
build/*.o
build/*.obj
build/*.exe
CMakeCache.txt
CMakeFiles/
cmake-build-*/
Makefile
# IDE
.vs/
.vscode/
*.user
*.suo
*.sln
*.vcxproj*
# Python cache
scripts/__pycache__/
*.pyc
*.pyo
__pycache__/
# Temporary files
*.tmp
*.log
*.swp
*.bak
# OS
.DS_Store
Thumbs.db
# Model training artifacts
checkpoints/
*.pth
runs/
# Output files
output/*.wav
output/*.txt

@ -0,0 +1,29 @@
# Changelog
## [Unreleased]
### Added
- 完整的单元测试套件:`test_core_lib.exe`音频缓冲区、预加重、GCC-PHAT、距离估计、威胁跟踪、特征提取器形状验证
- `run_demo.bat` 一键运行脚本:自动构建并执行核心测试 + ONNX 推理 + 离线演示
- `build_core_test.bat`:单独编译所有测试可执行文件
- JSON 格式 label map 支持(兼容旧版 `"index: label"` 文本格式)
- `.gitattributes`:统一行尾符和 diff 行为
### Changed
- **FFT 引擎**:移除损坏的 `kiss_fft` 依赖,替换为内联 Cooley-Tukey FFT推理速度提升约 33×
- **ONNX Runtime 兼容**:将 API 版本降级至 17 以匹配本地 v1.17.1 DLL
- **输入张量形状**:调整为 `[batch=1, time=63, n_mels=64]` 以匹配 ONNX 导出模型
- **AudioBuffer API**:统一为 `Push`/`Pop`/`Get`/`Clear`/`Size`
- **DistanceEstimator**`GetReferenceSpl("threat")` 使用配置值(默认 150 dB替代硬编码 160 dB
- **代码风格**:统一所有 `size_t``std::size_t`
- **CMakeLists.txt**清理多余空行install 规则仅在 `BUILD_ROS_WRAPPER=ON` 时生效
- **`.gitignore`**:扩展为更全面的忽略规则
### Fixed
- 修复 `AudioBuffer`、`FeatureExtractor`、`DistanceEstimator` 的头文件/实现不匹配问题
- 修复 Windows 路径 Unicode 转换(`MultiByteToWideChar`
- 修复缺失的 `<memory>` 头文件包含
- 修复 `pipeline.cpp` 和 ROS 包装器以使用 `Pipeline::Process` 返回 `AcousticFrame`
### Removed
- `kiss_fft` 第三方库(头文件和实现均缺失,无法编译)

@ -0,0 +1,221 @@
cmake_minimum_required(VERSION 3.10)
project(acoustic_analyzer)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Windows / MinGW fixes
if(WIN32)
add_compile_definitions(_USE_MATH_DEFINES)
endif()
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
add_compile_options("-Wa,-mbig-obj")
endif()
option(BUILD_TESTS "Build unit tests" ON)
option(BUILD_ROS_WRAPPER "Build ROS wrapper node" OFF)
option(BUILD_ONNX_TESTS "Build ONNX classifier tests" ON)
# Eigen3 (bundled)
set(EIGEN3_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party/eigen-3.4.0")
if(NOT EXISTS "${EIGEN3_INCLUDE_DIR}/Eigen/Core")
message(FATAL_ERROR "Eigen3 not found at ${EIGEN3_INCLUDE_DIR}")
endif()
# yaml-cpp (optional)
set(YAML_CPP_ROOT "")
if(WIN32)
set(_conda_yaml "C:/Users/$ENV{USERNAME}/miniconda3/Library")
if(EXISTS "${_conda_yaml}/include/yaml-cpp/yaml.h")
set(YAML_CPP_ROOT "${_conda_yaml}")
message(STATUS "Found yaml-cpp in conda: ${YAML_CPP_ROOT}")
endif()
endif()
set(YAML_CPP_FOUND FALSE)
find_package(yaml-cpp QUIET)
if(yaml-cpp_FOUND AND TARGET yaml-cpp)
set(YAML_CPP_TARGET yaml-cpp)
set(YAML_CPP_FOUND TRUE)
if(NOT yaml-cpp_INCLUDE_DIRS AND DEFINED YAML_CPP_INCLUDE_DIR)
set(yaml-cpp_INCLUDE_DIRS "${YAML_CPP_INCLUDE_DIR}")
endif()
elseif(yaml-cpp_FOUND AND DEFINED YAML_CPP_INCLUDE_DIR)
set(YAML_CPP_TARGET yaml-cpp)
set(YAML_CPP_FOUND TRUE)
add_library(yaml-cpp UNKNOWN IMPORTED)
set_target_properties(yaml-cpp PROPERTIES
IMPORTED_LOCATION "${YAML_CPP_LIBRARY_DIR}/yaml-cpp.lib"
INTERFACE_INCLUDE_DIRECTORIES "${YAML_CPP_INCLUDE_DIR}"
)
if(NOT yaml-cpp_INCLUDE_DIRS)
set(yaml-cpp_INCLUDE_DIRS "${YAML_CPP_INCLUDE_DIR}")
endif()
elseif(YAML_CPP_ROOT)
set(yaml-cpp_INCLUDE_DIRS "${YAML_CPP_ROOT}/include")
set(yaml-cpp_LIBRARIES "${YAML_CPP_ROOT}/lib/yaml-cpp.lib")
if(EXISTS "${yaml-cpp_LIBRARIES}")
add_library(yaml-cpp UNKNOWN IMPORTED)
set_target_properties(yaml-cpp PROPERTIES
IMPORTED_LOCATION "${yaml-cpp_LIBRARIES}"
INTERFACE_INCLUDE_DIRECTORIES "${yaml-cpp_INCLUDE_DIRS}"
)
set(YAML_CPP_TARGET yaml-cpp)
set(YAML_CPP_FOUND TRUE)
endif()
endif()
if(YAML_CPP_FOUND)
message(STATUS "yaml-cpp found. Pipeline will be built.")
else()
message(WARNING "yaml-cpp not found. Pipeline and ROS wrapper will be disabled.")
endif()
# ONNX Runtime
set(ONNXRuntime_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party/onnxruntime" CACHE PATH "ONNX Runtime root")
set(ONNXRuntime_INCLUDE_DIRS "${ONNXRuntime_DIR}/include")
if(WIN32)
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
set(ONNXRuntime_LIB_CANDIDATE "${ONNXRuntime_DIR}/lib/libonnxruntime.a")
else()
set(ONNXRuntime_LIB_CANDIDATE "${ONNXRuntime_DIR}/lib/onnxruntime.lib")
endif()
else()
set(ONNXRuntime_LIB_CANDIDATE "${ONNXRuntime_DIR}/lib/libonnxruntime.so")
endif()
if(EXISTS "${ONNXRuntime_LIB_CANDIDATE}")
set(ONNXRuntime_LIBS "${ONNXRuntime_LIB_CANDIDATE}")
set(ONNXRuntime_FOUND TRUE)
message(STATUS "ONNX Runtime found: ${ONNXRuntime_LIBS}")
else()
set(ONNXRuntime_FOUND FALSE)
message(WARNING "ONNX Runtime NOT found. ONNX tests disabled.")
endif()
# Core library sources
set(CORE_BASE_SOURCES
src/core/fft_utils.cpp
src/core/audio_buffer.cpp
src/core/feature_extractor.cpp
src/core/gcc_phat_localizer.cpp
src/core/distance_estimator.cpp
src/core/threat_tracker.cpp
)
set(CORE_ONNX_SOURCES
src/core/gunshot_classifier.cpp
)
if(YAML_CPP_FOUND)
list(APPEND CORE_ONNX_SOURCES src/core/pipeline.cpp)
endif()
set(IO_SOURCES
src/io/wav_file_source.cpp
)
if(NOT WIN32)
list(APPEND IO_SOURCES src/io/mobile_phone_source.cpp)
endif()
# Build base core library
add_library(${PROJECT_NAME}_core_base STATIC ${CORE_BASE_SOURCES})
target_include_directories(${PROJECT_NAME}_core_base PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
${EIGEN3_INCLUDE_DIR}
)
# Full core library
if(ONNXRuntime_FOUND)
add_library(${PROJECT_NAME}_core STATIC ${CORE_BASE_SOURCES} ${CORE_ONNX_SOURCES} ${IO_SOURCES})
target_include_directories(${PROJECT_NAME}_core PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
${ONNXRuntime_INCLUDE_DIRS}
${EIGEN3_INCLUDE_DIR}
)
if(YAML_CPP_FOUND)
target_include_directories(${PROJECT_NAME}_core PUBLIC ${yaml-cpp_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME}_core PUBLIC ${YAML_CPP_TARGET})
endif()
target_link_libraries(${PROJECT_NAME}_core PUBLIC ${ONNXRuntime_LIBS})
if(NOT WIN32)
target_link_libraries(${PROJECT_NAME}_core PUBLIC m)
endif()
else()
add_library(${PROJECT_NAME}_core ALIAS ${PROJECT_NAME}_core_base)
endif()
# ROS Wrapper
if(BUILD_ROS_WRAPPER)
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
sensor_msgs
geometry_msgs
message_generation
)
add_message_files(FILES AcousticThreat.msg AcousticThreatArray.msg)
generate_messages(DEPENDENCIES std_msgs)
catkin_package(CATKIN_DEPENDS roscpp std_msgs sensor_msgs message_runtime)
add_executable(${PROJECT_NAME}_node
src/ros/acoustic_node.cpp
src/ros/threat_publisher.cpp
src/main.cpp
)
target_include_directories(${PROJECT_NAME}_node PRIVATE ${catkin_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME}_node ${PROJECT_NAME}_core ${catkin_LIBRARIES})
add_dependencies(${PROJECT_NAME}_node ${PROJECT_NAME}_generate_messages_cpp)
endif()
# Unit tests
if(BUILD_TESTS)
enable_testing()
add_executable(test_core_lib tests/test_core_lib.cpp ${CORE_BASE_SOURCES})
target_include_directories(test_core_lib PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/include ${EIGEN3_INCLUDE_DIR})
if(NOT WIN32)
target_link_libraries(test_core_lib PRIVATE m)
endif()
add_test(NAME core_lib COMMAND test_core_lib)
add_executable(extract_mel_cpp tests/extract_mel_cpp.cpp
src/core/fft_utils.cpp src/core/feature_extractor.cpp)
target_include_directories(extract_mel_cpp PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/include ${EIGEN3_INCLUDE_DIR})
if(NOT WIN32)
target_link_libraries(extract_mel_cpp PRIVATE m)
endif()
if(ONNXRuntime_FOUND AND BUILD_ONNX_TESTS)
add_executable(test_classifier_cpp tests/test_classifier_cpp.cpp
src/core/fft_utils.cpp src/core/feature_extractor.cpp src/core/gunshot_classifier.cpp)
target_include_directories(test_classifier_cpp PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/include ${EIGEN3_INCLUDE_DIR} ${ONNXRuntime_INCLUDE_DIRS})
target_compile_definitions(test_classifier_cpp PRIVATE _stdcall=)
target_link_libraries(test_classifier_cpp PRIVATE ${ONNXRuntime_LIBS})
if(NOT WIN32)
target_link_libraries(test_classifier_cpp PRIVATE m)
endif()
add_test(NAME classifier_cpp COMMAND test_classifier_cpp
--model ${CMAKE_CURRENT_SOURCE_DIR}/models/gunshot_classifier.onnx
--wav ${CMAKE_CURRENT_SOURCE_DIR}/dataset/binary/val/ambient/drone_noise_val_000.wav)
endif()
endif()
# Install
if(BUILD_ROS_WRAPPER AND TARGET ${PROJECT_NAME}_core)
install(TARGETS ${PROJECT_NAME}_core
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
install(DIRECTORY include/${PROJECT_NAME}/ DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION})
install(DIRECTORY config/ DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/config)
install(DIRECTORY models/ DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/models)
endif()

@ -0,0 +1,131 @@
# Acoustic Analyzer Module
无人机声学威胁检测模块基于深度学习CNN-GRU的枪声/爆炸声分类器,结合麦克风阵列 GCC-PHAT 定位与 SPL 衰减模型测距。
## 模块结构
```
acoustic/
├── include/acoustic_analyzer/ # 公共头文件
│ ├── core/ # 核心算法
│ │ ├── audio_buffer.h # 音频循环缓冲区
│ │ ├── distance_estimator.h # SPL 距离估计器
│ │ ├── feature_extractor.h # Mel 频谱图提取
│ │ ├── fft_utils.h # FFT 工具
│ │ ├── gcc_phat_localizer.h # GCC-PHAT 声源定位
│ │ ├── gunshot_classifier.h # ONNX 分类器
│ │ ├── pipeline.h # 完整处理流水线
│ │ ├── threat_tracker.h # 威胁跟踪/去重
│ │ └── types.h # 公共类型定义
│ ├── io/ # 音频输入源
│ │ ├── audio_source.h
│ │ ├── mobile_phone_source.h
│ │ └── wav_file_source.h # WAV 文件读取
│ └── ros/ # ROS 包装器
│ ├── acoustic_node.h
│ └── threat_publisher.h
├── src/ # 实现文件
│ ├── core/
│ ├── io/
│ └── ros/
├── tests/ # 测试程序
│ ├── demo_offline.cpp # 离线推理演示
│ ├── test_core_lib.cpp
│ ├── test_classifier_cpp.cpp
│ └── extract_mel_cpp.cpp
├── scripts/ # Python 训练/导出脚本
│ ├── train_binary_classifier.py
│ ├── export_onnx.py
│ ├── generate_dataset.py
│ └── verify_val_accuracy.py
├── models/ # 模型文件
│ ├── gunshot_classifier.onnx
│ ├── label_map.json
│ └── mel_filter_bank.bin
├── config/
│ └── acoustic_params.yaml # 流水线配置
├── third_party/ # 头文件级依赖
│ ├── eigen-3.4.0/ # 矩阵运算
│ └── onnxruntime/ # ONNX Runtime C++ API
├── CMakeLists.txt
├── build_demo.bat # Windows 一键编译
├── batch_test.bat # Windows 一键测试
└── package.xml # ROS 包描述
```
## 快速开始Windows + MinGW
### 1. 编译离线演示程序
```bat
build_demo.bat
```
### 2. 运行单文件测试
```bat
build\demo_offline.exe dataset\binary\val\ambient\drone_noise_val_000.wav
build\demo_offline.exe dataset\binary\val\threat\synth_threat_val_000.wav
```
### 3. 批量验证整个数据集
```bat
batch_test.bat
:: 或直接传目录(支持递归子目录)
build\demo_offline.exe dataset\binary\val
```
### 4. 使用自定义模型
```bat
build\demo_offline.exe some_audio.wav --model my_model.onnx --label_map my_labels.json
```
## 模型训练Python
```bash
# 1. 生成合成数据集(或准备真实音频)
cd scripts
python generate_dataset.py
# 2. 训练二分类器
python train_binary_classifier.py --data_dir ../dataset/binary --epochs 50
# 3. 导出 ONNX
python export_onnx.py --checkpoint checkpoints/best.pth --output ../models/gunshot_classifier.onnx
```
## ROS 集成Ubuntu
```bash
cd ~/catkin_ws/src
git clone <repo_url>
cd ~/catkin_ws
catkin_make -DCMAKE_BUILD_TYPE=Release
source devel/setup.bash
roslaunch acoustic_analyzer acoustic_node.launch
```
## 依赖
| 依赖 | 用途 | 状态 |
|------|------|------|
| Eigen 3.4.0 | 矩阵运算 | Bundled |
| ONNX Runtime 1.17+ | 模型推理 | Bundled headers + DLL/lib |
| yaml-cpp | 配置解析 | Ubuntu: `apt install libyaml-cpp-dev` |
| kiss_fft | ~~FFT~~ | **已移除**,使用内联实现 |
## 已知限制
- 当前分类器基于合成数据集训练,仅用于代码集成验证。实际部署需真实威胁音频重新训练。
- Windows 下完整流水线Pipeline 类)需要 yaml-cpp离线 demo 已绕过此依赖。
- 距离估计依赖 SPL 校准,合成音频的归一化幅度会导致距离值偏大。
## 更新日志
详见 [CHANGELOG.md](CHANGELOG.md)。
## 许可证
与父项目保持一致。

@ -0,0 +1,32 @@
@echo off
chcp 65001 >nul
setlocal EnableDelayedExpansion
echo ==========================================
echo Acoustic Analyzer Batch Validation Test
echo ==========================================
set DEMO=build\demo_offline.exe
if not exist %DEMO% (
echo [ERROR] demo_offline.exe not found. Run build_demo.bat first.
exit /b 1
)
echo.
echo [TEST 1] Validation set (all subdirectories)...
%DEMO% dataset\binary\val
if %ERRORLEVEL% NEQ 0 (
echo [FAIL] Validation test failed.
exit /b 1
)
echo.
echo [TEST 2] Single ambient file...
%DEMO% dataset\binary\val\ambient\drone_noise_val_000.wav
echo.
echo [TEST 3] Single threat file...
%DEMO% dataset\binary\val\threat\synth_threat_val_000.wav
echo.
echo [OK] All batch tests completed.
endlocal

@ -0,0 +1,52 @@
@echo off
chcp 65001 >nul
setlocal EnableDelayedExpansion
echo ==========================================
echo Acoustic Module - CMake MinGW Build
echo ==========================================
set SRC_ROOT=%~dp0
set TEMP_SRC=C:\temp\acoustic_src
set TEMP_BUILD=C:\temp\acoustic_build
set OUTPUT_DIR=%SRC_ROOT%build
REM --- Copy source to temp English path (workaround for Chinese path issues) ---
echo [INFO] Copying source to %TEMP_SRC% ...
if exist %TEMP_SRC% rmdir /s /q %TEMP_SRC%
if exist %TEMP_BUILD% rmdir /s /q %TEMP_BUILD%
mkdir %TEMP_SRC%
xcopy /s /e /i /q "%SRC_ROOT%*" "%TEMP_SRC%\" >nul
echo [INFO] Running CMake ...
mkdir %TEMP_BUILD%
cd /d %TEMP_BUILD%
cmake "%TEMP_SRC%" -G "MinGW Makefiles" ^
-DBUILD_TESTS=ON ^
-DBUILD_ONNX_TESTS=ON ^
-DBUILD_ROS_WRAPPER=OFF ^
-DCMAKE_BUILD_TYPE=Release
if %ERRORLEVEL% NEQ 0 (
echo [FAIL] CMake configuration failed.
exit /b 1
)
echo [INFO] Building with mingw32-make ...
mingw32-make -j4
if %ERRORLEVEL% NEQ 0 (
echo [FAIL] Build failed.
exit /b 1
)
REM --- Copy executables back ---
if not exist "%OUTPUT_DIR%" mkdir "%OUTPUT_DIR%"
for %%E in (test_core_lib.exe extract_mel_cpp.exe test_classifier_cpp.exe demo_offline.exe) do (
if exist "%TEMP_BUILD%\%%E" (
copy /y "%TEMP_BUILD%\%%E" "%OUTPUT_DIR%\" >nul
echo [OK] Copied %%E
)
)
echo.
echo [OK] CMake MinGW build complete. Executables in %OUTPUT_DIR%
endlocal

@ -0,0 +1,70 @@
@echo off
chcp 65001 >nul
setlocal EnableDelayedExpansion
echo ==========================================
echo Acoustic Core Library Test Build
echo ==========================================
set SRC_ROOT=%~dp0
set EIGEN=%SRC_ROOT%third_party\eigen-3.4.0
set ONNX_INC=%SRC_ROOT%third_party\onnxruntime\include
set INCLUDES=-I%SRC_ROOT%include -I%EIGEN%
set FLAGS=-std=c++17 -O2 -D_USE_MATH_DEFINES -Wa,-mbig-obj
if not exist build mkdir build
echo [1/3] Building test_core_lib.exe ...
g++ %FLAGS% %INCLUDES% ^
tests\test_core_lib.cpp ^
src\core\fft_utils.cpp ^
src\core\audio_buffer.cpp ^
src\core\feature_extractor.cpp ^
src\core\distance_estimator.cpp ^
src\core\gcc_phat_localizer.cpp ^
src\core\threat_tracker.cpp ^
src\io\wav_file_source.cpp ^
-o build\test_core_lib.exe ^
-D_stdcall=
if %ERRORLEVEL% NEQ 0 (
echo [FAIL] test_core_lib build failed.
exit /b 1
)
echo [2/3] Building extract_mel_cpp.exe ...
g++ %FLAGS% %INCLUDES% ^
tests\extract_mel_cpp.cpp ^
src\core\fft_utils.cpp ^
src\core\feature_extractor.cpp ^
src\io\wav_file_source.cpp ^
-o build\extract_mel_cpp.exe ^
-D_stdcall=
if %ERRORLEVEL% NEQ 0 (
echo [FAIL] extract_mel_cpp build failed.
exit /b 1
)
echo [3/3] Building test_classifier_cpp.exe ...
set ONNX_LIB=%SRC_ROOT%third_party\onnxruntime\lib\libonnxruntime.a
g++ %FLAGS% %INCLUDES% -I%ONNX_INC% ^
tests\test_classifier_cpp.cpp ^
src\core\fft_utils.cpp ^
src\core\feature_extractor.cpp ^
src\core\gunshot_classifier.cpp ^
src\io\wav_file_source.cpp ^
-o build\test_classifier_cpp.exe ^
%ONNX_LIB% -D_stdcall=
if %ERRORLEVEL% NEQ 0 (
echo [FAIL] test_classifier_cpp build failed.
exit /b 1
)
echo.
echo [OK] All test executables built successfully.
echo.
echo Run tests:
echo build\test_core_lib.exe
echo build\extract_mel_cpp.exe dataset\binary\val\ambient\xxx.wav
echo build\test_classifier_cpp.exe --model models\gunshot_classifier.onnx --wav dataset\binary\val\ambient\xxx.wav --label_map models\label_map.json
endlocal

@ -0,0 +1,40 @@
@echo off
chcp 65001 >nul
setlocal EnableDelayedExpansion
echo ==========================================
echo Acoustic Offline Demo Build (Windows)
echo ==========================================
set SRC_ROOT=%~dp0
set EIGEN=%SRC_ROOT%third_party\eigen-3.4.0
set ONNX_INC=%SRC_ROOT%third_party\onnxruntime\include
set ONNX_LIB=%SRC_ROOT%third_party\onnxruntime\lib\libonnxruntime.a
set INCLUDES=-I%SRC_ROOT%include -I%EIGEN% -I%ONNX_INC%
set FLAGS=-std=c++17 -O2 -D_USE_MATH_DEFINES -Wa,-mbig-obj
set LIBS=%ONNX_LIB%
if not exist build mkdir build
echo [1/1] Building demo_offline.exe (simplified, no yaml-cpp dependency) ...
g++ %FLAGS% %INCLUDES% ^
tests\demo_offline.cpp ^
src\core\fft_utils.cpp ^
src\core\feature_extractor.cpp ^
src\core\distance_estimator.cpp ^
src\core\gunshot_classifier.cpp ^
src\io\wav_file_source.cpp ^
-o build\demo_offline.exe ^
%LIBS% -D_stdcall=
if %ERRORLEVEL% NEQ 0 (
echo [FAIL] demo_offline build failed.
exit /b 1
)
echo.
echo [OK] demo_offline.exe built successfully in build\
echo.
echo Usage: build\demo_offline.exe dataset\binary\val\ambient\xxx.wav
echo build\demo_offline.exe dataset\binary\val\threat\xxx.wav
endlocal

@ -0,0 +1,74 @@
# 声源分析模块默认配置
# 本文件由 acoustic_node 通过 ros::param 或 Pipeline 直接加载
# ── 音频参数 ───────────────────────────────
audio:
sample_rate: 16000
chunk_duration: 2.0 # 分析窗口长度 (秒)
hop_duration: 0.5 # 步进 (秒)
n_channels: 4 # 麦克风数量
# ── 音频源选择 ──────────────────────────────
# [TEMP] 临时方案: 手机麦克风单通道测试
# [FINAL] 最终方案: 麦克风阵列多通道定位
# 可选值: "mic_array" (最终), "mobile_phone" (临时), "wav_file" (离线测试)
source:
type: "mic_array" # [FINAL] 最终方案4 通道麦克风阵列
# 临时方案参数 (手机音频)
mobile_phone_topic: "/mobile_phone/audio"
mobile_phone_timeout: 10.0 # 等待连接超时 (秒)
# 离线测试参数
wav_file_path: "" # 若 type="wav_file",填写 WAV 路径
# ── 麦克风阵列几何 (单位: 米) ──────────────
# layout 可选: cross, linear, circular, custom
# 使用 custom 时,需要填写 positions 数组 [x, y, z]
# [TEMP] 临时方案手机单通道num_mics=1, layout 任意
# [FINAL] 最终方案4 通道阵列num_mics=4, layout=cross
mic_array:
num_mics: 4 # [FINAL] 4 通道十字阵列
layout: "cross" # 单通道时此值被忽略
spacing: 0.15
positions:
- [0.0, 0.15, 0.0] # Mic 1 (前)
- [0.15, 0.0, 0.0] # Mic 2 (右)
- [0.0, -0.15, 0.0] # Mic 3 (后)
- [-0.15, 0.0, 0.0] # Mic 4 (左)
# ── 特征提取 ────────────────────────────────
features:
n_mels: 64
n_fft: 2048
hop_length: 512
f_min: 0.0
f_max: 8000.0
preemphasis: 0.97
# ── 分类器 ──────────────────────────────────
classifier:
model_path: "$(find acoustic_analyzer)/models/gunshot_classifier.onnx"
label_map_path: "$(find acoustic_analyzer)/models/label_map.json"
threshold: 0.7
smoothing_window: 3
# ── 定位 ────────────────────────────────────
localization:
algorithm: "gcc_phat"
max_tdoa: 0.00044 # 最大时延 (0.15m / 343m/s)
interpolation_factor: 4 # 互相关插值倍数
# ── 距离估计 ─────────────────────────────────
distance:
reference_spl:
threat: 150 # [FINAL] 二分类模型统一使用 threat 参考 SPL
gunshot: 150 # 兼容 4 类模型
artillery: 180
explosion: 170
attenuation_alpha: 0.6
kalman_process_noise: 0.01
kalman_measurement_noise: 5.0
# ── 输出 ────────────────────────────────────
output:
publish_rate: 10 # 最大输出频率 (Hz)
min_event_interval: 0.3 # 同一威胁最小上报间隔 (秒)

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save