查看: 1488|回复: 0
打印 上一主题 下一主题

圆点博士DMP库移植

[复制链接]
跳转到指定楼层
沙发
发表于 2015-10-7 14:45:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚才说到DMP移植,要上资料。
圆点博士的库:
我们移植的并不是官方的库,而是圆点博士的库,还包括他的I2C,两者是配套使用的。这个移植要比官方的简单。但是很想给官方和圆点博士点建议,多用点宏定义,不要老是retuen 0/1/2...绕晕了,还有那个发送用串口发送字符用起来太麻烦了,还要自己数多少个字符。添加圆点博士的文件到工程里面,该include的就include。
首先初始I2C、DMP、MPU6005如下:
        uart_init(115200);         //串口初始化为115200
        //引用圆点博士的I2C程序,这里跟我们平常没有什么区别
        ANBT_I2C_Configuration();                //IIC初始化
        AnBT_DMP_MPU6050_Init();                        //6050DMP初始化
复制代码

我稍微将他的程序改了下,一些英文的被我改为中文了,因为不习惯。^_^


接着定义一些变量,变量的意义如下:
        short gyro[3], accel[3], sensors;//陀螺仪存放数组,加速度存放数组,返回状态量
        unsigned char more;
        long quat[4];//四元数存放数组
        float Yaw=0.00,Roll,Pitch;//欧拉角
        float q0=1.0f,q1=0.0f,q2=0.0f,q3=0.0f;//计算姿态过程用到的变量
复制代码

接着用库函数读出四元数
dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors,&more);        
复制代码
计算欧拉角,里面包含了上面所说的将四元数转化为欧拉角的公式。
                 if(sensors&INV_WXYZ_QUAT)
                 {
                         q0=quat[0] / q30;
                         q1=quat[1] / q30;
                         q2=quat[2] / q30;
                         q3=quat[3] / q30;
                         Pitch = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; // pitch
                         Roll = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // roll
                         Yaw =         atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3;               
        //         printf("pitch: %.2f    roll:%.2f                yaw:%.2f\r\n",Pitch,Roll,Yaw);                //普通串口输出
                        Data_Send_Status(Pitch,Roll,Yaw,gyro,accel);
                        delay_init(72);
                 }           
复制代码
最后写一个符合你上位机通讯协议的发送程序,我的是匿名四轴最新版上位机,函数如下:
/*函数功能:根据匿名最新上位机协议写的显示姿态的程序
*具体原理看匿名的讲解视频
*/

void Data_Send_Status(float Pitch,float Roll,float Yaw,int16_t *gyro,int16_t *accel)
{
        unsigned char i=0;
        unsigned char _cnt=0,sum = 0;
        unsigned int _temp;
        u8 data_to_send[50];

        data_to_send[_cnt++]=0xAA;
        data_to_send[_cnt++]=0xAA;
        data_to_send[_cnt++]=0x01;
        data_to_send[_cnt++]=0;

        _temp = (int)(Roll*100);
        data_to_send[_cnt++]=BYTE1(_temp);
        data_to_send[_cnt++]=BYTE0(_temp);
        _temp = 0-(int)(Pitch*100);
        data_to_send[_cnt++]=BYTE1(_temp);
        data_to_send[_cnt++]=BYTE0(_temp);
        _temp = (int)(Yaw*100);
        data_to_send[_cnt++]=BYTE1(_temp);
        data_to_send[_cnt++]=BYTE0(_temp);

        data_to_send[3] = _cnt-4;
        //和校验
        for(i=0;i<_cnt;i++)
                sum+= data_to_send;
        data_to_send[_cnt++]=sum;

        //串口发送数据
        for(i=0;i<_cnt;i++)
                AnBT_Uart1_Send_Char(data_to_send);
}
复制代码
然后就可以了,就是这么简单!
最后把线接对,就可以了,还有把匿名的上位机视频真的好好看看,不然你有时都不知道你错在哪里!!!!!!!!!!
传上移植好的工程文件:
如果你想用官方的东西去移植也是可以的,我没有试过,但是我研究过别人的程序,我觉得跟圆点博士库的最大区别在于下面这个函数。实际上圆点博士已经讲初始化的步骤都包含在这个函数里面,这样子我们就不用一步一步去做,要了解究竟要做什么,去看这个函数就好。里面的内容一打开跟别人官方库移植的一对比你就会清楚的,官方的移植没有包含在这个函数里面而已。都差不多。
AnBT_DMP_MPU6050_Init();                        //6050DMP初始化
复制代码
上传官方文档:
阿莫上传文件太慢了,我直接上传到百度云盘给链接吧
DMP官方工程:http://pan.baidu.com/s/1pJoF4pl
用库但是思路跟上面移植差不多的工程:http://pan.baidu.com/s/1eQimoIe(没有试验过,不能保证可以运行)
就先写到这里了,以后如果有什么补充再发多几个帖子。卡尔曼滤波等问题还没有学会,等学会了也发个帖子。
如果有大神发现什么错误,跟我说下!!互相学习转载

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表