19 """Collect magnetometer readings at multiple orientations"""
20 print(
"Magnetometer Calibration")
22 print(
"Rotate sensor through multiple orientations")
23 print(
"Aim for at least 12 different orientations covering all axes")
29 reference_field = np.array([1.0, 0.0, 0.0])
32 print(f
"Collecting {num_positions} orientations...")
34 for i
in range(num_positions):
35 input(f
"Rotate sensor to orientation {i+1}/{num_positions} and press Enter...")
38 print(
"Collecting readings (3 seconds)...")
44 raw = np.array([0.0, 0.0, 0.0])
49 avg_reading = np.mean(readings, axis=0)
57 raw_value=avg_reading,
62 calibrator.add_calibration_point(point)
64 print(f
" Collected orientation {i+1}: {avg_reading}")
70 parser = argparse.ArgumentParser(description=
"Magnetometer Calibration")
71 parser.add_argument(
"--sensor-id", default=
"imu_0")
72 parser.add_argument(
"--output", default=
"mag_calibration.json")
76 help=
"Interactive mode (collect orientations)",
82 default=[1.0, 0.0, 0.0],
83 help=
"Reference magnetic field vector",
86 args = parser.parse_args()
92 calibrator.reference_field_magnitude = np.linalg.norm(args.reference_field)
93 print(
"Add calibration points programmatically or use --interactive")
98 params = calibrator.calibrate()
99 print(
"\nCalibration Results:")
100 print(f
" Bias (Hard Iron): {params.bias}")
101 print(f
" Scale Matrix (Soft Iron):\n{params.scale_matrix}")
102 print(f
" Quality: {params.calibration_quality:.3f}")
105 calibrator.save_calibration(args.output)
106 print(f
"\nSaved calibration to {args.output}")
107 except Exception
as e:
108 print(f
"Calibration failed: {e}")