zoukankan      html  css  js  c++  java
  • 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端获取的效果如下图:

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

    视频:

  • 相关阅读:
    SAP ABAP Development Tools in Eclipseのセットアップ
    SET UPDATE TASK LOCAL (ローカル更新 )
    SEARCH(文字の検索)
    OVERLAY(文字の上書き)
    ULINE(插入水平线)
    SKIP(插入空行)
    NO-ZERO(空格补全)
    CONVERT TEXT(转换为可排序格式)
    递归获取子节点
    生活小记
  • 原文地址:https://www.cnblogs.com/dreamfactory/p/5402691.html
Copyright © 2011-2022 走看看