diff --git a/README.md b/README.md index cfbc31e..11bb40a 100644 --- a/README.md +++ b/README.md @@ -193,7 +193,6 @@ The system automatically records tracking data from the **active player** (the o **Data recording**: - Starts automatically when experiment starts - Stops automatically when experiment stops -- Only records from the active player (not the guesser) - Exports as CSV with group ID and timestamp in filename ## Unity Project Details diff --git a/experiment-scripts/app.py b/experiment-scripts/app.py index c252748..2f771cf 100644 --- a/experiment-scripts/app.py +++ b/experiment-scripts/app.py @@ -80,8 +80,8 @@ async def tracking_listener(): source_ip = addr[0] actual_data = message - # Only record data from the active player - if source_ip == tracking_state["active_player_ip"]: + # Record data from both players + if source_ip in [tracking_state["player1_ip"], tracking_state["player2_ip"]]: parsed = parse_tracking_data(actual_data) if parsed: @@ -89,10 +89,24 @@ async def tracking_listener(): # Calculate time elapsed since experiment start elapsed_time = time.time() - tracking_state["experiment_start_time"] + # Determine player_ID and role + if source_ip == tracking_state["player1_ip"]: + player_id = "player1" + else: + player_id = "player2" + + # Determine role: active_player_ip is the mimicker + if source_ip == tracking_state["active_player_ip"]: + role = "mimicker" + else: + role = "guesser" + # Add sample with metadata sample = { "timestamp": time.time(), "elapsed_time": elapsed_time, + "player_id": player_id, + "role": role, "current_word": current_word_state["word"], "word_time_remaining": 0.0, "data": parsed @@ -188,7 +202,9 @@ class VRConfig(BaseModel): class TrackingStart(BaseModel): group_id: str condition: str - active_player_ip: str + player1_ip: str + player2_ip: str + active_player_ip: str # The player who mimics (mimicker) # Global state for current word display current_word_state = { @@ -203,7 +219,9 @@ tracking_state = { "is_recording": False, "group_id": "", "condition": "", - "active_player_ip": "", + "player1_ip": "", + "player2_ip": "", + "active_player_ip": "", # The mimicker "experiment_start_time": None, "samples": [] # List of tracking data samples } @@ -369,18 +387,22 @@ def send_vr_config(config: VRConfig): @app.post("/tracking/start") def start_tracking(config: TrackingStart): """ - Start recording tracking data from the active player. + Start recording tracking data from both players. """ import time tracking_state["is_recording"] = True tracking_state["group_id"] = config.group_id tracking_state["condition"] = config.condition + tracking_state["player1_ip"] = config.player1_ip + tracking_state["player2_ip"] = config.player2_ip tracking_state["active_player_ip"] = config.active_player_ip tracking_state["experiment_start_time"] = time.time() tracking_state["samples"] = [] - print(f"Started tracking: group={config.group_id}, condition={config.condition}, player={config.active_player_ip}") + print(f"Started tracking: group={config.group_id}, condition={config.condition}") + print(f" Player1: {config.player1_ip}, Player2: {config.player2_ip}") + print(f" Mimicker: {config.active_player_ip}") return { "status": "ok", "message": "Tracking started" } @app.post("/tracking/stop") @@ -421,7 +443,7 @@ def download_tracking_csv(): # Write header header = [ - "timestamp", "elapsed_time", "group_id", "condition", "current_word", "word_time_remaining", + "timestamp", "elapsed_time", "player_id", "role", "group_id", "condition", "current_word", "word_time_remaining", "center_eye_pos_x", "center_eye_pos_y", "center_eye_pos_z", "center_eye_rot_w", "center_eye_rot_x", "center_eye_rot_y", "center_eye_rot_z", "left_hand_pos_x", "left_hand_pos_y", "left_hand_pos_z", @@ -437,6 +459,8 @@ def download_tracking_csv(): row = [ str(sample["timestamp"]), f"{sample['elapsed_time']:.4f}", + sample["player_id"], + sample["role"], tracking_state["group_id"], tracking_state["condition"], sample["current_word"],