added recording for both players

This commit is contained in:
2025-10-06 16:53:55 +02:00
parent 296a8f5d51
commit daf06564ba
2 changed files with 31 additions and 8 deletions

View File

@ -193,7 +193,6 @@ The system automatically records tracking data from the **active player** (the o
**Data recording**: **Data recording**:
- Starts automatically when experiment starts - Starts automatically when experiment starts
- Stops automatically when experiment stops - Stops automatically when experiment stops
- Only records from the active player (not the guesser)
- Exports as CSV with group ID and timestamp in filename - Exports as CSV with group ID and timestamp in filename
## Unity Project Details ## Unity Project Details

View File

@ -80,8 +80,8 @@ async def tracking_listener():
source_ip = addr[0] source_ip = addr[0]
actual_data = message actual_data = message
# Only record data from the active player # Record data from both players
if source_ip == tracking_state["active_player_ip"]: if source_ip in [tracking_state["player1_ip"], tracking_state["player2_ip"]]:
parsed = parse_tracking_data(actual_data) parsed = parse_tracking_data(actual_data)
if parsed: if parsed:
@ -89,10 +89,24 @@ async def tracking_listener():
# Calculate time elapsed since experiment start # Calculate time elapsed since experiment start
elapsed_time = time.time() - tracking_state["experiment_start_time"] 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 # Add sample with metadata
sample = { sample = {
"timestamp": time.time(), "timestamp": time.time(),
"elapsed_time": elapsed_time, "elapsed_time": elapsed_time,
"player_id": player_id,
"role": role,
"current_word": current_word_state["word"], "current_word": current_word_state["word"],
"word_time_remaining": 0.0, "word_time_remaining": 0.0,
"data": parsed "data": parsed
@ -188,7 +202,9 @@ class VRConfig(BaseModel):
class TrackingStart(BaseModel): class TrackingStart(BaseModel):
group_id: str group_id: str
condition: 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 # Global state for current word display
current_word_state = { current_word_state = {
@ -203,7 +219,9 @@ tracking_state = {
"is_recording": False, "is_recording": False,
"group_id": "", "group_id": "",
"condition": "", "condition": "",
"active_player_ip": "", "player1_ip": "",
"player2_ip": "",
"active_player_ip": "", # The mimicker
"experiment_start_time": None, "experiment_start_time": None,
"samples": [] # List of tracking data samples "samples": [] # List of tracking data samples
} }
@ -369,18 +387,22 @@ def send_vr_config(config: VRConfig):
@app.post("/tracking/start") @app.post("/tracking/start")
def start_tracking(config: TrackingStart): def start_tracking(config: TrackingStart):
""" """
Start recording tracking data from the active player. Start recording tracking data from both players.
""" """
import time import time
tracking_state["is_recording"] = True tracking_state["is_recording"] = True
tracking_state["group_id"] = config.group_id tracking_state["group_id"] = config.group_id
tracking_state["condition"] = config.condition 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["active_player_ip"] = config.active_player_ip
tracking_state["experiment_start_time"] = time.time() tracking_state["experiment_start_time"] = time.time()
tracking_state["samples"] = [] 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" } return { "status": "ok", "message": "Tracking started" }
@app.post("/tracking/stop") @app.post("/tracking/stop")
@ -421,7 +443,7 @@ def download_tracking_csv():
# Write header # Write header
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_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", "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", "left_hand_pos_x", "left_hand_pos_y", "left_hand_pos_z",
@ -437,6 +459,8 @@ def download_tracking_csv():
row = [ row = [
str(sample["timestamp"]), str(sample["timestamp"]),
f"{sample['elapsed_time']:.4f}", f"{sample['elapsed_time']:.4f}",
sample["player_id"],
sample["role"],
tracking_state["group_id"], tracking_state["group_id"],
tracking_state["condition"], tracking_state["condition"],
sample["current_word"], sample["current_word"],