Files
Handcontrol_LYT_Version_Win…/data_logger.py
2026-07-16 15:24:40 +08:00

85 lines
3.1 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import csv
import time
import os
import numpy as np
class DataLogger:
def __init__(self, filename_prefix="dataset"):
"""
初始化日志记录器
:param filename_prefix: 文件名前缀,例如 "train_batch"
"""
# 1. 自动创建 data 文件夹,保持项目目录整洁
if not os.path.exists('data'):
os.makedirs('data')
print("[Logger] Created 'data' directory.")
# 2. 生成带时间戳的文件名,防止覆盖旧数据
# 格式: data/dataset_20240105_143022.csv
timestamp = time.strftime("%Y%m%d_%H%M%S")
self.filename = f"data/{filename_prefix}_{timestamp}.csv"
# 3. 定义标准表头 (Header) - 对应你的12个力 + 3个构型 + 3个标签
# 传感器命名规则: F(手指ID)_U(单元ID)_(Fn/Ft)
sensor_headers = []
for f in range(3): # 3个手指
for u in range(1, 3): # 2个单元
sensor_headers.append(f"F{f}_U{u}_Fn")
sensor_headers.append(f"F{f}_U{u}_Ft")
# 完整的列名列表
self.header = ['Timestamp', 'Config_ID'] + sensor_headers + ['Label_X', 'Label_Y', 'Label_Theta']
# 4. 创建文件并写入第一行(表头)
try:
with open(self.filename, mode='w', newline='') as f:
writer = csv.writer(f)
writer.writerow(self.header)
print(f"[Logger] Log file initialized: {self.filename}")
except Exception as e:
print(f"[Logger] Error creating file: {e}")
def log(self, sensor_data, config_id, label_vector):
"""
写入一行数据
:param sensor_data: 12维 numpy 数组或列表 (触觉数据)
:param config_id: 整数 (0, 1, 2) (当前手指构型)
:param label_vector: [x, y, theta] (机械臂的真实偏差值)
"""
with open(self.filename, mode='a', newline='') as f:
writer = csv.writer(f)
# 拼接数据: 时间 + ID + 传感器数值 + 标签
# time.time() 获取当前精确时间戳
row = [f"{time.time():.3f}", int(config_id)] + list(sensor_data) + list(label_vector)
# 格式化: 将浮点数保留4位小数节省空间且美观
formatted_row = []
for item in row:
if isinstance(item, float):
formatted_row.append(f"{item:.4f}")
else:
formatted_row.append(item)
writer.writerow(formatted_row)
# === 单元测试 (Unit Test) ===
# 直接运行此文件,测试是否能生成 CSV
if __name__ == "__main__":
print("Testing DataLogger...")
logger = DataLogger(filename_prefix="test_data")
# 模拟写入 5 条假数据
for i in range(5):
# 模拟 12 个传感器数据 (0-10之间)
fake_sensor = np.random.rand(12) * 10
# 模拟机械臂偏差 (Label)
fake_label = [0.0, 5.5, -2.0]
logger.log(sensor_data=fake_sensor, config_id=0, label_vector=fake_label)
print(f"Logged row {i + 1}")
time.sleep(0.1)
print("Test done. Please check the 'data' folder.")