以下に示すマーカーオブジェクトの配列によりマーカーの地図を定義する。
"マーカーオブジェクトのフォーマット" { "id":110, "pos":[7.45,-2.25,0.0], "mat":[[1.0,0.0,0.0], [0.0,1.0,0.0],[0.0,0.0,1.0]], "size":4.5 }
id -- ARマーカーのID pos -- 絶対座標におけるマーカー中心の位置 mat -- 絶対座標における、マーカー座標系(後述)の各基底の方向 size -- マーカー一辺の長さ
※1 マーカーのサイズ、および位置の長さは同じ単位である
※2 マーカー座標系は、マーカーを正面に見た時、X(右方向)、Y(上方向)、Z(紙面奥方向)により構成される座標系である 【訂正】X(右)、Y(上)、Z(手前)に変更
####サンプルコード //THREExを用いて画像、動画などを取得 var imageGrabbing = new THREEx.ImageGrabbing("images/test2.jpg"); //var imageGrabbing = new THREEx.VideoGrabbing("videos/sample.3gp");
//画像ないし動画を表示
document.body.appendChild(imageGrabbing.domElement);
//画像ないし動画を格納しているHTML要素(?)
var domElement = imageGrabbing.domElement;
//位置推定を行うインスタンス
var estimater = new POSITEST.positionEstimater(map);
//位置推定に成功するまで繰り返し
var timerID = setInterval(function (){
//位置の取得を行う
//戻り値は{"x":カメラ位置座標 ,"R":カメラ座標系(後述)の方向余弦行列 "f":カメラの焦点距離(後述)}
var pos = estimater.est_pos(domElement);
if(!(pos==null)){
clearInterval(timerID);
}
}, 1000);
※1 カメラ座標系は、カメラの画像の右、上、奥行き方向がそれぞれI,J,Kとなるような座標系。方向余弦行列の各行がそれぞれグローバル座標系におけるI,J,Kの値となっている。 【訂正】I(右),J(上),K(手前)に変更
※2 カメラの焦点距離について。今回は、カメラの撮像素子の横幅が1(単位はグローバル座標系と同じ)であると仮定した。各clientのカメラの視野が持つ自由度には焦点距離を推定することによって対応した。 例えばfの値が2.0である場合は、カメラから距離2.0だけ離れた横辺の長さが1.0の平面に透視投影したことになる。
vendor/js-aruco/aruco.js の220行目付近にあるhammingDistance関数のローカル変数idsに、マーカーのパターンを追加することで対応できるARマーカーの数を増やすことができる。 (正直このあたりの処理はよくわかっていない) マーカーを正面に見た時、外枠を除いた内部5*5の領域がパターンとなっている(黒が0で白が1)。このidsには、このパターンの上4行分を上から順番に格納した配列を追加することで、マーカーに対応できる。
【訂正】マーカーを追加するに当たり、とくに上記の変更を行う必要は無い。ARマーカーは2ビットのデータビットと、3つのパリティビットにより構成されており、計4種のビット列しか用いられない。 これはどのマーカーについても同じ(はず)なので、特に追加する必要は無い
位置推定については、カメラの焦点距離とカメラの位置を両方同時に推定。単純な二乗誤差平均により解を求めている。
ただし焦点距離も同時に推定しているため、全てのマーカーまでの距離が等しい場合に、焦点距離を定められずに解がおかしくなる カメラの焦点距離(視野)を取得する方法があるのであればそちらの情報を使う用に変更したい