Arduino 与 MPU6050 姿态解算+ PROCESSING

买的MPU6050自带姿态解算大大减轻了上层处理器所做的工作。 通过熟悉了一下processing之后做了一个小例子更是感觉这个传感器的奇妙。

Arduino部分

主要是读取MPU6050数据并将采集到的欧拉角通过串口打印到上位机,采集数据很简单,MPU6050接到arduino mega2560的serial1上便可接收数据,然后通过serial传输到电脑上。MPU6050自带了卡尔曼滤波,所以上层更是直接使用了数据,观测得误差确实很少,很实用的传感器。

注: MPU6050使用的是串口模式,配置时掉电保存的,波特率为9600

#include <Wire.h>
byte A[11];

void setup()
{
	Serial.begin(115200);
	Serial1.begin(9600);
	Serial.println("initial ...");
	Serial1.write(0xff);
	Serial1.write(0xaa);
	Serial1.write(0x52);
	Serial1.flush();
	Serial.println("end");
}

static int counter=0;
char buffer[20];
void loop()
{
	if(counter==0&&A[0]==0x55)
	{
		int index=2;
		switch(A[1])
		{
			case 0x53:
			{

				float xa=(A[index]|(A[index+1]<<8))/32768.0*180;
				float ya=(A[index+2]|(A[index+3]<<8))/32768.0*180;
				float za=(A[index+4]|(A[index+5]<<8))/32768.0*180;
				//if(abs(temp-97.77)<3) break;
				//sprintf(buffer,"%lf,",xa);
				Serial.print("x=");
				Serial.println(xa);
				//sprintf(buffer,"%lf,",ya);
				Serial.print("y=");
				Serial.println(ya);
				//sprintf(buffer,"%lf",za);
				Serial.print("z=");
				Serial.println(za);
				A[0]=0;
				delay(50);
			}
				break;
			default:
			break;
		}
	}
}

void serialEvent1()
{
	while(Serial1.available())
	{
		A[counter]=Serial1.read();
		if(counter==0&&A[counter]!=0x55) return;
		counter=(counter+1)%11;
	}
}
void serialEvent()
{
	char buf[255];
	int i=0;
	while(Serial.available()) buf[i++]=Serial.read();
	buf[i]=0;
	if(strcmp("stop",buf)==0) Serial1.end();
	else if(strcmp("run",buf)==0) Serial1.begin(115200);
}

MPU6050的四根线连到arduino后便可源源不断地接收到数据,上传到电脑上的格式为:
 x=12.44

y=56.01

z=67.34

下面的processing程序会根据这个来解析收到的数据并且调整姿态。

Processing部分

processing这个程序昨天第一次听说,看到国外视频里有人做的模型看着实在舒服,所以也想尝试一下。虽然官网上称Processing为一门语言,不过个人感觉语法就是java+opengl+p3d+c++混合而成。传送门

通过arduino串口发送出来的消息,在processing接收处理,没有太多可说的,大致感觉下

processing

import processing.serial.*;
import processing.opengl.*;

Serial myserial;
float value[]=new float[4];
String rf[]=new String[4];
PGraphics graphics1;
PGraphics graphics2;
PGraphics graphics3;
PGraphics graphics4;
void setup()
{
  size(600,600,P2D);
  String name="COM5";
  myserial=new Serial(this,name,115200);
  smooth();
  for(int i=0;i<4;++i) value[i]=0;

   graphics1=createGraphics(298,298,OPENGL);
   graphics2=createGraphics(298,298,OPENGL);
   graphics3=createGraphics(298,298,OPENGL);
   graphics4=createGraphics(298,298,OPENGL);
   textMode(MODEL);
   textSize(32);
}
long lasttime=0;

void draw()
{
  frameRate(60);
  drawRect(graphics1,0,0,1,0); //FONT
  drawRect(graphics2,90,0,1,0);//lLEFT
  drawRect(graphics3,-90,1,0,0);//TOP
  drawRect(graphics4,90,1,1,0);//RANDOM

  image(graphics1,0,0);
  image(graphics2,300,0);
  image(graphics3,0,300);
  image(graphics4,300,300);
  fill(248,147,147);
  text("FONT VIEW",10,50);
  text("LEFT VIEW",310,50);
  text("TOP VIEW",10,350);
  text("RANDOM VIEW",310,350);
  lasttime=millis();
}

void drawRect(PGraphics pg,float rot,int x,int y,int z)
{
  pg.beginDraw();
  pg.lights();
  pg.background(126);
  pg.textSize(20);
  pg.fill(3,60,244);
  long framerate=1000/(millis()-lasttime);
  pg.text("fps:"+framerate,200,20);

  pg.fill(246,225,65);
  pg.translate(100,100,-100);
  pg.rotate(rot*PI/180,x,y,z);
  pg.rotateY(value[2]*PI/180);
  pg.rotateZ(-value[1]*PI/180);
  pg.rotateX(value[0]*PI/180);
  pg.box(50,50,100);
  pg.endDraw();
}
String st;
void serialEvent(Serial p)
{
    st=p.readStringUntil(10);
    if(st==null) return;
    if(st.indexOf("x=")!=-1)
    {
      value[0]=float(st.substring(2));
    }
    else if(st.indexOf("y=")!=-1)
    {
      value[1]=float(st.substring(2));
    }
    else if(st.indexOf("z=")!=-1)
    {
      value[2]=float(st.substring(2));
    }
}

另外做了一个演示视频 click

时间: 2024-12-05 04:36:06

Arduino 与 MPU6050 姿态解算+ PROCESSING的相关文章

四轴飞行器1.4 姿态解算和Matlab实时姿态显示

原创文章,欢迎转载,转载请注明出处 MPU6050数据读取出来后,经过一个星期的努力,姿态解算和在matlab上的实时显示姿态终于完成了. 1:完成matlab的串口,并且实时通过波形显示数据 2:添加RTT查看CPU使用率的扩展功能,MPU6050读取数据的优化 3:四元素表示的坐标变化,四元素与欧拉角的关系和Madgwick的IMUupdate算法 4:飞控数据采集线程和数据处理线程的安排,类似于生产者与消费者的关系. 先放个效果视频... 如果看不了视频,请打开视屏网址:http://v.

Pixhawk之姿态解算篇(1)_入门篇(DCM Nomalize)

一.开篇 慢慢的.慢慢的.慢慢的就快要到飞控的主要部分了,飞控飞控就是所谓的飞行控制呗,一个是姿态解算一个是姿态控制,解算是解算,控制是控制,各自负责各自的任务.我也不懂.还在学习中~~~~ 近期看姿态预计部分看的太累了,明显发现基础知识太薄弱,什么欧拉角.DCM.四元数.gyro误差.矫正.正交化等各个概念.然后就是各种转换公式.接下来结合代码介绍一些主要的东西.太深入的还不了解~~~ 一定要多看论文啊,英文版的论文(也没有中文的.国人的悲哀啊).尽管看着头疼,看是看完了以后就会发现很多不了解

[UVA]Pixhawk之姿态解算篇(2)

一.开篇 还是没能进入到源码部分研究,对姿态解算过程太过于模糊,所以主要开始研究一下关于姿态解算的过程和实现,本篇博文主要是以mahony的算法为基础理解姿态解算的过程,主要参考的论文就是William Premerlani and Paul Bizard的关于DCM的一篇经典论文<Direction Cosine Matrix IMU_Theory>,一定要搞透这偏论文,没看过它都不敢称自己研究过飞控算法:然后接下来还有madgwick和mahony的论文需要研究,看英文的比较费时间,但是还

卡尔曼(Kalman)滤波(六)--卡尔曼滤波的应用: 四元数卡尔曼滤波(QKF)的C代码实现姿态解算

0 引言 在捷联惯导工程实践[6]中,我们希望陀螺仪能够非常精确的获取信息,或者说希望陀螺仪能非常准确的地反映观测量(加速度,磁场等)[6,7]的真实值,但是这个过程或多或少是受到噪声干扰的,导致测量的不准确:为了能够让陀螺仪在状态更新时做到准确,必须对状态变量和观测量进行数据融合和滤波,从而尽最大限度的降低噪声的干扰. 最常用也最有效的方法非卡尔曼滤波莫属,其在处理高斯模型的系统上效果颇佳:随着计算机技术的发展,Kalman滤波的计算要求和复杂性已不再成为其应用中的阻碍,并且越来越受到人们的青

[UVA]Pixhawk之姿态解算篇(4)_补充篇

一.开篇 大家期待已久的第四篇来了,但是本篇可能比较水啊~~~见谅~~~ 首先,上一周没有什么收获,虽然看了不少的论文,但是却没有什么质的飞越~~~~ 看的论文都是关于姿态解算的,用的算法大部分也都是基于mahony算法的扩展,就当是深入理解一下姿态解算过程吧,稍微写写上周总结的一丁点的知识. 昨天开了一整天的会议,最终决定姿态解算部分还是需要用EKF做,慢慢搞吧,但是我还是先把姿态控制部分解决了,感觉这个部分也相当重要. 二.版权声明 博主:summer 声明:喝水不忘挖井人,转载请注明出处.

[UVA]Pixhawk之姿态解算篇(3)_源码姿态解算算法分析

一.开篇 终于到ardupilot源代码的姿态解算了,有了前期关于mahony姿态解算算法的基础以后,理解源代码的姿态解算算法就快多了,所有的东西都在脑海中初步有了一个框架:首先要做什么,然后再做什么,再然后捏~~~反正容易上手的. 2016.04.04日晚,别人都在嗨,而我却在实验室苦逼的工作着,今晚最大的收获就是发现了"新大陆"-----"北航可靠飞行控制研究组",其喜悦之情绝不亚于哥伦布发现新大陆.他们才是专业的啊,看看他们毕业生的去向,不是研究所就是出国深造

Arduino uno + mpu6050 陀螺仪 运用卡尔曼滤波姿态解算实验

MPU6050六轴陀螺仪 作用于四轴无人机,平衡车,机器人等等的电子实作当中,用于姿态判断,掌握了可以发挥自己的想象完成更多更有趣的作品. 本例程输出XYZ的角度,正负90度. 运用卡尔曼滤波算法解算姿态,感觉算是比较稳定,但好像有点偏移.大家好好学习参考,再改进吧. 输出效果 首先看看本例程XYZ轴的输出效果图: (时间曲线的体现是:静止姿态→摆动→恢复原静止姿态→拍动桌子→静止姿态) Bom表 Arduino Uno               *1 mpu6050 陀螺仪模块 *1 跳线

四轴飞行器6050六轴传感器软件姿态解算

使用MPU6050硬件DMP解算姿态是非常简单的,下面介绍由三轴陀螺仪和加速度计的值来使用四元数软件解算姿态的方法. 我们先来看看如何用欧拉角描述一次平面旋转(坐标变换): 设坐标系绕旋转α角后得到坐标系,在空间中有一个矢量在坐标系中的投影为,在内的投影为由于旋转绕进行,所以Z坐标未变,即有. 转换成矩阵形式表示为: 整理一下: 所以从旋转到可以写成 上面仅仅是绕一根轴的旋转,如果三维空间中的欧拉角旋转要转三次: 上面得到了一个表示旋转的方向余弦矩阵. 不过要想用欧拉角解算姿态,其实我们套用欧拉

软件姿态解算

使用MPU6050硬件DMP解算姿态是非常简单的,下面介绍由三轴陀螺仪和加速度计的值来使用四元数软件解算姿态的方法. 我们先来看看如何用欧拉角描述一次平面旋转(坐标变换): 设坐标系绕旋转α角后得到坐标系,在空间中有一个矢量在坐标系中的投影为,在内的投影为由于旋转绕进行,所以Z坐标未变,即有. 转换成矩阵形式表示为: 整理一下: 所以从旋转到可以写成 上面仅仅是绕一根轴的旋转,如果三维空间中的欧拉角旋转要转三次: 上面得到了一个表示旋转的方向余弦矩阵. 不过要想用欧拉角解算姿态,其实我们套用欧拉