Gainer勉強3回目:加速度センサ誤差修正
A very basic example on how to use an accelerometer
(without a smoothing filter)
ain 0: X
ain 1: Y
ain 2: Z
Reference
http://funnel.cc/Software/ActionScript3
加速度センサって誤差があって、デフォルトでは水平になってくれない・・・
ってことでどうにかまっすぐにしたい!
いろいろわかんなかったけどなんとかできました!
実行した0.5s後に傾きを設定。
モジュールのボタンを押しても傾きを設定できるようにしてみました。
GainerはAS2の説明はあるけどAS3はないですよね。
なんで、自分は1行ずつ自分なりの解釈で勉強します。
ちなみにAS3も初心者です(笑)
こういうことだよ!って突っ込みあったらご指導お願いします。
/**
* Copyright umi_kappa ( http://wonderfl.net/user/umi_kappa )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/xCKt
*/
// forked from kotobuki's Gainer Basic Example: Accelerometer
// forked from kotobuki's Gainer Basic Example: Analog Input
// forked from kotobuki's Gainer Basic Example: SignalScope
// A very basic example on how to use an accelerometer
// (without a smoothing filter)
//
// ain 0: X
// ain 1: Y
// ain 2: Z
//
// Reference
// http://funnel.cc/Software/ActionScript3
//加速度センサって誤差があって、デフォルトでは水平になってくれない・・・
//ってことでどうにかまっすぐにしたい!
//いろいろわかんなかったけどなんとかできました!
//実行した0.5s後に傾きを設定。
//モジュールのボタンを押しても傾きを設定できるようにしてみました。
//GainerはAS2の説明はあるけどAS3はないですよね。
//なんで、自分は1行ずつ自分なりの解釈で勉強します。
//ちなみにAS3も初心者です(笑)
//こういうことだよ!って突っ込みあったらご指導お願いします。
package {
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
import flash.text.TextField;
import flash.utils.*;
import funnel.*;
import funnel.gui.*;
import funnel.ui.*;
[SWF(width="600", height="500",backgroundColor="0x808080")]
public class GainerTest extends Sprite {
private var gio:Gainer;
private var scope:SignalScope;
//入力の状態を表示させるためのスコープクラス
private var yAxisPin:Pin;
//入出力ピン
private var board:Shape;
private var aa:Number = 0;
//調節用
private var myTextField:TextField;
//角度表示用
private var intervalId:uint = setTimeout(syoki_set, 5000);
//0.5s後に実行 wonderflでは速度遅いから5sにしました。 調節してください。
public function GainerTest() {
gio = new Gainer();
scope = new SignalScope(0, 5, 200, "ain 1 (y-axis)", -180, 180);
//signalScope(x,y,width,名前,最小値、最大値)
addChild(scope);
var gui:GainerGUI = new GainerGUI();
addChild(gui);
gio.gui = gui;
gui.setPosition(IOModuleGUI.LEFT_BOTTOM);
//スライダーのまとまりを左下に配置
board = new Shape();
board.graphics.lineStyle(5, 0xFFFFFF);
board.graphics.moveTo(-100, 0);
board.graphics.lineTo(100, 0);
board.x = 100;
board.y = 210;
this.addChild(board);
//ラインを表示させる
myTextField = new TextField();
this.addChild(myTextField);
myTextField.x = 220;
myTextField.y = 200;
myTextField.textColor = 0xffffff;
//テキストフィールド表示
yAxisPin = gio.analogInput(1);
//ain1を使う
yAxisPin.addFilter(new Scaler(0, 1, -180, 180, Scaler.LINEAR, true));
//addFilter フィルターを追加
//Scalerってなんよ??
//Scaler(入力の最小値,入力の最大値,出力の最小値,出力の最大値,
// マッピングに使用する曲線を表す関数,指定した範囲を超えた入力値を制限するか否か)
//0 ~ 1
//↑ ↑
// 対 応
//↓ ↓
//-180 ~ 180
//水平時0.5 垂直時2.5,7.5
//2.5 ~ 0.5 ~ 7.5
//↑ ↑ ↑
// 対 応
//↓ ↓ ↓
//-90 ~ 0 ~ 90
yAxisPin.addFilter(new Convolution(Convolution.MOVING_AVERAGE));
//Convolution.MOVING_AVERAGE 移動平均フィルタのカーネル なにそれ??
//ブレが少なくなるみたい
addEventListener(Event.ENTER_FRAME, loop);
gio.button.addEventListener(ButtonEvent.PRESS, btn_press);
//モジュールのボタンを押すと傾きを再設定する。
}
private function btn_press(e:ButtonEvent):void
{
syoki_set();
}
private function syoki_set():void{
aa = Math.floor(yAxisPin.value);
//trace(aa);
}
//0.5s後に実行される wonderflでは速度遅いから5sにしました。
//PCが信号を感知するのに時間がかかるみたいだから。ちょっと待って。
private function loop(event:Event):void {
scope.update(gio.analogInput(1));
//スコープの更新 ain1について
board.rotation = Math.floor(yAxisPin.value - aa);
//もともとの角度をaaに入れておいて、その後は角度からaaを引いてあげれば水平に。
myTextField.text = "角度 " + board.rotation + "°";
}
}
}