| Algorithm 1 Multimodal Affective-to-Symbolic Control (Closed Loop) |
| Inputs: Physio P_t = {HRV_RMSSD, EDA_phasic, EDA_tonic, EEG_alpha_asym, EyeFix} Behavior B_t = {head/hand kinematics, locomotion (approach–avoidance), object/avatar interactions, (prosody: F0, rate, pauses) [optional]} Parameters: θ_vagal, θ_arousal # safety thresholds f_s = 5–10 Hz # control-loop frequency w_phys, w_beh # fusion weights (safety-first priority) Initialize: scene_params ← neutral_safe_scene avatar_params ← neutral_presence while session_active: # 1) Acquisition & preprocessing (edge) P̂_t ← preprocess(P_t) # filtering, artifact removal, z-scoring B̂_t ← preprocess(B_t) # smoothing, normalization # 2) Affect proxies (physio & behavior) p_affect ← g_phys(P̂_t) # e.g., vagal withdrawal (HRV), arousal (EDA), avoidance (EyeFix) b_affect ← g_beh(B̂_t) # e.g., approach–avoidance, freezing, interaction tempo # 3) Safety-first multimodal fusion affect* ← fuse(p_affect, b_affect; weights = {w_phys, w_beh}, safety_priority = True) # 4) Symbolic/environmental mapping scene_params ← map_env(affect*) # LightIntensity, SpaceDensity, Soundscape, TransitionalObjects # 5) Relational/Avatar adaptation avatar_params ← map_avatar(affect*) # Proximity, Gaze, Turn-taking/Prosody # 6) Render & log render(scene_params, avatar_params) log(t, P̂_t, B̂_t, p_affect, b_affect, affect*, scene_params, avatar_params) # 7) Safety override if (p_affect.arousal > θ_arousal) or (b_affect.avoidance_high) or user_panic_exit(): scene_params ← neutral_safe_scene avatar_params ← calming_distance render(scene_params, avatar_params) continue end while |