Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Navio2(python2)的MPU9250中的陀螺仪计算俯仰值_Python_Raspberry Pi_Sensors_Gyroscope_Robotics - Fatal编程技术网

如何使用Navio2(python2)的MPU9250中的陀螺仪计算俯仰值

如何使用Navio2(python2)的MPU9250中的陀螺仪计算俯仰值,python,raspberry-pi,sensors,gyroscope,robotics,Python,Raspberry Pi,Sensors,Gyroscope,Robotics,我可以获得陀螺传感器的原始值 但是,我不知道如何用这些值来计算音高值 我想得到-180和+180之间的音高值 这是因为我想用一个互补滤波器获得一个精确的俯仰值,该滤波器的俯仰值由加速度计获得,俯仰值由陀螺仪获得 请帮帮我 我的代码(获取陀螺传感器的原始值) 细节(设置) 陀螺刻度=2000DPS 陀螺分频器=16.4 “陀螺传感器原始值”=(PI/180)*数据/陀螺除法器 陀螺仪测量随时间的角度变化,因此原始值表示所有三维(偏航、俯仰、横摇)的角度变化。要获得角度,您需要在一段时间内

我可以获得陀螺传感器的原始值

但是,我不知道如何用这些值来计算音高值

我想得到-180和+180之间的音高值

这是因为我想用一个互补滤波器获得一个精确的俯仰值,该滤波器的俯仰值由加速度计获得,俯仰值由陀螺仪获得

请帮帮我


我的代码(获取陀螺传感器的原始值)


细节(设置)

陀螺刻度=2000DPS

陀螺分频器=16.4

“陀螺传感器原始值”=(PI/180)*数据/陀螺除法器



陀螺仪测量随时间的角度变化,因此原始值表示所有三维(偏航、俯仰、横摇)的角度变化。要获得角度,您需要在一段时间内对数据进行采样,并计算自开始采样以来的变化。如果您想知道“校准”阶段(0度采样)与当前状态之间的角度差,则需要不断更新该状态。这是否意味着采样开始的角度应为零度?如果实际采样开始角度不是0°C怎么办?你无法知道是否在0°开始采样-正如我所说,陀螺仪会随时间改变角度-为了获取当前角度(相对于重力),你需要一个倾斜仪。仅使用陀螺仪时,您需要在称为
的位置静止,以定义校准参考点(顺便说一句,加速度计也是如此,只是随着时间而改变位置,而不是角度)。当然,由于陀螺仪本身和代码的采样率不可避免的错误,它将随着时间的推移开始“漂移”,并需要偶尔重新校准一次。
import spidev
import time
import argparse
import sys
import navio.mpu9250
import navio.util

navio.util.check_apm()

imu = navio.mpu9250.MPU9250()
imu.initialize()

m9a, m9g, m9m = acc.imu.getMotion9()

#These are raw values of gyroscope
gyro_x = m9g[0]
gyro_y = m9g[1]
gyro_z = m9g[2]
...

def getMotion9(self):
    self.read_all()
    m9a = self.accelerometer_data
    m9g = self.gyroscope_data
    m9m = self.magnetometer_data

    return m9a, m9g, m9m

...

def read_all(self):
    # Send I2C command at first
    # Set the I2C slave addres of AK8963 and set for read.
    self.WriteReg(self.__MPUREG_I2C_SLV0_ADDR, self.__AK8963_I2C_ADDR | self.__READ_FLAG)
    # I2C slave 0 register address from where ; //Read 7 bytes from the magnetometerto begin data transfer
    self.WriteReg(self.__MPUREG_I2C_SLV0_REG, self.__AK8963_HXL)
    # Read 7 bytes from the magnetometer
    self.WriteReg(self.__MPUREG_I2C_SLV0_CTRL, 0x87)
    # must start your read from AK8963A register 0x03 and read seven bytes so that upon read of ST2 register 0x09 the AK8963A will unlatch the data registers for the next measurement.

    # time.sleep(0.001)
    response = self.ReadRegs(self.__MPUREG_ACCEL_XOUT_H, 21);

    # Get Accelerometer values
    for i in range(0, 3):
        data = self.byte_to_float(response[i*2:i*2+2])
        self.accelerometer_data[i] = self.G_SI*data/self.acc_divider

    # Get temperature
    i = 3
    temp = self.byte_to_float(response[i*2:i*2+2])
    self.temperature = (temp/340.0)+36.53

    # Get gyroscope values
    for i in range(4, 7):
        data = self.byte_to_float(response[i*2:i*2+2])
        self.gyroscope_data[i-4] =(self.PI/180)*data/self.gyro_divider

    # Get magnetometer values
    for i in range(7, 10):
        data = self.byte_to_float_le(response[i*2:i*2+2])
        self.magnetometer_data[i-7] = data * self.magnetometer_ASA[i-7]