# 多模态融合节点 — 声学威胁订阅补丁

> 问题：C++ 多模态融合节点未订阅 `/acoustic/threats`，导致声源数据无法参与融合避障。
> 适用文件：`src/多模态融合/cpp/src/main.cpp`

---

## 修改 1：添加成员变量

在 `ros::Subscriber flash_det_sub_;` 之后添加：

```cpp
    ros::Subscriber acoustic_sub_;     // /acoustic/threats
```

## 修改 2：在 setup_ros() 中订阅声学话题

在 `flash_enabled` 订阅块之后、`// ── 定时器 ──` 之前添加：

```cpp
        // ── 声学威胁订阅者 ──
        if (cfg_.acoustic_enabled) {
            acoustic_sub_ = nh.subscribe("/acoustic/threats", 5,
                &ThreatFusionNode::acoustic_threats_cb, this);
            ROS_INFO("[ThreatFusion] 已订阅 /acoustic/threats");
        }
```

## 修改 3：添加回调函数

在 `flash_detection_cb` 之后、`fusion_timer_cb` 之前添加：

```cpp
    void acoustic_threats_cb(const acoustic_analyzer::AcousticThreatArray::ConstPtr& msg) {
        for (const auto& t : msg->threats) {
            if (t.confidence < cfg_.acoustic_confidence_threshold) continue;
            AcousticThreatData a;
            a.threat_id           = t.threat_id;
            a.sound_type          = t.sound_type;
            a.confidence          = t.confidence;
            a.azimuth             = t.azimuth;
            a.elevation           = t.elevation;
            a.distance            = t.distance;
            a.distance_confidence = t.distance_confidence;
            a.timestamp           = get_time();
            cache_.add_acoustic(a);
        }
        modality_status_["acoustic"] = "OK";
    }
```

## 修改 4：添加消息头文件 include

在文件顶部的 include 区域添加：

```cpp
#include <acoustic_analyzer/AcousticThreatArray.h>
```

> 注：若构建时提示找不到该头文件，需确保 `acoustic_analyzer` 包已编译（`catkin_make`），并在 CMakeLists.txt 的 `find_package` 中声明依赖。

---

*补丁生成时间：2026-05-23*
