LSM9DS1 icon indicating copy to clipboard operation
LSM9DS1 copied to clipboard

Question

Open arthurvanl opened this issue 4 years ago • 15 comments

Hello, i was wondering how could implement all the code (so no serial code either) in python. I have an LSM9DS1TR chip simular to LSM9DS1. But if i convert the phi, theta and pitch to degrees its really off. There is a big difference, is there anyway u could help?

#Data ophalen vanuit de chip.
            accel_x = data.data['accel_x_mg']
            accel_y = data.data['accel_y_mg']
            accel_z = data.data['accel_z_mg']

            gyro_x = data.data['gyro_x_dps'] 
            gyro_y = data.data['gyro_y_dps']
            gyro_z = data.data['gyro_z_dps']

            magn_x = data.data['magn_x_mG']
            magn_y = data.data['magn_y_mG']
            magn_z = data.data['magn_z_mG']
            
            dt = (millis() - millisOld) / 1000
            millisOld = millis()

            q = [1.0, 0.0, 0.0, 0.0]
            eInt = [0.0, 0.0, 0.0]

            hx = float()
            hy = float()
            bx = float()
            bz = float()

            vx = float()
            vy = float()
            vz = float()

            wx = float()
            wy = float()
            wz = float()

            ex = float()
            ey = float()
            ez = float()

            pa = float()
            pb = float()
            pc = float()
            
            q1 = q[0]
            q2 = q[1]
            q3 = q[2]
            q4 = q[3]

            q1q1 = q[0]*q[0]
            q1q2 = q[0]*q[1]
            q1q3 = q[0]*q[2]
            q1q4 = q[0]*q[3]
            q2q2 = q[0]*q[1]
            q2q3 = q[0]*q[2]
            q2q4 = q[0]*q[3]
            q3q3 = q[0]*q[2]
            q3q4 = q[0]*q[3]
            q4q4 = q[0]*q[3]

            norm = math.sqrt(accel_x*accel_x + accel_y*accel_y + accel_z*accel_z)
            norm = 1.0 / norm #norm berekenen.

            accel_x *= norm 
            accel_y *= norm
            accel_z *= norm

        	#Deze 3 waardes bij elkaar in het kwadraat is ongeveer 1.0, met soms een hele kleine afwijking
            # print(np.round(accel_x, decimals=4), np.round(accel_y, decimals=4), np.round(accel_z, decimals=4))

            norm = math.sqrt(magn_x*magn_x + magn_y*magn_y + magn_z*magn_z)
            norm = 1.0 / norm #norm berekenen.

            magn_x *= norm 
            magn_y *= norm
            magn_z *= norm
            #plus minus 1

            hx = 2.0 * magn_x * (0.5 - q3q3 - q4q4) + 2.0 * magn_y * (q2q2 - q1q4) + 2.0 * magn_z * (q2q4 + q1q3)
            hY = 2.0 * magn_x * (q2q3 + q1q4) + 2.0 * magn_y * (0.5 - q2q2 - q4q4) + 2.0 * magn_z * (q3q4 - q1q2)
            bx = math.sqrt((hx*hx) + (hy*hy))
            bz = 2.0 * bx * (q2q4 - q1q3) + 2.0 * magn_y * (q3q4 + q1q2) + 2.0 * magn_z * (0.5 - q2q2 - q3q3)

            vx = 2.0 * (q2q4 - q1q3)
            vy = 2.0 * (q1q2 + q3q4)
            vz = q1q1 - q2q2  - q3q3 + q4q4
            
            wx = 2.0 * bx * (0.5 - q3q3 - q4q4) + 2.0 * bz * (q2q4 - q1q3)
            wy = 2.0 * bx * (q2q3 - q1q4) + 2.0 * bz * (q1q2 + q3q4)
            wz = 2.0 * bx * (q1q3 + q2q4) + 2.0 * bz * (0.5 - q2q2 - q3q3)

            ex = (accel_y * vz - accel_z * vy) + (magn_y * wz - magn_z * wy)
            ey = (accel_z * vx  - accel_x * vz) + (magn_z * wx  - magn_x * wz)
            ez = (accel_x * vy - accel_y * vx) + (magn_x * wy - magn_y * wx)

            Ki = float()
            if(Ki > 0.0):
                eInt[0] += ex
                eInt[1] += ey
                eInt[2] += ez
            else:
                eInt[0] = 0.0
                eInt[1] = 0.0
                eInt[2] = 0.0
            
            Kp = 2.0 * 5.0
            gyro_x = gyro_x + Kp * ex + Ki * eInt[0]
            gyro_y = gyro_y + Kp * ey + Ki * eInt[1]
            gyro_z = gyro_z + Kp * ez + Ki * eInt[2]

            pa = q2
            pb = q3
            pc = q4
            q1 = q1 + (-q2 * gyro_x - q3 * gyro_y - q4 * gyro_z) * (0.5 * dt)
            q2 = pa + (q1 * gyro_x + pb * gyro_z - pc * gyro_y) * (0.5 * dt)
            q3 = pb + (q1 * gyro_y - pa * gyro_z + pc * gyro_x) * (0.5 * dt)
            q4 = pc + (q1 * gyro_z + pa * gyro_y - pb * gyro_x) * (0.5 * dt)

            # Normalise quaternion
            norm = math.sqrt(q1 * q1 + q2 * q2 + q3 * q3 + q4 * q4)
            norm = 1.0 / norm
            q[0] = q1 * norm
            q[1] = q2 * norm
            q[2] = q3 * norm
            q[3] = q4 * norm
            #Ongeveer 1.0

            # print(q[0]*q[0]+q[1]*q[1]+q[2]*q[2]+q[3]*q[3])

            yaw   = math.atan2(2.0 * (q[1] * q[2] + q[0] * q[3]), q[0] * q[0] + q[1] * q[1] - q[2] * q[2] - q[3] * q[3])
            pitch = -math.asin(2.0 * (q[1] * q[3] - q[0] * q[2]))
            roll  = math.atan2(2.0 * (q[0] * q[1] + q[2] * q[3]), q[0] * q[0] - q[1] * q[1] - q[2] * q[2] + q[3] * q[3])
            pitch *= 180.0 / np.pi
            yaw   *= 180.0 / np.pi
            # yaw   -= 13.22 # Declination at Los Altos, California is ~13 degrees 13 minutes on 2020-07-19
            roll  *= 180.0 / np.pi
            print(pitch, yaw, roll)

arthurvanl avatar Sep 28 '21 09:09 arthurvanl

Sorry, I never use Python for programming, no idea...

On Tue, Sep 28, 2021 at 2:08 AM Arthur @.***> wrote:

Hello, i was wondering how could implement all the code (so no serial code either) in python. I have an LSM9DS1TR chip simular to LSM9DS1. But if i convert the phi, theta and pitch to degrees its really off. There is a big difference, is there anyway u could help?

#Data ophalen vanuit de chip. accel_x = data.data['accel_x_mg'] accel_y = data.data['accel_y_mg'] accel_z = data.data['accel_z_mg']

        gyro_x = data.data['gyro_x_dps']
        gyro_y = data.data['gyro_y_dps']
        gyro_z = data.data['gyro_z_dps']

        magn_x = data.data['magn_x_mG']
        magn_y = data.data['magn_y_mG']
        magn_z = data.data['magn_z_mG']

        dt = (millis() - millisOld) / 1000
        millisOld = millis()

        q = [1.0, 0.0, 0.0, 0.0]
        eInt = [0.0, 0.0, 0.0]

        hx = float()
        hy = float()
        bx = float()
        bz = float()

        vx = float()
        vy = float()
        vz = float()

        wx = float()
        wy = float()
        wz = float()

        ex = float()
        ey = float()
        ez = float()

        pa = float()
        pb = float()
        pc = float()

        q1 = q[0]
        q2 = q[1]
        q3 = q[2]
        q4 = q[3]

        q1q1 = q[0]*q[0]
        q1q2 = q[0]*q[1]
        q1q3 = q[0]*q[2]
        q1q4 = q[0]*q[3]
        q2q2 = q[0]*q[1]
        q2q3 = q[0]*q[2]
        q2q4 = q[0]*q[3]
        q3q3 = q[0]*q[2]
        q3q4 = q[0]*q[3]
        q4q4 = q[0]*q[3]

        norm = math.sqrt(accel_x*accel_x + accel_y*accel_y + accel_z*accel_z)
        norm = 1.0 / norm #norm berekenen.

        accel_x *= norm
        accel_y *= norm
        accel_z *= norm

    	#Deze 3 waardes bij elkaar in het kwadraat is ongeveer 1.0, met soms een hele kleine afwijking
        # print(np.round(accel_x, decimals=4), np.round(accel_y, decimals=4), np.round(accel_z, decimals=4))

        norm = math.sqrt(magn_x*magn_x + magn_y*magn_y + magn_z*magn_z)
        norm = 1.0 / norm #norm berekenen.

        magn_x *= norm
        magn_y *= norm
        magn_z *= norm
        #plus minus 1

        hx = 2.0 * magn_x * (0.5 - q3q3 - q4q4) + 2.0 * magn_y * (q2q2 - q1q4) + 2.0 * magn_z * (q2q4 + q1q3)
        hY = 2.0 * magn_x * (q2q3 + q1q4) + 2.0 * magn_y * (0.5 - q2q2 - q4q4) + 2.0 * magn_z * (q3q4 - q1q2)
        bx = math.sqrt((hx*hx) + (hy*hy))
        bz = 2.0 * bx * (q2q4 - q1q3) + 2.0 * magn_y * (q3q4 + q1q2) + 2.0 * magn_z * (0.5 - q2q2 - q3q3)

        vx = 2.0 * (q2q4 - q1q3)
        vy = 2.0 * (q1q2 + q3q4)
        vz = q1q1 - q2q2  - q3q3 + q4q4

        wx = 2.0 * bx * (0.5 - q3q3 - q4q4) + 2.0 * bz * (q2q4 - q1q3)
        wy = 2.0 * bx * (q2q3 - q1q4) + 2.0 * bz * (q1q2 + q3q4)
        wz = 2.0 * bx * (q1q3 + q2q4) + 2.0 * bz * (0.5 - q2q2 - q3q3)

        ex = (accel_y * vz - accel_z * vy) + (magn_y * wz - magn_z * wy)
        ey = (accel_z * vx  - accel_x * vz) + (magn_z * wx  - magn_x * wz)
        ez = (accel_x * vy - accel_y * vx) + (magn_x * wy - magn_y * wx)

        Ki = float()
        if(Ki > 0.0):
            eInt[0] += ex
            eInt[1] += ey
            eInt[2] += ez
        else:
            eInt[0] = 0.0
            eInt[1] = 0.0
            eInt[2] = 0.0

        Kp = 2.0 * 5.0
        gyro_x = gyro_x + Kp * ex + Ki * eInt[0]
        gyro_y = gyro_y + Kp * ey + Ki * eInt[1]
        gyro_z = gyro_z + Kp * ez + Ki * eInt[2]

        pa = q2
        pb = q3
        pc = q4
        q1 = q1 + (-q2 * gyro_x - q3 * gyro_y - q4 * gyro_z) * (0.5 * dt)
        q2 = pa + (q1 * gyro_x + pb * gyro_z - pc * gyro_y) * (0.5 * dt)
        q3 = pb + (q1 * gyro_y - pa * gyro_z + pc * gyro_x) * (0.5 * dt)
        q4 = pc + (q1 * gyro_z + pa * gyro_y - pb * gyro_x) * (0.5 * dt)

        # Normalise quaternion
        norm = math.sqrt(q1 * q1 + q2 * q2 + q3 * q3 + q4 * q4)
        norm = 1.0 / norm
        q[0] = q1 * norm
        q[1] = q2 * norm
        q[2] = q3 * norm
        q[3] = q4 * norm
        #Ongeveer 1.0

        # print(q[0]*q[0]+q[1]*q[1]+q[2]*q[2]+q[3]*q[3])

        yaw   = math.atan2(2.0 * (q[1] * q[2] + q[0] * q[3]), q[0] * q[0] + q[1] * q[1] - q[2] * q[2] - q[3] * q[3])
        pitch = -math.asin(2.0 * (q[1] * q[3] - q[0] * q[2]))
        roll  = math.atan2(2.0 * (q[0] * q[1] + q[2] * q[3]), q[0] * q[0] - q[1] * q[1] - q[2] * q[2] + q[3] * q[3])
        pitch *= 180.0 / np.pi
        yaw   *= 180.0 / np.pi
        # yaw   -= 13.22 # Declination at Los Altos, California is ~13 degrees 13 minutes on 2020-07-19
        roll  *= 180.0 / np.pi
        print(pitch, yaw, roll)

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/kriswiner/LSM9DS1/issues/18, or unsubscribe https://github.com/notifications/unsubscribe-auth/ABTDLKUT6EPEFQDYET6PRX3UEGAZTANCNFSM5E444QNA . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.

kriswiner avatar Sep 28 '21 18:09 kriswiner

Do you have a complete tutorial how it works and just one code file? Because i really find it hard to understand it

arthurvanl avatar Sep 28 '21 19:09 arthurvanl

Maybe take a look at Adafruit or Sparkfun?

On Tue, Sep 28, 2021 at 12:52 PM Arthur @.***> wrote:

Do you have a complete tutorial how it works and just one code file? Because i really find it hard to understand it

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/kriswiner/LSM9DS1/issues/18#issuecomment-929575032, or unsubscribe https://github.com/notifications/unsubscribe-auth/ABTDLKXKJBPR4ZKYO7FFI3LUEIMJPANCNFSM5E444QNA . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.

kriswiner avatar Sep 28 '21 20:09 kriswiner

That’s a different chip then right? Because im not allowed to use any other chip

arthurvanl avatar Sep 28 '21 21:09 arthurvanl

Adafruit or Sparkfun are companies that sell LSM6DS1 sensor breakout boards. Try Google, it is your friend here...

On Tue, Sep 28, 2021 at 2:07 PM Arthur @.***> wrote:

That’s a different chip then right? Because im not allowed to use any other chip

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/kriswiner/LSM9DS1/issues/18#issuecomment-929625865, or unsubscribe https://github.com/notifications/unsubscribe-auth/ABTDLKURPEPZRYETOAXEC6DUEIVBFANCNFSM5E444QNA . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.

kriswiner avatar Sep 28 '21 21:09 kriswiner

i was using google for a long time already didnt found anything 😄

arthurvanl avatar Sep 29 '21 05:09 arthurvanl

Arthur, 

This doesn't look right:

q1q1 = q[0]*q[0]
q1q2 = q[0]*q[1]
q1q3 = q[0]*q[2]
q1q4 = q[0]*q[3]
q2q2 = q[0]*q[1]
q2q3 = q[0]*q[2]
q2q4 = q[0]*q[3]
q3q3 = q[0]*q[2]
q3q4 = q[0]*q[3]
q4q4 = q[0]*q[3] 

Should probably be (untested):

q1q1 = q[0]*q[0]
q1q2 = q[0]*q[1]
q1q3 = q[0]*q[2]
q1q4 = q[0]*q[3]
q2q2 = q[1]*q[1]
q2q3 = q[1]*q[2]
q2q4 = q[1]*q[3]
q3q3 = q[2]*q[2]
q3q4 = q[2]*q[3]
q4q4 = q[3]*q[3] 

Hope this helps to fix it.

marknn3 avatar Sep 29 '21 09:09 marknn3

Yea i found that out earlier too, but still the same problem actually

arthurvanl avatar Sep 29 '21 10:09 arthurvanl

            thetaM = math.degrees(math.atan2(accel_x, math.sqrt(accel_y ** 2.0 + accel_z ** 2.0))) #x range van 90 -90
            phiM = -math.degrees(math.atan2(accel_y, math.sqrt(accel_x ** 2.0 + accel_z ** 2.0))) #y standaard min, range van90 -90

I started euler angles, wich works fine, but the problem is that the range is only from -90 to 90 degrees. And i need a full rotation.

arthurvanl avatar Sep 29 '21 10:09 arthurvanl

Kris, are u changing the raw values of the accelerometer, gyroscope and magnetometer into the function?

arthurvanl avatar Oct 07 '21 06:10 arthurvanl

Not sure what you mean here.

The raw register values are converted to signed 16-bit integers, then scaled, then have their offset biases applied to get physically meaningful data. These data are then fed into a fusion algorithm to get yaw, roll, and pitch.

On Wed, Oct 6, 2021 at 11:29 PM Arthur @.***> wrote:

Kris, are u changing the raw values of the accelerometer, gyroscope and magnetometer into the function?

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/kriswiner/LSM9DS1/issues/18#issuecomment-937493539, or unsubscribe https://github.com/notifications/unsubscribe-auth/ABTDLKWGFUESJ2FMPIUO4ADUFU46NANCNFSM5E444QNA . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.

kriswiner avatar Oct 07 '21 15:10 kriswiner

Then i have no idea what im doing wrong.

arthurvanl avatar Oct 14 '21 11:10 arthurvanl

i have no idea what wrong means here...

On Thu, Oct 14, 2021 at 4:02 AM Arthur @.***> wrote:

Then i have no idea what im doing wrong.

— You are receiving this because you commented.

Reply to this email directly, view it on GitHub https://github.com/kriswiner/LSM9DS1/issues/18#issuecomment-943249073, or unsubscribe https://github.com/notifications/unsubscribe-auth/ABTDLKQNRPV2J6C4TNHGAP3UG22ERANCNFSM5E444QNA . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.

kriswiner avatar Oct 14 '21 11:10 kriswiner

Well im trying the code (https://github.com/kriswiner/LSM9DS1/issues/18#issue-1009486405) But it doesn't work, it gives like -30 and the next data it gives -180 or something, the difference is to big, even though the chip is not moving

arthurvanl avatar Oct 14 '21 13:10 arthurvanl

I have no idea how to use python for this as mentioned.

But 99% of these kinds of problems are due to inadequate calibration.

If the sensor is laying flat and motion less do you see 0, 0, 1 g for accel to within 10 mg or less and 0, 0, 0 dps for gyro to within 10 mdps or less and mag values consistent with your local mag field (see USGS or equivalent) and if you flip the board upside down does Mz = -Mz, etc.?

kriswiner avatar Oct 14 '21 18:10 kriswiner