added recording for both players
This commit is contained in:
@ -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
|
||||||
|
|||||||
@ -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"],
|
||||||
|
|||||||
Reference in New Issue
Block a user