Navigation

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    1. Home
    2. paha
    3. Posts
    • Profile
    • More
      • Following
      • Followers
      • Topics
      • Posts
      • Best
      • Groups

    Posts made by paha

    Process Jacobian

    Hello
    I have question to the process Jacobian in PredictFunctions.c file.
    There is #if #else preprocessing macro in _UpdateProcessJacobian() which selects code that updates ∂v∂q submatrix in your explanation here:
    https://openimu.readthedocs.io/en/latest/algorithms/Process_Jacobian.html
    I don't understand why the #if branch is selected instead of #else branch, because according to the explanation the #else branch should be selected.
    Where did

    gKalmanFilter.R_BinN[0][0]*q0aXdT -                                      gKalmanFilter.R_BinN[0][1]*q0aYdT -                                                 gKalmanFilter.R_BinN[0][2]*q0aZdT);
    

    come from? Why is not there only

    q0aXdT - q3aYdT + q2aZdT
    

    ?

    Thank you
    Best regards
    Pavel

    posted in The OpenIMU Family •
    RE: Wheel angle in EKF

    I got it now.
    Thank you very much
    Regards
    Pavel

    posted in The OpenIMU Family •
    RE: Wheel angle in EKF

    Thank you very much for the reply.
    I'd like to ask one more question about function _GenerateObservationJacobian_AHRS in UpdateFunctions.c.

    There is following comment for uTheta

    /* Pitch (including modifications for |q| = 1 constraint)
         *   mu = 2*( q(1)*q(3) - q(2)*q(4) );
         *   % 2/sqrt(1-mu*mu) * [q(3); -q(4); q(1); -q(2)]
         *   2/sqrt(1-mu*mu) * [q(3) - mu*q(1);
         *                      -q(4) - mu*q(2);
         *                     q(1)- mu*q(3);
         *                     -q(2)- mu*q(4)]
         */
    

    I know how to get this line

    % 2/sqrt(1-mu*mu) * [q(3); -q(4); q(1); -q(2)]
    

    but don't know how you came to this

    2/sqrt(1-mu*mu) * [q(3) - mu*q(1);
         *                      -q(4) - mu*q(2);
         *                     q(1)- mu*q(3);
         *                     -q(2)- mu*q(4)]
    

    which is most probably mentioned constraint for |q| = 1.

    Could you please shed more light on it? Your code awesome and great practical EKF tutorial.

    Thank you
    regards
    Pavel

    posted in The OpenIMU Family •
    Wheel angle in EKF

    Hello

    I intend to use IMU300ZI in our omnidirectional robot (can turn all 4 wheels into arbitrary but the same direction). The robot has speed encoder and wheel angle encoder so I want to use this info in EKF. As a base code I use your INS example project.
    I studied your code and think that the best place for wheel angle incorporation is in function Update_PseudoMeasurement() in UpdateFunctions.c. Instead of using frontVelMea variable as scalar I would make it vector the values of wich would be set based on current wheel angle, wheel speed and gKalmanFilter.ppsEulerAngles[YAW]. I would also set gAlgorithm.velocityAlwaysAlongBodyX=FALSE.

    Odometer data would be received over SPI.
    Do you think this is correct solution or is there anything important I forgot about which could cause failure?

    Thank you
    Regards
    Pavel

    posted in The OpenIMU Family •
    BUG in platformGetOrientation()

    Hello
    It seems to me there is a bug in openIMU300-lib/Platform/Core/src/platform.c in function platformGetOrientation()

    instead of:

    case 42:   orientation = 0x005A7958; break;         // 0000 000 | 00 0 | 10 1 | 01 0 +Z -X +Y
    

    this:

    case 42:   orientation = 0x005A7859; break;         // 0000 000 | 00 0 | 10 1 | 01 0 +Z -X +Y
    

    Regards
    Pavel

    posted in The OpenIMU Family •