370 parser = argparse.ArgumentParser(description="IMU Calibration System")
372 "--sensor-type", choices=["accel", "gyro", "mag"], required=True
374 parser.add_argument("--sensor-id", default="imu_0")
375 parser.add_argument("--data-file", help="CSV file with calibration data")
376 parser.add_argument("--output", help="Output calibration file")
378 args = parser.parse_args()
381 calib_system = IMUCalibrationSystem()
383 if args.sensor_type == "accel":
384 calibrator = calib_system.create_calibrator(
385 SensorType.ACCELEROMETER, args.sensor_id
387 elif args.sensor_type == "gyro":
388 calibrator = calib_system.create_calibrator(
389 SensorType.GYROSCOPE, args.sensor_id
392 calibrator = calib_system.create_calibrator(
393 SensorType.MAGNETOMETER, args.sensor_id
396 # Load data from CSV or use interactive mode
399 # Format: raw_x, raw_y, raw_z, ref_x, ref_y, ref_z, temperature
400 with open(args.data_file, "r") as f:
401 reader = csv.reader(f)
403 raw = np.array([float(row[0]), float(row[1]), float(row[2])])
404 ref = np.array([float(row[3]), float(row[4]), float(row[5])])
405 temp = float(row[6]) if len(row) > 6 else 25.0
407 point = CalibrationPoint(
411 timestamp=time.time(),
413 calibrator.add_calibration_point(point)
415 print("Interactive calibration mode")
416 print("Enter calibration points (or 'done' to finish):")
417 # Interactive input would go here
419 # Perform calibration
421 params = calibrator.calibrate()
422 print(f"Calibration successful!")
423 print(f" Bias: {params.bias}")
424 print(f" Quality: {params.calibration_quality:.3f}")
427 calibrator.save_calibration(args.output)
428 except Exception as e:
429 print(f"Calibration failed: {e}")