← 首页 CoreFusion · SERVO-18 CONSOLE

18 路舵机控制模拟台 18-Servo Live Control Console · 面部 15 路 + 颈部 3 路 → 实时 3D

模拟:命令经与真机同式的限速/映射,未接真串口与真舵机
加载 3D 头模中…
本仓库不随附 3D 头模(models/avatar.glb 需自行放置,见 models/README.md);three.js(MIT,vendor/ 本地副本)随包收录,无需联网。
颈姿态(实际)
PITCH +0.0°
YAW +0.0°
ROLL +0.0°

情绪预设(7 情绪,同后端 emotionPresets)/ Emotion presets

🎭 扩展状态(10 个微妙/复合状态 · EXTENDED_PRESETS 后端真值)

权重以后端 emotion_mix.EXTENDED_PRESETS 为真值(单测锁定:AU 全在可落舵机集/权重∈(0,1]/ 与基础 7 情绪键不冲突且 AU 向量 L1 距离>0.3),页面镜像已入 check_alignment 期望清单; 走同一 applyEmotionAU 管线(ASD 包络×强度×耦合×限速)。困倦(sleepy)的眼睑闭合走下方"清醒度" 生理轴,不写进 AU 预设;疑惑(confused)的单侧挑眉硬件无法做(AU 通道均为双侧联动),以组合近似。

强度 Intensity 100%
清醒度 Arousal 100%

· 清醒度=生理轴(公式/系数同 arousal_physiology.py,check_alignment 锁定; 打盹间隔已抬升为确定性调度,可复现):眼睑基线叠加 (1−清醒度)×0.55 闭合量(经限速); 眨眼间隔均值 = 4.0s(gen_blink_schedule 锁定值)×(0.4+0.6×清醒度)×心境眨眼间隔缩放(见下方心境层) ——低清醒更频繁(眨眼速度受同一 250°/s 限速,未另行放慢,如实注明);呼吸幅度 ×(1.6−0.6×清醒度)、周期 ×(1+0.5×(1−清醒度)); 颈俯仰微垂 −(1−清醒度)×4°(同呼吸层叠加实际角,不动目标值);清醒度<20% 时 8–15s 确定性间隔 "打盹点头"(缓降 8° 再猛回,next_doze_interval 同式)。急停/hold 时全部静止。

· 预设切换经 ASD 包络:attack 0.3s 淡入 → sustain=hold(同 duration≤0 语义,不自行衰减)→ 切换新情绪时旧情绪按 decay 0.6s 释放,交叉淡出(时间常数同 emotion_envelope.envelope_gain 默认,已锁定)。
· 点选任一面部通道行,可在示波器看到包络斜坡(目标虚线)与 250°/s 限速斜坡(实际实线)叠加; 示波器右上可切换轨迹 profile(rate_limit 现状 / trapezoid 梯形 / scurve 限 jerk,同 trajectory_shaping, 已锁定),并叠画三种 profile 对同一目标的响应对比细线——任意 profile 恒守 |Δpos|≤0.5°/tick 限速不变量, 急停/hold 时轨迹状态(vel/acc)清零;加速度/加加速度上限为演示层工程值(未接真硬件)。
· 强度拖动即时重算,不重触发包络;手动拖滑杆即接管并取消包络。
· 面部 AU 落舵机前经耦合约束层(顶栏 ⚙ 可关):协同联动+拮抗互锁两轮定点迭代,同 expression_coupling.coordinate(表已锁定);被耦合修正的通道行出现 ⚙ 角标,悬停看原值→现值。 口型通道与复合情绪并存 AU 豁免拮抗(同 C++ 引擎豁免规则);眨眼为事件通道,旁路耦合(同后端旁路 EMA 语义)。

心境层 Mood · PAD 三时标(同 mood_dynamics,已锁定)/ Mood layer

人格 Persona

秒级情绪事件经 leaky integrator(τ=60s)积成分钟级心境(PAD 三轴),叠加人格基线偏置后输出 5 项表情调制系数(常量/公式同 mood_dynamics,已入 check_alignment 锁定):intensity_gain 乘入预设强度 (触发预设/拖强度那一刻采样,非逐帧重算)、 arousal_baseline 可接管上方清醒度滑杆(默认手动不接管;拖杆/剧本渐变即回退手动)、呼吸幅度/眨眼间隔/扫视频率 三项缩放实际接入拟真微动层。数据流:L0 为基础 7 情绪或扩展十态时按滑杆强度持续驱动 step_mood (扩展态 PAD 表 EXTENDED_EMOTION_PAD 已落地并锁定——proud 推高愉悦/掌控、bored 压低唤醒等, 负价扩展态的强度增益极性分支随之正确),其余时刻每帧 decay_only 纯衰减; 复合/自定义情绪仍无 PAD 向量,按 neutral 衰减(如实注明)。 诚实边界:人格档与 τ 均为演示层参数(非实测标定),条形图显示的是"瞬时心境+人格偏置"的有效心境。

复合情绪(两情绪加权混合,同 emotion_mix)/ Compound emotion

A B 0.60/0.40

复合情绪 = 各预设 AU×权重线性叠加后逐 AU 钳位 0..1,与 emotion_mix.mix_from_pairs / blend_emotions 同式;spec 解析同 parse_emotion_spec (未知情绪贡献为空、坏权重按 1 容错);标签形式同认知侧 emotion_fusion 复合标签。 结果经同一 ASD 包络/强度/限速管线落舵机。预置复合按钮的权重为演示层自定(已注明), PRESETS 真值不动。

行为模式(FSM 行为,同 interaction_expression 等真值)/ Behaviors

就绪。倾听=间歇点头(间隔 1.8s·单次 0.5s·幅 0.4,同 backchannel/interaction_expression,已锁定) +关注眉 AU1 0.12,点头起始亮"嗯~"(真机同时发一声轻"嗯",此处仅指示);思考=抬眉 AU1 0.30/AU2 0.20+眼上看 −0.45+眼神游移(眼动走 3D 眼骨,id15/16 不在台面);说话=交给下方口型演示+嘴角微扬 AU12 0.20(下颌占位摆动由真 viseme 调度取代);附和=单次点头;告别=1.6s 鞠躬+挥手(同 farewell_gesture,已锁定;挥手为占位通道,不在 18 路台面, 仅显示数值)。演示层约定:点头/鞠躬方向按本页"+ 为抬头"取负;倾听/思考 10s 自动停止;急停或点新行为即中断。

对话驱动状态迁移(迟滞状态机,同 dialogue_affect)/ Dialogue affect

置信度
0.00/2.00
当前 neutral · 无候选
就绪:输入或点快捷句,文本经 extract_events → step_affect。

文本 → extract_events 关键词命中 → step_affect 迟滞状态机(常量已锁定):同态强化刷新强度并清空 异候选;异候选先衰减、归零才另立;候选置信度累积 ≥1.0 且当前状态驻留满 2.0s 才迁移(置信上限 2.0,防锁死); 无事件按 0.2/s 衰减,30s 无事件回落 neutral。迁移发生时自动触发同名情绪预设/扩展状态(走既有 L0 包络×强度×耦合×限速通道,强度取事件表目标强度)。橙线=触发阈值 1.0。诚实边界:关键词启发式为演示层词面规则 (不处理否定/反讽/指代),线上由 LLM 情感标注替代/融合本结果。

自然度层 · 去恐怖谷(不对称/变异/反应延迟,同 naturalness)/ Naturalness

seed=1
不对称:关(左右增益恒 (1.0000, 1.0000),现状零改变)
反应延迟:关(点预设瞬时触发)
序号=0
表情变体:关(点情绪预设/扩展状态恒用标准表,现状零改变)

反"机械完美"三件套,同 bionic_expression/reference/naturalness.py(FNV-1a 确定性哈希,JS 同式镜像, 自然度 3 枚金标已入 selfCheck):①完美左右对称→asymmetry_pair 左右微差增益对(±8%,和恒为 2 只重分配); ②机械精确重复→vary_keyframes 关键帧时刻 ±6%/幅度 ±4% 确定性变异(上表对照,换种子换一版、同种子可复现); ③零反应延迟→reaction_delay 类人 120–350ms。接入现状(如实):反应延迟与包络变异已接入 C++ 表情引擎 (natural_react / natural_vary 参数,默认关=行为逐位一致;kNatural 三值经 check_alignment 与 C++ 逐值锁定; 变异另已接入臂侧手势 vary_keyframes+clamp_pose,单测锁定,上表对照仅前后演示、不接本页管线); 左右不对称则因 20 路 MVP 每 AU 双侧联动、无左右独立硬件通道,仅在渲染层演示——增益乘在 AU→ARKit 左右 blendshape 扇出点,眨眼事件通道除外(wink 单眼硬件不可做,同上方微表情注明),硬件前提归 30 DOF 形态。 诚实边界:阈值为演示层工程值(非动捕统计标定);只建模强度不对称,未建模真人常见的时序不对称 (单侧先启动,留后续);反应延迟只作用于手动点击情绪预设/扩展状态(对话状态机/剧本通道未接, 防双重延迟),急停立即清除 pending 延迟。

表情变体="永不重复"在表情维度的对应物(真人同一情绪每次表情略有不同,归自然度主题),同 bionic_expression/reference/expression_variants.py:6 基础情绪 + 10 扩展状态 × 标准/含蓄/强化 三档 AU 表(standard 逐值=PRESETS/EXTENDED_PRESETS,单一真值不漂移), VARIANT_WEIGHTS=(0.5, 0.3, 0.2) 分档 u<0.5 标准 / u<0.8 含蓄 / 其余强化,u=hash01('variant', 情绪, 自增序号) 确定性可复现; 开启后点情绪预设/扩展状态按变体档触发,走同一 applyEmotionAU 包络×强度×耦合×限速通道 (强度滑杆语义不变),变体金标已入 selfCheck(含扩展态 1 枚)。neutral 无变体;复合/自定义/对话/剧本 通道不经此入口,不受影响。诚实边界:变体表为演示层设计值(FACS 文献口径的工程化取值,非动捕统计); C++ 引擎 natural_variant 参数已同表接入(默认关=行为逐位一致)。

双目视觉(预设场景模拟,同 stereo_vision)/ Stereo vision

dist=— m · disparity=—px · vergence=—° ·(z=f·B/d 同式)
就绪:点场景按钮播放(targetAt 线性插值轨迹 · eventsBetween (t0,t1] 逐帧派发)。

双目几何/事件反应/场景同 bionic_perception/stereo_vision.py(JS 同式镜像,3 枚金标已入 selfCheck): 视差 d=f·B/z(基线 B=58mm 拟人瞳距,f=640px 内参示例)、注视会聚角 2·atan(B/2/z)、左右眼投影 x=W/2+f·tan(bearing)∓d/2——左右图中目标 x 恰差一个视差,近大远小+视差随距离变化=双目深度感; 事件反应强度按距离调制 ×clamp(1.2/z, 0.6, 1.5) 后钳 [0,1]。事件触发走既有情绪通道(基础态 applyEmotion / 扩展态 EXT_PRESETS,同一包络×强度×耦合×限速;尊重急停/hold 门禁;直连不经自然度反应延迟,防双重延迟, 同对话状态机/剧本口径)。注视联动为演示层映射(已注明):眼球偏航激活=bearing/30 钳 [-1,1](驱动 3D 眼骨, id15/16 不在台面)、颈 NECK_YAW 目标小幅跟随 bearing×0.6°(经既有限速管线)。darkness 事件期间画面调暗。 场景播完自动停,播放中点新场景即抢占;急停停止播放并清画面。 诚实边界:无真双目硬件,场景为脚本化预设——事件字符串+距离/方位就是与后续视觉模型(VLM/检测器)的 接口契约,模型接入后输出同一格式即无缝替换;内参/基线为演示层设计值(打样后标定);注视映射系数为演示层。

微表情(L1 快事件,叠加在当前情绪上)/ Micro-expressions

自发微表情:等待空闲…

短时序经 L1 层 ASD 快包络(攻/释 ≤0.12/0.2s)叠加在当前情绪上,可连点(同 AU 取大), 被急停/切换行为打断。叹气=单次大幅呼吸(NECK_PITCH 实际角叠加 ~1.6° 半正弦)+AU15/AU17。 事件库/包络/空闲调度已真值化:同 reference/micro_expressions.py(check_alignment 锁定), 并已接 C++ 表情引擎 natural_micro 参数(默认关=行为逐位一致)。**自发微表情**:拟真微动 开关开启且空闲(无活跃情绪/不说话)时,按确定性泊松间隔(均值 9s/下限 3s)从空闲池 自动触发——同引擎调度公式(FNV 序号驱动,可复现)。 诚实边界:wink 单眼眨无法模拟——AU_BLINK 为单通道双眼联动(真机同款约束); 叹气呼吸叠加为页面演示层(引擎只接 AU 分量)。

🧬 分层混合 L0-L3(实时堆叠图 · 仲裁同 arbiter 参考实现)
堆叠条=各层对通道的归一化激活贡献(仅正向显示;颈俯仰取绝对值): 基座=滑杆手动 / L0 情绪(含复合与包络)/ L1 行为微表情 / L2 口型 / L3 眨眼 / idle 呼吸。 仲裁增益与状态机同 arbiter.py 参考实现(说话>情绪>空闲;idle 快出 0.12s/慢入 1.2s,情绪保持 0.5s,已锁定): 情绪或说话活跃时 idle 层(呼吸/眼神游走)按增益淡出,回到安静后缓慢淡入。mute 为演示工具,只影响本页合成。

颈部动作(预置轨迹,经限速播放)/ Neck moves

安全控制 · 0xC3 控制帧(急停/hold 语义同固件,模拟)/ Safety

说话口型演示(viseme 15 键同后端 visemeMap)/ Talk demo

台词「你好,我是堆芯聚变,很高兴见到你。」——其拼音序列经后端 viseme.build_plan 时序规则 离线预排(0.12s/帧 · 标点停顿 0.18s · 断流 0.4s 老化清零,常量已锁定);播放时嘴部 5 通道 (AU17/20/23/25/26)按帧调度(到期生效、末帧胜出,同 VisemeScheduler),走同一 250°/s 限速管线并同步 3D,不改写滑杆目标值;急停或再次点击可中断。诚实边界:真机口型由 TTS 音素时间戳实时驱动,此处为预排时间表演示。

动作录制 / 回放(用户目标值时间线)/ Record & replay

未录制。录的是用户目标值变化(时间戳+通道+值);回放经同一限速管线成形;导出/导入用下方文本框复制粘贴,无下载。
🎨 自定义情绪(逐 AU 微调 · 演示层,localStorage)
起点
名称
从 7 预设任选起点 → 逐 AU 权重(0-1)微调 → 预览走同一包络/强度/耦合/限速管线 → 命名保存(仅存浏览器 localStorage,演示层)。保存后按钮出现在上方预设区(点 × 删除)。 导出/导入用文本框复制粘贴,无下载;导入兼容 {AU:权重} 字典与 emotion_mix spec 字符串(格式见占位提示)。 诚实边界:自定义权重未经真机验证,PRESETS 真值不动,自定义仅存在演示层,需经真机标定验证。
🎬 情绪剧本(状态序列时间轴 · 数据与派发口径已锁定)
预置
就绪:选预置剧本点"载入",或直接编辑下方 JSON 后播放。

剧本 = [{t 秒, action:{type:'emotion'|'behavior'|'micro'|'talk'|'neck'|'arousal'|'doze',…}}] 时间轴,播放时按 t 依次派发到既有管线:emotion(name=预设/扩展/spec 字符串,或 au 字典 + 可选 intensity)经包络×强度×耦合;behavior/micro 走 L1;talk 走 viseme 调度;neck 触发预置轨迹; arousal{to,over} 渐变清醒度;doze 触发一次打盹点头。JSON 可改可复制(无下载)。 预置时间轴数据、条目清洗排序与游标派发口径同 emotion_script.py(check_alignment 锁定); 动作执行落在页面既有管线,属演示层联调。急停或任何面板手动操作即打断,进度见上方状态行。

📡 遥测 0x5A / 配置帧 0xB7(模拟)
0x5A v2 遥测帧(9 metric,1Hz):last_seq/急停计数(计入 error_count)/渲染帧间隔 (作 comm_latency_ms)取自页面运行态,温度/电池为缓变模拟量,frame_gap_count 恒 0(本模拟器数据流 不丢帧)——遥测值为模拟器状态,非真硬件。
—(展开后 1Hz 刷新)
🩺 遥测健康分析(滑窗趋势/堵转/疲劳/评分,同 telemetry_health)
综合评分
—(展开后随 1Hz 遥测流刷新)

评分=100 逐项扣分(WARN −15 / CRIT −40 / 温度趋势上行>0.2℃/s −10 / 疲劳按维护阈值占比 ≤−30), 评级 ≥85 A / ≥70 B / ≥50 C / 其余 D;堵转=残差>5° 且电流≥0.48A(0.6A×80%)且持续>0.5s 三条同判; 疲劳权重 2^((T−40)/10)(温度每高 10℃ 磨损 ×2)——常量/公式同 telemetry_health,已入 check_alignment 锁定。 诚实边界:全部阈值/权重为演示层工程估计(未接真硬件标定);数据取自本页模拟遥测流(1Hz 滑窗 10s); servo_current_a 不在 0x5A 帧 9 项内,为驱动侧采样口径的演示合成量;"注入"按钮为演示层异常注入,非真故障。

· 眼球 2 路(id15 AU_EYE_YAW / id16 AU_EYE_PITCH)不在本台面,由注视子系统驱动。
· 标定为示例值(servo_calibration.yaml 同源),实物打样后逐通道实测替换。
· 3D 仅表现正向激活(a<0 的反向行程在 blendshape 端截为 0),颈部三路按角度直转头部节点。
· 急停/恢复为 0xC3 控制帧全语义模拟(同 firmware/servo_controller.c):急停冻结位姿、忽略指令;
  恢复后进入 hold,直到第一个新数据帧(拖滑杆/垫/点预设)才恢复跟随。未接真硬件。
· 拟真微动(顶部开关,默认开):呼吸=NECK_PITCH 的渲染/下发实际角上叠加 ~0.6°、4s 正弦+微噪, 不动目标值,急停/hold 时静止;
  自动眨眼=blink_saccade 同参数(间隔指数分布均值 4s/下限 1.5s/双连眨 12%,已锁定)事件式驱动 AU_BLINK,走同一 250°/s 限速管线——85° 行程闭合约 0.34s,接近真实眨眼 0.3–0.4s (仅默认 rate_limit 轨迹下成立;切 trapezoid/scurve 后更平缓、行程更慢。 真机事件通道按 0.06/0.12s 闭/睁曲线更快,如实注明);
  眼神微游走=saccade 主序(VMAX/A0/PEAK_FACTOR 同后端,已锁定)+微扫视抖动,驱动头模 LeftEye/RightEye 骨骼——眼球属 id15/16 注视子系统,不在 18 路台面,此处仅 3D 演示层 (facecap 回退源无眼骨则自动跳过)。

下发帧预览 · 协议 v2 数据帧(SOF=0xA5,CRC16-CCITT)/ Frame preview

限速示波器 · 目标=虚线 实际=实线 · 近 5s

轨迹

状态 / Status

限速 250°/s · max_step=0.50°/tick@500Hz
seq 0 · 运动中 0/18 路 · 渲染 fps
链路 数据流 · 轨迹 rate_limit