<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>项目 on Zesean 的博客</title><link>https://zeseanblog.top/projects/</link><description>Recent content in 项目 on Zesean 的博客</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Sun, 06 Sep 2026 17:23:33 +0800</lastBuildDate><atom:link href="https://zeseanblog.top/projects/index.xml" rel="self" type="application/rss+xml"/><item><title>聆行 VoxDrive — 分布式车载智能座舱（RK3588 + Jetson Orin 双板）</title><link>https://zeseanblog.top/projects/voxdrive/</link><pubDate>Fri, 04 Sep 2026 23:50:00 +0800</pubDate><guid>https://zeseanblog.top/projects/voxdrive/</guid><description>&lt;h2 id="项目概述"&gt;&lt;a href="#%e9%a1%b9%e7%9b%ae%e6%a6%82%e8%bf%b0" class="header-anchor"&gt;&lt;/a&gt;项目概述&#13;&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;聆行 VoxDrive&lt;/strong&gt; 是一套跑在真实硬件上的双 SoC 分布式车载智能座舱：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;RK3588（LubanCat-4）= 媒体 + 端侧语音节点&lt;/strong&gt;：摄像头采集 → MPP 硬件编码 → MP4 循环存储 / RTMP 推流，NPU 跑行人/车辆检测做&lt;strong&gt;事件锁录&lt;/strong&gt;；流式 ASR（fp16 三模型 NPU 分载）与 TTS 合成（SummerTTS）也都落在这块板；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Jetson Orin Nano = 中心 AI 节点&lt;/strong&gt;：LLM / RAG / 意图路由 / 画面问答 / Qt 数字座舱，全离线、不上云；&lt;/li&gt;&#10;&lt;li&gt;两板以太网互联：&lt;strong&gt;视频走 RTMP，控制与事件走 ZeroMQ&lt;/strong&gt;。语音可以控制录像、查状态、抓拍，还能直接问&amp;quot;画面里有什么&amp;quot;（VLM 看行车画面作答）；&lt;/li&gt;&#10;&lt;li&gt;麦克风与音箱是接在 RK 上的同一 USB 设备：说话本板识别、跨板查询、应答本板播报，播报期自动静音防&amp;quot;自己听到自己&amp;quot;（回灌）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;设计原则：&lt;strong&gt;数据密集走专用加速器（RK 的 VPU/RGA/NPU），模型密集走中心算力（Jetson 的 GPU）&lt;/strong&gt;；实时敏感、算力可承担的小模型（ASR/TTS）下沉边缘，大模型（LLM/VLM）留中心。&lt;/p&gt;&#10;&lt;h2 id="双板实物"&gt;&lt;a href="#%e5%8f%8c%e6%9d%bf%e5%ae%9e%e7%89%a9" class="header-anchor"&gt;&lt;/a&gt;双板实物&#13;&#10;&lt;/h2&gt;&lt;p&gt;左上 Jetson Orin Nano（带散热扇），右侧 RK3588 LubanCat-4，两板经路由器以太网互联；左下 7 寸 DSI 触摸屏接 RK，正在运行座舱 UI 的桌面会话；麦克风/音箱 USB 组合设备接 RK 侧：&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="双板实物：左上 Jetson Orin Nano、右侧 RK3588 LubanCat-4、左下 7 寸 DSI 触摸屏（座舱 UI 运行中），两板经路由器以太网互联，麦克风/音箱 USB 组合设备接 RK" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="1200" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/projects/voxdrive/images/hardware-setup.jpg" srcset="https://zeseanblog.top/projects/voxdrive/images/hardware-setup_hu_9510a3377c499d66.jpg 800w, https://zeseanblog.top/projects/voxdrive/images/hardware-setup.jpg 1600w" width="1600"&gt;&lt;/p&gt;&#10;&lt;h2 id="系统架构"&gt;&lt;a href="#%e7%b3%bb%e7%bb%9f%e6%9e%b6%e6%9e%84" class="header-anchor"&gt;&lt;/a&gt;系统架构&#13;&#10;&lt;/h2&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10; subgraph RK ["RK3588 · 媒体节点 + 语音推理节点"]&#10; CAM["IMX415&lt;br/&gt;MIPI CSI"] --&gt; ISP["rkisp&lt;br/&gt;NV12 1080p"]&#10; ISP --&gt; ENC["MPP H.264 硬编&lt;br/&gt;VBR · 零 CPU 软编"]&#10; ENC --&gt; MP4["MP4 分段循环存储&lt;br/&gt;水位覆盖 · 事件锁录"]&#10; ENC --&gt; RTMP["RTMP 推流&lt;br/&gt;断流自动重连"]&#10; NPU["RKNPU&lt;br/&gt;YOLOv5s INT8"] --&gt;|"行人/车辆检测"| MP4&#10; SVC["recorder_service&lt;br/&gt;REP :6700 / PUB :6701"]&#10; MP4 --- SVC&#10; RTMP --- SVC&#10; MIC["USB 组合设备&lt;br/&gt;麦克风+音箱"] --- VS&#10; VS["voice_service&lt;br/&gt;NPU×3 流式解码"] --&gt;|"识别文本"| ROUTER&#10; TN["tts_node&lt;br/&gt;SummerTTS 多核&lt;br/&gt;本板播报"] -.-&gt;|"合成请求"| TTS&#10; end&#10; subgraph JS ["Jetson Orin · 中心算力节点"]&#10; MM["mediamtx&lt;br/&gt;RTMP/RTSP/HLS"] --&gt; UI["Qt 数字座舱&lt;br/&gt;预览 · 状态 · 告警"]&#10; VLMQ["画面问答"] -.-&gt;|"vlm 直通"| VLM["vlm_service&lt;br/&gt;Qwen2-VL-2B"]&#10; VLM -.-&gt;|"抓帧 :6700"| SVC&#10; ROUTER["意图路由"] --&gt; LLM["LLM&lt;br/&gt;Qwen2.5-1.5B"]&#10; ROUTER --&gt; RAG["RAG&lt;br/&gt;真实车主手册"]&#10; ROUTER --&gt; TB["Tool Bus"]&#10; TB --&gt; TTS["TTS 网关&lt;br/&gt;REQ :6720"]&#10; LLM --&gt; TB&#10; end&#10; RTMP --&gt;|"视频流"| MM&#10; TB &lt;--&gt;|"REQ :6700&lt;br/&gt;状态/抓拍/开关 (RTT 2ms)"| SVC&#10; SVC --&gt;|"PUB :6701&lt;br/&gt;水位/断流/检测事件"| UI&lt;/pre&gt;&lt;p&gt;两个平面刻意分开：视频大流量不进控制面，控制面单条消息只有几百字节——跨板工具往返实测 &lt;strong&gt;0.73-2ms&lt;/strong&gt;。语音链同理：&lt;strong&gt;音频采集、识别、合成、播报都在 RK 本板&lt;/strong&gt;，跨板只传识别文本与应答文本两条轻量通道。&lt;/p&gt;&#10;&lt;h2 id="真机实拍rk3588-7-寸触摸屏真屏拍摄"&gt;&lt;a href="#%e7%9c%9f%e6%9c%ba%e5%ae%9e%e6%8b%8drk3588-7-%e5%af%b8%e8%a7%a6%e6%91%b8%e5%b1%8f%e7%9c%9f%e5%b1%8f%e6%8b%8d%e6%91%84" class="header-anchor"&gt;&lt;/a&gt;真机实拍（RK3588 7 寸触摸屏，真屏拍摄）&#13;&#10;&lt;/h2&gt;&lt;p&gt;行车记录页：左侧 mediamtx 拉流的&lt;strong&gt;实时预览&lt;/strong&gt;（断流自动重连），右侧状态卡轮询 RK（帧率/段数/磁盘水位环）+ 实时事件日志，底部按钮经 tool_bus 直控真设备；语音气泡「你：打开行车记录」是刚说完一句语音导航后 UI 的回显：&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="RK 触摸屏·行车记录页：实时预览 LIVE + 存储水位环 + 事件日志 + 语音气泡" class="gallery-image" data-flex-basis="407px" data-flex-grow="169" height="908" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/projects/voxdrive/images/dashboard-touch-dashcam.png" srcset="https://zeseanblog.top/projects/voxdrive/images/dashboard-touch-dashcam_hu_bb7794176d726824.png 800w, https://zeseanblog.top/projects/voxdrive/images/dashboard-touch-dashcam.png 1540w" width="1540"&gt;&lt;/p&gt;&#10;&lt;p&gt;主页磁贴：录像状态横条（30.0fps / 138 段 / 5.8GB 可用）与四张磁贴的数据全部来自跨板实时链路，无一张静态图：&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="RK 触摸屏·主页磁贴" class="gallery-image" data-flex-basis="407px" data-flex-grow="169" height="908" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/projects/voxdrive/images/dashboard-touch-home.png" srcset="https://zeseanblog.top/projects/voxdrive/images/dashboard-touch-home_hu_c8c3f0673f171e6f.png 800w, https://zeseanblog.top/projects/voxdrive/images/dashboard-touch-home.png 1540w" width="1540"&gt;&lt;/p&gt;&#10;&lt;p&gt;行车记录仪原始画质参考（IMX415 直出 1080p 快照，RK 端 NV12→JPEG、跨板抓拍约 0.15s）：&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="IMX415 原始 1080p 快照" class="gallery-image" data-flex-basis="426px" data-flex-grow="177" height="1080" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/projects/voxdrive/images/snapshot-1080.jpg" srcset="https://zeseanblog.top/projects/voxdrive/images/snapshot-1080_hu_22f00068aaaacc49.jpg 800w, https://zeseanblog.top/projects/voxdrive/images/snapshot-1080_hu_c7de95e0f383a800.jpg 1600w, https://zeseanblog.top/projects/voxdrive/images/snapshot-1080.jpg 1920w" width="1920"&gt;&lt;/p&gt;&#10;&lt;p&gt;车控页 + 语音上屏（Jetson 侧实例同款界面）：问&amp;quot;现在录着吗&amp;quot;走真实链路（识别 → 路由 → 跨板查询 → LLM 组织 → TTS），底栏字幕是用户原话、气泡是基于真实工具应答生成的播报：&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="车控页与语音播报" class="gallery-image" data-flex-basis="426px" data-flex-grow="177" height="900" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/projects/voxdrive/images/dashboard-voice.png" srcset="https://zeseanblog.top/projects/voxdrive/images/dashboard-voice_hu_145be24756cde134.png 800w, https://zeseanblog.top/projects/voxdrive/images/dashboard-voice.png 1600w" width="1600"&gt;&lt;/p&gt;&#10;&lt;h2 id="行车记录视频链路rk3588"&gt;&lt;a href="#%e8%a1%8c%e8%bd%a6%e8%ae%b0%e5%bd%95%e8%a7%86%e9%a2%91%e9%93%be%e8%b7%afrk3588" class="header-anchor"&gt;&lt;/a&gt;行车记录视频链路（RK3588）&#13;&#10;&lt;/h2&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10; A["IMX415&lt;br/&gt;RAW Bayer"] --&gt;|MIPI CSI-2| B["rkcif → rkisp&lt;br/&gt;3A/格式"]&#10; B --&gt;|NV12| C["V4L2 用户态&lt;br/&gt;mmap 4 缓冲 + DMA-BUF"]&#10; C --&gt; D["MPP H.264&lt;br/&gt;NV12 直入 · VBR"]&#10; D --&gt; E["Mp4SegmentSink&lt;br/&gt;I 帧边界滚动分段"]&#10; D --&gt; F["RtmpSink&lt;br/&gt;flv + extradata"]&#10; C -.每 30 帧.-&gt; G["最新帧槽"]&#10; G --&gt; H["RGA → RKNN&lt;br/&gt;YOLOv5s INT8 · NPU"]&#10; H --&gt;|"命中行人/车辆"| E&lt;/pre&gt;&lt;p&gt;几个值得说的实现细节：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;NV12 同制式直入 MPP&lt;/strong&gt;：ISP 出的 NV12 不做格式转换直接编码（全链路 CPU ~2.8%），RGA 只用于检测前处理的缩放；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;MP4 分段的坑&lt;/strong&gt;：movenc 不代转 Annex-B，需逐 NAL 转 AVCC 并手工组装 avcC；NAL 边界 off-by-one 的症状是&amp;quot;时长正常但解码全错&amp;quot;——验收判据用&lt;strong&gt;逐段全量解码&lt;/strong&gt;而非 duration；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;事件锁录&lt;/strong&gt;：检测线程经&amp;quot;最新帧槽&amp;quot;旁路挂接（忙时覆盖、不反压主管线），命中即给当前段加 &lt;code&gt;LOCK_&lt;/code&gt; 前缀，循环覆盖天然豁免，另有配额防锁段吃满磁盘；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;rkisp 残留态&lt;/strong&gt;：boot 残留下 S_FMT 原样传回会得到行距矛盾的布局（SEGV/无帧），修复=清零强制重算 + 读回几何校验。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="端侧语音闭环推理与音频-io-都在-rkllm-留-jetson"&gt;&lt;a href="#%e7%ab%af%e4%be%a7%e8%af%ad%e9%9f%b3%e9%97%ad%e7%8e%af%e6%8e%a8%e7%90%86%e4%b8%8e%e9%9f%b3%e9%a2%91-io-%e9%83%bd%e5%9c%a8-rkllm-%e7%95%99-jetson" class="header-anchor"&gt;&lt;/a&gt;端侧语音闭环（推理与音频 I/O 都在 RK，LLM 留 Jetson）&#13;&#10;&lt;/h2&gt;&lt;p&gt;语音链的形态一句话：&lt;strong&gt;音频不出板，跨板只传文本&lt;/strong&gt;。麦克风/音箱（同一 USB 设备）接 RK——&lt;code&gt;voice_service&lt;/code&gt; 进程内采集 16k PCM → kaldi-native-fbank 特征（与 sherpa C++ 前端逐位一致）→ zipformer 三模型 fp16 NPU 三核分载流式解码 → 识别文本 REQ 回 Jetson 意图路由 → 应答文本回到 RK 的 &lt;code&gt;tts_node&lt;/code&gt;（SummerTTS 多核合成）→ 本板播报。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;防回灌&lt;/strong&gt;：麦克风和音箱是同一块硬件，播报期做事件驱动静音，解除须等 play_end 后麦克风连续 1s 真实静音（+超时兜底）；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ASR 选 fp16 而非 int8&lt;/strong&gt;：INT8 全套量化精度分析实测不满足流式精度（状态累积崩溃），fp16 零量化损失且 RTF 0.3 以内；TTS 评估 matcha RKNN 路线后放弃（声码器输出 STFT 谱需宿主 ISTFT，NPU 图不适用），改用 SummerTTS 引擎源码上板编译——真麦声学自环实测识别逐字正确、无循环。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Jetson 侧保留三个关键架构决策：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;真设备域确定性直通&lt;/strong&gt;。1.5B 小模型在 7 个工具间选择实测不可靠（&amp;ldquo;关闭预览&amp;quot;被选成关车窗、&amp;ldquo;还剩多少存储&amp;quot;选成编数），改为关键词命中即直达跨板工具、LLM 只把真实结果组织成播报——控制类链路降到 &lt;strong&gt;0.43s&lt;/strong&gt;。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;语义双路路由&lt;/strong&gt;。规则通路兜底 + 语义通路（离线意图中心余弦，阈值留出探针校准）：关键词全 miss 的改述问句直接走 RAG 快路径，&lt;strong&gt;9.4s → 1.2s&lt;/strong&gt;；语义通路故障自动退化为规则单路。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;推理位置按实时性分层&lt;/strong&gt;。ASR/TTS 下沉边缘 NPU/CPU，LLM/RAG 留中心——判据是&amp;quot;实时敏感 × 算力可承担&amp;rdquo;，不是无脑把模型搬到一块板。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;RAG 语料是&lt;strong&gt;真实车主手册&lt;/strong&gt;（官网 PDF → 三级过滤 → 577 块向量库，板上构建），召回阈值 0.48 由&amp;quot;手册内改述句 vs 手册外噪声&amp;quot;的相似度实测分界定出。&lt;/p&gt;&#10;&lt;h2 id="座舱-ui-双端部署rk-触摸屏"&gt;&lt;a href="#%e5%ba%a7%e8%88%b1-ui-%e5%8f%8c%e7%ab%af%e9%83%a8%e7%bd%b2rk-%e8%a7%a6%e6%91%b8%e5%b1%8f" class="header-anchor"&gt;&lt;/a&gt;座舱 UI 双端部署（RK 触摸屏）&#13;&#10;&lt;/h2&gt;&lt;p&gt;同一套 dashboard 代码不改一行，配置切换跑在两种形态：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Jetson 桌面&lt;/strong&gt;与 &lt;strong&gt;RK 7 寸 DSI 触摸屏&lt;/strong&gt;（1024×600，Goodix 触摸）各跑一个实例，&lt;strong&gt;双端同时在线&lt;/strong&gt;、订阅同一套 ZMQ 数据源——UI 是纯客户端，换屏只是多一个实例，服务端拓扑零变化；&lt;/li&gt;&#10;&lt;li&gt;小屏自适应：可用几何过小时自动最大化 + &lt;strong&gt;X 级缩放 1.5625×&lt;/strong&gt; 到 1600×938 逻辑设计尺寸（Qt 自带 &lt;code&gt;QT_SCALE_FACTOR&lt;/code&gt; 在本板组合上首帧后冻结，实测弃用）；&lt;/li&gt;&#10;&lt;li&gt;真机闭环已验证：说&amp;quot;打开行车记录&amp;rdquo;→ RK 触摸屏切页并自动拉起 RTSP 预览，画面色彩正确、跨屏数据实时。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="实测数据"&gt;&lt;a href="#%e5%ae%9e%e6%b5%8b%e6%95%b0%e6%8d%ae" class="header-anchor"&gt;&lt;/a&gt;实测数据&#13;&#10;&lt;/h2&gt;&lt;p&gt;所有数字可复述测量方法，无估算值：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;指标&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;实测值&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;采集（IMX415 → NV12 1080p）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;30.0fps&lt;/strong&gt;，max 帧间距 33ms（驱动时间戳，120 帧）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MPP H.264 硬编&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;延迟 &lt;strong&gt;avg 4.8 / max 8.5ms&lt;/strong&gt;，全链路 CPU &lt;strong&gt;~2.8%&lt;/strong&gt;（单核）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;跨板拉流（RK→Jetson mediamtx）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1080p30 全量解码零错误（30.2s），静态场景 VBR 下探 0.71Mbps&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;跨板控制面（ZMQ REQ）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RTT &lt;strong&gt;2ms&lt;/strong&gt;（路由器组网）；直连组网复测 &lt;strong&gt;avg 0.73ms&lt;/strong&gt;（0.64-0.83，n=20）；抓拍 143ms（含 JPEG 编码 + 183KB base64 跨板）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RKNN 事件锁录检测&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;推理 &lt;strong&gt;25.3ms ewma&lt;/strong&gt;（NPU core0），检测线程挂接下录像 30fps 无损；连续 1.5h+ 录像 ewma 26.2ms / 5154 次&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;语音闭环全程（文本入口→播报结束）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;3.55-5.47s&lt;/strong&gt;（LLM 组织 0.86-1.07s 为大头，跨板工具仅 2-10ms）；修复回灌级联后干净口径：router 应答 1.49-4.14s，→播报结束 7.0-17.9s（=答复文本+合成+实时音频时长，随答复长度自洽）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ASR 推理（RK NPU fp16 三模型分核）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;RTF 0.26-0.30&lt;/strong&gt;（10.1s 中英混复测 0.296），线上流式转写与 Jetson ORT fp32 贪心&lt;strong&gt;逐字一致&lt;/strong&gt;；前端特征与 sherpa C++ 逐位一致（对拍 maxabs=0）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;TTS 合成（RK SummerTTS 多核 CPU）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;RTF 0.22-0.27&lt;/strong&gt;（7 字句 0.63s、28 字句 1.47s），合成 PCM 回传播放时长精确吻合&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;VLM 画面问答（Qwen2-VL-2B，按需换出 llm）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;应答与画面实测一致；周期=快照 0.35s+推理 4.7s+恢复 14.9s（冷启动 ~25-30s）；GPU 铁律=共存 OOM/须 evict 页缓存/ctx 2048+图降采样 960×540&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;真麦声学闭环（USB 组合设备）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;播命令→空气→麦克风→NPU 识别&lt;strong&gt;逐字正确&lt;/strong&gt;→真数据应答→本板播报+防回灌静音→无循环&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;LLM&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Qwen2.5-1.5B Q4_K_M，&lt;strong&gt;22.8 token/s&lt;/strong&gt;（首测）；第三轮复测 20.5-21.0 token/s（llama.cpp 纯生成口径 ×3，全栈在线）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;长稳&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;16min 双板联跑 fps 稳定 30.00、29417 帧零异常；故障注入 5s 精确超时自愈；第三轮复测时已连续录像 &lt;strong&gt;1.5h+（154k 帧）&lt;/strong&gt; 30.001fps、RTMP 零写错误&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;回归验证&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2026-09-06 第二轮全量验证全绿：RK 5/5 + Jetson selftest 8/8 + 回归 4/4×2 + E2E 抽查（RTSP 90 帧零错误/色度中性、HLS、跨板语音查询含真实值 rtt 1.6-2.2s、跨板抓拍 123ms）；同日傍晚第三轮性能复测（跨板 RTT/LLM/RAG 208-280ms/ASR/TTS/E2E 全栈在线全项重测）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="五个实战排障叙事"&gt;&lt;a href="#%e4%ba%94%e4%b8%aa%e5%ae%9e%e6%88%98%e6%8e%92%e9%9a%9c%e5%8f%99%e4%ba%8b" class="header-anchor"&gt;&lt;/a&gt;五个实战排障叙事&#13;&#10;&lt;/h2&gt;&lt;p&gt;比数字更有意思的是踩坑（每条都有一手证据链）：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;RKNN「流式状态发散」— 症状像量化精度，根因是内存布局&lt;/strong&gt;。zipformer 转 RKNN 后流式解码首块全对、之后结构性错乱（值集不变、位置全乱），INT8/fp16 同症状——直觉会怪量化或图编译。真因是 &lt;strong&gt;RKNN 对 4D 图输入的布局约定&lt;/strong&gt;：缓存张量必须按 &lt;code&gt;transpose(0,2,3,1)&lt;/code&gt; 预转置喂入。定位：探针模型 chunk 级逐张量对账 → 周期标记指纹排除数值精度 → 4D 直通 tiny 图暴力解出唯一转置；修复后转写与 fp32 &lt;strong&gt;逐字一致&lt;/strong&gt;。教训：多输入非图像模型上 NPU，先做直通等价自测。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ZMQ linger 默认无限&lt;/strong&gt;：对端进程死亡时，客户端析构带着未投递消息&lt;strong&gt;永久阻塞&lt;/strong&gt;，工具总线整体楔死。没有 gdb 条件，靠 &lt;code&gt;/proc/&amp;lt;pid&amp;gt;/wchan&lt;/code&gt; + 残留 context 线程定位；修复 linger=0 + EINTR 重试后，故障注入 5s 精确超时、恢复即自愈。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;1.5B 选错工具&lt;/strong&gt;：LLM 自由选工具实测不可靠（关预览→关车窗），改成&amp;quot;关键词直通执行 + LLM 仅组织结果&amp;quot;——把确定性还给代码，把语言能力留给模型。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;rkisp 残留态&lt;/strong&gt;：S_FMT 原样传回残留行距，驱动照收但布局自相矛盾，症状是段错误 + 无帧。教训：&lt;strong&gt;不信任驱动的&amp;quot;照单全收&amp;quot;，写入前清零重算、读回后几何校验&lt;/strong&gt;。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;防回灌静音窗口被&amp;quot;事件语义差&amp;quot;击穿&lt;/strong&gt;：E2E 对账发现播报结束时间异常，排查见&lt;strong&gt;扬声器播的回答被自家麦克风识别、级联出新查询&lt;/strong&gt;。根因是跨板事件语义差：Jetson 的 &lt;code&gt;play_end&lt;/code&gt; 是&amp;quot;合成+写入完成&amp;quot;（12s 音频 2.9s 就发出），而播报在 RK 实时进行——静音在&amp;quot;写完&amp;quot;后 0.6s 就解除，长答复播到一半麦克风听到自己的声音。修复=静音期顺带能量观测，解除改为 &lt;strong&gt;play_end 后麦克风连续 1s 真实静音&lt;/strong&gt;；同场景对比级联 3 次 → 0 次。教训：跨板系统的&amp;quot;同名词事件&amp;quot;未必同语义，端到端对账日志是最好的透视镜。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="与站内其他项目的关系"&gt;&lt;a href="#%e4%b8%8e%e7%ab%99%e5%86%85%e5%85%b6%e4%bb%96%e9%a1%b9%e7%9b%ae%e7%9a%84%e5%85%b3%e7%b3%bb" class="header-anchor"&gt;&lt;/a&gt;与站内其他项目的关系&#13;&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://zeseanblog.top/projects/vehicle-voice-agent/" &gt;车载 AI 语音助手（Jetson）&lt;/a&gt;：本项目的 Jetson 侧前身，七服务架构与音频链路由它收编重构而来；&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://zeseanblog.top/projects/xray-motion-control/" &gt;X 射线焊缝检测下位机&lt;/a&gt;：另一条嵌入式线（STM32 + FreeRTOS）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>可穿戴导盲辅助系统（智辅盲行）</title><link>https://zeseanblog.top/projects/wearable/</link><pubDate>Tue, 01 Sep 2026 13:00:00 +0800</pubDate><guid>https://zeseanblog.top/projects/wearable/</guid><description>&lt;h2 id="项目概述"&gt;&lt;a href="#%e9%a1%b9%e7%9b%ae%e6%a6%82%e8%bf%b0" class="header-anchor"&gt;&lt;/a&gt;项目概述&#13;&#10;&lt;/h2&gt;&lt;p&gt;「智辅盲行」是一套面向视力障碍者的&lt;strong&gt;可穿戴式出行辅助装置&lt;/strong&gt;，为本团队参加第二十一届中国研究生电子设计竞赛「通感算智融合与数智化应用」专项赛的参赛作品。&lt;/p&gt;&#10;&lt;p&gt;传统导盲工具（盲杖、导盲犬）难以感知红绿灯、远处来车等语义信息。本系统以 &lt;strong&gt;RK3588 边缘计算平台&lt;/strong&gt;为核心，融合摄像头、毫米波雷达、IMU 与 GPS 多源传感器，在端侧完成目标检测与场景理解，并通过&lt;strong&gt;分级语音/触觉提醒&lt;/strong&gt;帮助使用者规避风险，实现全天候（夜间、雨雾、逆光均可工作）的独立出行辅助。&lt;/p&gt;&#10;&lt;h2 id="系统组成"&gt;&lt;a href="#%e7%b3%bb%e7%bb%9f%e7%bb%84%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;系统组成&#13;&#10;&lt;/h2&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10; subgraph SENSE["感知端"]&#10; CAM["IMX415 摄像头"]&#10; RADAR["毫米波雷达"]&#10; IMU["ICM20948 IMU"]&#10; GPS["NEO6M GPS"]&#10; ESP["ESP32-S3 采集节点"]&#10; end&#10; subgraph COMPUTE["计算端：RK3588 边缘网关"]&#10; RKNN["RKNN NPU 推理&lt;br/&gt;YOLOv8n 目标检测"]&#10; FUSION["多源融合&lt;br/&gt;时空对齐"]&#10; GUIDE["导盲决策引擎&lt;br/&gt;风险分级"]&#10; end&#10; subgraph FEEDBACK["反馈端"]&#10; SPK["功放喇叭 · 紧急播报"]&#10; BC["骨传导耳机 · 常规提示"]&#10; VIB["震动马达 · 触觉告警"]&#10; end&#10; CAM --&gt;|MIPI| RKNN&#10; RADAR --&gt;|UART| ESP&#10; IMU --&gt;|I2C| ESP&#10; GPS --&gt;|UART| ESP&#10; ESP --&gt;|UART| FUSION&#10; RKNN --&gt; FUSION&#10; FUSION --&gt; GUIDE&#10; GUIDE --&gt; SPK&#10; GUIDE --&gt; BC&#10; GUIDE --&gt; VIB&lt;/pre&gt;&lt;p&gt;整机采用&lt;strong&gt;胸包式佩戴&lt;/strong&gt;：RK3588 与电池组置于胸前硬壳包内，摄像头从包顶朝前，传感器节点固定于腰带，续航 3 小时以上。&lt;/p&gt;&#10;&lt;h2 id="多传感器融合策略"&gt;&lt;a href="#%e5%a4%9a%e4%bc%a0%e6%84%9f%e5%99%a8%e8%9e%8d%e5%90%88%e7%ad%96%e7%95%a5" class="header-anchor"&gt;&lt;/a&gt;多传感器融合策略&#13;&#10;&lt;/h2&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;传感器&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;职责&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;频率&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;兜底逻辑&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;摄像头 + RKNN&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;目标检测：行人/车辆/障碍/红绿灯/斑马线&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;30fps&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;毫米波雷达&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;测距测速测角；&lt;strong&gt;夜间/雨雾/逆光兜底&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;10Hz&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;纯视觉失效时接管&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IMU&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;坡道/坑洼检测、步态分析、跌倒检测&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;200Hz&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;GPS 辅助姿态&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;GPS&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;全局定位、远程监护&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1Hz&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;基站定位降级&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;视觉与雷达互为冗余是本系统的核心设计：白天以视觉语义为主，摄像头失效的夜间与恶劣天气场景由毫米波雷达接管，保证感知链路无死角。&lt;/p&gt;&#10;&lt;h2 id="分级提醒策略"&gt;&lt;a href="#%e5%88%86%e7%ba%a7%e6%8f%90%e9%86%92%e7%ad%96%e7%95%a5" class="header-anchor"&gt;&lt;/a&gt;分级提醒策略&#13;&#10;&lt;/h2&gt;&lt;p&gt;不同距离与场景对应不同的置信度要求和提醒强度，避免过度打扰：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;场景&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;提醒方式&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&amp;lt; 0.8m 障碍（雷达+视觉双确认）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;喇叭强播「停！前方障碍」+ 震动马达&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.8~2m 车辆逼近&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;喇叭播报「注意车辆靠近」&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2~5m 行人&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;骨传导耳机「前方 3 米有人」&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;红绿灯 / 斑马线识别&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;骨传导耳机「红灯停，检测到斑马线」&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;下坡 / 路面坑洼（IMU）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;骨传导耳机「注意下坡，路面不平」&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="软件架构"&gt;&lt;a href="#%e8%bd%af%e4%bb%b6%e6%9e%b6%e6%9e%84" class="header-anchor"&gt;&lt;/a&gt;软件架构&#13;&#10;&lt;/h2&gt;&lt;p&gt;全 C++ 模块化实现，按 &lt;code&gt;camera / radar / imu / gps / fusion / guide / voice / comm&lt;/code&gt; 划分模块，配置与规则（距离阈值、播报模板）全部外置为 YAML/JSON，便于现场调整：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;推理&lt;/strong&gt;：RKNN NPU 上运行 YOLOv8n 通用检测，预留红绿灯、斑马线专用模型&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;融合&lt;/strong&gt;：GPS UTC 时间戳 + 系统时钟做时空对齐，完成多源目标关联&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;决策&lt;/strong&gt;：场景理解 → 风险分级 → 播报策略三级流水&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;语音&lt;/strong&gt;：Piper 离线 TTS 实时合成常规提示 + 预录 WAV 零延迟播放紧急告警的混合方案，播报队列支持优先级打断&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="项目状态"&gt;&lt;a href="#%e9%a1%b9%e7%9b%ae%e7%8a%b6%e6%80%81" class="header-anchor"&gt;&lt;/a&gt;项目状态&#13;&#10;&lt;/h2&gt;&lt;p&gt;竞赛作品已完成整机集成与多场景实测（室内避障、逆光/雨雾、复杂路口、夜间、坑洼路面），目前仍在持续迭代识别精度与佩戴体验。&lt;/p&gt;&#10;</description></item><item><title>个人博客（本站）</title><link>https://zeseanblog.top/projects/blog/</link><pubDate>Tue, 01 Sep 2026 13:05:00 +0800</pubDate><guid>https://zeseanblog.top/projects/blog/</guid><description>&lt;h2 id="项目概述"&gt;&lt;a href="#%e9%a1%b9%e7%9b%ae%e6%a6%82%e8%bf%b0" class="header-anchor"&gt;&lt;/a&gt;项目概述&#13;&#10;&lt;/h2&gt;&lt;p&gt;你现在看到的这个网站，就是我的第一个完整独立部署的 Web 项目。&lt;/p&gt;&#10;&lt;p&gt;从域名备案、服务器采购，到站点搭建、HTTPS 证书、自动化部署，全流程独立完成。除了站点本身，还为它写了一套配套的本地工具：&lt;strong&gt;notes-ui 笔记工作台&lt;/strong&gt;——把「写完的 Markdown 笔记 → 线上文章」的全流程做成了浏览器界面，拖拽上传、自动处理图片、分步构建部署。&lt;/p&gt;&#10;&lt;h2 id="架构"&gt;&lt;a href="#%e6%9e%b6%e6%9e%84" class="header-anchor"&gt;&lt;/a&gt;架构&#13;&#10;&lt;/h2&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10; UI["notes-ui 本地笔记工作台&lt;br/&gt;（Flask · 127.0.0.1）"] --&gt;|"解析 / 图片归位 / 元数据"| SRC["本地 Markdown 源码&lt;br/&gt;（本仓库）"]&#10; SRC --&gt;|"hugo 构建（毫秒级）"| BUILD["静态 HTML / CSS / JS"]&#10; BUILD --&gt;|"tar 打包 + scp 上传 + 原子替换"| SRV["腾讯云服务器&lt;br/&gt;Nginx 托管"]&#10; SRV --&gt;|"Let's Encrypt HTTPS"| USER["访客&lt;br/&gt;zeseanblog.top"]&lt;/pre&gt;&lt;h2 id="技术栈"&gt;&lt;a href="#%e6%8a%80%e6%9c%af%e6%a0%88" class="header-anchor"&gt;&lt;/a&gt;技术栈&#13;&#10;&lt;/h2&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;组件&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;选择&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;说明&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;静态站点生成器&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Hugo&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;单二进制，构建速度极快&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;主题&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Stack&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;卡片式设计，简洁美观&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Web 服务器&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Nginx&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;HTTP/2、gzip、静态资源缓存&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;HTTPS&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Let&amp;rsquo;s Encrypt&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;免费证书，certbot 自动续期&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;部署&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;自研脚本&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;构建 → 打包 → 上传 → 原子替换&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;本地工具&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;notes-ui（Flask）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;笔记上传 / 图片处理 / 分步发布 / 文章管理&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="配套工具notes-ui-笔记工作台"&gt;&lt;a href="#%e9%85%8d%e5%a5%97%e5%b7%a5%e5%85%b7notes-ui-%e7%ac%94%e8%ae%b0%e5%b7%a5%e4%bd%9c%e5%8f%b0" class="header-anchor"&gt;&lt;/a&gt;配套工具：notes-ui 笔记工作台&#13;&#10;&lt;/h2&gt;&lt;p&gt;写笔记在本地编辑器，发布却要手工做一堆机械活：建目录、拷图片、改路径、拼 front matter、构建、部署、提交。notes-ui 把这条链路做成了只监听本机的 Web 界面：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;导入&lt;/strong&gt;：拖拽 &lt;code&gt;.md&lt;/code&gt; 文件或整个笔记文件夹（图片自动带上），也可直接粘贴文本；自动剥离笔记自带的 front matter 并预填表单&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;图片处理&lt;/strong&gt;：按正文引用自动匹配、拷入页面包 &lt;code&gt;images/&lt;/code&gt;、统一改写路径，缺失的图片列清单可补传&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;发布流水线&lt;/strong&gt;：生成页面包 → 构建验证 → 部署上线（二次确认、原子替换可回滚）→ 线上抽查（页面与图片 200 检查）→ git 提交，每步独立日志、可停在中途&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;文章管理&lt;/strong&gt;：列出全部文章，支持编辑元数据、草稿开关、改 slug、本地预览（托管 &lt;code&gt;hugo server -D&lt;/code&gt;）、删除进回收站&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;工程细节&lt;/strong&gt;：零前端框架的原生单页界面；slug 实时查重；分类/标签全站自动补全；发布时间自动与最新文章错开&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;技术上是一个单文件 Flask 应用（Python 标准库风格，唯一的第三方依赖就是 Flask 本身），通过 subprocess 编排 hugo / 部署脚本 / git，前端为原生 HTML/JS/CSS 单页，无构建步骤。&lt;/p&gt;&#10;&lt;h2 id="项目状态"&gt;&lt;a href="#%e9%a1%b9%e7%9b%ae%e7%8a%b6%e6%80%81" class="header-anchor"&gt;&lt;/a&gt;项目状态&#13;&#10;&lt;/h2&gt;&lt;p&gt;已上线并稳定运行，持续更新学习笔记中；笔记发布日常已通过 notes-ui 完成。&lt;/p&gt;&#10;</description></item><item><title>车载 AI 语音助手（Jetson Orin Nano）</title><link>https://zeseanblog.top/projects/vehicle-voice-agent/</link><pubDate>Tue, 01 Sep 2026 14:00:00 +0800</pubDate><guid>https://zeseanblog.top/projects/vehicle-voice-agent/</guid><description>&lt;h2 id="项目概述"&gt;&lt;a href="#%e9%a1%b9%e7%9b%ae%e6%a6%82%e8%bf%b0" class="header-anchor"&gt;&lt;/a&gt;项目概述&#13;&#10;&lt;/h2&gt;&lt;p&gt;基于 NVIDIA Jetson Orin Nano 的&lt;strong&gt;端侧车辆 AI 语音助手&lt;/strong&gt;：说话→听懂→思考→执行→回答全链路在车端本地完成，不依赖云端。集成 ASR-TTS 语音交互、意图路由、RAG 车辆知识库、LLM/Tool 调用与 QT 数字座舱界面，实现车辆知识问答、车控工具调用与 GUI 展示。&lt;/p&gt;&#10;&lt;p&gt;各服务模块采用 &lt;strong&gt;ZeroMQ&lt;/strong&gt; 轻量级通信框架，实现松耦合的分布式多服务架构。&lt;/p&gt;&#10;&lt;h2 id="系统架构"&gt;&lt;a href="#%e7%b3%bb%e7%bb%9f%e6%9e%b6%e6%9e%84" class="header-anchor"&gt;&lt;/a&gt;系统架构&#13;&#10;&lt;/h2&gt;&lt;p&gt;系统拆分为 ASR、Intent Router、RAG、LLM、Tool Bus、TTS、QT UI 七个模块，模块间通过 ZMQ 的 REQ/REP + PUB/SUB 组合，实现&lt;strong&gt;请求应答、状态广播、状态同步&lt;/strong&gt;三种通信模式。&lt;/p&gt;&#10;&lt;p&gt;以一句「帮我把空调调到 24 度」为例的完整链路：&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10; MIC["麦克风"] --&gt; VAD["VAD / 关键词唤醒"]&#10; VAD --&gt; ASR["ASR 语音识别&lt;br/&gt;sherpa-onnx zipformer"]&#10; ASR --&gt; IR["意图路由&lt;br/&gt;语义分类 + 规则分类"]&#10; IR --&gt;|"车控意图"| LLM["LLM&lt;br/&gt;Qwen2.5-3B Q4_K_M"]&#10; IR --&gt;|"知识问答"| RAG["RAG 检索&lt;br/&gt;车辆手册向量库"]&#10; RAG --&gt; LLM&#10; LLM --&gt;|"tool_call JSON"| TOOL["Tool Bus&lt;br/&gt;车控工具执行"]&#10; LLM --&gt;|"respond JSON"| TTS["TTS 播报&lt;br/&gt;SummerTTS"]&#10; TOOL --&gt;|"状态同步"| UI["QT 座舱 UI"]&#10; TTS --&gt; OUT["扬声器"]&lt;/pre&gt;&lt;h2 id="关键技术点"&gt;&lt;a href="#%e5%85%b3%e9%94%ae%e6%8a%80%e6%9c%af%e7%82%b9" class="header-anchor"&gt;&lt;/a&gt;关键技术点&#13;&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;AI 语音交互&lt;/strong&gt;：ASR 使用 sherpa-onnx 部署 zipformer 模型，TTS 基于 SummerTTS；设计了 ASR 与 TTS 的同步机制，避免 TTS 播放期间语音回灌误识别；构建 VAD 与关键词唤醒&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;意图路由&lt;/strong&gt;：语义分类 + 规则分类双通路融合的意图识别，编排 5 类服务调用，按意图选择 RAG 检索、LLM 调用、直接语音回复或 Tool 调用的组合&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;RAG 车辆知识库&lt;/strong&gt;：基于 sentence-transformers 将车辆手册向量化，余弦相似度 + Top-K 检索，端侧全离线完成知识问答&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;LLM 部署与 Tool 调用&lt;/strong&gt;：llama.cpp 部署 Qwen2.5-3B 的 GGUF Q4_K_M 量化模型；通过 prompt 强约束让模型只输出两类 JSON——&lt;code&gt;respond&lt;/code&gt; 交给 TTS 播放，&lt;code&gt;tool_call&lt;/code&gt; 驱动车控工具执行&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;QT 车载座舱 GUI&lt;/strong&gt;：数字座舱界面，实时展示空调、车窗、天窗、摄像头与传感器等车辆状态&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="核心-api-与接口设计"&gt;&lt;a href="#%e6%a0%b8%e5%bf%83-api-%e4%b8%8e%e6%8e%a5%e5%8f%a3%e8%ae%be%e8%ae%a1" class="header-anchor"&gt;&lt;/a&gt;核心 API 与接口设计&#13;&#10;&lt;/h2&gt;&lt;h3 id="服务端口与通信原语"&gt;&lt;a href="#%e6%9c%8d%e5%8a%a1%e7%ab%af%e5%8f%a3%e4%b8%8e%e9%80%9a%e4%bf%a1%e5%8e%9f%e8%af%ad" class="header-anchor"&gt;&lt;/a&gt;服务端口与通信原语&#13;&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;服务&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;端口&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;协议&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Intent Router&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;:6666&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ZMQ REQ/REP&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RAG Service&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;:6667&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ZMQ REQ/REP&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;LLM Service&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;:6668&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ZMQ REQ/REP&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Tool Bus&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;:6669&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ZMQ REQ/REP&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;状态广播&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;:6670 / :6671&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ZMQ PUB/SUB&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;TTS Server&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;:7777&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;音频流&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;llama-server（GGUF 推理后端）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;:8080&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;HTTP&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;C++ 侧封装了 &lt;code&gt;ZmqServer / ZmqClient&lt;/code&gt;（REQ/REP 请求应答）与 &lt;code&gt;ZmqPub / ZmqSub&lt;/code&gt;（状态广播）两组通用组件，各服务只依赖消息契约、不依赖彼此实现。&lt;/p&gt;&#10;&lt;h3 id="意图路由五分类多分支"&gt;&lt;a href="#%e6%84%8f%e5%9b%be%e8%b7%af%e7%94%b1%e4%ba%94%e5%88%86%e7%b1%bb%e5%a4%9a%e5%88%86%e6%94%af" class="header-anchor"&gt;&lt;/a&gt;意图路由：五分类多分支&#13;&#10;&lt;/h3&gt;&lt;p&gt;Router 对每句输入做&lt;strong&gt;语义分类 + 规则分类&lt;/strong&gt;双通路融合，输出五类意图并按类型路由到不同服务链：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;意图&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;链路&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;典型时延&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;EMERGENCY（紧急事项）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RAG → TTS&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;~0.5s&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;FACTUAL（手册事实问答）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RAG → TTS&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;~0.5s&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;EXPLICIT_CMD（明确车控指令）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Tool Bus → TTS&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;~0.5s&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;COMPLEX（复杂查询）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RAG → LLM → TTS&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;秒级&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CREATIVE（闲聊/生成）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;LLM → TTS&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;秒级&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;LLM + Tool 闭环&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;LLM ↔ Tool → LLM → TTS&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;秒级&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="llm-双模式-json-契约"&gt;&lt;a href="#llm-%e5%8f%8c%e6%a8%a1%e5%bc%8f-json-%e5%a5%91%e7%ba%a6" class="header-anchor"&gt;&lt;/a&gt;LLM 双模式 JSON 契约&#13;&#10;&lt;/h3&gt;&lt;p&gt;通过 Prompt 强约束 LLM 只输出两类 JSON，这是「语音语义 → 车辆动作」的核心契约：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;action&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;respond&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;好的，已为您将空调调到 24 度&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;action&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;tool_call&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tool&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ac&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tool_action&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;set_temperature&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;params&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;reason&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;用户要求把空调调到 24 度&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;respond&lt;/code&gt; → 直接送 TTS 播报&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;tool_call&lt;/code&gt; → Tool Bus 侧做参数归一化与校验（例如从口语化文本中提取「24 度」的数值），执行后通过 PUB 通道把车辆状态同步给 QT 座舱，并把执行结果回灌 LLM 生成自然语言回复&lt;/li&gt;&#10;&lt;li&gt;无法归一化的输出会降级为 &lt;code&gt;respond&lt;/code&gt; 兜底，保证任何情况下用户都能得到语音反馈&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="rag-检索接口"&gt;&lt;a href="#rag-%e6%a3%80%e7%b4%a2%e6%8e%a5%e5%8f%a3" class="header-anchor"&gt;&lt;/a&gt;RAG 检索接口&#13;&#10;&lt;/h3&gt;&lt;p&gt;车辆手册切片后经 sentence-transformers 编码为 &lt;strong&gt;768 维向量&lt;/strong&gt;入库；查询时同模型编码 query → 余弦相似度 Top-K 检索 → 命中文档拼接进 LLM 上下文，全部在端侧离线完成。&lt;/p&gt;&#10;&lt;h2 id="项目状态"&gt;&lt;a href="#%e9%a1%b9%e7%9b%ae%e7%8a%b6%e6%80%81" class="header-anchor"&gt;&lt;/a&gt;项目状态&#13;&#10;&lt;/h2&gt;&lt;p&gt;全链路已在 Jetson Orin Nano 上跑通，端侧离线完成语音到车控的闭环。&lt;/p&gt;&#10;</description></item><item><title>基于人脸识别的视觉门禁系统（RK3588）</title><link>https://zeseanblog.top/projects/face-access-control/</link><pubDate>Tue, 01 Sep 2026 14:05:00 +0800</pubDate><guid>https://zeseanblog.top/projects/face-access-control/</guid><description>&lt;h2 id="项目概述"&gt;&lt;a href="#%e9%a1%b9%e7%9b%ae%e6%a6%82%e8%bf%b0" class="header-anchor"&gt;&lt;/a&gt;项目概述&#13;&#10;&lt;/h2&gt;&lt;p&gt;面向区域门禁的&lt;strong&gt;边缘侧视觉安防系统&lt;/strong&gt;，防止异常访客进入。在 RK3588 上完成视频编解码、多模型 NPU 推理、视频推流的系统集成，实现「识别 → 比对 → 开门」的任务闭环，同时保证库内人脸识别准确度。&lt;/p&gt;&#10;&lt;h2 id="系统链路"&gt;&lt;a href="#%e7%b3%bb%e7%bb%9f%e9%93%be%e8%b7%af" class="header-anchor"&gt;&lt;/a&gt;系统链路&#13;&#10;&lt;/h2&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10; CAM["4 路 RTSP 摄像头"] --&gt; PULL["FFmpeg 拉流"]&#10; PULL --&gt; DEC["MPP 硬解码&lt;br/&gt;1080p@30fps"]&#10; DEC --&gt; BUF["共享缓冲区&lt;br/&gt;生产者-消费者队列"]&#10; BUF --&gt; RGA["RGA 预处理&lt;br/&gt;零拷贝"]&#10; RGA --&gt; NPU["NPU 多模型推理&lt;br/&gt;YOLO11 · RetinaFace · FaceNet"]&#10; NPU --&gt; CMP{"人脸比对&lt;br/&gt;SQLite 5k+ 特征库"}&#10; CMP --&gt;|"命中 &gt; 98%"| DOOR["GPIO 继电器开门&lt;br/&gt;延迟 &lt; 1s"]&#10; DEC --&gt; ENC["H.264 封装"]&#10; ENC --&gt; RTMP["RTMP 推流"]&lt;/pre&gt;&lt;p&gt;解码、推理、推流之间采用&lt;strong&gt;生产者-消费者队列&lt;/strong&gt;隔离，端到端延迟 &amp;lt; 200ms，长时间连续运行无内存泄漏。&lt;/p&gt;&#10;&lt;h2 id="关键技术点"&gt;&lt;a href="#%e5%85%b3%e9%94%ae%e6%8a%80%e6%9c%af%e7%82%b9" class="header-anchor"&gt;&lt;/a&gt;关键技术点&#13;&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;多媒体采集处理&lt;/strong&gt;：FFmpeg 实现 4 路 RTSP 视频流拉流；Rockchip MPP 完成 H.264 硬件解码；共享缓冲区保证帧数据的线程安全；解码后封装 H.264 经 RTMP 推流供远程查看&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;多模型 NPU 推理调度&lt;/strong&gt;：RKNN-Toolkit2 完成三模型 INT8 量化部署——YOLO11（人体检测）、RetinaFace（人脸检测）、FaceNet（人脸识别）；量化精度分析后对敏感层做&lt;strong&gt;混合量化&lt;/strong&gt;提升精度，单帧 NPU 推理耗时 &lt;strong&gt;&amp;lt; 35ms&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;工程优化&lt;/strong&gt;：解码零拷贝输出 Buffer 直入 RGA 做图像预处理，显著降低 CPU 负载&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;人脸识别管理&lt;/strong&gt;：本地人脸库管理，SQLite 存储 5000+ 人脸特征，库内验证命中率 &lt;strong&gt;&amp;gt; 98%&lt;/strong&gt;；编写 GPIO 子系统驱动门禁继电器，识别通过到开门 &lt;strong&gt;&amp;lt; 1s&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="核心模块与接口设计"&gt;&lt;a href="#%e6%a0%b8%e5%bf%83%e6%a8%a1%e5%9d%97%e4%b8%8e%e6%8e%a5%e5%8f%a3%e8%ae%be%e8%ae%a1" class="header-anchor"&gt;&lt;/a&gt;核心模块与接口设计&#13;&#10;&lt;/h2&gt;&lt;h3 id="多媒体链路模块"&gt;&lt;a href="#%e5%a4%9a%e5%aa%92%e4%bd%93%e9%93%be%e8%b7%af%e6%a8%a1%e5%9d%97" class="header-anchor"&gt;&lt;/a&gt;多媒体链路模块&#13;&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;模块&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;接口&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;职责&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;stream_loader&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;FFmpeg &lt;code&gt;avformat_open_input / av_read_frame&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4 路 RTSP 拉流接入&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;mpp_decoder&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Rockchip MPP 硬解接口&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;H.264 → NV12，1080p@30fps&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;rga_func&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;imresize / imcvtcolor&lt;/code&gt;（零拷贝 DMA）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;缩放与色彩空间转换&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;mpp_encoder&lt;/code&gt; + &lt;code&gt;streaming_manager&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;H.264 编码 + RTMP 封装推流&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;远程实时查看&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;detection_fusion_manager&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;多模型结果融合&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;检测/识别结果汇总&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="三级级联推理rknn-c-api"&gt;&lt;a href="#%e4%b8%89%e7%ba%a7%e7%ba%a7%e8%81%94%e6%8e%a8%e7%90%86rknn-c-api" class="header-anchor"&gt;&lt;/a&gt;三级级联推理（RKNN C API）&#13;&#10;&lt;/h3&gt;&lt;p&gt;人体 → 人脸 → 特征三级模型逐级过滤，只有命中上一级的候选才进入下一级，显著降低 NPU 平均负载：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;rknn_init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 加载 INT8 量化 .rknn 模型&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;rknn_inputs_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 送入 RGA 预处理后的帧&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;rknn_run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;rknn_outputs_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 检测框 / 人脸特征输出&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;级联&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;模型&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;输出&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;YOLO11（INT8）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;人体检测框&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RetinaFace（INT8）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;人脸框 + 关键点&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;FaceNet（INT8，敏感层混合量化）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;人脸特征向量&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="人脸比对接口"&gt;&lt;a href="#%e4%ba%ba%e8%84%b8%e6%af%94%e5%af%b9%e6%8e%a5%e5%8f%a3" class="header-anchor"&gt;&lt;/a&gt;人脸比对接口&#13;&#10;&lt;/h3&gt;&lt;p&gt;特征比对走 &lt;strong&gt;SQLite 特征库 + 余弦相似度&lt;/strong&gt;：&lt;code&gt;sqlite3_prepare / step&lt;/code&gt; 逐条读取库内 5000+ 人脸特征，与现场提取的特征做余弦相似度计算，超过阈值即判定命中——库内验证命中率 &amp;gt; 98%。命中后经 GPIO 子系统写寄存器拉起门禁继电器，识别通过到开门 &amp;lt; 1s。&lt;/p&gt;&#10;&lt;h3 id="线程与队列模型"&gt;&lt;a href="#%e7%ba%bf%e7%a8%8b%e4%b8%8e%e9%98%9f%e5%88%97%e6%a8%a1%e5%9e%8b" class="header-anchor"&gt;&lt;/a&gt;线程与队列模型&#13;&#10;&lt;/h3&gt;&lt;p&gt;解码、推理、推流三个环节以&lt;strong&gt;生产者-消费者队列&lt;/strong&gt;隔离：共享缓冲区 + 互斥锁/条件变量保证帧数据线程安全，单路阻塞不拖垮全局链路，端到端延迟 &amp;lt; 200ms，长时间运行无内存泄漏。&lt;/p&gt;&#10;&lt;h2 id="项目状态"&gt;&lt;a href="#%e9%a1%b9%e7%9b%ae%e7%8a%b6%e6%80%81" class="header-anchor"&gt;&lt;/a&gt;项目状态&#13;&#10;&lt;/h2&gt;&lt;p&gt;系统已完成集成与闭环联调，各项指标（识别耗时、端到端延迟、命中率、开门时延）均达标。&lt;/p&gt;&#10;</description></item><item><title>冷阴极 X 射线源球壳钛合金焊缝检测装置（下位机）</title><link>https://zeseanblog.top/projects/xray-motion-control/</link><pubDate>Tue, 01 Sep 2026 22:30:00 +0800</pubDate><guid>https://zeseanblog.top/projects/xray-motion-control/</guid><description>&lt;h2 id="项目概述"&gt;&lt;a href="#%e9%a1%b9%e7%9b%ae%e6%a6%82%e8%bf%b0" class="header-anchor"&gt;&lt;/a&gt;项目概述&#13;&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;国家重点研发项目&lt;/strong&gt;子课题：冷阴极 X 射线源球壳钛合金焊缝检测装置的运动控制系统（下位机部分）。&lt;/p&gt;&#10;&lt;p&gt;装置通过 X 射线源与平板探测器沿弧形轨道协同扫查，对球壳钛合金焊缝成像检测。下位机负责对 X 射线源、探测器的&lt;strong&gt;协同控制与远程控制&lt;/strong&gt;：配合 QT 上位机调整射线源与探测器的速度与动作，完成单段焊缝、截面焊缝两种检测模式，并实时上报系统状态。&lt;/p&gt;&#10;&lt;h2 id="系统组成"&gt;&lt;a href="#%e7%b3%bb%e7%bb%9f%e7%bb%84%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;系统组成&#13;&#10;&lt;/h2&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TB&#10; PC["QT 上位机"] &lt;--&gt;|"RS485 自定义协议帧&lt;br/&gt;UART 中断+DMA · 字节状态机 · 环形缓冲"| MCU["STM32F429 下位机&lt;br/&gt;FreeRTOS 多任务"]&#10; MCU --&gt;|"Modbus RTU + CRC16"| SERVO["禾川伺服电机驱动器"]&#10; SERVO --&gt; AXIS["弧形轨道多电机协同"]&#10; AXIS --&gt; DEV["X 射线源 + 平板探测器"]&lt;/pre&gt;&lt;p&gt;&lt;img alt="检测装置整机：弧形轨道与伺服驱动系统" class="gallery-image" data-flex-basis="179px" data-flex-grow="74" height="1706" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/projects/xray-motion-control/images/device-overview.jpg" srcset="https://zeseanblog.top/projects/xray-motion-control/images/device-overview_hu_53f8fa1bc98513c9.jpg 800w, https://zeseanblog.top/projects/xray-motion-control/images/device-overview.jpg 1279w" width="1279"&gt;&lt;/p&gt;&#10;&lt;p&gt;整机实拍：左侧为提升立柱与弧形齿轮轨道，右侧为探测器载滑车，地面为多路禾川伺服驱动器与供电线缆。&lt;/p&gt;&#10;&lt;h2 id="软件分层与模块"&gt;&lt;a href="#%e8%bd%af%e4%bb%b6%e5%88%86%e5%b1%82%e4%b8%8e%e6%a8%a1%e5%9d%97" class="header-anchor"&gt;&lt;/a&gt;软件分层与模块&#13;&#10;&lt;/h2&gt;&lt;p&gt;软件分为两层：&lt;strong&gt;APP 应用层&lt;/strong&gt;承载对外协议、运动语义与任务调度；&lt;strong&gt;驱动层&lt;/strong&gt;提供寄存器级能力（Modbus 协议模板与 CRC、电机寄存器配置序列、OLED/菜单/按键、FLASH 参数存储）。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;模块&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;职责&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;app_conf.h&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;全部可调参数集中管理：协议常量、超时、限幅、软限位、任务栈与优先级、RS485 开关&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;host_proto.h/.c&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;RS485/USART6 二进制协议栈&lt;/strong&gt;：TX DMA + 环形缓冲 + 组包 CRC；RX IDLE+DMA + 环形缓冲 + 字节状态机解析；命令分发回调；心跳时间戳；收发统计&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;motion_api.h/.c&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;统一运动控制接口&lt;/strong&gt;：轴状态机（IDLE/READY/MOVING/FAULT）、方向（速度符号）/速度（±3000 限幅）/动作时序（松闸稳定→运动→清速减速→抱闸）、编码器事务三重校验、软限位、安全关断收敛入口、故障复位&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;dev_task.h/.c&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;四大逻辑任务&lt;/strong&gt;：motionTask（动作执行+ACK）、statusTask（50ms 状态轮询+100ms 状态帧）、monitorTask（心跳超时/故障沿上报/IWDG 喂狗点）、装配函数 &lt;code&gt;APP_TasksInit()&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="软件架构"&gt;&lt;a href="#%e8%bd%af%e4%bb%b6%e6%9e%b6%e6%9e%84" class="header-anchor"&gt;&lt;/a&gt;软件架构&#13;&#10;&lt;/h2&gt;&lt;h3 id="数据流下行指令--上行状态"&gt;&lt;a href="#%e6%95%b0%e6%8d%ae%e6%b5%81%e4%b8%8b%e8%a1%8c%e6%8c%87%e4%bb%a4--%e4%b8%8a%e8%a1%8c%e7%8a%b6%e6%80%81" class="header-anchor"&gt;&lt;/a&gt;数据流（下行指令 → 上行状态）&#13;&#10;&lt;/h3&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TB&#10; PC["上位机"] --&gt;|"A5 5A 协议帧"| RX["USART6 RX&lt;br/&gt;IDLE 中断 + DMA 批量入环形缓冲"]&#10; RX --&gt; PARSE["parseTask（AboveNormal）&lt;br/&gt;7 态字节状态机 + CRC16 查表校验"]&#10; PARSE --&gt;|"CRC 通过"| Q["motionQueue&lt;br/&gt;8 深消息队列削峰"]&#10; Q --&gt; MOTION["motionTask（High）&lt;br/&gt;动作时序执行 + ACK 上行"]&#10; MOTION --&gt;|"轴级互斥锁串行化"| MB["UART4/5 RS485&lt;br/&gt;Modbus RTU"]&#10; MB --&gt; DRIVE["禾川伺服驱动器&lt;br/&gt;速度环 + 电流环硬件闭环"]&#10; DRIVE --&gt; AXIS["弧形轨道双轴电机"]&#10;&#10; STATUS["statusTask（Normal · 50ms）&lt;br/&gt;编码器轮询 + 软限位检查"] --&gt; MB&#10; STATUS --&gt;|"100ms 状态帧 0x82&lt;br/&gt;TX 环形缓冲 + DMA"| PC&#10; MON["monitorTask（Normal · 100ms）&lt;br/&gt;心跳超时 / 故障沿 / IWDG"] --&gt;|"SafeShutdown + 0x8F 上报"| MOTION&lt;/pre&gt;&lt;h3 id="任务划分"&gt;&lt;a href="#%e4%bb%bb%e5%8a%a1%e5%88%92%e5%88%86" class="header-anchor"&gt;&lt;/a&gt;任务划分&#13;&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;任务&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;CMSIS 优先级&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;栈&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;阻塞点&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;职责&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;parseTask&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AboveNormal&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2KB&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;线程标志（50ms 超时）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;协议解析（状态机+CRC）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;motionTask&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;High&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2KB&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;消息队列（100ms 超时）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;动作执行 + 定时动作截止判定&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;statusTask&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Normal&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2KB&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;osDelay(50)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;编码器轮询 + 状态反馈&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;monitorTask&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Normal&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.5KB&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;osDelay(100)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;心跳超时/故障沿/安全关断触发&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;oledShowMenuTask&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Low&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;512B&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;事件标志&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;菜单显示（按键扫描定时器 10ms）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;defaultTask&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Normal&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;512B&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;osDelay(1000)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;LED 心跳&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;两个关键的执行体设计：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;协议解析与动作执行分离&lt;/strong&gt;：解析出指令后经 8 深消息队列投递给 motionTask 按序执行，队列削峰保证解析节奏不受动作耗时拖累；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;编码器轮询放在任务而非软件定时器中&lt;/strong&gt;：定时器回调与任务可能并发访问同一 Modbus 通道，统一到任务上下文并配合轴级互斥锁后，「请求-应答」事务被彻底串行化。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="任务优先级设计依据"&gt;&lt;a href="#%e4%bb%bb%e5%8a%a1%e4%bc%98%e5%85%88%e7%ba%a7%e8%ae%be%e8%ae%a1%e4%be%9d%e6%8d%ae" class="header-anchor"&gt;&lt;/a&gt;任务优先级设计依据&#13;&#10;&lt;/h3&gt;&lt;p&gt;优先级不是按“功能重要性”排的，而是按三条工程准则：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;截止期与后果&lt;/strong&gt;：动作执行（清速/抱闸/安全关断）有硬时序且后果不可逆 → 最高应用优先级；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;阻塞特性&lt;/strong&gt;：事件驱动型任务平时全部阻塞在同步原语上，高优先级只影响唤醒延迟，不产生 CPU 争抢；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;依赖方向&lt;/strong&gt;：数据流上游不能被下游长时间阻塞（parse 喂 motion 的队列；status 的编码器数据被 motion 的轴锁依赖）。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;完整优先级谱系（NVIC 中断优先级与任务优先级是两套量纲，勿混）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NVIC 中断 (任何 ISR 可抢占任何任务)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ UART4/5/6/8 抢占优先级=5（恰好等于 FreeRTOS 可调用 API 的阈值，&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ISR 内允许 FromISR API；只做批量入环形缓冲 + flagsSet，µs 级）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;任务 (FreeRTOS 原生优先级，抢占式 + 同级时间片轮转)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 38 High motionTask ← 安全动作的执行权最高&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 31 AboveNormal parseTask ← 必须高于周期型任务，否则状态轮询可推迟命令解析&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 23 Normal statusTask / monitorTask / defaultTask&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 8 Low oledShowMenuTask（人机界面，空闲余量处理）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 2 Timer Service（按键扫描定时器，CubeMX 默认值）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ 0 Idle&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;几个关键取舍：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;为什么 motion(38) &amp;gt; parse(31)&lt;/strong&gt;：命令队列已削峰（8 深），解析晚 1–2ms 不影响正确性；反之若 parse 更高，解析长帧期间到达的停止/安全命令会被推迟执行——&lt;strong&gt;安全动作的执行权高于协议的解析权&lt;/strong&gt;。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;status/monitor 同级 Normal&lt;/strong&gt;：两者都是周期型软实时（50ms/100ms），判定窗口（软限位/心跳 500ms）远大于调度延迟；它们持锁时间短（单次 Modbus 事务约 6ms），motion 高优先级被轴锁阻塞时由&lt;strong&gt;互斥量优先级继承&lt;/strong&gt;临时提升持锁任务，消除优先级反转。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;关中断快照 vs 互斥量&lt;/strong&gt;：跨任务读轴状态用 &lt;code&gt;__disable_irq()&lt;/code&gt; 短临界区（µs 级、无反转风险）；锁只用于&lt;strong&gt;必须串行化的 Modbus 事务&lt;/strong&gt;（同一 UART 的请求-应答配对）。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;一个已知限制&lt;/strong&gt;：定时器守护任务优先级为 CubeMX 默认值 2，低于所有应用任务——当前成立的条件是所有任务都有周期阻塞点，定时器总能在间隙运行；若未来把安全逻辑放进软件定时器（如限位去抖），必须提高该优先级。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Realtime(47) 刻意留空&lt;/strong&gt;：为硬实时扩展预留（5–20ms 节拍的位置环、限位 EXTI 的紧急处理链）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="轴状态机"&gt;&lt;a href="#%e8%bd%b4%e7%8a%b6%e6%80%81%e6%9c%ba" class="header-anchor"&gt;&lt;/a&gt;轴状态机&#13;&#10;&lt;/h3&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;stateDiagram-v2&#10; [*] --&gt; IDLE&#10; IDLE --&gt; READY: InitAll（伺服参数+原点捕获+松闸）&#10; READY --&gt; MOVING: SetSpeed / MoveTimed&#10; MOVING --&gt; READY: Stop（清速→等减速→抱闸）&#10; READY --&gt; FAULT: Safe_Shutdown（异常保护）&#10; MOVING --&gt; FAULT: Safe_Shutdown&#10; FAULT --&gt; READY: FaultReset（重初始化+重捕获原点+松闸）&lt;/pre&gt;&lt;p&gt;任何异常都收敛到&lt;strong&gt;单一安全关断入口&lt;/strong&gt; &lt;code&gt;MOTION_SafeShutdown()&lt;/code&gt;：清速 → 等 150ms（驱动器 100ms 减速斜坡完成，避免高速抱闸冲击）→ 断抱闸继电器 → 锁定 FAULT + 故障码 → monitorTask 沿检测上报。恢复必须显式故障复位指令。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="下位机主控板：STM32F429 + 多路 RS485（RJ45 座）与继电器输出" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="1279" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/projects/xray-motion-control/images/control-board.jpg" srcset="https://zeseanblog.top/projects/xray-motion-control/images/control-board_hu_6a4d8b99c70223cc.jpg 800w, https://zeseanblog.top/projects/xray-motion-control/images/control-board_hu_957865d0400ddf81.jpg 1600w, https://zeseanblog.top/projects/xray-motion-control/images/control-board.jpg 1706w" width="1706"&gt;&lt;/p&gt;&#10;&lt;h2 id="上位机帧协议"&gt;&lt;a href="#%e4%b8%8a%e4%bd%8d%e6%9c%ba%e5%b8%a7%e5%8d%8f%e8%ae%ae" class="header-anchor"&gt;&lt;/a&gt;上位机帧协议&#13;&#10;&lt;/h2&gt;&lt;h3 id="帧格式"&gt;&lt;a href="#%e5%b8%a7%e6%a0%bc%e5%bc%8f" class="header-anchor"&gt;&lt;/a&gt;帧格式&#13;&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌──────┬──────┬─────┬──────┬─────────────┬─────────────┬──────────────┐&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 0xA5 │ 0x5A │ SEQ │ LEN │ CMD │ DATA[LEN] │ CRC16_LO/HI │&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└──────┴──────┴─────┴──────┴─────────────┴─────────────┴──────────────┘&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 帧头1 帧头2 序号 载荷长 命令字 0~64B 小端 查表 CRC16，低字节先&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;双帧头 A5 5A&lt;/strong&gt;：误同步率 1/65536；A5/5A 位翻转丰富，示波器上可辨；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;SEQ 序号&lt;/strong&gt;：下行主机自增（ACK 回显 → 去重/丢帧检测），上行设备独立自增；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;LEN 显式变长&lt;/strong&gt;：状态机据此收数，天然支持命令扩展；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;CRC16 覆盖 SEQ..DATA&lt;/strong&gt;（不含帧头与自身），算法与 Modbus 完全一致（同一张查表），全协议栈一套 CRC；&lt;/li&gt;&#10;&lt;li&gt;帧开销 7 字节；载荷中可能出现假帧头，由 CRC 兜底丢弃（更高可靠场景可选 COBS 变长编码）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="命令集"&gt;&lt;a href="#%e5%91%bd%e4%bb%a4%e9%9b%86" class="header-anchor"&gt;&lt;/a&gt;命令集&#13;&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;CMD&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;方向&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;载荷&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;语义&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0x01&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;下行&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;轴号 + 开关&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;抱闸控制&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0x02&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;下行&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;轴号 + rpm(int16)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;速度指令（符号=方向，±3000 限幅）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0x03&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;下行&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;轴号 + rpm + 时长(100ms 单位)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;定时动作（动作时序演示）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0x04&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;下行&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;轴号（0xFF=全轴）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;停止&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0x05&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;下行&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;seq 回显&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;心跳（200ms 周期，不回 ACK）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0x06&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;下行&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;轴号（0xFF=全部）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;故障复位&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0x07&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;下行&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;无&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;立即请求状态帧（回 0x82）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0x81&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;上行&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;回显命令/序号 + status&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;命令应答（OK/BUSY/REJECT/BAD_ARG）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0x82&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;上行&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;状态字×2 + 双轴速度 + 故障码&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;周期状态帧（100ms）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0x8F&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;上行&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;故障码 + 轴号 + 保留&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;故障上报（故障沿触发一次）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="实例帧crc-实算可直接用于联调"&gt;&lt;a href="#%e5%ae%9e%e4%be%8b%e5%b8%a7crc-%e5%ae%9e%e7%ae%97%e5%8f%af%e7%9b%b4%e6%8e%a5%e7%94%a8%e4%ba%8e%e8%81%94%e8%b0%83" class="header-anchor"&gt;&lt;/a&gt;实例帧（CRC 实算，可直接用于联调）&#13;&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;帧&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;字节&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;轴1 速度 -500rpm&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;A5 5A 01 03 02 01 FE 0C 55 D7&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;轴2 800rpm 转 3.0s&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;A5 5A 02 04 03 02 20 03 1E FD CE&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;心跳&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;A5 5A 03 01 05 5A D2 CB&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;状态帧（READY/MOVING，sp1=1500，fault=0x0001）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;A5 5A 10 08 82 01 02 DC 05 00 00 01 00 97 A8&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;故障帧（驱动器无应答，轴1）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;A5 5A 11 05 8F 02 00 01 00 00 E2 F4&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="解析鲁棒性7-态状态机--三重防护"&gt;&lt;a href="#%e8%a7%a3%e6%9e%90%e9%b2%81%e6%a3%92%e6%80%a77-%e6%80%81%e7%8a%b6%e6%80%81%e6%9c%ba--%e4%b8%89%e9%87%8d%e9%98%b2%e6%8a%a4" class="header-anchor"&gt;&lt;/a&gt;解析鲁棒性（7 态状态机 + 三重防护）&#13;&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;LEN &amp;gt; 64&lt;/strong&gt; → 丢弃回找头（防超长帧打爆缓冲）；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;帧内字节间隔 &amp;gt; 50ms&lt;/strong&gt; → 强制回找头（防半帧卡死）；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;CRC 失败&lt;/strong&gt; → 丢当前帧回找头（假同步自愈）；RX 环满 → 丢最新并计数上报统计。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;接收链路硬件侧使用 UART 中断 + DMA 不定长接收，以 IDLE 总线空闲事件判帧：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;__HAL_UART_ENABLE_IT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;huart6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;UART_IT_IDLE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/* 帧长 = 接收缓冲区大小 - __HAL_DMA_GET_COUNTER(&amp;amp;hdma_usart6_rx) */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;ISR 只做批量搬移入环形缓冲（SPSC 免锁）+ 置线程标志，解析全部在 parseTask 完成——ISR 保持极短是实时性的关键：若在中断里做逐字节处理甚至打印，9600 波特率下一帧即可阻塞几十 ms。&lt;/p&gt;&#10;&lt;h2 id="统一运动控制-api"&gt;&lt;a href="#%e7%bb%9f%e4%b8%80%e8%bf%90%e5%8a%a8%e6%8e%a7%e5%88%b6-api" class="header-anchor"&gt;&lt;/a&gt;统一运动控制 API&#13;&#10;&lt;/h2&gt;&lt;p&gt;对上层屏蔽多电机与 Modbus 细节，全部运动能力收敛为一组 &lt;code&gt;MOTION_*&lt;/code&gt; 接口：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;API&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;语义&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;MOTION_InitAll()&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;伺服参数写入 + 原点捕获 + 松闸（任务上下文）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;MOTION_SetSpeed(ax, rpm)&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;方向=符号；自动先松闸再设速&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;MOTION_MoveTimed(ax, rpm, dur)&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;速度 + 截止期（定时动作）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;MOTION_Stop(ax)&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;清速 → 150ms 减速等待 → 抱闸&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;MOTION_Brake(ax, open)&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;手动抱闸（运动中拒绝）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;MOTION_Tick()&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;定时动作到期判定（100ms 粒度）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;MOTION_PollFeedback()&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;双轴编码器轮询 + 无应答计数 + 软限位&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;MOTION_GetSnapshot(ax, &amp;amp;s)&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;状态/速度/位置/故障原子快照&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;MOTION_SafeShutdown(ax, fault)&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;安全关断唯一入口&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;MOTION_FaultReset(ax)&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;FAULT → READY：重初始化 + 重捕获原点 + 松闸&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;底层由一组寄存器级驱动接口支撑：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;Motor_Init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MOTOR1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 初始化：Modbus 链路建立 + 驱动器寄存器配置&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;openMotor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MOTOR1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 电机使能&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;speed_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MOTOR1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 速度模式设定：负速度转补码写入，±3000rpm 软件限幅&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;closeMotor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MOTOR1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 去使能（配合抱闸继电器安全停机）&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="modbus-rtu-驱动器接口"&gt;&lt;a href="#modbus-rtu-%e9%a9%b1%e5%8a%a8%e5%99%a8%e6%8e%a5%e5%8f%a3" class="header-anchor"&gt;&lt;/a&gt;Modbus RTU 驱动器接口&#13;&#10;&lt;/h2&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;功能码&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;用途&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0x03&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;读保持寄存器（状态/速度回收）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0x06&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;写单寄存器（速度设定等）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0x10&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;写多寄存器（批量参数下发）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;帧结构：&lt;code&gt;地址(1B) + 功能码(1B) + 数据(NB) + CRC16(2B，低字节在前)&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;CRC16 参数：多项式 &lt;strong&gt;0x8005&lt;/strong&gt;（反射 0xA001）、初值 &lt;strong&gt;0xFFFF&lt;/strong&gt;，实现查表法与逐位法两种等价算法——上位机协议栈的 CRC 直接复用同一张表&lt;/li&gt;&#10;&lt;li&gt;实例帧：&lt;code&gt;01 06 03 03 05 DC&lt;/code&gt; → CRC = &lt;code&gt;7B 47&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;错误应答识别：功能码 + 0x80&lt;/li&gt;&#10;&lt;li&gt;编码器读事务做&lt;strong&gt;功能码 + 长度 + CRC 三重校验&lt;/strong&gt;，连续无应答即触发单轴安全关断&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="异常保护体系"&gt;&lt;a href="#%e5%bc%82%e5%b8%b8%e4%bf%9d%e6%8a%a4%e4%bd%93%e7%b3%bb" class="header-anchor"&gt;&lt;/a&gt;异常保护体系&#13;&#10;&lt;/h2&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;保护&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;触发条件&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;动作&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;心跳丢失&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;500ms 无任何合法帧（首帧后生效）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;全轴 SafeShutdown + 0x8F 上报&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;驱动器失联&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;连续 3 次编码器读无应答/校验失败&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;单轴 SafeShutdown&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;软限位&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;位置超出 ±170°（可配）且运动中&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;单轴 SafeShutdown&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;硬限位&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;EXTI 接口预留（硬件常闭开关已具备）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;后续接入 SafeShutdown 链&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CRC 错帧&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;校验失败&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;丢帧 + 收发统计&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IWDG&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;喂狗点已置于 monitorTask（启用为编译开关）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;复位兜底&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;抱闸 failsafe&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;硬件特性：断电即抱死&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;物理兜底&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="关于伺服三环控制的工程结论"&gt;&lt;a href="#%e5%85%b3%e4%ba%8e%e4%bc%ba%e6%9c%8d%e4%b8%89%e7%8e%af%e6%8e%a7%e5%88%b6%e7%9a%84%e5%b7%a5%e7%a8%8b%e7%bb%93%e8%ae%ba" class="header-anchor"&gt;&lt;/a&gt;关于伺服三环控制的工程结论&#13;&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;电流环/速度环/位置环要不要在 MCU 里做？——不需要，这是伺服系统的标准级联结构&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;位置环（软件，按曲线节拍）→ 速度环（驱动器硬件闭环）→ 电流环（驱动器硬件闭环，µs 级带宽）；&lt;/li&gt;&#10;&lt;li&gt;若强行在 MCU 做三环：RS485 半双工往返 + RTOS 任务抖动，内环带宽根本撑不起来，反而劣化性能；&lt;/li&gt;&#10;&lt;li&gt;本项目 MCU 只做&lt;strong&gt;位置外环&lt;/strong&gt;：协议与运动接口预留位置指令扩展，速度/电流环交给禾川驱动器。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;轨迹跟踪业务层的实现方案：双电机按 FLASH 中的 1000 点位置/速度曲线做 S 曲线协同跟踪——位置 PID + 速度前馈 + 双电机交叉耦合补偿，位置环输出直接写驱动器速度寄存器；上位机经 LoRa 链路完成曲线分块下传（块号 ACK 隐含重传）、误差曲线回读、前馈/耦合系数在线整定与点动控制；限位开关走 EXTI 硬件链路。&lt;/p&gt;&#10;&lt;h2 id="已知限制与后续项"&gt;&lt;a href="#%e5%b7%b2%e7%9f%a5%e9%99%90%e5%88%b6%e4%b8%8e%e5%90%8e%e7%bb%ad%e9%a1%b9" class="header-anchor"&gt;&lt;/a&gt;已知限制与后续项&#13;&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;驱动器应答等待仍为固定 5ms 盲等，改进方向是信号量 + 超时；&lt;/li&gt;&#10;&lt;li&gt;IWDG 未启用（喂狗点与启用步骤已就位，编译开关打开即用）；&lt;/li&gt;&#10;&lt;li&gt;硬限位 EXTI 尚未接入软件保护链（常闭开关硬件与 EXTI 驱动已具备，接入方案：ISR 直接抱闸 + 通知任务走 SafeShutdown）；&lt;/li&gt;&#10;&lt;li&gt;USART6 波特率 9600，协议帧建议提升到 115200；&lt;/li&gt;&#10;&lt;li&gt;printf 复用上位机串口，正式版应以编译开关关闭或改用独立调试口；&lt;/li&gt;&#10;&lt;li&gt;位置闭环当前为速度模式的接口预留，轨迹跟踪按上文 S 曲线方案扩展。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="项目状态"&gt;&lt;a href="#%e9%a1%b9%e7%9b%ae%e7%8a%b6%e6%80%81" class="header-anchor"&gt;&lt;/a&gt;项目状态&#13;&#10;&lt;/h2&gt;&lt;p&gt;下位机软件已完成「RS485 协议栈 + 统一运动接口 + 四大逻辑任务 + 多级异常保护」的完整架构实现；驱动层经整机联调实测，Modbus 通信、双轴运动控制、上位机链路稳定工作，支撑完成单段焊缝与截面焊缝检测流程。&lt;/p&gt;&#10;</description></item></channel></rss>