モーションコントロール用テストプログラム

とりあえずセンサーが動いていることを確認するもの。
手持ちの端末が古いのでMIDP1.0用。

MotionTest.java

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class MotionTest extends MIDlet{
  public void startApp(){
    MotionCanvas canvas = new MotionCanvas();
    Display.getDisplay(this).setCurrent(canvas);
    new Thread(canvas).start();
  }
  public void pauseApp(){}
  public void destroyApp(boolean b){}
}

MotionCanvas.java

import javax.microedition.lcdui.*;
import com.j_phone.system.*;
public class MotionCanvas extends Canvas implements Runnable {
  PostureInfo pi;
  public void run() {
    try{
      MotionDetectiveSensor mds = MotionDetectiveSensor.getDefaultMotionDetectiveSensor();
      mds.startSensor(mds.POSTURE_INFO,mds.CYCLE_100);
      while(true){
        while(mds.getStackCount()==0) Thread.sleep(200);
        pi = mds.getPostureInfoLatest();
        repaint();
      }
    }catch(Exception e){}
  }
  public void paint(Graphics g) {
    int fh = g.getFont().getHeight()+1;
    int lt = g.LEFT|g.TOP;
    g.setColor(255,255,255);
    g.fillRect(0,0,getWidth(),getHeight());
    g.setColor(0,0,0);
    g.drawString("MotionSensorTest",0,0,lt);
    if(pi==null) return;
    g.drawString("Count:"+pi.getCount(),0,fh*1,lt);
    g.drawString("Field:"+pi.getField(0,1)[0],0,fh*2,lt);
    g.drawString("DynAccX:"+pi.getDynamicAccelerationX(0,1)[0],0,fh*3,lt);
    g.drawString("DynAccY:"+pi.getDynamicAccelerationY(0,1)[0],0,fh*4,lt);
    g.drawString("StaAccX:"+pi.getStaticAccelerationX(0,1)[0],0,fh*5,lt);
    g.drawString("StaAccY:"+pi.getStaticAccelerationY(0,1)[0],0,fh*6,lt);
    g.drawString("Yaw:"+pi.getYaw(0,1)[0],0,fh*7,lt);
    g.drawString("Roll:"+pi.getRoll(0,1)[0],0,fh*8,lt);
    g.drawString("Pitch:"+pi.getPitch(0,1)[0],0,fh*9,lt);
  }
}

取得値がばたつくときの対策

移動平均によるスムージング
加速度センサからの出力を扱う場合、受け取ったそのままの値は、細かく変動していることがよくあります。こうした値をそのままパラメータにマッピングしてしまうと、本来は必要な動きまで反映されてしまうことになります。対象としている動きが比較的ゆっくりしたものである場合、不必要な速い動きをカットすると、スムーズな変化が得られます。
このような目的に適したフィルタには様々なものがありますが、ここでは移動平均によるフィルタを紹介します。

http://gainer.cc/wiki/index.php?title=Tutorial/Basic/MaxMSP/04/ja