机器人姿态(05):姿态获取
无论小米的平衡车还是MW的飞行器,内部均有IMU:Inertial Measurement Unit。常见的IMU是日本Invensense公司产品。
Invensense公司早期的MPU3050只是三轴陀螺仪,后期的MPU6050增加了三轴加速度计变为六轴,最新的MPU9150增加了三轴电子罗盘变为九轴。
MPU全系列支持I2C总线,最新的9150支持I2C和SPI。
使用方法,可以直接用原始数据,自己做算法;或者使用其DMP:Digital Motion Processor处理过的数据。第一种方法可以熟悉内部过程,但是由九轴数据计算姿态的过程需要涉及大量浮点数和三角运算,可能降低闭环系统的带宽。
- I2C总线
I2C总线使用2条双向的串行线,一条数据线SDA另一条是时钟线SCL,SDA传输数据是大端传输,每次传输一个byte即8个bit。
一般很少使用专用的接口芯片,都是用单片机口线来模拟总线协议。例如SCL为高电平期间,SDA由高电平向低电平跳变的跨越,即意味着开始信号,可以开始传送数据。可以从读写AT24CXX这类I2C总线的器件入手,来熟悉协议。
/******************************************************************************
函数名称:I2C_Start
函数功能:起始信号
入口参数:无
返回值:无
备注:无
*******************************************************************************/
void I2C_Start(void)
{
//时钟线在高电平时,数据线由高变低即为开始信号
I2C_SDA_1 = 1;
_DELAY_;
I2C_SCL_1 = 1;
_DELAY_;
I2C_SDA_1 = 0;
_DELAY_;
I2C_SCL_1 = 0;
_DELAY_;
}/******************************************************************************
函数名称:I2C_SendOneByte
函数功能:发送一个数据
入口参数:ucData要发送的数据
返回值:无
备注:无
*******************************************************************************/
void I2C_SendOneByte(uchar ucData)
{
uchar i;for(i = 0;i < 8;i++) {
I2C_SDA_1 = ucData & 0x80; //高位在前发出
I2C_SCL_1 = 1;
_DELAY_;
I2C_SCL_1 = 0;
ucData <<= 1; //左移一位
}
- T宝模块
T宝上面有很多现成模块:
把SCL/SDA/VCC/GND接到任一个开发板就可以试验。
注意ADO要接地,这样模块地址是0XD0。
- 使用原始数据
{
I2C_WriteOneByteOnAddr(0,PWR_MGMT_1,0x00); //解除休眠状态
I2C_WriteOneByteOnAddr(0,SMPLRT_DIV,0x07); //陀螺仪采集频率, 1KHz
I2C_WriteOneByteOnAddr(0,CONFIG, 0x06); //低通滤波频率, 截止频率是1K,带宽是5K
I2C_WriteOneByteOnAddr(0,ACCEL_CONFIG, 0x01); //加速计自检、测量范围及高通滤波频率,例程是+/-2g,
//灵敏度16384lsb/G
I2C_WriteOneByteOnAddr(0,GYRO_CONFIG, 0x18); //陀螺仪自检及测量范围,典型值0x18:不自检,量程是+/-2000deg/s
//灵敏度是 16.4lsb/(deg/s)
}
- 使用DMP数据
DMP 是指 MPU内部集成的运动处理单元,可以直接运算出四元数和姿态,不再需要另外进行数学运算。
void init_MPU9150 (void)
{
I2C_WriteBits (1, 0x6B,2,3,0×01); //电源管理
I2C_WriteBits (1, 0x1B,4,2,0×00); //设置陀螺仪量程 250/s
I2C_WriteBits (1, 0x1C,4,2,0×00); //设置加速度量程 2G
I2C_WriteBit (1, 0x6B,6,1); //电源管理MUP进入睡眠模式
InitDmp();
I2C_WriteBit(1,0x6A,2,1); //复位 FIFO
I2C_WriteBit(1,0x6A,7,1); //使能DMP
}