If you bought the cheap magnetomter module like HMC5883L you can not use it without calibration. Measurement of magnetic field will be subjected to distortion. There are two categories of these distortions: the hard iron distortions and the soft iron distortions. The hard iron errors refer to the presence of magnetic fields around the sensor (magnets, power supply wires) and are related to measurement offset errors, while the soft iron errors refer to the presence of ferromagnetic materials around the sensor, which skew the density of the Earth's magnetic field locally and are related to scaling offset errors. You can read more information about these distortions here.
In other words, to get the correct magnetometer data you should get the calibrated magnetometer data. One of the ways to resolve this problem: you should apply the bias to the vector of the non calibrated magnetometer data (X, Y, Z coordinates) and then multiply the transformation matrix by this resulting vector:
In this case the magnetometer calibration is the process of getting the transformation matrix and the bias. To get these data you can use the MagMaster program.
You can download MagMaster here.
Example of using the MagMaster
Hardware:
- HMC5883L magnetometer module (GY-273 version, picture 2)
- Arduino Mega 2560 (chinese SaintSmart Mega 2560 version, picture 3)
Software:
- MagMaster (placed in MagMaster folder)
- MagViewer (placed in MagMaster folder)
Firmware:
- Arduino Sketch (placed in MagMaster folder)
Connect the magnetometer module to the arduino board via I2C bus (picture 4). Upload the arduino sketch to the arduino board (see "Arduino_Code" folder in the "MagMaster" folder). This arduino sketch requires the HMC5883L library, copy the folder "HMC5883L" (placed in "Arduino_Code" folder) to the folder "C:\Program Files\Arduino\libraries".
Then run the MagViewer.exe, select the serial port of the arduino board (the boud rate of the seraial port should be 9600 bps) and click "Run MagViewer". Now you can see the coordinates of the magnetometer data vector in 3D space on a real time (picture 5, video 1, 2). These data are not calibrated yet.
Video 1
Video 2
If you see the points of the magnetometer vector coordinates in 3D space the arduino board and the PC connection works right.
Now close the MagViewer window and run the MagMaster.exe (picture 6). Select the serial port of the arduino board. The green strings X, Y, Z will indicates the coordinates of the magnetometer vector.
Place the magnetometer module as shown on the picture 8.1 and click "Point 0" button of the "Axis X+" groupbox. For the placement of the module you can use the wooden bar or the paper box (picture 7). If you can not connect your magnetometer device to PC then you can use any other way to get to know the magnetometer data. You can enter these data in the program manually.
Place the magnetometer as shown on the picture 8.2 and click "Point 180" button of the "Axis X+" groupbox and so on. You should do in the following way:
- Picture 8.1: "Point 0", "Axis X+"
- Picture 8.2: "Point 180", "Axis X+"
- Picture 8.3: "Point 0", "Axis X-"
- Picture 8.4: "Point 180", "Axis X-"
- Picture 8.5: "Point 0", "Axis Y+"
- Picture 8.6: "Point 180", "Axis Y+"
- Picture 8.7: "Point 0", "Axis Y-"
- Picture 8.8: "Point 180", "Axis Y-"
- Picture 8.9: "Point 0", "Axis Z+"
- Picture 8.10: "Point 180", "Axis Z+"
- Picture 8.11: "Point 0", "Axis Z-"
- Picture 8.12: "Point 180", "Axis Z-"
You should fill the table. After that click "Calculate Transformation Matrix and Bias" and get the required matrix and bias (picture 9).
The transformation matrix and the bias are got. Now you can calculate the calibrated magnetometer data in your device on a real time with using the matrix and the bias as shown on picture 1. The example of the arduino sketch of using this calculation you can find in the "Arduino_Test_Results" folder.
You can apply the sphere radius stabilization algorithm to your program (use for it the Arduino_Radius_Stabilization folder placed in MagMaster folder).
The calibrated magnetometer vector coordinates in 3D space with the radius stabilization shown on the picture 10 and video 3, 4.
Video 3
Video 4
Using of the arduino is only example, you can easy adopt the arduino code for any other system and use the MagMaster program with it.
Comments
Hello, Akhil Mohan!
Yuor results seems not right. I repeat my old comment for you:
I think you have a problem with the magnetometer device orientation during the calibration process. There is screenshot of my calibration results:
In my location the magnetic field is directed at the 70 grad angle to the earth plane:
So, in my case, if I place the magntometer with Z axis directed to the sky I will get the negative value of the Z coorinate of the magnetometer vector (number 3 on the picture above). If the Z axis of magnetometer is directed to the earth I will the positive value of Z coordinate (number 6). These rules are the same for X and Y axis (numbers 1,2,4,5 on the picture).
Hello Yuri,
I am using MPU9250 and I am trying to calibrate using MagMaster. What I have understood from pic 8 is, align the MPU9250 say in first case, +X up and measurements at 0 degree and 180degree and then -X and so on. Am I correct ? I have attached the result in that way and please check whether I am in the correct path.
And here's another question: If I'm using a magnetometer that has positive Y to the right of the X axis instead of to the left as used by the Honeywell chip, what changes would I need to make?
Hi Yury,
I've got a challenge for you. I'm trying to calibrate a 3-axis magnetometer that's in the presence of a magnetic field that's distorted by muShield. I need to use this material to lessen the effects of transient magnetic fields being generated by some large motors. Without the shield and with the motors unpowered, the output of the magnetometers is fairly spherical. When I install the shield the output becomes distorted into the familiar ellipsoid shape. The problem is that the axis are no longer orthogonal so it's a step beyond a pure soft-iron case. So, my question to you is: does your algorithm solve this problem?
Ali Shan,
I do not understand what you want from me. Math of MagViewer or MagMaster? MagViewer are programmed without any math. For writing MagMaster algorithm I used this article http://muzhig.ru/magnetometer-calibration-hmc5883l-imu/ (this is the theory). This is russian language post, but I think you can translate it to english by google translate. About the practical part, here https://github.com/YuriMat/MagMasterSource/archive/master.zip I shared the MagMaster source code, function of the transformation matrix and bias finding called calculate_transformation_matrix(). This is Visual Studio 2010 C# project.
Yury Matselenak, very nice work. I just want to know the Math/calculations behind the Mag Viewer. Actually, I want to rotate my device at some specific angle with the help of magnetometer. How can I do this? Thank you.
I used Yuri's brilliant work again to calibrate for use in ArduIMU. I like it, thanks.
Yury,
I have a problem after using your calibration transformation matrix.Here,the ninth in picture 8,when calibrated to get Xc and Yc,then calulating the yaw using Yaw=atan(Yc/Xc)*180/pi,but the result is not 0° or 90°,In fact,we placed it at the deriction of north,can you help me out?
Dear Yury;
I have an HMC5983 GY-282 connected to Arduino projected for an autohelm.
Serial monitor from IDE is delivering data, Magviewer is showing 3d position dots.
MagMaster however doesnot connect and signals "no serial data"".
Can you please give any hint or suggestion to overcome this
kind regards
martin
MagMaster download doesn't download all needed files, No way I can use it.
Harry