Giter VIP home page Giter VIP logo

mpu-9250-ahrs's People

Contributors

jremington avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

mpu-9250-ahrs's Issues

Compile error min() required

Hi, I wanted to use your roll offset code. I started with calibration but I get a compilation error on stm32f411.

On the stm32duino forum I got this answer:


_min() required to compare two value of the same type. which is not the case here.

So simply cast them to fix the issue here:
https://github.com/jremington/MPU-9250-AHRS/blob/master/libs/I2Cdev.cpp#L276_

Error code:


C:\Users\backu\OneDrive\Dokumenty\Arduino\libraries\I2Cdev\I2Cdev.cpp: In static member function 'static int8_t I2Cdev::readBytes(uint8_t, uint8_t, uint8_t, uint8_t*, uint16_t)':
C:\Users\backu\OneDrive\Dokumenty\Arduino\libraries\I2Cdev\I2Cdev.cpp:276:75: error: no matching function for call to 'min(uint8_t&, int)'
  276 |             for (uint8_t k = 0; k < length; k += min(length, BUFFER_LENGTH)) {
      |                                                                           ^
In file included from c:\users\backu\appdata\local\arduino15\packages\stm32\tools\xpack-arm-none-eabi-gcc\9.2.1-1.1\arm-none-eabi\include\c++\9.2.1\algorithm:62,
                 from C:\Users\backu\AppData\Local\Arduino15\packages\STM32\hardware\stm32\1.9.0\cores\arduino/wiring_constants.h:26,
                 from C:\Users\backu\AppData\Local\Arduino15\packages\STM32\hardware\stm32\1.9.0\cores\arduino/wiring.h:34,
                 from C:\Users\backu\AppData\Local\Arduino15\packages\STM32\hardware\stm32\1.9.0\cores\arduino/Arduino.h:36,
                 from C:\Users\backu\OneDrive\Dokumenty\Arduino\libraries\I2Cdev\I2Cdev.h:74,
                 from C:\Users\backu\OneDrive\Dokumenty\Arduino\libraries\I2Cdev\I2Cdev.cpp:44:
c:\users\backu\appdata\local\arduino15\packages\stm32\tools\xpack-arm-none-eabi-gcc\9.2.1-1.1\arm-none-eabi\include\c++\9.2.1\bits\stl_algo.h:3450:5: note: candidate: 'template<class _Tp, class _Compare> constexpr _Tp std::min(std::initializer_list<_Tp>, _Compare)'
 3450 |     min(initializer_list<_Tp> __l, _Compare __comp)
      |     ^~~
c:\users\backu\appdata\local\arduino15\packages\stm32\tools\xpack-arm-none-eabi-gcc\9.2.1-1.1\arm-none-eabi\include\c++\9.2.1\bits\stl_algo.h:3450:5: note:   template argument deduction/substitution failed:
C:\Users\backu\OneDrive\Dokumenty\Arduino\libraries\I2Cdev\I2Cdev.cpp:276:75: note:   mismatched types 'std::initializer_list<_Tp>' and 'unsigned char'
  276 |             for (uint8_t k = 0; k < length; k += min(length, BUFFER_LENGTH)) {
      |                                                                           ^
In file included from c:\users\backu\appdata\local\arduino15\packages\stm32\tools\xpack-arm-none-eabi-gcc\9.2.1-1.1\arm-none-eabi\include\c++\9.2.1\algorithm:62,
                 from C:\Users\backu\AppData\Local\Arduino15\packages\STM32\hardware\stm32\1.9.0\cores\arduino/wiring_constants.h:26,
                 from C:\Users\backu\AppData\Local\Arduino15\packages\STM32\hardware\stm32\1.9.0\cores\arduino/wiring.h:34,
                 from C:\Users\backu\AppData\Local\Arduino15\packages\STM32\hardware\stm32\1.9.0\cores\arduino/Arduino.h:36,
                 from C:\Users\backu\OneDrive\Dokumenty\Arduino\libraries\I2Cdev\I2Cdev.h:74,
                 from C:\Users\backu\OneDrive\Dokumenty\Arduino\libraries\I2Cdev\I2Cdev.cpp:44:
c:\users\backu\appdata\local\arduino15\packages\stm32\tools\xpack-arm-none-eabi-gcc\9.2.1-1.1\arm-none-eabi\include\c++\9.2.1\bits\stl_algo.h:3444:5: note: candidate: 'template<class _Tp> constexpr _Tp std::min(std::initializer_list<_Tp>)'
 3444 |     min(initializer_list<_Tp> __l)
      |     ^~~
c:\users\backu\appdata\local\arduino15\packages\stm32\tools\xpack-arm-none-eabi-gcc\9.2.1-1.1\arm-none-eabi\include\c++\9.2.1\bits\stl_algo.h:3444:5: note:   template argument deduction/substitution failed:
C:\Users\backu\OneDrive\Dokumenty\Arduino\libraries\I2Cdev\I2Cdev.cpp:276:75: note:   mismatched types 'std::initializer_list<_Tp>' and 'unsigned char'
  276 |             for (uint8_t k = 0; k < length; k += min(length, BUFFER_LENGTH)) {
      |                                                                           ^
In file included from c:\users\backu\appdata\local\arduino15\packages\stm32\tools\xpack-arm-none-eabi-gcc\9.2.1-1.1\arm-none-eabi\include\c++\9.2.1\algorithm:61,
                 from C:\Users\backu\AppData\Local\Arduino15\packages\STM32\hardware\stm32\1.9.0\cores\arduino/wiring_constants.h:26,
                 from C:\Users\backu\AppData\Local\Arduino15\packages\STM32\hardware\stm32\1.9.0\cores\arduino/wiring.h:34,
                 from C:\Users\backu\AppData\Local\Arduino15\packages\STM32\hardware\stm32\1.9.0\cores\arduino/Arduino.h:36,
                 from C:\Users\backu\OneDrive\Dokumenty\Arduino\libraries\I2Cdev\I2Cdev.h:74,
                 from C:\Users\backu\OneDrive\Dokumenty\Arduino\libraries\I2Cdev\I2Cdev.cpp:44:
c:\users\backu\appdata\local\arduino15\packages\stm32\tools\xpack-arm-none-eabi-gcc\9.2.1-1.1\arm-none-eabi\include\c++\9.2.1\bits\stl_algobase.h:246:5: note: candidate: 'template<class _Tp, class _Compare> constexpr const _Tp& std::min(const _Tp&, const _Tp&, _Compare)'
  246 |     min(const _Tp& __a, const _Tp& __b, _Compare __comp)
      |     ^~~
c:\users\backu\appdata\local\arduino15\packages\stm32\tools\xpack-arm-none-eabi-gcc\9.2.1-1.1\arm-none-eabi\include\c++\9.2.1\bits\stl_algobase.h:246:5: note:   template argument deduction/substitution failed:
C:\Users\backu\OneDrive\Dokumenty\Arduino\libraries\I2Cdev\I2Cdev.cpp:276:75: note:   deduced conflicting types for parameter 'const _Tp' ('unsigned char' and 'int')
  276 |             for (uint8_t k = 0; k < length; k += min(length, BUFFER_LENGTH)) {
      |                                                                           ^
In file included from c:\users\backu\appdata\local\arduino15\packages\stm32\tools\xpack-arm-none-eabi-gcc\9.2.1-1.1\arm-none-eabi\include\c++\9.2.1\algorithm:61,
                 from C:\Users\backu\AppData\Local\Arduino15\packages\STM32\hardware\stm32\1.9.0\cores\arduino/wiring_constants.h:26,
                 from C:\Users\backu\AppData\Local\Arduino15\packages\STM32\hardware\stm32\1.9.0\cores\arduino/wiring.h:34,
                 from C:\Users\backu\AppData\Local\Arduino15\packages\STM32\hardware\stm32\1.9.0\cores\arduino/Arduino.h:36,
                 from C:\Users\backu\OneDrive\Dokumenty\Arduino\libraries\I2Cdev\I2Cdev.h:74,
                 from C:\Users\backu\OneDrive\Dokumenty\Arduino\libraries\I2Cdev\I2Cdev.cpp:44:
c:\users\backu\appdata\local\arduino15\packages\stm32\tools\xpack-arm-none-eabi-gcc\9.2.1-1.1\arm-none-eabi\include\c++\9.2.1\bits\stl_algobase.h:198:5: note: candidate: 'template<class _Tp> constexpr const _Tp& std::min(const _Tp&, const _Tp&)'
  198 |     min(const _Tp& __a, const _Tp& __b)
      |     ^~~
c:\users\backu\appdata\local\arduino15\packages\stm32\tools\xpack-arm-none-eabi-gcc\9.2.1-1.1\arm-none-eabi\include\c++\9.2.1\bits\stl_algobase.h:198:5: note:   template argument deduction/substitution failed:
C:\Users\backu\OneDrive\Dokumenty\Arduino\libraries\I2Cdev\I2Cdev.cpp:276:75: note:   deduced conflicting types for parameter 'const _Tp' ('unsigned char' and 'int')
  276 |             for (uint8_t k = 0; k < length; k += min(length, BUFFER_LENGTH)) {
      |                                                                           ^
exit status 1

How can I add a delay instead of using the millis() function?

EDIT: I am closing this issue because I am posting on the Arduino Forum because it seems more lively there. I don't want to cross-post and waste people's time. This issue has NOT been solved.

Sorry if the title was not clear, but I want to replace the following lines in MPU9250_Mahony.ino with a delay function that will eventually become a sleep function to allow the Arduino to go into deep sleep. I also need to use a delay function because I want to move servos, but not all of them at the same time, so as to avoid a brownout.

now_ms = millis(); //time to print?
if (now_ms - last_ms >= print_ms) {
last_ms = now_ms;

So from that to this:

delay(1000).

I have tried to just put the delay function there, but the values get all skewed, jumping back and forth. I understand that this phenomenon probably relates to how the sensor polls and how it calculates yaw, pitch, and roll based on the time between the readings. I understand that there is already a variable (deltat) that tracks the time between readings, but it doesn't seem to help in this operation.

Is this even feasible, or am I undermining the working principle of this sketch? I apologize in advance for my relatively low understanding of how this works. I also apologize that this might not be the ideal place to ask questions like this, I just couldn't find anywhere else.

If anyone can guide me in the right direction, that would be greatly appreciated.

Thanks!

Magneto output to Arduino Code

Hi everybody,

I am trying to use AHRS code. I run the calibration code and got the output and separated the values as mag and acc.

I run the magneto software and Hnorm as 10000 for acc and 100 for mag.

attached files are the output of the magneto software.

Which values should I enter to Arduino Code.
acc
mag

Thanks

Madgwick Quaternion Update gravity Compensate y and z direction wrong output

Hello jremington

I am currently developing a Gravity Compensate code using your explanation in the Arduino forum.
Thanks for it. It was a great discussion ever. I was clarified a lot of things from it

This my problem.
When I am getting gx, gy, and gz from bellow code

g[0] = 2 * (q[2] * q[0] - q[1] * q[3]);
g[1] = 2 * (q[1] * q[2] + q[3] * q[0]);
g[2] = q[1] * q[1] - q[2] * q[2] - q[3] * q[3] + q[0] * q[0]; 

When I rotating the MPU sensor gy and gz values change But gx value not change
I calibrate gyro and mag also

For example

a mean acceleration
g mean gravity

Finally, I want to do (a - g)
Initial Position   &          ax         ay           az          gx          gy          gz
No movement  &
Z up                           0         0            +1          0           0           -1
X down                        -1         0             0          1           0            0
Y down                         0        -1             0          0           1            0
Z down                         0         0            -1          0           0            1

// above values are correct exactly I want to get above values.
But I rotate the sensor that values change like below
 
But when I rotate clockwise gy and gz change
Y down & 
Rotate clockwise              0           -1           0           0             0          1

Z down &
Rotate clockwise              0            0          -1           0             1           0

I am using this for getting quaternion

MadgwickQuaternionUpdate(accel[0], accel[1], accel[2], gyro[0]*PI/180.0f, -gyro[1]*PI/180.0f, -gyro[2]*PI/180.0f, mag[1], -mag[0], -mag[2], deltat);
void MadgwickQuaternionUpdate(float ax, float ay, float az, float gx, float gy, float gz, float mx, float my, float mz, float deltat)
{
  // short name local variable for readability
  float q1 = q[0], q2 = q[1], q3 = q[2], q4 = q[3];
  float norm;
  float hx, hy, _2bx, _2bz;
  float s1, s2, s3, s4;
  float qDot1, qDot2, qDot3, qDot4;

  // Auxiliary variables to avoid repeated arithmetic
  float _2q1mx;
  float _2q1my;
  float _2q1mz;
  float _2q2mx;
  float _4bx;
  float _4bz;
  float _2q1 = 2.0f * q1;
  float _2q2 = 2.0f * q2;
  float _2q3 = 2.0f * q3;
  float _2q4 = 2.0f * q4;
  float _2q1q3 = 2.0f * q1 * q3;
  float _2q3q4 = 2.0f * q3 * q4;
  float q1q1 = q1 * q1;
  float q1q2 = q1 * q2;
  float q1q3 = q1 * q3;
  float q1q4 = q1 * q4;
  float q2q2 = q2 * q2;
  float q2q3 = q2 * q3;
  float q2q4 = q2 * q4;
  float q3q3 = q3 * q3;
  float q3q4 = q3 * q4;
  float q4q4 = q4 * q4;

  // Normalise accelerometer measurement
  norm = sqrt(ax * ax + ay * ay + az * az);
  if (norm == 0.0f) return; // handle NaN
  norm = 1.0f / norm;
  ax *= norm;
  ay *= norm;
  az *= norm;

  // Normalise magnetometer measurement
  norm = sqrt(mx * mx + my * my + mz * mz);
  if (norm == 0.0f) return; // handle NaN
  norm = 1.0f / norm;
  mx *= norm;
  my *= norm;
  mz *= norm;
  
  // Reference direction of Earth's magnetic field
  _2q1mx = 2.0f * q1 * mx;
  _2q1my = 2.0f * q1 * my;
  _2q1mz = 2.0f * q1 * mz;
  _2q2mx = 2.0f * q2 * mx;
  hx = mx * q1q1 - _2q1my * q4 + _2q1mz * q3 + mx * q2q2 + _2q2 * my * q3 +
       _2q2 * mz * q4 - mx * q3q3 - mx * q4q4;
  hy = _2q1mx * q4 + my * q1q1 - _2q1mz * q2 + _2q2mx * q3 - my * q2q2 + my * q3q3 + _2q3 * mz * q4 - my * q4q4;
  _2bx = sqrt(hx * hx + hy * hy);
  _2bz = -_2q1mx * q3 + _2q1my * q2 + mz * q1q1 + _2q2mx * q4 - mz * q2q2 + _2q3 * my * q4 - mz * q3q3 + mz * q4q4;
  _4bx = 2.0f * _2bx;
  _4bz = 2.0f * _2bz;

  // Gradient decent algorithm corrective step
  s1 = -_2q3 * (2.0f * q2q4 - _2q1q3 - ax) + _2q2 * (2.0f * q1q2 + _2q3q4 - ay) - _2bz * q3 * (_2bx * (0.5f - q3q3 - q4q4) + _2bz * (q2q4 - q1q3) - mx) + (-_2bx * q4 + _2bz * q2) * (_2bx * (q2q3 - q1q4) + _2bz * (q1q2 + q3q4) - my) + _2bx * q3 * (_2bx * (q1q3 + q2q4) + _2bz * (0.5f - q2q2 - q3q3) - mz);
  s2 = _2q4 * (2.0f * q2q4 - _2q1q3 - ax) + _2q1 * (2.0f * q1q2 + _2q3q4 - ay) - 4.0f * q2 * (1.0f - 2.0f * q2q2 - 2.0f * q3q3 - az) + _2bz * q4 * (_2bx * (0.5f - q3q3 - q4q4) + _2bz * (q2q4 - q1q3) - mx) + (_2bx * q3 + _2bz * q1) * (_2bx * (q2q3 - q1q4) + _2bz * (q1q2 + q3q4) - my) + (_2bx * q4 - _4bz * q2) * (_2bx * (q1q3 + q2q4) + _2bz * (0.5f - q2q2 - q3q3) - mz);
  s3 = -_2q1 * (2.0f * q2q4 - _2q1q3 - ax) + _2q4 * (2.0f * q1q2 + _2q3q4 - ay) - 4.0f * q3 * (1.0f - 2.0f * q2q2 - 2.0f * q3q3 - az) + (-_4bx * q3 - _2bz * q1) * (_2bx * (0.5f - q3q3 - q4q4) + _2bz * (q2q4 - q1q3) - mx) + (_2bx * q2 + _2bz * q4) * (_2bx * (q2q3 - q1q4) + _2bz * (q1q2 + q3q4) - my) + (_2bx * q1 - _4bz * q3) * (_2bx * (q1q3 + q2q4) + _2bz * (0.5f - q2q2 - q3q3) - mz);
  s4 = _2q2 * (2.0f * q2q4 - _2q1q3 - ax) + _2q3 * (2.0f * q1q2 + _2q3q4 - ay) + (-_4bx * q4 + _2bz * q2) * (_2bx * (0.5f - q3q3 - q4q4) + _2bz * (q2q4 - q1q3) - mx) + (-_2bx * q1 + _2bz * q3) * (_2bx * (q2q3 - q1q4) + _2bz * (q1q2 + q3q4) - my) + _2bx * q2 * (_2bx * (q1q3 + q2q4) + _2bz * (0.5f - q2q2 - q3q3) - mz);
  norm = sqrt(s1 * s1 + s2 * s2 + s3 * s3 + s4 * s4);    // normalise step magnitude
  norm = 1.0f / norm;
  s1 *= norm;
  s2 *= norm;
  s3 *= norm;
  s4 *= norm;

  // Compute rate of change of quaternion
  qDot1 = 0.5f * (-q2 * gx - q3 * gy - q4 * gz) - beta * s1;
  qDot2 = 0.5f * (q1 * gx + q3 * gz - q4 * gy) - beta * s2;
  qDot3 = 0.5f * (q1 * gy - q2 * gz + q4 * gx) - beta * s3;
  qDot4 = 0.5f * (q1 * gz + q2 * gy - q3 * gx) - beta * s4;

  // Integrate to yield quaternion
  q1 += qDot1 * deltatx;
  q2 += qDot2 * deltatx;
  q3 += qDot3 * deltatx;
  q4 += qDot4 * deltatx;
  norm = sqrt(q1 * q1 + q2 * q2 + q3 * q3 + q4 * q4);    // normalise quaternion
  norm = 1.0f / norm;
  q[0] = q1 * norm;
  q[1] = q2 * norm;
  q[2] = q3 * norm;
  q[3] = q4 * norm;
}

I try to resolve this by changing variable values and sing but it does not work for me.
Can you help me t do that?
Thank you

Is there a license?

Hey all,

We can't legally use this code until there is a license. Could a license be added, such as MIT?

Thanks,
Charlie

Doc Folder File "Instructions" refers to non-existent file MPU9250_AHRS.ino

Instructions in Doc folder state: "Copy the output of Magneto into either MPU9520_tiltcomp or MPU9250_AHRS". However, file MPU9250_AHRS does not exist in this repository. MPU9250_Mahony.ino exists, however it does not accept full Magneto output, instead takes input from MPU9250_cal.ino output. Is MPU9250_AHRS" file supposed to exist?

Wrong accelerometer data during Calibration

Hello jremington,
I'm having an issue with the data from calibration: it's working well for Magnetometer but Accelerometer seems "stuck".
Here is an extract from the calibration:

"Initializing I2C devices...
Testing device connections...
MPU9250 OK
Gyro bias collection ... KEEP SENSOR STILL
Done. Gyro offsets (raw) -240.2, 610.5, -557.3
Collecting 300 points for scaling, 3/second
TURN SENSOR VERY SLOWLY AND CAREFULLY IN 3D
32767 -32768 -32768 -15 21 62
32767 -32768 -32768 -17 21 61
32767 -32768 -32768 -15 20 60
32767 -32768 -32768 -16 21 63
32767 -32768 -32768 -14 17 62
32767 -32768 -32768 -10 15 62
32767 -32768 -32768 -6 13 62
32767 -32768 -32768 -6 12 61
32767 -32768 -32768 -5 13 64
32767 -32768 -32768 -2 11 62
32767 -32768 -32768 0 10 61
...
32767 -32768 -32768 21 72 -42
32767 -32768 -32768 22 63 -45
Done. rms Acc = 56849.78, rms Mag = 74.30"

Do you have any idea to solve this issue?

My setup: Arduino nano, SDA and SCL on A4 A5, 5V and grnd.

Many thanks for the libraries btw :)

Regards
Mixou

Mahony2 code doesn't compile

`Arduino: 1.8.19 (Windows 10), Board: "Arduino Pro or Pro Mini, ATmega328P (3.3V, 8 MHz)"

...\Desktop\MPU-9250-AHRS-master\Mahony2\Mahony2.ino: In function 'void MahonyQuaternionUpdate(float, float, float, float, float, float, float, float, float, float)':

Mahony2:272:1: error: 'qa' was not declared in this scope

qa = q1;

^~

...\Desktop\MPU-9250-AHRS-master\Mahony2\Mahony2.ino:272:1: note: suggested alternative: 'pa'

qa = q1;

^~

pa

Mahony2:273:1: error: 'qb' was not declared in this scope

qb = q2;

^~

...\Desktop\MPU-9250-AHRS-master\Mahony2\Mahony2.ino:273:1: note: suggested alternative: 'pb'

qb = q2;

^~

pb

Mahony2:274:1: error: 'qc' was not declared in this scope

qc = q3;

^~

C:\Users\Gamze TEKIN\Desktop\MPU-9250-AHRS-master\Mahony2\Mahony2.ino:274:1: note: suggested alternative: 'pc'

qc = q3;

^~

pc

exit status 1

'qa' was not declared in this scope

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.
`

Hello everybody,

When I try to upload Mahony2 code, i got the above error.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.