智途投送系统 — 软件体系结构图

按《软件体系结构》课程规范绘制 | 管道-过滤器 / 分层 / 客户端-服务器 / 发布-订阅

图1 系统整体体系结构 — 分层 + 客户端-服务器风格
单兵终端APP(客户端) Client-Server 架构 / 分层结构 后勤保障系统(服务器端) Layered 分层架构 / REST API 无人机软件系统 Pipe-Filter + Pub-Sub 混合架构 表示层 (Presentation) UI界面 / 地图 / 交互控件 业务逻辑层 (Service) 需求上报 / 位置同步 / 策略选择 数据访问层 (Data Access) REST API调用 / 本地存储 硬件抽象层 (HAL) GPS / 网络 / 摄像头 表示层 (Web前端) HTML/CSS/JS / 地图可视化 应用层 (Flask API) REST路由 / 任务调度 / 身份认证 业务逻辑层 (Services) 路径规划 / 资源分配 / 威胁融合 数据层 (Data) SQLite / 内存数据 / 日志 ROS 节点层 (Pub-Sub) 威胁发布 / 航点订阅 / 状态广播 感知流水线层 (Pipe-Filter) 声学/视觉/热成像 → 威胁地图 算法核心层 (Core) GCC-PHAT / CNN-GRU / SPL 硬件接口层 (Drivers) 麦克风 / 相机 / IMU / GPS HTTP/REST ROS/WebSocket rosbridge / WebSocket(间接通信,经由后勤保障系统或直接)

设计说明:三大子系统各自内部采用分层架构,子系统间采用客户端-服务器风格交互。 上层(单兵APP、Web前端)通过 REST API 与后勤保障系统通信;后勤保障系统通过 ROS 网络与无人机交互。 分层架构的约束:每一层只使用直接下层提供的服务,层与层之间通过定义好的接口协议交互。

图2 声源分析模块 — 管道-过滤器体系结构(我负责部分)
数据流:原始音频 → [缓冲 → 特征 → 分类 → 定位/测距 → 跟踪] → 威胁事件 数据源 麦克风阵列 WAV文件 Filter 1 AudioBuffer 循环缓冲区 滑动窗口管理 Filter 2 FeatureExtractor Mel频谱图提取 FFT + Mel滤波器组 Filter 3 GunshotClassifier CNN-GRU分类 ONNX Runtime推理 Filter 4a GccPhatLocalizer GCC-PHAT定位 时延估计 → 方位角/俯仰角 Filter 4b DistanceEstimator SPL距离估计 声压级衰减 + Kalman滤波 Filter 5 ThreatTracker 威胁跟踪/去重 时域去重 + ID分配 数据汇点 AcousticThreat 事件 float[] float[] MatrixXf label+conf label azimuth,elevation distance AcousticFrame VAD门控 能量+过零率检测 时序平滑 滑动窗口平均 过滤器组件 (独立处理单元) 数据源/汇点 (系统边界) 管道 (数据流)

管道-过滤器风格的四个核心特征在本模块的体现:
过滤器独立性:每个 Filter(如 FeatureExtractor、GunshotClassifier)都是独立的类,不与其他 Filter 共享状态;
数据流驱动:音频数据沿管道单向流动,无循环(符合「不允许出现环」的约束);
局部变换:每个 Filter 只负责一种局部变换(时域→频域→概率→方位→距离);
黑盒复用:GunshotClassifier 可独立替换为其他模型(如 Transformer),只要输入输出 Mel 频谱图格式不变。

图3 声源分析模块 — 分层体系结构(静态视角)
Layer 3:应用/集成层 (Application/Integration) ROS 包装器 / 节点生命周期管理 / 话题发布订阅 acoustic_node.cpp | threat_publisher.cpp Layer 2:业务逻辑层 (Business Logic / Pipeline) 流水线编排 (Pipeline) / 配置管理 / 数据类型定义 pipeline.cpp | types.h | 配置解析 (YAML) Layer 1:算法核心层 (Algorithm Core) 音频缓冲 (AudioBuffer) | 特征提取 (FeatureExtractor) | 分类器 (GunshotClassifier) 声源定位 (GccPhatLocalizer) | 距离估计 (DistanceEstimator) | 威胁跟踪 (ThreatTracker) FFT工具 (fft_utils) | IO适配 (WavFileSource, MobilePhoneSource) 上层 → 下层:只允许向下依赖(依赖倒置原则) core 层完全不依赖 ROS / yaml-cpp / 操作系统 Ubuntu (实机部署) BUILD_ROS_WRAPPER=ON ROS节点 + 麦克风阵列驱动 Windows / Linux (仿真调试) BUILD_ROS_WRAPPER=OFF 离线WAV测试 + 单元测试 分层架构约束:① 每一层只使用直接下层的服务 ② 层间通过接口交互,不直接访问实现 ③ 下层修改不影响上层(只要接口不变)

设计说明:通过分层隔离,算法核心层(Layer 1)完全与 ROS、操作系统解耦。 这意味着同一套 C++ 声学算法既可以在 Ubuntu 上作为 ROS 节点运行(控制真实无人机), 也可以在 Windows 上编译为独立可执行文件做离线仿真测试,实现了"一次开发,多处部署"。

图4 无人机感知系统 — 发布-订阅(Pub-Sub)运行时交互
ROS Master 节点注册 / 话题匹配 ROS Topic 总线(异步消息通道) /microphone_array/audio | /acoustic_threat | /threat_map | /dynamic_waypoints Publisher 麦克风阵列驱动节点 发布:/microphone_array/audio 数据类型:Float32MultiArray Publisher(我负责) 声学分析节点 (acoustic_node) 订阅:/microphone_array/audio 发布:/acoustic_threat Subscriber + Publisher 多模态融合节点 订阅:/acoustic_threat + /vision_threat 发布:/threat_map Subscriber 动态路径规划节点 订阅:/threat_map 发布:/dynamic_waypoints 音频数据流 AcousticThreat 事件 融合后的 ThreatMap 发布-订阅特征:① 发布者与订阅者完全解耦,互不知道对方存在 ② 支持一对多广播(一个威胁事件可被多个消费者处理) ③ 异步非阻塞,适合实时感知系统的低延迟要求

设计说明:发布-订阅风格使得声学分析节点无需关心"谁会使用威胁结果"。 在仿真阶段,可以订阅 /acoustic_threat 做可视化验证;在实机阶段,同一个话题被多模态融合节点订阅。 这种「隐式调用」机制大幅降低了系统各模块间的耦合度。

图5 PIMPL 惯用法 — 信息隐藏与编译隔离
公开头文件 (Public API) pipeline.h / feature_extractor.h class Pipeline { public: Process(audio) FromYaml(path) Reset() private: Impl* impl_; }; 实现文件 (Private Implementation) pipeline.cpp struct Pipeline::Impl { AudioBuffer* FeatureExtractor* GunshotClassifier* GccPhatLocalizer* ... }; 编译依赖 (.cpp 包含所有头文件) 无反向依赖(接口不感知实现细节) 编译防火墙 效果:修改 Impl 内部(如替换 FFT 库、新增滤波器)→ 无需重新编译依赖 pipeline.h 的其他模块 → 大幅缩短编译时间,降低模块耦合

设计说明:PIMPL(Pointer to Implementation)是 C++ 中实现「信息隐藏」的经典惯用法。 它将类的实现细节完全移入 .cpp 文件,头文件中只暴露接口指针。 这符合软件体系结构「接口与实现分离」的原则,也提升了系统的可修改性质量属性。

智途投送系统 — 软件体系结构汇报用图 | 绘制规范参考《软件体系结构》课程