轨道风机 · 叶片舞蹈 · 计划文档 V1(待确认)

5 段舞蹈 · 双自由度 · 网页 3D + 真机指令

按你 10 条回答定稿;确认后开始编程

一、已确认的 10 条需求

#项定稿
1跑在哪网站 3D 演示 + 真实样机
2谁在跳全部 15 滑车 / 30 叶片
3自由度叶面角 ±360° + 叶轴角 ±45°
4段数5 段
5配乐配,音乐与时长我定(100 BPM)
6播放自动连播 + 手动点选
7安全约束保留(真机风速 <0.1 m/s 才允许 DANCE)
8动作来源先写死 5 段预设(编舞编辑器二期)
9交付网页 + 下位机 danc 指令集
10性能手机 ≥30 fps,用简模

二、5 段舞蹈动作表

记号:i = 叶片序号 0–29,t = 段内时间(s),az = 叶面角,el = 叶轴角。全部为**开环正弦/线性**,下位机可分帧插值。

段名称时长az 函数el 函数视觉
1波浪24 s25°·sin(2πt/8 − i·24°)0°沿轨道传播的波峰
2开花20 s0→90→0°(梯形,5s/5s/10s)45°·sin(πt/10)整体展开后收拢
3交叉24 s(i 偶 ? +) 45°·sin(2πt/12)±30° 交替奇偶反向摆动
4旋涡30 si·12° + 60°·t/3020°·sin(2πt/15)相位沿圆周旋转
5收尾18 s依次归零,每片延迟 0.3 s45°→0 缓落逐个回到顺风位
合计116 s100 BPM | 1 拍 = 0.6 s | 段落切换对齐到 4 拍

角度边界(硬约束)

所有函数输出必须经钳位:az ∈ [−360, 360]、el ∈ [−45, 45]。超界直接截断并记一条告警,不允许"软着陆"到别的段。

三、网页端结构

模块内容
场景Three.js 简模:轨道圆环(Φ3 m)+ 15 滑车(盒)+ 30 叶片(1.01×0.54 平面)
驱动单个 requestAnimationFrame 循环,按 dance(t) 求 (az, el) 赋给实例矩阵
控制条▶ 播放/暂停 | 1–5 段按钮 | 进度条(可拖动)| 当前段名 + 时间码
HUDFPS 计数 | 角度读数(选一片)| "演示模式" 徽标
音频<audio> 可选加载;无音频/静音时按时间轴照常跳
性能实例化渲染(InstancedMesh);叶片用 2 面片;不开阴影;目标手机 ≥30 fps

四、下位机指令协议(扩展)

在现有 danc 指令上扩展为「舞蹈号 + 起始相位 + 时长」,帧内 3 个参数字节:

字节含义取值
0帧头0xAA
1长度固定 9
2命令0x35 DANCE
3序号0–255
4舞蹈号1–5
5起始相位0–29(叶片序号偏移)
6–7段时长u16,单位 0.1 s
8CRC8前 8 字节
下位机执行:收到 DANCE 后启动一个 10 ms 定时器,按「舞蹈表」算 (az, el) 目标值 → 走现有脉冲映射表 → 输出到 T0/T1。任一叶片算出的角度越界即整段中止并回 SAFE 位置。

五、安全约束(保留)

约束真机网页
进入 DANCE 前提风速 < 0.1 m/s 且主轴停转不检查(显示"演示模式")
角度越界钳位 + 告警 + 中止钳位
通信超时200 ms 无帧 → 全部回 SAFE不适用
急停硬件急停优先,立即断使能空格键暂停

六、验收标准

#项判据
15 段可独立播放点第 N 段立刻从该段 0 秒开始
2自动连播1→5 自动衔接,段间无黑屏
3手机帧率iPhone/安卓微信内置浏览器 ≥30 fps
4角度范围全程 az∈[−360,360]、el∈[−45,45],无越界告警
5真机联锁风速 ≥0.1 m/s 时拒绝进 DANCE
6可恢复任一段中止后能回 SAFE 位

七、交付物