モーションコントロール用テストプログラム
とりあえずセンサーが動いていることを確認するもの。
手持ちの端末が古いので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
加速度センサからの出力を扱う場合、受け取ったそのままの値は、細かく変動していることがよくあります。こうした値をそのままパラメータにマッピングしてしまうと、本来は必要な動きまで反映されてしまうことになります。対象としている動きが比較的ゆっくりしたものである場合、不必要な速い動きをカットすると、スムーズな変化が得られます。
このような目的に適したフィルタには様々なものがありますが、ここでは移動平均によるフィルタを紹介します。