получение правильных значений IMU - PullRequest
0 голосов
/ 28 марта 2019

Я читаю данные с датчика AHRS / IMU через USB с Python 2.7. Для получения ускорения производитель указывает в соответствии с изображением ниже:

Описание поставщика IMU

Мой код на python такой, но когда ускорение отрицательное, значения неправильные. Я считаю, что мне нужно проверить первый бит MSB (в данном случае, поле AxH), если 1 отрицательно, если 0 положительно.

    #....
    #data = serial.read(size=11)
    #....
    #

    #Acceleration
    elif data[1] == b'\x51':
        AxL=int(data[2:3].encode('hex'), 16)
        AxH=int(data[3:4].encode('hex'), 16)
        AyL=int(data[4:5].encode('hex'), 16)
        AyH=int(data[5:6].encode('hex'), 16)
        AzL=int(data[6:7].encode('hex'), 16)
        AzH=int(data[7:8].encode('hex'), 16)

        x = (AxH<<8|AxL)/32768.0*16.0
        y = (AyH<<8|AyL)/32768.0*16.0
        z = (AzH<<8|AzL)/32768.0*16.0

У кого-нибудь есть предложения?

Полное руководство по эксплуатации датчика IMU: http://wiki.wit -motion.com / английский / Библиотека / ех / fetch.php медиа = модуль: wt901: документы: jy901usermanualv4.pdf

1 Ответ

1 голос
/ 29 марта 2019

Использование struct

Данные осей хранятся в виде little-endian целых чисел со знаком (2 байта) , поэтомумы можем использовать struct для распаковки данных.Модуль struct позаботится о правильной интерпретации bytes как коротких целых чисел.

import struct

g = 9.81
conv = 16.0 / 32768.0 * g

# ...

    elif data[1] == b'\x51':
        axes = struct.unpack("<hhh", data[2:8])
        x, y, z = [a*conv for a in axes]

Преобразование вручную

Если вы хотите выполнить преобразование самостоятельно, я 'd предположим, что представление числа со знаком является дополнением до двух :

def twos_complement(x, bytes=2):
    maxnum = 2**(bytes*8) - 1
    msb = 1 << (bytes*8 - 1) 
    return -((x^maxnum) + 1) if x&msb else x

AxL = data[2]
AxH = data[3]
Ax_unsigned = AxH << 8 | AxL
Ax = twos_complement(Ax_unsigned, 2)
...