形式放在同一 HTML 中。通过 CSS class active 控制显示/隐藏,配合 pageStack 实现返回上一页。底部 Tab 栏仅在首页、任务、无人机、我的四个主页面显示。`),
+ boldPara("js/app.js - 路由切换"),
+ codeBlock([
+ 'function router(page) {',
+ ' document.querySelectorAll(".page").forEach(p => p.classList.remove("active"));',
+ ' const target = document.getElementById("page-" + page);',
+ ' if (target) target.classList.add("active");',
+ ' // Tab 高亮与显隐控制',
+ ' document.querySelectorAll(".tab-item").forEach(t => t.classList.remove("active"));',
+ ' const tabItem = document.querySelector(\'.tab-item[data-page="\' + page + \'"]\');',
+ ' if (tabItem) tabItem.classList.add("active");',
+ ' const tabBar = document.getElementById("tab-bar");',
+ ' tabBar.style.display = TAB_PAGES.includes(page) ? "flex" : "none";',
+ ' pageStack.push(page);',
+ ' currentPage = page;',
+ ' onPageEnter(page); // 页面专属初始化',
+ '}'
+ ]),
+
+ // 3.4 GPS定位
+ subHeading("3.4 GPS 定位与自动上报", HeadingLevel.HEADING_2),
+ bodyPara("定位模块实现了四级降级策略:高德 JS 定位 → Capacitor 原生 GPS → 浏览器 Geolocation → IP 网络定位 → 默认坐标。确保在各种网络与权限环境下都能获得可用位置。"),
+ boldPara("js/location.js - 四级定位降级"),
+ codeBlock([
+ 'async function getCurrentPosition() {',
+ ' // 1. 高德定位',
+ ' try { return await getAmapPosition(); }',
+ ' catch (e) { errors.push("高德:" + e.message); }',
+ ' // 2. Capacitor 原生定位',
+ ' try { return await getCapacitorPosition(); }',
+ ' catch (e) { errors.push("原生:" + e.message); }',
+ ' // 3. 浏览器定位',
+ ' try { return await getBrowserPosition(); }',
+ ' catch (e) { errors.push("浏览器:" + e.message); }',
+ ' // 4. IP 定位',
+ ' try { return await getIpPosition(); }',
+ ' catch (e) { errors.push("IP:" + e.message); }',
+ ' // 5. 默认兜底',
+ ' return { lat: 30.2500, lng: 120.1600, accuracy: 100, source: "default" };',
+ '}'
+ ]),
+ bodyPara("登录成功后,app.js 调用 LocationModule.startReporting() 启动定时上报,每隔 10 秒将坐标发送至后端 /api/soldier/location。"),
+ boldPara("js/app.js - 启动自动上报"),
+ codeBlock([
+ 'function startLocationReporting() {',
+ ' LocationModule.startReporting(CONFIG.soldierId, CONFIG.soldierName, 10000);',
+ '}'
+ ]),
+
+ // 3.5 物资需求上报
+ subHeading("3.5 物资需求上报", HeadingLevel.HEADING_2),
+ bodyPara("士兵在“需求上报”页选择物资类型、数量、紧急程度,并关联投放点。提交时组装 JSON 对象,通过 POST /api/demand 发送至后端。投放点数据可以是地图选点结果,也可以是系统推荐列表中的安全点。"),
+ boldPara("js/app.js - 提交需求"),
+ codeBlock([
+ 'async function submitDemand() {',
+ ' const type = document.getElementById("demand-type").value;',
+ ' const qty = document.getElementById("demand-qty").value;',
+ ' const urgency = document.querySelector("#urgency-group .radio-label.active")',
+ ' .dataset.value;',
+ ' const demand = {',
+ ' soldier_id: CONFIG.soldierId,',
+ ' type, quantity: parseInt(qty), urgency,',
+ ' drop_point: selectedDropPoint,',
+ ' status: "待处理",',
+ ' created_at: new Date().toISOString()',
+ ' };',
+ ' await API.postDemand(demand);',
+ ' showToast("✅ 需求上报成功!");',
+ ' router("home");',
+ '}'
+ ]),
+
+ // 3.6 投放点与地图
+ subHeading("3.6 投放点选择与地图集成", HeadingLevel.HEADING_2),
+ bodyPara("投放点选择页整合了三种交互方式:地图直接点击选点、地点关键词搜索、附近推荐列表。地图基于高德 JS API 2.0 动态初始化,支持逆地理编码获取地址名称;若动态地图加载失败,自动降级为静态地图图片。"),
+ boldPara("js/location.js - 地图选点初始化"),
+ codeBlock([
+ 'async function initPickerMap(containerId, onSelectCallback) {',
+ ' const AMap = await loadAmapScript();',
+ ' const container = document.getElementById(containerId);',
+ ' container.style.width = "100%";',
+ ' container.style.height = "280px";',
+ ' container.innerHTML = "";',
+ ' pickerMap = new AMap.Map(containerId, {',
+ ' zoom: 15, center: [center.lng, center.lat], resizeEnable: true',
+ ' });',
+ ' // 点击地图选点',
+ ' pickerMap.on("click", (e) => {',
+ ' const lng = e.lnglat.lng, lat = e.lnglat.lat;',
+ ' pickerGeocoder.getAddress([lng, lat], (status, result) => {',
+ ' let address = result.regeocode.formattedAddress;',
+ ' onSelectCallback({ lat, lng, name, address });',
+ ' });',
+ ' });',
+ '}'
+ ]),
+
+ // 3.7 任务监控
+ subHeading("3.7 任务进度监控", HeadingLevel.HEADING_2),
+ bodyPara("任务页展示当前运输任务的进度、预计到达时间、飞行路径与投放点安全系数。进入页面时调用 API.getCurrentTask() 获取数据;若后端不可用,返回 Mock 数据保证界面不空白。"),
+ boldPara("js/app.js - 加载任务信息"),
+ codeBlock([
+ 'async function loadTaskInfo() {',
+ ' const task = await API.getCurrentTask(CONFIG.soldierId);',
+ ' if (task) {',
+ ' document.getElementById("task-id").textContent = task.id;',
+ ' document.getElementById("task-status").textContent =',
+ ' statusMap[task.status]?.text || task.status;',
+ ' const prog = task.progress || 0;',
+ ' const filled = Math.round(20 * prog / 100);',
+ ' document.getElementById("task-progress-text").textContent =',
+ ' "█".repeat(filled) + "░".repeat(20 - filled) + " " + prog + "%";',
+ ' }',
+ '}'
+ ]),
+
+ // 3.8 无人机状态
+ subHeading("3.8 无人机状态查看", HeadingLevel.HEADING_2),
+ bodyPara("无人机页展示实时飞行数据:速度、高度、电量、温度、距离目标等,以及最近动态日志。与任务页共用轮询机制,每 5 秒自动刷新。"),
+ boldPara("js/app.js - 加载无人机状态"),
+ codeBlock([
+ 'async function loadDroneStatus() {',
+ ' const status = await API.getDroneStatus();',
+ ' if (status) {',
+ ' document.getElementById("drone-battery").textContent = status.battery + "%";',
+ ' document.getElementById("drone-speed").textContent = status.speed + "m/s";',
+ ' document.getElementById("drone-alt").textContent = status.altitude + "m";',
+ ' document.getElementById("drone-dist").textContent = status.distance + "m";',
+ ' }',
+ ' const logs = await API.getDroneLogs();',
+ ' document.getElementById("drone-logs").innerHTML =',
+ ' logs.map(l => `
...`).join("");',
+ '}'
+ ]),
+
+ // 3.9 SOS
+ subHeading("3.9 一键 SOS 求救", HeadingLevel.HEADING_2),
+ bodyPara("设置页提供紧急求救按钮,点击后二次确认,随后获取当前 GPS 坐标并立即上报后端 /api/sos。上报内容包含士兵ID、姓名、坐标和时间戳。"),
+ boldPara("js/app.js - SOS 求救"),
+ codeBlock([
+ 'async function triggerSOS() {',
+ ' if (!confirm("确认发送求救信号?此操作将立即上报您的当前位置。")) return;',
+ ' const pos = await LocationModule.getCurrentPosition();',
+ ' await API.sendSOS({',
+ ' soldier_id: CONFIG.soldierId,',
+ ' soldier_name: CONFIG.soldierName,',
+ ' lat: pos.lat, lng: pos.lng,',
+ ' time: new Date().toISOString()',
+ ' });',
+ ' showToast("🚨 求救信号已发送!");',
+ '}'
+ ]),
+
+ // 3.10 API封装
+ subHeading("3.10 API 通信封装与离线降级", HeadingLevel.HEADING_2),
+ bodyPara("api.js 封装了所有后端接口请求,统一处理超时(5 秒)、JSON 序列化和错误捕获。对于投放点、任务、无人机状态等查询类接口,若后端不可用或超时,自动返回 Mock 数据,确保 APP 在离线/演示场景下仍可正常使用。"),
+ boldPara("js/api.js - 统一请求与超时控制"),
+ codeBlock([
+ 'async function request(url, options = {}) {',
+ ' const fullUrl = url.startsWith("http") ? url : BASE + url;',
+ ' const controller = new AbortController();',
+ ' const timeoutId = setTimeout(() => controller.abort(), 5000);',
+ ' try {',
+ ' const resp = await fetch(fullUrl, {',
+ ' headers: { "Content-Type": "application/json" },',
+ ' signal: controller.signal, ...options',
+ ' });',
+ ' clearTimeout(timeoutId);',
+ ' return resp.json();',
+ ' } catch (e) {',
+ ' clearTimeout(timeoutId);',
+ ' if (e.name === "AbortError")',
+ ' throw new Error("请求超时,请检查后端是否启动");',
+ ' throw e;',
+ ' }',
+ '}'
+ ]),
+ boldPara("js/api.js - Mock 降级示例"),
+ codeBlock([
+ 'async function getDropPoints() {',
+ ' try {',
+ ' const data = await request("/api/drop-points");',
+ ' return data.drop_points || data;',
+ ' } catch (e) {',
+ ' return getMockDropPoints(); // 离线兜底',
+ ' }',
+ '}'
+ ]),
+
+ // 第四章 总结
+ new Paragraph({ children: [new PageBreak()] }),
+ subHeading("四、设计特点与总结", HeadingLevel.HEADING_1),
+ bodyPara("单兵终端APP在设计上遵循“简单、可靠、可演示”的原则,主要特点如下:"),
+ new Paragraph({ numbering: { reference: "numbers", level: 0 }, spacing: { before: 80, after: 80 },
+ children: [new TextRun({ font: "宋体", size: 24, text: "混合架构,跨平台成本低:基于 Capacitor 将 Web 技术打包为 Android APK,一套代码同时支持手机浏览器预览和真机安装。" })] }),
+ new Paragraph({ numbering: { reference: "numbers", level: 0 }, spacing: { before: 80, after: 80 },
+ children: [new TextRun({ font: "宋体", size: 24, text: "多级定位降级,适应战场复杂环境:四级定位策略 + 手动修正,确保在城市、室内、弱网环境下仍能获取可用坐标。" })] }),
+ new Paragraph({ numbering: { reference: "numbers", level: 0 }, spacing: { before: 80, after: 80 },
+ children: [new TextRun({ font: "宋体", size: 24, text: "Mock 数据兜底,支持离线演示:所有查询类 API 在后端不可用时自动返回模拟数据,便于开发调试与现场演示。" })] }),
+ new Paragraph({ numbering: { reference: "numbers", level: 0 }, spacing: { before: 80, after: 80 },
+ children: [new TextRun({ font: "宋体", size: 24, text: "模块职责清晰,易于维护:app.js 负责业务与UI、api.js 负责网络、location.js 负责定位与地图,三层之间通过明确接口协作。" })] }),
+ new Paragraph({ numbering: { reference: "numbers", level: 0 }, spacing: { before: 80, after: 80 },
+ children: [new TextRun({ font: "宋体", size: 24, text: "安全与权限考虑:Android 开启明文传输用于局域网调试;高德地图、GPS 权限在运行时动态申请;SOS 操作提供二次确认防止误触。" })] }),
+ bodyPara("综上所述,单兵终端APP通过简洁的分层架构和稳健的降级策略,实现了前线士兵在复杂战场环境下的物资需求上报、位置共享与任务协同功能。"),
+ ]
+ }]
+});
+
+Packer.toBuffer(doc).then(buffer => {
+ fs.writeFileSync("单兵终端APP_架构与功能实现说明.docx", buffer);
+ console.log("文档已生成:单兵终端APP_架构与功能实现说明.docx");
+});
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 00000000..6f05f1d3
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,204 @@
+{
+ "name": "智途投送软件系统",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "dependencies": {
+ "docx": "^9.6.1"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "25.6.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz",
+ "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~7.19.0"
+ }
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "license": "MIT"
+ },
+ "node_modules/docx": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/docx/-/docx-9.6.1.tgz",
+ "integrity": "sha512-ZJja9/KBUuFC109sCMzovoq2GR2wCG/AuxivjA+OHj/q0TEgJIm3S7yrlUxIy3B+bV8YDj/BiHfWyrRFmyWpDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "^25.2.3",
+ "hash.js": "^1.1.7",
+ "jszip": "^3.10.1",
+ "nanoid": "^5.1.3",
+ "xml": "^1.0.1",
+ "xml-js": "^1.6.8"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
+ }
+ },
+ "node_modules/immediate": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
+ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==",
+ "license": "MIT"
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "license": "MIT"
+ },
+ "node_modules/jszip": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
+ "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
+ "license": "(MIT OR GPL-3.0-or-later)",
+ "dependencies": {
+ "lie": "~3.3.0",
+ "pako": "~1.0.2",
+ "readable-stream": "~2.3.6",
+ "setimmediate": "^1.0.5"
+ }
+ },
+ "node_modules/lie": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
+ "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "immediate": "~3.0.5"
+ }
+ },
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "license": "ISC"
+ },
+ "node_modules/nanoid": {
+ "version": "5.1.9",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.9.tgz",
+ "integrity": "sha512-ZUvP7KeBLe3OZ1ypw6dI/TzYJuvHP77IM4Ry73waSQTLn8/g8rpdjfyVAh7t1/+FjBtG4lCP42MEbDxOsRpBMw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.js"
+ },
+ "engines": {
+ "node": "^18 || >=20"
+ }
+ },
+ "node_modules/pako": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+ "license": "(MIT AND Zlib)"
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "license": "MIT"
+ },
+ "node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "license": "MIT"
+ },
+ "node_modules/sax": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz",
+ "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=11.0.0"
+ }
+ },
+ "node_modules/setimmediate": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
+ "license": "MIT"
+ },
+ "node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "7.19.2",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz",
+ "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==",
+ "license": "MIT"
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "license": "MIT"
+ },
+ "node_modules/xml": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz",
+ "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==",
+ "license": "MIT"
+ },
+ "node_modules/xml-js": {
+ "version": "1.6.11",
+ "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz",
+ "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==",
+ "license": "MIT",
+ "dependencies": {
+ "sax": "^1.2.4"
+ },
+ "bin": {
+ "xml-js": "bin/cli.js"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 00000000..b33d018e
--- /dev/null
+++ b/package.json
@@ -0,0 +1,5 @@
+{
+ "dependencies": {
+ "docx": "^9.6.1"
+ }
+}
diff --git a/temp_doc_content.txt b/temp_doc_content.txt
new file mode 100644
index 00000000..973df360
Binary files /dev/null and b/temp_doc_content.txt differ
diff --git a/temp_doc_content_utf8.txt b/temp_doc_content_utf8.txt
new file mode 100644
index 00000000..2ac985d0
--- /dev/null
+++ b/temp_doc_content_utf8.txt
@@ -0,0 +1,100 @@
+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 助手将读取本文档及项目代码,基于当前状态继续推进。
diff --git a/temp_req.txt b/temp_req.txt
new file mode 100644
index 00000000..ddf42bb2
--- /dev/null
+++ b/temp_req.txt
@@ -0,0 +1,5 @@
+=== 第四组软件需求规格说明书 ===
+文档编号:“智途投送”软件系统 – SRS – 1.0 “智途投送”软件系统软件需求规格说明书日期:2026年3月30日文档变更历史记录序号变更日期变更人员变更内容详情描述变更后的版本号12026/3/29全员撰写了软件需求规格说明书初稿V1.0目录1. 引言41.1 编写目的41.2 读者对象41.3 软件项目概述41.4 文档概述41.5 定义41.6 参考资料42. 软件的一般性描述52.1软件产品与其环境之间的关系52.2限制与约束52.3假设与前提条件53. 软件功能需求描述53.1 软件功能概述53.2 软件需求的用例模型53.3 软件需求的分析模型54. 其它软件需求描述54.1 性能要求54.2 设计约束64.3 界面要求64.4 进度要求64.5 交付要求64.6 验收要求65. 软件原型61. 引言1.1 编写目的本文档为“最后一公里”智能运输软件系统的软件需求规格说明,旨在对系统的功能需求、非功能需求及约束条件进行完整、准确、规范的描述。编写目的主要包括以下几点:·明确系统需求边界:完整定义系统应具备的功能、性能及约束,为后续设计与开发提供统一的需求边界。·指导开发与测试:为开发团队提供详细的功能规格说明,为测试团队提供需求验证的依据。·支持评审与决策:为项目评审、技术决策及需求变更管理提供正式的参考文档。·促进团队协作:统一各子系统(单兵终端、无人机软件、后勤保障系统)开发人员对系统需求的理解。1.2 读者对象本文档的目标读者包括用户,分析人员,软件设计人员,项目管理人员。1.3 软件项目概述项目名称:“智途投送”软件系统项目简称:“智途投送”用户单位:城市作战环境下的前线作战单兵及后方后勤保障指挥部门开发单位:国防科大计算机学院23级软件工程小班王嘉奇小组软件项目背景和大致功能:近年来,多场局部战争的实战经验反复证明,后勤补给的最后一公里已成为制约战场持续作战能力的核心瓶颈。所谓战场后勤的最后一公里,是指作战物资从后方集散中心输送至前线作战单元、偏远阵地士兵手中的最后一段末端配送路程,该环节直面复杂地形、敌方袭扰、火力封锁、通信中断等多重风险。2023年以哈战争中,以军在加沙城市巷战环境遭遇严重后勤困境,狭窄街巷、密集建筑使得传统装甲运输车难以深入城区,补给车队频遭伏击。2022年俄乌冲突中,前线部队长期面临弹药、食品、急救药品严重短缺,传统有人运输在最后几公里内频繁遭遇炮火覆盖,伤亡率极高。即便引入无人机等无人平台,也因缺乏统一调度、智能路径规划和安全投放策略,末端配送效率低下、协调困难。本软件专为解决城市作战环境下“最后一公里”末端补给难题而设计,聚焦无人机物资投送场景。系统支持前线士兵通过终端实时上报需求,后方统一调度无人机执行运输任务;无人机基于城市三维模型识别墙体等障碍物,智能规划安全飞行路径,确保关键物资在复杂城市战场环境下能够隐蔽、安全、及时送达作战人员手中;无人机还能实时同步士兵位置变化,支持任务执行过程中动态更新投放目标。1.4 文档概述本文档按照软件需求规格说明书的标准结构组织,共分为五个部分:第1章 引言:阐述文档的编写目的、读者对象、项目概述、文档结构、术语定义及参考资料。第2章 软件的一般性描述:描述系统与其运行环境之间的关系,包括系统组成、部署架构、外部接口、限制约束及假设前提。第3章 软件功能需求描述:以用例模型和分析模型的方式,详细描述系统的各项功能需求,包括物资请求与任务规划、路径规划策略选择、动态目标调整、信息加密与安全传输、自主路径规划与动态避障、安全投放点筛选、应急处理等功能。第4章 其它软件需求描述:描述系统的性能要求、设计约束、界面要求、进度要求、交付要求及验收要求。第5章 软件原型:提供系统原型及必要的说明。1.5 定义本文档中涉及到一些关键术语,它们的具体说明如下表1所示。术语/缩写全称定义最后一公里Last Mile作战物资从后方集散中心输送至前线作战单元、偏远阵地士兵手中的末端配送路程UAVUnmanned Aerial Vehicle无人机,本系统中指执行物资运输任务的多旋翼无人机IMUInertial Measurement Unit惯性测量单元,提供姿态与角速度信息,用于视觉导航辅助GPSGlobal Positioning System全球定位系统,用于提供无人机和士兵的位置信息SDKSoftware Development Kit软件开发工具包AESAdvanced Encryption Standard高级加密标准,本系统用于通信数据加密A*A-Star Algorithm一种启发式路径搜索算法,用于全局路径规划RRTRapidly-exploring Random Tree快速扩展随机树算法,用于复杂环境下的路径规划OpenCVOpen Source Computer Vision Library开源计算机视觉库,用于图像处理与障碍物识别PX4PX4 Autopilot开源飞控系统,支持无人机自主飞行开发GazeboGazebo Simulator开源机器人仿真平台,用于算法验证表 1 术语说明表1.6 参考资料[1].GB/T 8567-2006 计算机软件文档编制规范.中国国家标准化管理委员会.2006[2].IEEE 830-1998 软件需求规格说明推荐实践.IEEE.1998[3].“最后一公里”智能运输软件系统的需求构思及描述.第四组.2026[4].CSIS报告:俄乌冲突中的无人机末端投送分析.Center for Strategic and International Studies.2022[5].文档模板:软件需求规格说明书.课程提供.20262. 软件的一般性描述2.1 软件产品与其环境之间的关系1.系统总体架构本系统由三大核心子系统构成:单兵终端系统、无人机软件系统、后勤保障系统,各子系统协同配合,共同完成城市巷战中物资运输的完整闭环任务,三个子系统的部署图如图1所示。(1)单兵终端系统部署于前线士兵随身携带的智能手表/手环或智能手机上,安装轻量级终端APP。作为士兵与后勤保障系统的交互入口,负责物资需求上报、库存查询、投放点导航及消息通知接收。通过移动网络或局域网与后勤保障系统保持通信。(2)无人机软件系统搭载于多旋翼无人机平台,集成路径规划算法模块、动态避障算法模块、飞行控制模块及视觉导航模块,负责执行运输任务、自主路径规划及动态避障。机载软件预加载城市三维模型,与后勤保障系统通过无线网络保持通信。(3)后勤保障系统部署于后方指挥所或移动指挥车的服务器或高性能PC上,包含任务调度模块、数据库管理模块、通信服务模块、可视化监控模块及城市地图数据,负责需求接收、无人机任务分配、资源管理、状态监控及通信中继。图 1 软件系统部署图2. 子系统间数据流关系三大子系统之间存在以下数据交互关系:数据流向传输内容通信方式频率单兵终端 → 后勤保障系统物资需求(类型、数量、紧急程度、位置)加密无线通信按需触发后勤保障系统 → 无人机任务指令(起点、目标区域、物资信息、策略)Wi-Fi/数传电台任务下发时无人机 → 后勤保障系统飞行状态、位置、电量、任务进度Wi-Fi/数传电台周期性上报后勤保障系统 → 单兵终端投放点位置、预计到达时间、任务状态加密无线通信任务确认后推送表 2 子系统数据交互关系说明表3. 外部系统与硬件环境本系统与以下外部系统及硬件环境存在交互关系:关系描述交互方式为无人机和单兵终端提供定位信息卫星信号接收为各子系统间数据传输提供通信链路Wi-Fi / 4G / 5G / 数传电台提供建筑轮廓、道路网络、三维模型数据预加载至本地执行飞行控制指令,反馈传感器数据SDK / MAVLink协议提供环境图像数据用于障碍物识别与视觉导航图像数据采集提供姿态与角速度数据用于视觉导航辅助传感器数据读取表 3 外部系统与硬件环境交互关系表4. 用户角色系统主要包含三类用户角色,他们分别有不同的职责,具体描述如下表4所示。角色职责描述使用子系统前线士兵上报物资需求、查看库存信息、接收投放点通知、选择路径策略、更新目标位置单兵终端系统后勤调度员接收需求、分配无人机任务、监控任务状态、管理物资库存、标注威胁区域后勤保障系统系统管理员系统配置、用户管理、数据维护、日志审计后勤保障系统表 4 用户角色职责描述表2.2 限制与约束1. 硬件约束无人机载荷限制:多旋翼无人机载荷能力建议不低于2kg,单次运输物资量受载荷与续航双重约束。无人机续航限制:续航时间建议不低于20分钟,任务规划需考虑电量消耗与安全返航预留。终端设备限制:单兵终端运行于智能手表/手环或智能手机,计算资源与存储空间有限,仅部署轻量级应用。视觉传感器限制:采用普通摄像头而非激光雷达,在低光照、遮挡、纹理缺失等条件下识别精度受限。服务器资源:后勤保障系统部署于普通PC或笔记本,算力有限,复杂算法运算需进行效率优化。2.通信约束城市环境遮挡:建筑物密集导致无线信号不稳定,通信链路可能中断。带宽限制:战场环境下可用通信带宽有限,数据传输需进行压缩与优先级管理。通信范围:无人机与后勤保障系统的有效通信距离受限于无线设备功率与地形遮挡。加密开销:AES加密与完整性校验会增加通信延迟,需在安全性与实时性之间取得平衡。3. 环境约束GPS信号受限:城市峡谷效应可能导致GPS信号漂移或丢失,需视觉导航与IMU辅助定位。气象条件:大风、降雨、沙尘等复杂气象条件影响无人机飞行安全,需设置气象阈值。电磁干扰:战场电磁环境复杂,可能影响GPS信号与无线通信质量。动态环境:城市战场环境瞬息万变,建筑损毁、道路阻断等变化需系统具备快速适应能力。4. 数据约束三维模型精度:建筑模型精度不足或数据更新滞后可能导致视线遮蔽计算误差。地图数据时效性:城市战场环境中建筑可能被摧毁或改变,预加载的地图数据可能过时。威胁信息准确性:敌方火力点、禁区等威胁区域信息依赖人工标注,可能存在滞后或遗漏。5. 安全约束通信安全:所有子系统间数据传输必须经过加密处理,防止敌方截获与篡改。身份认证:系统需实现双向身份认证,防止非法节点接入。位置信息安全:士兵位置、投放点坐标等敏感信息需严格保护,防止敌方通过投放点反推阵地位置。抗干扰能力:系统需具备一定的抗电磁干扰和抗欺骗能力。6. 开发约束开发周期:课程项目周期有限,需合理规划开发优先级,核心功能优先实现。团队规模:开发团队人数有限,需合理分工,各子系统并行开发。实验条件:实际无人机飞行实验条件受限,部分功能需通过仿真环境验证。技术选型:优先采用成熟开源技术栈,降低开发风险。2.3 假设与前提条件1. 运行环境假设卫星定位可用:假设任务区域内GPS/北斗卫星定位信号基本可用,仅在局部区域(如高楼密集区)可能出现信号衰减。无线通信可用:假设任务区域内存在可用的无线通信网络(Wi-Fi、4G/5G或专用数传网络),通信中断为临时性、可恢复的。三维数据就绪:假设任务执行前已完成城市建筑三维模型数据的采集与预处理,并预加载至无人机与后勤保障系统。威胁信息已知:假设敌方主要火力点、禁区等威胁区域信息已通过侦察手段获取,并录入系统。2. 用户假设士兵具备基本操作能力:假设前线士兵能够使用智能手表/手环或智能手机进行基本操作,包括需求上报、策略选择等。调度员具备系统操作能力:假设后勤调度员经过培训,能够熟练使用后勤保障系统进行任务管理与监控。用户遵循操作规程:假设用户按照系统设计的使用流程操作,不会进行超出系统设计范围的异常操作。3. 硬件前提无人机可用:假设执行任务的多旋翼无人机处于正常工作状态,具备足够的电量和载荷能力。终端设备可用:假设士兵携带的智能手表/手环或智能手机电量充足、网络连接正常。服务器可用:假设后勤保障系统的服务器或PC正常运行,数据库服务可用。4. 技术前提算法可行性:假设A*、RRT等路径规划算法及视线遮蔽计算算法在城市三维模型数据上能够有效运行。视觉算法可用性:假设基于OpenCV的墙体识别与障碍检测算法在典型城市环境图像上能够达到可接受的识别精度。无人机SDK支持:假设选用的无人机平台提供稳定的SDK接口,支持航线规划、状态监控及自主飞行控制。5. 验证前提仿真环境可用:假设Gazebo、AirSim等仿真环境可用于路径规划和投放点筛选算法的验证。测试数据就绪:假设能够采集或获取足够数量的城市环境图像数据集,用于视觉算法的离线测试。飞行测试场地:假设存在小范围空旷场地可用于无人机系统集成测试与通信链路验证。3. 软件功能需求描述3.1 软件功能概述1. 物资请求与任务规划功能功能描述:前线士兵通过单兵终端上报物资需求(类型、数量、紧急程度、位置),系统自动校验并生成任务方案。优先级:高使用场景:前线士兵急需补给时执行主体:人工决策 + 软件执行说明:系统支持异常请求过滤与毫秒级响应处理路径规划策略选择功能功能描述:提供“最快到达”、“最安全”、“最省能耗”三种路径策略,由士兵自主选择。优先级:高使用场景:不同战术需求(紧急补给/高威胁区域/长距离运输)执行主体:人工决策 + 软件执行说明:若30秒内未选择,默认“最安全”策略动态目标调整功能功能描述:支持任务执行过程中动态更新目标位置,并重新规划航线。优先级:较高使用场景:士兵移动或战场态势变化执行主体:软件执行 + 无人机执行说明:电量充足且在通信范围内才能调整,否则通知士兵前往原投放点。信息加密与安全传输功能功能描述:提供通信安全保障,包括加密、认证与重传机制。优先级:高执行主体:软件执行关键能力:AES加密、数据完整性校验、双向身份认证自主路径规划与动态避障功能功能描述:无人机基于视觉与IMU实现自主飞行与避障。优先级:高执行主体:无人机执行特点:墙体识别、障碍绕行、GPS拒止环境可运行战士标注辅助决策功能优先级:中等功能描述:士兵可标记危险/安全区域,影响算法决策。执行主体:人工决策 + 软件执行应急处理功能功能描述:应对通信中断、电量不足等异常情况。优先级:中等执行主体:软件执行3.2 软件需求的用例模型图2展示了“智途投送”系统的用例图。图 2“智途投送”软件系统用例图以下是对该软件系统的各个具体用例的详细描述。用例1:物资请求与任务规划用例名物资请求与任务规划用例描述前线士兵通过单兵终端上报物资需求,后勤保障系统接收需求并进行校验、分析和任务规划,后勤调度员确认后生成配送任务。参与者前线士兵、后勤调度员过程1.前线士兵在单兵终端中填写物资类型、数量、紧急程度和当前位置等信息。 单兵终端对输入内容进行完整性检查。2.需求信息通过加密通信链路上传至后勤保障系统。3.后勤保障系统对需求进行时间戳标记、去重校验和合法性校验。后勤调度员查看需求信息,并结合库存状态、无人机状态进行任务分配。4.系统生成运输任务,确定执行无人机、起点、目标区域和基础路径信息。系统将任务状态反馈给前线士兵,并进入后续配送流程。表 5 物资请求与任务规划用例描述表图 3 物资请求与任务规划顺序图用例2:信息加密与安全传输用例名信息加密与安全传输用例描述系统对单兵终端、后勤保障系统和无人机之间的数据通信进行加密、认证和完整性校验,保障任务数据和位置信息安全。参与者单兵终端、后勤保障系统、无人机过程1.通信双方建立连接并进行双向身份认证。2.系统协商并生成会话密钥。3.发送端对需求数据、任务数据、状态数据等进行加密处理,系统为每个数据帧附加完整性校验信息。4.接收端进行解密和校验,验证数据来源和内容完整性。5.当链路中断时,系统将关键数据缓存在本地。链路恢复后,系统优先重传关键任务数据。表 6 信息加密与安全传输用例描述表用例3:路径策略选择用例用例名路径规划策略选择用例描述根据战场态势和任务优先级,在系统提供的多种路径规划策略中进行选择,以提高运输任务的灵活性和适应性参与者后勤调度员,无人机过程1.任务创建后系统展示可选策略,包括“最快到达”“最安全”“最省能耗”。2.后期调度员根据当前物资紧急程度、敌方火力密度、无人机续航情况选择路径策略。3.系统记录所选策略并作为路径规划算法的优化目标。4.后勤保障系统依据所选策略计算全局路径。5.若在规定时间内未完成选择,系统自动采用默认策略“最安全”。6.路径规划结果下发至无人机执行。表 7 路径策略选择用例描述表图 4 路径策略选择顺序图用例4:自主路径规划与动态避障用例用例名自主路径规划与动态避障用例描述后勤保障系统在完成任务规划、路径生成和投放点确定后,将运输任务下发给指定无人机。无人机按照任务指令完成起飞、巡航飞行、动态避障、物资投放和任务返回等全过程,并实时向系统回传任务状态。参与者无人机、后勤保障系统、前线士兵、后勤调度员过程1.后勤保障系统根据任务规划结果,向指定无人机下发运输任务。无人机接收任务信息,包括物资类型、目标区域、推荐投放点、飞行路径和任务优先级。2.无人机对任务参数进行校验,并检查当前电量、载荷状态、通信状态和传感器状态是否满足执行条件。若满足起飞条件,无人机进入待执行状态并向后勤保障系统反馈“任务已接收”。3.无人机按照预设流程完成起飞,沿规划路径飞向目标区域。飞行过程中,无人机持续采集周边环境信息,并结合机载视觉与IMU数据进行姿态控制和局部路径修正。4.若前方存在障碍物、禁飞区域或突发风险,无人机启动动态避障或局部重规划机制。无人机持续向后勤保障系统回传当前位置、剩余电量、飞行速度、任务阶段和预计到达时间。5.前线士兵位置发生变化且满足目标调整条件时,系统向无人机下发更新后的目标点和航线信息。6.无人机到达目标区域后,对推荐投放点进行最终安全性确认;满足安全条件则执行物资投放,记录投放时间、坐标和任务结果。7.无人机将投放完成信息同步发送给后勤保障系统和前线士兵终端。8.投放完成后,无人机按照系统指令返航,或继续执行后续任务。无人机返回基地或到达指定位置后,系统将任务状态更新为“已完成”。9.后勤保障系统保存任务执行记录,供后续查询、统计与复盘分析使用表 8 自主路径规划与动态避障用例描述表图 5 自主路径规划与动态避障顺序图用例5:动态调整目标用例用例名动态目标调整用例描述在无人机执行任务过程中,系统支持根据士兵位置变化或士兵主动申请,对目标位置和投放点进行动态更新参与者前线士兵、无人机、后勤保障系统过程1.前线士兵主动上报新位置,或单兵终端检测到士兵位置偏移超过阈值。2.单兵终端将目标变更请求发送至后勤保障系统。3.后勤保障系统评估无人机当前状态,包括剩余电量、飞行距离、通信范围和任务进度。若满足调整条件,系统重新计算投放点和飞行航线。无人机更新执行路径并继续任务。若不满足调整条件,系统通知士兵前往原投放点取用物资。表 9 动态目标调整用例描述表图 6 动态调整目标顺序图3.3 软件需求的分析模型(1)系统总体结构模型系统采用三层结构,分别是单兵终端层、后勤调度层、无人机执行层(2)主要类模型核心类包括:User(士兵/调度员)、Task(任务)、Drone(无人机)、Path(路径)、DropPoint(投放点)、Annotation(标注信息)(3)关键交互模型(时序逻辑)任务执行流程:士兵上报需求→后勤系统生成任务→士兵选择策略→系统规划路径→无人机执行→投放并反馈4. 其它软件需求描述4.1 性能要求1.需求上报与任务生成响应时间要求在网络正常的情况下,前线士兵提交物资需求后,系统应在短时间内完成请求接收、校验与任务生成。普通请求的响应时间应不超过2秒,紧急任务请求应优先处理。2.路径规划与投放点计算性能要求在预加载城市地图和三维模型数据的前提下,系统应在可接受时间内完成全局路径规划和安全投放点筛选。常规任务的路径规划时间建议不超过5秒,安全投放点筛选建议不超过3秒。3.状态回传实时性要求无人机应周期性向后勤保障系统回传位置、电量、速度和任务状态信息,状态刷新周期建议不超过1秒,以保障监控的实时性。4.动态目标调整响应要求当士兵发起目标变更请求后,系统应在3秒内完成条件判断并给出是允许调整的结果;若允许调整,应在5秒内重新生成目标点和航线。5.可靠性要求系统应支持连续运行,后勤保障系统需具备较高稳定性;无人机在正常任务周期内应保持稳定通信与飞行控制能力。系统应支持关键任务日志记录与错误恢复机制。6.并发能力要求后勤保障系统应支持多个前线终端同时上报需求,并支持同时监控多架无人机任务执行状态,不得因多任务并发导致系统崩溃或关键任务信息丢失。4.2 设计约束1.硬件约束系统需部署在具备一定载荷能力和续航能力的多旋翼无人机平台上,并依赖摄像头、IMU、定位模块和通信模块等基础硬件。部分扩展功能如热成像识别需要额外传感器支持。2.环境约束系统主要面向城市作战环境,需考虑高楼遮挡、道路阻断、通信不稳定、GPS漂移或拒止等复杂条件。算法设计必须适应非理想环境。3.数据约束系统运行依赖预先采集的城市建筑轮廓、道路网络和三维模型数据。若地图数据缺失、精度不足或更新滞后,可能影响路径规划与安全投放点筛选效果。4.技术约束系统应优先采用可实现、可集成的成熟技术方案,如A*、RRT 等路径规划算法、OpenCV视觉处理技术、开源飞控或主流SDK接口,避免依赖难以落地的高成本专有设备。5.安全约束系统涉及敏感位置、任务和战术信息,通信过程必须采用加密机制,未经授权的终端不得接入系统。系统应尽量减少任务信息泄露风险。6.时间约束项目开发需在限定周期内完成,因此应采用模块化开发方式,优先完成需求上报、任务调度、路径规划、安全投放和应急处理等核心功能原型。4.3 界面要求1.单兵终端界面要求单兵终端界面应简洁直观,适合战场高压环境下快速操作。界面设计应突出大按钮、少层级、低操作复杂度,便于士兵快速完成关键操作。核心功能包括物资需求上报、路径策略选择、投放点查看与导航、任务状态查看、战场区域标注、位置变更上报。2.后勤保障系统界面要求后勤保障系统应提供可视化调度界面,支持调度员快速查看任务全局态势,并进行任务分配、任务取消和状态监控。能够展示:任务列表、无人机位置与状态、库存信息、投放点位置、地图与三维环境信息、风险区域与士兵标注信息。3.无人机端界面要求无人机机载软件以自主执行为主,对图形界面无强制要求;如配套调试界面,应能显示传感器状态、当前航线、避障结果和返航状态等调试信息。4.4 进度要求1)项目初期应完成需求分析、系统方案设计及原型规划。2)中期应完成单兵终端、后勤保障系统和无人机机载软件的核心模块开发。3)后期应完成系统联调、仿真测试、功能验证和文档整理。4)应优先保证以下核心功能按期完成:物资请求与任务规划,路径规划策略选择,自主路径规划与动态避障,动态目标调整,应急处理。4.5 交付要求整个软件系统项目完成以后,应当交付以下文档及程序:单兵终端软件安装包或可运行版本;后勤保障系统软件及数据库部署文件;无人机机载软件或仿真运行程序;软件需求规格说明书电子文档;软件设计说明书电子文档;系统使用说明书电子文档;必要的测试报告、演示材料和运行说明。4.6 验收要求1.系统应能够完成物资需求上报、任务调度、路径规划、任务执行监控和异常处理等核心功能。2.系统在仿真环境或测试环境中,应能够正确展示以下能力:士兵成功提交物资需求;调度员成功生成并下发任务;无人机根据所选策略完成路径执行;士兵位置变化后系统可进行动态目标调整;遇到通信中断、电量不足等情况时系统能触发应急处理机制。3.系统运行过程中不应出现严重错误或崩溃,对异常输入和异常状态应能够给出合理提示或安全处理结果。4.系统文档应齐全,内容与实际实现一致,能够支持用户使用、系统部署与后续维护。5. 软件原型5.1单兵终端APP界面设计1.首页(主界面)如图 7为单兵终端APP的主界面,是前线士兵进入系统后的第一个页面,提供核心功能的快速入口。在士兵需要快速了解当前物资状态并上报需求时使用。图 7 单兵终端APP主界面2.物资需求上报界面如图 8为前线士兵上报物资需求的核心界面,支持详细的物资信息和战场标注。士兵需要请求物资补给时,填写详细需求信息并提交。图 8 物资需求上报界面3.投放点选择界面如图 9为士兵查看系统推荐的安全投放点列表,并可选择或标注投放位置。系统推荐多个投放点后,士兵需要选择最合适的投放位置,或主动标注战场信息辅助决策。图 9 投放点选择界面4.位置更新界面如图 10为士兵位置发生偏移时,申请更新投放目标位置的界面。士兵因战术移动导致位置变化,需要通知系统更新投放目标时使用。图 10 位置更新界面5.无人机状态如图 11为士兵查看为其执行任务的无人机实时状态和飞行数据。士兵需要实时了解无人机状态,或在紧急情况下控制无人机时使用。图 11 无人机状态界面6.个人中心如图 12为士兵个人信息和任务统计的汇总界面,提供系统功能导航入口。士兵需要查看个人任务历史或进入其他功能模块时使用。图 12 个人中心界面7.任务监控界面如图 13为士兵查看当前物资运输任务执行状态的界面,实时掌握任务进度。士兵需要了解无人机运输进度、预计到达时间,或处理紧急情况时使用。图 13 任务监控界面8.系统设置如图 14为单兵终端APP的系统配置界面,提供个性化设置和安全选项。士兵需要调整应用设置或紧急求救时使用。图 14 系统设置界面5.2 后勤保障系统界面设计1.任务调度界面如图 15为后勤调度员的日常工作界面,查看和处理所有待分配的物资需求。后勤调度员需要查看所有待处理需求并分配无人机执行任务时使用。图 15 任务调度界面2.需求详情界面如图 16为查看单个物资需求的详细信息,并进行调度决策的界面。调度员需要详细了解某个需求并做出调度决策时使用。图 16 需求详情界面3.无人机状态界面如图 17为后勤调度员监控所有无人机运行状态的管理界面。调度员需要监控无人机运行状态、处理异常情况或远程控制无人机时使用。图 17 无人机状态界面(后勤保障端)
+
+=== 第四组软件构思 ===
+“智途投送”软件系统的需求构思及描述背景介绍近年来,多场局部战争的实战经验反复证明,后勤补给的“最后一公里”已成为制约战场持续作战能力的核心瓶颈。所谓战场后勤“最后一公里”,是指作战物资从后方集散中心输送至前线作战单元、偏远阵地士兵手中的最后一段末端配送路程,该环节直面复杂地形、敌方袭扰、火力封锁、通信中断等多重风险。以下真实战例深刻揭示了这一问题的严峻性:【案例一:以哈战争中的城市战补给难题】 2023年以哈战争中,以军在加沙城市巷战环境遭遇严重后勤困境。狭窄街巷、密集建筑、简易爆炸装置使得传统装甲运输车难以深入城区,补给车队频遭伏击。前线士兵在激烈交火中急需物资,但配送延误成为常态。以军随后成立专门的后勤创新部门,探索利用无人机等新技术手段解决前线补给问题。【案例二:俄乌冲突中的无人机末端投送困境】 2022年俄乌冲突中,前线部队长期面临弹药、食品、急救药品严重短缺。传统有人运输在最后几公里内频繁遭遇炮火覆盖,伤亡率极高。乌军被迫大规模采用无人机进行末端投送,但据CSIS报告指出,由于缺乏统一调度系统和智能路径规划能力,无人机投送效率低下、协调困难,大量物资仍无法及时送达前沿阵地。即便2025年引入大量无人地面车辆,因战场透明度过高和通信中断,末端配送挑战依然严峻。上述战例表明,无论是堑壕战还是城市巷战,后勤补给的“最后一公里”始终是制约作战效能的关键短板。前线士兵在关键物资上面临严重短缺,而传统有人运输伤亡率极高,即便引入无人机等无人平台,也因缺乏统一调度、智能路径规划和安全投放策略,末端配送效率低下、协调困难。面对这一现实挑战,亟需构建一套集需求实时上报、智能路径规划、安全点位投放于一体的智能化末端补给系统,从根本上为破解战场“最后一公里”困局提供帮助。本软件专为解决城市作战环境下“最后一公里”末端补给难题而设计,聚焦无人机物资投送场景。系统支持前线士兵通过终端实时上报需求,后方统一调度无人机执行运输任务;基于城市三维模型智能规划安全飞行路径,自动筛选视线遮蔽的安全投放点位,确保关键物资在复杂城市战场环境下能够隐蔽、安全、及时送达作战人员手中。欲解决问题基于现代战场城市作战场景与后勤保障痛点,小组期望通过该软件系统解决以下核心问题: 需求不通畅:前线作战人员物资需求无法实时上报,后方调度依赖人工无线电沟通,信息传递链路长、易中断,常出现物资错送、延误、短缺等情况。本系统支持前线士兵通过手持终端一键上报物资类型、数量和紧急程度,需求信息经加密通信链路实时回传至后方调度中心,调度指令精准下达至对应运输平台,实现需求-调度-配送全链路信息贯通;配送不安全:传统人力或车辆末端配送面临敌方伏击、空袭与火力封锁,运输人员伤亡率高;运输平台缺乏自主威胁规避能力,遇地形障碍阻挡时任务失败率极高。本系统通过无人机替代有人运输,搭载视觉传感器与IMU等低成本设备,结合动态避障算法,实时识别障碍物并自主调整航线,最大限度降低人员暴露与物资折损风险;策略不灵活:传统无人机运输系统路径策略固定,无法根据战场态势灵活调整。本系统提供多种路径规划策略供前线士兵自主选择,可根据物资紧急程度、敌方火力密度、无人机剩余电量等因素做出最优决策;目标不适应:战场瞬息万变,士兵位置可能发生转移,传统系统目标固定无法响应需求变化。本系统支持动态目标调整,实时同步士兵位置变化,确保物资准确送达最新位置。软件创意小组设计的“智途投送”系统软件,针对城市复杂立体空间特性及战场环境多变的特点,创新性地提出了三个创意点:自主路径规划、路径自主选择与目标实时调整。该软件系统聚焦于城市巷战末端补给最危险的投放与运输环节,确保关键物资在敌方火力封锁下实现隐蔽、精准、自主送达。具体的创意点说明阐述如下。3.1 基于视觉感知的墙体识别与自主路径规划算法为解决城市巷战中高楼遮挡、道路被倒塌建筑阻断导致运输任务失败的问题,本软件系统搭载基于视觉的自主导航算法。系统综合利用普通摄像头与惯性测量单元(IMU)等低成本设备,通过软件算法实现自主通行。针对道路阻断,软件系统调用图像处理算法,实时识别前方墙体、倒塌建筑等大型障碍物的边缘轮廓。当识别到通行路径被墙体阻挡时,系统自动触发路径规划程序,根据墙体轮廓计算可行通的侧向间隙或绕行路线,控制无人机自主转向避开障碍,无需人工干预。3.2 多策略路径规划与士兵自主选择机制由于战场环境多变、任务优先级实时变化,本系统创新性引入路径规划策略选择机制。系统提供“最快到达”、“最安全”、“最省能耗”三种策略选项,每种策略对应不同的优化目标与适用场景,由前线士兵根据实际战况自主选择。该创意突破了传统无人机运输系统路径策略固定、缺乏灵活性的局限,将决策权下放至一线作战人员,使其能够根据当前战场态势(如敌方火力密度、物资紧急程度等)做出最优选择,显著提升了系统对复杂战场环境的适应能力。3.3 动态目标调整与实时位置同步机制针对战场瞬息万变、士兵位置可能发生转移的现实问题,本系统创新性设计动态目标调整机制。在无人机执行任务过程中,系统可以实时接收士兵位置变更信息,动态更新投放位置。当检测到士兵位置偏移超过阈值或士兵主动申请变更时,系统自动判断无人机当前状态(电量、距离、通信范围),若满足条件则重新更新航线,前往新的投放点,否则通知士兵前往原投放点。该创意点解决了传统无人机运输系统目标固定、无法响应需求变化的痛点,确保物资能够准确送达士兵需要的最新位置。系统的组成和部署4.1 系统组成本系统由三大核心子系统构成:单兵终端系统、无人机软件系统、后勤保障系统,各子系统协同配合,共同完成城市巷战中物资运输的完整闭环任务。图 1 “智途投送”软件系统用例图参与者说明:前线士兵:上报物资需求,查看库存信息,接收投放点通知,选择路径策略,更新目标位置,选择投放点。后勤调度员:接收需求,分配无人机任务,监控任务状态,管理物资库存。无人机:执行运输任务,自主路径规划,动态避障,回传状态信息,动态调整航线。(1)单兵终端系统单兵终端系统是前线士兵与后勤保障系统的交互入口,负责需求上报与信息接收。单兵终端系统的硬件和软件组成分别如表1、2所示。表 1 单兵终端系统硬件组成组件说明功能要求智能手表/手环或智能手机士兵随身携带,用于上报需求和接收通知具备网络通信能力,可运行轻量级APP表 2 单兵终端系统软件组成组件功能描述单兵终端APP需求上报界面(物资类型、数量、紧急程度)、库存查询、投放点导航、消息通知接收(2)无人机软件系统无人机软件系统搭载于无人机平台,负责执行运输任务、自主路径规划、动态避障及安全投放点计算。无人机软件系统的硬件组成和软件组成分别如表3、4所示。表 3 无人机系统硬件组成组件功能要求说明多旋翼无人机具备一定载荷能力(建议≥2kg)和续航时间(建议≥20分钟),支持SDK二次开发或开源飞控执行物资运输任务视觉传感器普通摄像头(前置/下视)环境感知、障碍物识别IMU惯性测量单元提供姿态角速度信息视觉导航辅助定位模块GPS/北斗定位,可选RTK增强提供位置信息通信模块Wi-Fi或数传电台与后勤保障系统通信表 4 无人机系统软件组成组件功能描述路径规划算法模块基于城市地图与威胁区域计算安全飞行路径,支持动态重规划安全投放点选择支持模块让士兵选择最后安全的地点进行投发,支持多次调整飞行控制模块接收任务指令、执行航线、反馈状态、应急返航视觉导航模块在GPS拒止环境下提供辅助定位(3)后勤保障系统后勤保障系统部署于后方指挥所,负责需求接收、任务调度、资源管理与状态监控。后勤保障系统的硬件组成和软件组成分别如表5、6所示。表 5 后勤系统硬件组成组件功能要求说明服务器或高性能PC运行调度服务、数据库、算法运算后方指挥所部署网络通信设备局域网/移动网络接入连接各子系统表 6 无人机系统软件组成组件功能描述任务调度模块接收需求、分配无人机、监控任务状态数据库管理模块存储物资库存、无人机状态、任务记录、飞行日志通信服务模块处理与单兵终端、无人机的数据收发,支持加密传输可视化监控模块地图界面显示任务状态、无人机位置、投放点标注城市地图数据建筑轮廓、道路网络、三维模型数据(4) 子系统间数据流图 2 三大子系统间数据流图单兵终端 → 后勤保障系统:上报物资需求(类型、数量、紧急程度、位置)单兵终端 → 后勤保障系统:上报战士标注信息(危险区域、安全区域、战术情报)后勤保障系统 → 无人机:下发任务指令(起点、目标区域、物资信息、路径策略)后勤保障系统 → 无人机:下发标注约束条件(需避开/优先选择的区域)无人机 → 后勤保障系统:回传飞行状态、位置、电量、任务进度后勤保障系统 → 单兵终端:推送投放点位置、预计到达时间4.2 系统部署本系统主要分成三个部分展开部署,分别是后勤保障系统、无人机系统、单兵终端系统,三个系统的部署情况以及系统部署图如下所示。1. 后勤保障系统部署:部署于后方指挥所或移动指挥车内运行调度服务、数据库、通信服务预载城市地图与任务区域三维模型数据2. 无人机部署:存储于便携箱,任务前快速部署机载软件预加载城市三维模型与威胁区域数据与后勤保障系统通过无线网络保持通信3. 单兵终端部署:士兵随身携带智能手表/手环或智能手机安装轻量级终端APP通过移动网络或局域网与后勤保障系统通信4. 依赖条件:卫星定位信号(GPS/北斗)无线通信网络(Wi-Fi、4G/5G或专用数传网络)预先采集的任务区域城市建筑三维模型数据图 3 系统部署图部署说明:后方指挥所:部署后勤服务器与数据库服务器,运行后勤保障系统核心软件。前线作战区域:部署单兵终端设备与无人机平台。各节点通过无线网络(Wi-Fi/4G/数传)进行数据通信。GPS/北斗卫星为终端与无人机提供定位服务软件系统的功能描述为明确系统运行中的职责分工,本节在每个功能描述中标注执行主体:【人工决策】:需要前线士兵或后勤调度员做出判断和选择。【软件执行】:由后勤保障系统或机载软件自动完成。【无人机执行】:由无人机自主完成,无需人工干预。5.1 物资请求与任务规划功能该模块负责前端任务需求的收集与分析,是系统运行的起点。图 4 物资请求与任务规划功能顺序图当前线士兵想要申请物资时,首先在终端APP上选择对应的物资数量、类型以及紧急程度,终端APP根据实际情况向后勤保障系统发送士兵需求,同时查询库存和无人机状态,向后勤调度人员推送物资与无人机调度方案,后勤调度员进行方案的调整和确认,最后根据实际情况派出无人机运输对应的物资。5.2 路径规划策略选择功能针对战场环境多变、任务优先级不同的特点,系统提供多种路径规划策略供前线士兵选择,提高运输任务的灵活性。下面表7展示了三种路径策略选择的具体说明,图5展示了路径策略选择功能的顺序图。前线士兵可以根据战场危险等级、紧急状况等因素综合考虑路径策略选择问题。表 7 路径规划策略说明策略类型优化目标适用场景最快到达优先选择飞行时间最短的路径紧急物资(急救药品、弹药)最安全优先避开威胁区域,选择遮蔽性好的路径高风险区域、敌方火力密集最省能耗优先选择能耗最低的路径,延长续航远距离运输、电量有限图 5 路径规划策略选择功能顺序图默认策略: 若士兵在30秒内未选择,系统默认采用“最安全”策略。5.3 动态目标调整功能针对战场瞬息万变、士兵位置可能发生变化的情况,系统支持在无人机执行任务过程中动态调整目标位置。三种触发条件分别是:前线士兵主动上报位置变更单兵终端检测到位置偏移超过设定阈值(如50米)士兵主动申请变更投放点然而,动态目标实现调整需要一定的约束条件,只有当无人机剩余电量需满足飞往新目标的能耗需求以及新目标位置需在无人机通信范围内时,才能变更物资投放目的地,否则系统通知士兵前往原投放点。图 6 动态目标调整功能顺序图5.4 信息加密与安全传输功能该模块功能主要由软件系统本身执行,负责保障系统通信过程中的数据安全,主要内容有以下三个:数据加密:采用AES-128/256对称加密算法,结合动态密钥协商机制完整性校验:每个数据帧附带校验码,检测篡改或丢失身份认证:双向身份认证机制,防止非法节点接入5.5 自主路径规划与动态避障功能在该模块中,无人机具备自主避障飞行能力,在飞行过程种依托机载摄像头与 IMU 惯性测量单元,精准识别墙体、倒塌建筑等各类障碍物,机载端实时解算可安全通行间隙并动态规划最优绕行航线路径。全程无需人工操控干预,无人机可独立完成避障机动动作。此外,系统还支持通信链路中断冗余运行,在空地通信失联工况下,仍能稳定维持自主飞行与避障作业能力,保障复杂受限环境飞行任务安全连续执行。下面图7展示了系统自主路径规划与动态避障功能的顺序图。图 7 自主路径规划与动态避障功能顺序图5.6 应急处理功能针对执行任务过程种可能出现的通信中断、电量不足等异常情况,本系统提供了一些自动应急处理机制,具体情况以及应急措施说明如下表8所示。表 8 应急处理说明异常情况执行主体应急措施通信中断【无人机执行】自动悬停或按预设逻辑返航电量不足【无人机执行】自动中止任务,返航至出发点GPS信号丢失【无人机执行】切换至视觉导航模式,维持飞行目标区域不可达【软件执行】通知士兵,提供最近可行投放点任务取消【人工决策】士兵或调度员可随时中止任务可行性及潜在风险6.1 可行性分析(1)技术可行性路径规划算法:A*、RRT等经典算法开源实现丰富(如Python的pathfinding库、OMPL库),可直接集成或二次开发。视觉导航与避障:OpenCV提供完整的图像处理工具链,支持边缘检测、轮廓识别、特征提取等功能。无人机控制:主流无人机厂商提供SDK支持航线规划、状态监控;开源飞控(如PX4、ArduPilot)支持自主飞行开发。移动端开发:Android/Wear OS开发技术成熟,网络通信、地图集成、消息推送均有标准方案。(2)硬件可行性无人机:市面上有多款支持SDK二次开发或开源飞控的多旋翼无人机可供选择,功能满足自主飞行与载荷运输需求。终端设备:智能手机、智能手表等设备普及,可直接作为单兵终端使用。服务器:普通PC或笔记本即可运行后勤保障系统软件,无需特殊硬件设备。视觉传感器:普通USB摄像头或无人机搭载摄像头即可满足视觉感知需求,成本低廉。(3)数据可行性城市地图:OpenStreetMap免费开放,可导出建筑轮廓、道路网络等矢量数据。三维模型:可通过手动建模(如Blender)或从公开数据源获取。(4)开发能力可行性本小组具备Python、Java/Kotlin开发能力,熟悉算法实现与移动端开发;可采用模块化开发方式,先完成核心算法仿真验证,再进行硬件集成测试,在有限时间内完成核心功能原型。(5)实验条件可行性考虑到实际无人机飞行实验条件受限,可采用以下替代方案:算法验证:使用仿真环境(如Gazebo、AirSim)进行路径规划算法的验证。视觉算法测试:采集城市环境图像数据集,离线测试墙体识别与障碍检测算法。系统集成测试:小范围空旷场地进行无人机飞行测试,验证通信链路与任务执行流程。6.2 潜在风险分析(1)通信链路风险城市环境建筑遮挡导致无线信号不稳定,无人机可能失联。应对措施:预设通信中断后,无人机自动返航。(2)定位信号风险城市峡谷效应导致GPS信号漂移或丢失,影响航线精度。应对措施:结合视觉导航、IMU惯性导航进行辅助定位。(3)无人机硬件限制载荷与续航有限,单次运输物资量受限。应对措施:合理规划任务半径与物资重量。(4)三维数据精度风险建筑模型精度不足或数据更新滞后可能导致视线自主路径规划计算误差。应对措施:在关键区域进行现场数据校验。(5)视觉算法可靠性风险复杂光照条件、遮挡、纹理缺失等因素可能影响视觉识别准确性。应对措施:采用多传感器融合;设置置信度阈值,低置信度时触发人工介入。(6)实时性风险路径规划需要在有限时间内完成,计算复杂度可能影响响应速度。应对措施:采用分层规划策略,全局路径离线预计算,局部避障实时响应,优化算法效率。(7)动态调整风险动态目标调整过程中,频繁的位置变更可能导致无人机频繁调整航线,影响任务效率。应对措施:设置位置更新最小间隔阈值,或者限制单次任务最大调整次数,超出限制时通知士兵前往原投放点。(8)策略选择风险士兵可能因战场压力无法及时做出策略选择,或选择不当影响任务效果。应对措施:设置默认策略(最安全),超时自动采用该策略。
\ No newline at end of file
diff --git a/temp_verify_doc.txt b/temp_verify_doc.txt
new file mode 100644
index 00000000..b450ec67
--- /dev/null
+++ b/temp_verify_doc.txt
@@ -0,0 +1,133 @@
+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: 2.6 离线演示与多通道验证
+45: 已完成完整的离线演示程序(tests/demo_offline.cpp),支持单通道分类与多通道阵列(分类+方位角+距离)一体化测试:
+46: • 单通道验证:dataset/val 共 40 个文件,分类准确率 100%(ambient/artillery/explosion/gunshot 各 10 个)。
+47: • 多通道模拟测试:scripts/generate_multichannel_test.py 可按指定方位角(0°–360°)和距离(1–1000m)生成 4 通道十字阵 WAV。
+48: • 多通道验证结果(5 组典型工况):
+49: – 方位角:全部 0° 误差(GCC-PHAT 对模拟数据精度极高)。
+50: – 距离:最大误差 18.2m@300m(约 6%),其余 < 2m。
+51: – 分类:全部正确识别为 gunshot,置信度 0.77–0.98。
+52: • 一键演示脚本:run_demo.bat 自动执行核心单元测试 → ONNX 快速推理 → 完整离线流水线。
+53: 2.7 C++/Python 特征提取严格对齐
+54: 为保证 C++ 推理结果与 Python 训练一致,完成了特征提取全流程对齐:
+55: • 导出 librosa 0.10.x 的 Mel 滤波器组到二进制文件 models/mel_filter_bank.bin(64×1025),C++ 加载后不再自行构造。
+56: • 统一参数:Hann 窗、preemphasis=0.97、n_fft=2048、hop=512、center=False、pad_to=63 frames(edge 填充)。
+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: • CMake:4.1.0 已安装 ✅
+80: • Eigen3:bundled third_party/eigen-3.4.0 ✅
+81: • ONNX Runtime C++:v1.20.1 已配置(头文件 + DLL + MinGW 导入库)✅
+82: • yaml-cpp:conda 0.8.0 已检测,CMake 自动链接 ✅
+83: • 构建方式:
+84: – 快速命令行:build_core_test.bat(一键编译全部测试)
+85: – 标准 CMake:build_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)
diff --git a/update_handover_doc.py b/update_handover_doc.py
new file mode 100644
index 00000000..81115278
--- /dev/null
+++ b/update_handover_doc.py
@@ -0,0 +1,245 @@
+#!/usr/bin/env python3
+"""
+更新声源分析模块_项目交接文档.docx
+将本次(2026-05-06)完成的多通道离线演示等工作追加到文档中。
+"""
+
+from docx import Document
+from docx.shared import Pt, RGBColor
+from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
+import os
+
+def add_heading(doc, text, level=1):
+ """添加标题段落"""
+ p = doc.add_paragraph()
+ run = p.add_run(text)
+ run.bold = True
+ if level == 1:
+ run.font.size = Pt(16)
+ elif level == 2:
+ run.font.size = Pt(14)
+ else:
+ run.font.size = Pt(12)
+ p.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
+ return p
+
+def add_bullet(doc, text, indent=0):
+ """添加项目符号段落"""
+ p = doc.add_paragraph(style='List Bullet')
+ p.paragraph_format.left_indent = Pt(indent * 10)
+ p.add_run(text)
+ return p
+
+def add_normal(doc, text):
+ p = doc.add_paragraph()
+ p.add_run(text)
+ return p
+
+def main():
+ doc_path = '声源分析模块_项目交接文档.docx'
+ doc = Document(doc_path)
+
+ # ========================================================================
+ # 1. 在 "2.5 代码 Bug 修复记录" 之后插入 2.6 小节
+ # ========================================================================
+ insert_idx = None
+ for i, para in enumerate(doc.paragraphs):
+ if para.text.strip().startswith('2.5'):
+ # 找到 2.5 的最后一项(CMakeLists.txt 那行)之后
+ pass
+ if para.text.strip().startswith('三、架构设计'):
+ insert_idx = i
+ break
+
+ if insert_idx is None:
+ print("ERROR: 未找到插入点(三、架构设计)")
+ return
+
+ # 由于 python-docx 不支持在特定索引插入段落到 body,
+ # 我们采用另一种策略:将新内容作为独立段落追加到文档末尾,
+ # 然后手动调整顺序。但更简单的方法是:直接在 2.5 和 三 之间添加。
+ # python-docx 的 add_paragraph 总是追加到末尾,所以我们需要操作 XML。
+ # 为了避免 XML 操作复杂性,我们直接将整个文档重新组织:
+ # 读取所有段落文本 -> 在合适位置插入新文本 -> 重新写入。
+
+ # 实际上,对于 docx,最安全的方式是:
+ # 保存一份副本,然后在新段落要插入的位置,使用 paragraphs 列表的 _element 进行 insert。
+ paragraphs = doc.paragraphs
+
+ # 找到 2.5 最后一行(CMakeLists.txt)的索引
+ idx_after_25 = None
+ for i, p in enumerate(paragraphs):
+ if 'CMakeLists.txt' in p.text and 'MinGW' in p.text:
+ idx_after_25 = i + 1
+ break
+
+ if idx_after_25 is None:
+ # 备用:找到 "三、架构设计"
+ for i, p in enumerate(paragraphs):
+ if p.text.strip().startswith('三、架构设计'):
+ idx_after_25 = i
+ break
+
+ # 构建要插入的新段落列表 (text, style_name)
+ new_sections = []
+
+ # ---- 2.6 离线演示与多通道验证 ----
+ new_sections.append(('2.6 离线演示与多通道验证', 'Heading 2'))
+ new_sections.append(('已完成完整的离线演示程序(tests/demo_offline.cpp),支持单通道分类与多通道阵列(分类+方位角+距离)一体化测试:', None))
+ new_sections.append(('', 'List Bullet'))
+ # 修正:我们无法在 add_paragraph 之后修改之前的内容,所以换个策略
+ # 直接在 XML 层级插入
+
+ # 为了简化,我们把所有段落文本收集起来,重建文档
+ all_texts = []
+ for p in doc.paragraphs:
+ style = p.style.name if p.style else None
+ all_texts.append((p.text, style))
+
+ # 找到插入位置
+ insert_pos = None
+ for i, (text, style) in enumerate(all_texts):
+ if text.strip().startswith('三、架构设计'):
+ insert_pos = i
+ break
+
+ if insert_pos is None:
+ print("ERROR: 未找到 '三、架构设计'")
+ return
+
+ # 准备新内容
+ new_content = []
+ new_content.append(('2.6 离线演示与多通道验证', 'Heading 2'))
+ new_content.append(('已完成完整的离线演示程序(tests/demo_offline.cpp),支持单通道分类与多通道阵列(分类+方位角+距离)一体化测试:', None))
+ new_content.append(('• 单通道验证:dataset/val 共 40 个文件,分类准确率 100%(ambient/artillery/explosion/gunshot 各 10 个)。', 'List Bullet'))
+ new_content.append(('• 多通道模拟测试:scripts/generate_multichannel_test.py 可按指定方位角(0°–360°)和距离(1–1000m)生成 4 通道十字阵 WAV。', 'List Bullet'))
+ new_content.append(('• 多通道验证结果(5 组典型工况):', 'List Bullet'))
+ new_content.append((' – 方位角:全部 0° 误差(GCC-PHAT 对模拟数据精度极高)。', 'List Bullet'))
+ new_content.append((' – 距离:最大误差 18.2m@300m(约 6%),其余 < 2m。', 'List Bullet'))
+ new_content.append((' – 分类:全部正确识别为 gunshot,置信度 0.77–0.98。', 'List Bullet'))
+ new_content.append(('• 一键演示脚本:run_demo.bat 自动执行核心单元测试 → ONNX 快速推理 → 完整离线流水线。', 'List Bullet'))
+
+ new_content.append(('2.7 C++/Python 特征提取严格对齐', 'Heading 2'))
+ new_content.append(('为保证 C++ 推理结果与 Python 训练一致,完成了特征提取全流程对齐:', None))
+ new_content.append(('• 导出 librosa 0.10.x 的 Mel 滤波器组到二进制文件 models/mel_filter_bank.bin(64×1025),C++ 加载后不再自行构造。', 'List Bullet'))
+ new_content.append(('• 统一参数:Hann 窗、preemphasis=0.97、n_fft=2048、hop=512、center=False、pad_to=63 frames(edge 填充)。', 'List Bullet'))
+ new_content.append(('• 验证脚本:scripts/verify_feature_consistency.py 对比 C++ 与 Python 输出,最大差异 < 0.008。', 'List Bullet'))
+
+ # 插入
+ all_texts = all_texts[:insert_pos] + new_content + all_texts[insert_pos:]
+
+ # ========================================================================
+ # 2. 更新 "五、待办事项与下一步计划"
+ # ========================================================================
+ # 找到第五部分的起止范围
+ section5_start = None
+ section5_end = None
+ for i, (text, style) in enumerate(all_texts):
+ if text.strip().startswith('五、待办事项与下一步计划'):
+ section5_start = i
+ elif section5_start is not None and text.strip().startswith('六、'):
+ section5_end = i
+ break
+
+ if section5_start is not None and section5_end is not None:
+ # 替换第五部分的内容
+ new_section5 = []
+ new_section5.append(('五、待办事项与下一步计划', 'Heading 1'))
+ new_section5.append(('【已完成】', 'Heading 2'))
+ new_section5.append(('• 单通道分类准确率提升至 100%(修复 Mel 滤波器、padding、window、ONNX NCHW layout 等 4 处不一致)。', 'List Bullet'))
+ new_section5.append(('• GCC-PHAT 方位估计与 SPL 距离估计集成到离线 demo,使用模拟 4ch WAV 验证通过。', 'List Bullet'))
+ new_section5.append(('• 生成 scripts/generate_multichannel_test.py 及 run_demo.bat 一键演示。', 'List Bullet'))
+ new_section5.append(('【待完成】', 'Heading 2'))
+ new_section5.append(('• [P0] 实机部署:将编译通过的节点部署到 P600 机载电脑(Jetson / x86),验证 ROS 话题发布与订阅。', 'List Bullet'))
+ new_section5.append(('• [P0] 真实麦克风阵列驱动:接入 4 通道 USB / I2S 麦克风阵列,录制真实环境枪声/炮声样本。', 'List Bullet'))
+ new_section5.append(('• [P1] 数据集扩充:收集真实场景样本(含环境噪声、混响、多声源叠加),重新训练以降低合成数据过拟合。', 'List Bullet'))
+ new_section5.append(('• [P1] yaml-cpp CMake 链接修复:当前 MinGW 动态链接出现 __imp__ 未解析符号,需查明是 ABI 不兼容还是导入库生成错误。', 'List Bullet'))
+ new_section5.append(('• [P2] 距离估计 SPL 校准:当前合成数据使用固定 offset=60dB,真实场景需根据麦克风灵敏度数据 sheet 校准。', 'List Bullet'))
+ new_section5.append(('• [P2] Pipeline 类集成到 demo:当前 demo_offline 绕过 Pipeline 直接实例化模块,后续应统一走 Pipeline 以验证 YAML 配置加载。', 'List Bullet'))
+ new_section5.append(('• [P2] 俯仰角估计:当前 GCC-PHAT 仅输出水平面方位角,若阵列有高度差可解俯仰角。', 'List Bullet'))
+ all_texts = all_texts[:section5_start] + new_section5 + all_texts[section5_end:]
+
+ # ========================================================================
+ # 3. 更新 "七、文件路径索引"
+ # ========================================================================
+ section7_start = None
+ section7_end = None
+ for i, (text, style) in enumerate(all_texts):
+ if text.strip().startswith('七、文件路径索引'):
+ section7_start = i
+ elif section7_start is not None and text.strip().startswith('八、'):
+ section7_end = i
+ break
+
+ if section7_start is not None and section7_end is not None:
+ new_section7 = []
+ new_section7.append(('七、文件路径索引', 'Heading 1'))
+ new_section7.append(('项目根目录:software/src/drone-software/src/acoustic/', None))
+ new_section7.append(('• 核心算法:include/acoustic_analyzer/core/ & src/core/', 'List Bullet'))
+ new_section7.append(('• IO 抽象:include/acoustic_analyzer/io/ & src/io/', 'List Bullet'))
+ new_section7.append(('• ROS 封装:include/acoustic_analyzer/ros/ & src/ros/', 'List Bullet'))
+ new_section7.append(('• 训练脚本:scripts/train_classifier.py, export_onnx.py, verify_onnx.py', 'List Bullet'))
+ new_section7.append(('• 手机桥接:scripts/mobile_audio_bridge.py, android_audio_sender.py', 'List Bullet'))
+ new_section7.append(('• 多通道生成:scripts/generate_multichannel_test.py', 'List Bullet'))
+ new_section7.append(('• 特征对齐验证:scripts/verify_feature_consistency.py, verify_val_accuracy.py', 'List Bullet'))
+ new_section7.append(('• 测试程序:tests/test_core_lib.cpp, extract_mel_cpp.cpp, test_classifier_cpp.cpp, demo_offline.cpp', 'List Bullet'))
+ new_section7.append(('• 配置文件:config/acoustic_params.yaml', 'List Bullet'))
+ new_section7.append(('• 模型权重:models/gunshot_classifier.onnx, models/mel_filter_bank.bin, train_output/best_model.pth', 'List Bullet'))
+ new_section7.append(('• 数据集:dataset/{train,val}/{ambient,gunshot,artillery,explosion}/', 'List Bullet'))
+ all_texts = all_texts[:section7_start] + new_section7 + all_texts[section7_end:]
+
+ # ========================================================================
+ # 4. 更新 "八、新增构建脚本说明"
+ # ========================================================================
+ section8_start = None
+ section8_end = None
+ for i, (text, style) in enumerate(all_texts):
+ if text.strip().startswith('八、新增构建脚本说明'):
+ section8_start = i
+ elif section8_start is not None and (text.strip().startswith('AI 助手') or text.strip().startswith('附录') or i == len(all_texts)-1):
+ section8_end = i if text.strip() else i
+ if i == len(all_texts)-1:
+ section8_end = len(all_texts)
+ break
+ if section8_start is not None and section8_end is None:
+ section8_end = len(all_texts)
+
+ if section8_start is not None and section8_end is not None:
+ new_section8 = []
+ new_section8.append(('八、新增构建脚本说明', 'Heading 1'))
+ new_section8.append(('• build_core_test.bat:一键命令行编译,适用于快速验证核心算法和 ONNX 推理', 'List Bullet'))
+ new_section8.append((' 编译目标:test_core_lib.exe / extract_mel_cpp.exe / test_classifier_cpp.exe', 'List Bullet'))
+ new_section8.append(('• build_demo.bat:编译离线演示程序 demo_offline.exe', 'List Bullet'))
+ new_section8.append((' 不依赖 yaml-cpp 和 ROS,直接链接 ONNX Runtime + Eigen,用于快速验证完整流水线。', 'List Bullet'))
+ new_section8.append(('• build_cmake_mingw.bat:标准 CMake + MinGW Makefiles 构建流程', 'List Bullet'))
+ new_section8.append((' 自动将源码复制到 C:/temp/acoustic_src(规避中文路径问题),在 C:/temp/acoustic_build 构建,', 'List Bullet'))
+ new_section8.append((' 完成后将可执行文件复制回原目录。适用于需要标准 CMake 流程的场景。', 'List Bullet'))
+ new_section8.append(('• run_demo.bat:一键运行完整演示', 'List Bullet'))
+ new_section8.append((' Step 1: 核心单元测试(test_core_lib.exe)', 'List Bullet'))
+ new_section8.append((' Step 2: ONNX 快速推理(test_classifier_cpp.exe)', 'List Bullet'))
+ new_section8.append((' Step 3: 离线流水线验证(demo_offline.exe dataset/val)', 'List Bullet'))
+ all_texts = all_texts[:section8_start] + new_section8 + all_texts[section8_end:]
+
+ # ========================================================================
+ # 重建文档
+ # ========================================================================
+ new_doc = Document()
+ for text, style_name in all_texts:
+ if not text and style_name == 'List Bullet':
+ # 空项目符号,跳过
+ continue
+ if style_name:
+ try:
+ p = new_doc.add_paragraph(text, style=style_name)
+ except:
+ p = new_doc.add_paragraph(text)
+ else:
+ p = new_doc.add_paragraph(text)
+
+ # 保留原始文档的页眉页脚等信息?简化处理:不保留
+ output_path = '声源分析模块_项目交接文档.docx'
+ new_doc.save(output_path)
+ print(f"[OK] 文档已更新: {output_path}")
+
+if __name__ == '__main__':
+ main()