[Dprglist] Odometry on Mecanum-wheeled robots?

Murray Altheim murray18 at altheim.com
Tue Apr 14 22:58:12 PDT 2020


I'm going to contradict myself. Regarding orientation sensors, I dug
around a bit and found:

    https://blog.digilentinc.com/how-to-convert-magnetometer-data-into-compass-heading/

and am quite pleased to be getting a compass heading output from the
magnetometer of an Adafruit LSM9DS1. I'm no mean Python programmer but
in the interest of sharing, here goes:

------------------------------------------------------------
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# reads an x,y,z value from the LSM9DS1 magnetometer and
# displays a heading in degrees.

import time, board, busio, math, adafruit_lsm9ds1

LSB = 0.48828125 #mG

def convert_to_direction(mag_x, mag_y, mag_z):
     xGaussData = mag_x * LSB
     yGaussData = mag_y * LSB
     if xGaussData == 0.0:
         return 90.0 if yGaussData < 0.0 else 0.0
     else:
         direction = math.atan( yGaussData / xGaussData ) * ( 180.0 / math.pi )
     if direction > 360.0:
         return direction - 360.0
     elif direction < 0.0:
         return direction + 360.0
     else:
         return direction

try:
     i2c = busio.I2C(board.SCL, board.SDA)
     sensor = adafruit_lsm9ds1.LSM9DS1_I2C(i2c)
     while True:
         mag_x, mag_y, mag_z = sensor.magnetic
         direction = convert_to_direction(mag_x, mag_y, mag_z)
         print('lsm9ds1   : direction: {0:0.2f}°;\tmagnetometer(G): ({1:0.3f}, {2:0.3f}, {3:0.3f})'.format(direction, mag_x, mag_y, mag_z))
         time.sleep(0.5)

except KeyboardInterrupt:
         print('\nlsm9ds1   : Ctrl-C caught: keyboard interrupt.')

#EOF
------------------------------------------------------------

with output like:

lsm9ds1   : direction: 31.17°;	magnetometer(G): (0.349, 0.211, 0.077)
lsm9ds1   : direction: 21.02°;	magnetometer(G): (0.413, 0.159, 0.095)
lsm9ds1   : direction: 18.88°;	magnetometer(G): (0.438, 0.150, 0.078)
lsm9ds1   : direction: 8.52°;	magnetometer(G): (0.356, 0.053, 0.105)
lsm9ds1   : direction: 0.81°;	magnetometer(G): (0.285, 0.004, 0.130)
lsm9ds1   : direction: 2.04°;	magnetometer(G): (0.248, 0.009, 0.114)
lsm9ds1   : direction: 4.20°;	magnetometer(G): (0.242, 0.018, 0.128)
lsm9ds1   : direction: 6.50°;	magnetometer(G): (0.232, 0.026, 0.128)
lsm9ds1   : direction: 3.05°;	magnetometer(G): (0.303, 0.016, 0.121)
lsm9ds1   : direction: 346.79°;	magnetometer(G): (0.308, -0.072, 0.258)

On 15/04/20 3:50 PM, Murray Altheim via DPRGlist wrote:
> [...] so the idea of taking a more "raw" output from a magnetometer and having to
> process that for a value vs. an already-complete orientation value in radians or
> degrees from the BNO055, well, that's pretty compelling. I'd both have to spend
> a lot of time learning and debugging versus just getting a compass heading output
> from the BNO055. While it might be somebody's cup of tea to work out that kind
> of detail, it's not like there's not enough challenges in building a robot. And
> time, hmm. Time.
...........................................................................
Murray Altheim <murray18 at altheim dot com>                       = =  ===
http://www.altheim.com/murray/                                     ===  ===
                                                                    = =  ===
     In the evening
     The rice leaves in the garden
     Rustle in the autumn wind
     That blows through my reed hut.
            -- Minamoto no Tsunenobu



More information about the DPRGlist mailing list