ethanylhuang/tvc-characterization
GitHub: ethanylhuang/tvc-characterization
一套推力矢量控制与 IMU 的特性表征平台,通过 Teensy 固件和 Web 界面实现舵机自动调校、闭环自动配平及六项物理安装参数测量。
Stars: 0 | Forks: 0
# TVC 特性表征
推力矢量控制(TVC)与 IMU 设备的组合安装在单个 Teensy 4.1 上。一条串行链路
(115200 波特率)同时传输舵机指令和 IMU 姿态数据流,
由一个极简的 Web 界面驱动。
## 布局
固件(PlatformIO)位于根目录;Web 应用是位于 `web/` 目录下的 React + Vite 项目。
```
platformio.ini Teensy 4.1 build config
src/main.cpp firmware: 2 servos (pitch=5, yaw=6) + ISM330DHCX IMU
data/ tables.json + characterization CSVs (created at runtime)
web/
package.json React + Vite project
vite.config.js dev/preview server config
plugins/tables-api.js Vite middleware: GET/POST /api/tables, POST /api/save (CSV)
index.html Vite entry
src/
main.jsx React entry
App.jsx layout + wiring
styles.css
lib/ framework-agnostic logic
constants.js constants + built-in default tables
serial.js Web Serial connect/disconnect/send + line events
orientation.js IMU angle store, tracking mode, sample events
tables.js lookup tables, gimbal-command math, persistence
measure.js shared measurement primitives (settle, projection, capture)
autotune.js automated lookup-table characterization
characterize.js the six mount-characterization tests
csv.js CSV formatting + save-to-data/
hooks/ useSerial / useTableRanges / useOrientationDisplay
components/ ConnectionBar, ServoPanel, AutoTune, ImuPanel, Characterize, Stage, NumberField
```
## 固件
```
pio run # compile
pio run -t upload # flash the Teensy
pio device monitor # view the serial stream
```
串口协议:
- `p \n` — 设置俯仰舵机脉冲宽度(微秒)
- `y \n` — 设置偏航舵机脉冲宽度(微秒)
- `r \n` — 设置串口流传输周期(5–1000 ms;默认为 50)。用于
特性表征测试以约 100 Hz 的频率捕获瞬态响应,随后恢复为 50。
- 持续发送 `ms angle deg X: .. Y: .. Z: ..`(融合互补滤波器数据)
- 以及 `ms accel deg X: .. Y: ..`(仅加速度计倾斜数据)。`ms ` 前缀
是固件的毫秒时间戳;旧版解析器会将其忽略。
## Web 界面
```
cd web
npm install # first time only
npm run dev # Vite dev server with HMR at http://127.0.0.1:8787
# npm run build # 生产 bundle 到 web/dist/
# npm run preview # 提供已构建的 bundle(相同的 table API)
```
Vite 提供了开发服务器和模块热重载;一个小型 Vite 插件
(`plugins/tables-api.js`)提供 `GET`/`POST /api/tables` 服务,以便在 `dev` 和
`preview` 模式下将调校好的参数表持久化保存到 `data/tables.json`。
在 Chrome 或 Edge(Web Serial)中打开该 URL,点击 **Connect**,然后选择 Teensy。
- **Gimbal command** — 输入每个轴的万向节*偏转角度(度)*。页面会
将俯仰/偏航查找表(指令 µs → 偏转角度)进行反向插值以
得到脉冲宽度,根据各轴的 **trim µs**(即 0° 中性脉冲,
俯仰默认为 1605 / 偏航默认为 1640)对其进行重新居中,并发送原始的 `p`/`y` 指令。
生成的 µs 值会显示在每个轴的旁边。**cmd µs** 会直接发送
原始脉冲宽度,绕过查找表(便于进行特性表征)。**Center both**
将两个轴归零。
- **IMU orientation** — 一个直立的灰色圆柱体显示了开发板的姿态
(拖动可旋转视图)。提供各轴 X/Y/Z 的读数;**Zero** 会将
当前读数捕获为新的参考基准。**Tracking** 用于切换角度数据源:
*Dynamic* 使用融合互补滤波器(响应灵敏,运动时表现良好);
*Static* 仅使用加速度计获取无漂移的稳态倾斜(最适合
特性表征测量)。航向角(Z)始终来自陀螺仪,
因为加速度计无法感知围绕重力的旋转。
内置的默认参数表位于 `web/src/lib/constants.js`(`DEFAULT_TABLES`)中。
启动时,应用会将任何已保存的 `data/tables.json` 叠加在其上,因此调校过的轴
会自动生效。
### 自动调校 (`web/src/lib/autotune.js`)
**Auto-tune pitch** 和 **Auto-tune yaw** 各自会运行一次自动化的特性表征
扫描。对于每个脉冲宽度,该程序会向舵机发送指令,等待一个固定的最短时间后,
自适应地等待角度稳定,然后对一段窗口内的
纯加速度计样本进行平均。它会向上和向下扫描整个范围,并对
匹配点取平均值以消除舵机回程间隙,将 X/Y 倾斜投影到其
主方向上(因此即使 IMU 与万向节平面没有完美对齐,
也能保持精度),将 0° 锚定在中心指令处,并调整
符号以匹配参数表约定。
结果会**立即应用并保存到 `data/tables.json`** — 无需
复制/粘贴,并且在重新加载后依然有效。(删除该文件即可回退到
内置默认值。)请先进行连接;无论 UI 开关状态如何,它都会读取加速度计数据。
### 特性表征 (`web/src/lib/characterize.js`)
**Characterization** 面板用于测量物理安装参数。选择一个轴,
运行任何测试;每次测试都会以**原始微秒**为单位(独立于查找表)扫描/步进舵机,
并将指令 µs 与 IMU 测量出的度数配对,然后通过 `POST /api/save` 将每次运行的
数据以 CSV 格式保存到 `data/`。所有测试都会将 X/Y 倾斜投影到万向节
所发现的主轴上,因此结果对 IMU 的安装偏斜具有鲁棒性。
- **Repeatability** — K 个设定点 × N 次试验,每次均从中心点接近;按设定点计算 σ/极差。
- **Hysteresis** — 分别记录升序和降序扫描;计算每个 µs 对应的上下行间隙。
- **Response time** — 高速率(`r 10`)捕获阶跃瞬态;计算上升/稳定/超调量。
- **Deadband** — 先测量本底噪声,再找出能产生 >3σ 移动的最小 µs 步进。
- **Max slew** — 以约 100 Hz 的频率进行双向全范围阶跃;得出最大角速率(度/秒)。
- **Cross-axis** — 扫描一个轴,同时保持另一个轴居中;测量对所保持轴的泄漏量。
通用的测量原语(稳定/平均、主轴投影、
本底噪声、高速率捕获、瞬态分析)位于 `web/src/lib/measure.js` 中,
可同时被自动调校和特性表征测试复用。
## 备注
- 引脚:俯仰 = 5,偏航 = 6;IMU 位于 Wire 总线上(SDA 18 / SCL 19)。
- IMU 轴到圆柱体模型的映射符号取决于安装方式;如果某个运动
读数反向,请翻转 `web/src/hooks/useOrientationDisplay.js` 中
模型变换的相应符号。
标签:IMU传感器, PlatformIO, React, Syscalls, Teensy, 嵌入式硬件, 推力矢量控制, 自动控制系统, 自定义脚本