Processing 电子罗盘校准(以 MPU9250为例)

  使用Processing 软件, 通过 arduino 输入 电子罗盘的数据,通过PC端进行校准,程序如下:

import processing.serial.*;

Serial myPort;
ArrayList<Float> xList = new ArrayList<Float>();
ArrayList<Float> yList = new ArrayList<Float>();
ArrayList<Float> zList = new ArrayList<Float>();

float minX,maxX;
float minY,maxY;
float minZ,maxZ;
float moX,moY;
float count;

void setup() {
  size(600, 600, P3D);
  myPort = new Serial(this,"COM5", 38400);
  myPort.bufferUntil(10);
}

void draw() {
  background(100);
  float midX = (minX+maxX)/2;
  float midY = (minY+maxY)/2;
  float midZ = (minZ+maxZ)/2;
  if (mousePressed) {
    moX= mouseX;
    moY= mouseY;
  }

  //camera(moX,moY, (height/2) / tan(PI/5), midX, midY,midZ, 0, 1, 0);
  camera(moX,moY,(height/2) / tan(PI/5), width/2, height/2,0, 0, 1, 0);
  translate(width/2, height/2, -100);
  strokeWeight(2);  // Default
  stroke(255);
  noFill();

  //x
  line(midX-100,midY,midZ,midX+100,midY,midZ);
  //y
  line(midX,midY+100,midZ,midX,midY-100,midZ);
  //z
  line(midX,midY,midZ-100,midX,midY,midZ+100);

  //box(200);

  for(int i = 0;i<xList.size();i++){
    point(xList.get(i),yList.get(i),zList.get(i));
  }
  println(count);
  println("midX:"+midX+","+"midY"+midY+","+"midZ:"+midZ);

}

void serialEvent (Serial myPort)
{

  float mX = 0;
  float mY = 0;
  float mZ = 0;
  String inString = myPort.readStringUntil(10);

  if (inString != null)
  {
   inString = trim(inString);
   String[] list = split(inString, ‘,‘);
   if(list.length ==4){
     count = float(list[0]);
     mX  = float(list[1])/100;
     mY  = float(list[2])/100;
     mZ  = float(list[3])/100;

     //-------------------------
     if(mX < minX){
       minX = mX;
     }

     if(mX > maxX){
       maxX = mX;
     }

     //----------------------------
     if(mY < minY){
       minY = mY;
     }

     if(mY > maxY){
       maxY = mY;
     }
     //----------------------------
     if(mZ > maxZ){
       maxZ = mZ;
     }
     if(mZ < minZ){
       minZ = mZ;
     }

     xList.add(mX);
     yList.add(mY);
     zList.add(mZ);
   } 

  }
}

  

arduino 代码如下:

   int mx,my,mz;
   :
   :
   :  略

    Serial.print(count);
    Serial.print(",");
    Serial.print(mx);  //Inclination X axis (as measured by accelerometer)
    Serial.print(",");
    Serial.print(my);  //Inclination X axis (estimated / filtered)
    Serial.print(",");
    Serial.print(mz);  //Inclination X axis (estimated / filtered)

    Serial.println("");
    count++;

  

PC端获取的效果如下图:

最终坐标系完全落入球内表示校准成功.

视频:

时间: 2024-08-01 02:14:36

Processing 电子罗盘校准(以 MPU9250为例)的相关文章

MWC四轴飞行器代码解读

MWC v2.2 代码解读annexCode() 红色是一些暂时没去顾及的部分,与我现在关心的地方并无太大关系. 函数对rcDate进行处理(去除死区,根据油门曲线,roll/pitch曲线,油门值,动态PID调整参数,在无头模式对于rcdata进行优化),生成rccommand值用于姿态控制.记录最大循环时间,最小循环时间,解锁时间,最大气压值.用LED表示一些传感器运行的状态.若定义了低压报警则进行电压测量. rccommand[油门]在0-1000之间  rccommand[roll/pi

ST集成传感器方案实现电子罗盘功能

原文地址http://www.dzsc.com/data/html/2010-11-29/87454.html 电子罗盘是一种重要的导航工具,能实时提供移动物体的航向和姿态.随着半导体工艺的进步和手机操作系统的发展,集成了越来越多传感器的智能手机变得功能强大,很多手机上都实现了电子罗盘的功能.而基于电子罗盘的应用(如Android的Skymap)在各个软件平台上也流行起来. 要实现电子罗盘功能,需要一个检测磁场的三轴磁力传感器和一个三轴加速度传感器.随着微机械工艺的成熟,意法半导体推出将三轴磁力

iOS 时间校准解决方案

背景 在 iOS 开发中,凡是用到系统时间的,都要考虑一个问题:对时.有些业务是无需对时,或可以以用户时间为准的,比如动画用到的时间.一些日程类应用等.但电商相关的业务大都不能直接使用设备上的时间,而是需要跟服务器校准后的时间,例如: 区间判断:一些优惠促销活动需要在 app 端判断当前是否在活动期间内.如果用户设备时间不准,会给用户错误的信息,导致投诉. 倒计时:各种秒杀.限时促销.未支付订单的失效等的倒计时.如果用户设备时间不准,会带来倒计时结束后刷新页面,状态没变化的问题.可以测试一下电商

最简单的视音频播放演示样例4:Direct3D播放RGB(通过Texture)

===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频播放演示样例2:GDI播放YUV, RGB 最简单的视音频播放演示样例3:Direct3D播放YUV,RGB(通过Surface) 最简单的视音频播放演示样例4:Direct3D播放RGB(通过Texture) 最简单的视音频播放演示样例5:OpenGL播放RGB/YUV 最简单的视音频播放演示样例

Hive: TApplicationException: Internal error processing get_partition_names 错误的解决方法

有时候,某些非常规的操作会导致将要建立数据库/表与保存在metastore里的数据库/表的信息发生冲突,导致无法建立相应的数据库/表.举个例子:如果没有使用常规的drop database/table去删除一个数据库或是表,而是直接在hdfs上删除了相应的文件夹或文件,比如:/user/hive/warehouse/xxxxx.db,然后当你重新试图使用建库脚本建库时,有可能会报出: FAILED: Execution Error, return code 1 from org.apache.h

MapReduce的模式、算法和用例

在这篇文章里总结了几种网上或者论文中常见的MapReduce模式和算法,并系统化的解释了这些技术的不同之处.所有描述性的文字和代码都使用了标准hadoop的MapReduce模型,包括Mappers, Reduces, Combiners, Partitioners,和 sorting.如下图所示: 基本MapReduce模式 计数与求和 问题陈述: 有许多文档,每个文档都有一些字段组成.需要计算出每个字段在所有文档中的出现次数或者这些字段的其他什么统计值.例如,给定一个log文件,其中的每条记

洛谷P2751 [USACO4.2]工序安排Job Processing

P2751 [USACO4.2]工序安排Job Processing 18通过 78提交 题目提供者该用户不存在 标签 难度普及+/提高 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 一家工厂的流水线正在生产一种产品,这需要两种操作:操作A和操作B.每个操作只有一些机器能够完成. Ioi96d1.gif 上图显示了按照下述方式工作的流水线的组织形式.A型机器从输入库接受工件,对其施加操作A,得到的中间产品存放在缓冲库.B型机器从缓冲库接受中间产品,对其施加操作B,得到的最终产品存放在输

Eureka 的 Application Service client的注冊以及执行演示样例

Eureka 服务器架起来了(关于架设步骤參考博客<Linux 下 Eureka 服务器的部署>),如今怎样把我们要负载均衡的服务器(也就是从 Application Client 接收请求并返回一个响应的 Application Service)注冊到 Eureka?本文以一个演示样例介绍 Eureka Application Service 客户端的 Eureka 生命周期(包含启动时的注冊.侍服演示样例.关闭时的取消注冊)情况.相信读完本文之后,读者能够对 Eureka 的 Applic

Java线程演示样例 - 继承Thread类和实现Runnable接口

进程(Process)和线程(Thread)是程序执行的两个基本单元. Java并发编程很多其它的是和线程相关. 进程 进程是一个独立的执行单元,可将其视为一个程序或应用.然而,一个程序内部同事还包括多个进程. Java执行时环境就是一个单独的进程,在它内部还包括了作为进程的各种类和程序. 线程 能够将线程看做轻量级的进程. 线程存在于进程其中,须要的资源开销较小.同一进程中的线程共享进程的资源. Java多线程 每个Java引用都仅仅要有一个线程 - 主线程(main thread).尽管后台