<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://www23.atwiki.jp/yahirohumpty/">
    <title>おべんきょうwiki</title>
    <link>http://www23.atwiki.jp/yahirohumpty/</link>
    <description>おべんきょうwiki</description>

    <dc:language>ja</dc:language>
    <dc:date>2011-03-24T01:31:58+09:00</dc:date>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="http://www23.atwiki.jp/yahirohumpty/pages/8.html" />
                <rdf:li rdf:resource="http://www23.atwiki.jp/yahirohumpty/pages/18.html" />
                <rdf:li rdf:resource="http://www23.atwiki.jp/yahirohumpty/pages/22.html" />
                <rdf:li rdf:resource="http://www23.atwiki.jp/yahirohumpty/pages/21.html" />
                <rdf:li rdf:resource="http://www23.atwiki.jp/yahirohumpty/pages/12.html" />
                <rdf:li rdf:resource="http://www23.atwiki.jp/yahirohumpty/pages/20.html" />
                <rdf:li rdf:resource="http://www23.atwiki.jp/yahirohumpty/pages/19.html" />
                <rdf:li rdf:resource="http://www23.atwiki.jp/yahirohumpty/pages/9.html" />
                <rdf:li rdf:resource="http://www23.atwiki.jp/yahirohumpty/pages/13.html" />
                <rdf:li rdf:resource="http://www23.atwiki.jp/yahirohumpty/pages/17.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="http://www23.atwiki.jp/yahirohumpty/pages/8.html">
    <title>パーティクルフィルタ</title>
    <link>http://www23.atwiki.jp/yahirohumpty/pages/8.html</link>
    <description>
      * パーティクルフィルタ

時系列フィルタの一種．
最適解を求めるためにモンテカルロ法を用いるのが特徴．
分野によっては別の名前で呼ばれたりする．
理論については下の北川先生の解説が詳しい．

http://www.ism.ac.jp/editsec/toukei/pdf/44-1-031.pdf

が，理論を説明するよりも実装がかなり簡単である．
実装例としては例えば下記のページ．

http://mist.suenaga.cse.nagoya-u.ac.jp/trac/wiki/Tutorial/Practice0

単純なアルゴリズムでありながら適用できる問題が多いので各方面で大人気．


* アルゴリズム

アルゴリズムは非常に簡単．

** リサンプリング

パーティクルを撒きなおす．
初期状態では一様に撒く．
前の状態である重み付きパーティクルを元に撒きなおす．
大きな重みの付いたパーティクルの周囲には多くの点を配置する．
当然配置の際には乱数を加える．

** 予測

各パーティクルを状態方程式に基づいて移動させる．
速度項がなければ何もしなくていい．
速度が十分遅ければ速度項を無視してもうまくいくことが多い．

** 重み付け

現在の観測とパーティクルの状態を元に尤度（ゆうど）を計算する．
尤度とはそのパーティクルがどれだけもっともらしいかということで，
全体の計算がやっていることは確率的な尤度の最大化である．
尤度がすなわちそのパーティクルの重みとなるが，
ここで正規化しておくとリサンプリングのときに
全体のパーティクルの何割を撒くかが直ちに決定できて便利

** 状態推定

パーティクルフィルタが計算するのは
パーティクルの分布によって表される確率密度である．
ので，現在の状態をそこから計算しなければいけない．
重み付き平均を取る，最大重みを持つパーティクルを使う，
など方法は色々ある．


* 尤度関数の設計

尤度関数を設計するときには，
- 確実に最適解付近で尤度が最大化されること
- 現在の観測に対してロバストであること
に気をつける．

前者はそもそもこの条件が満たされていないと正しい解が得られるはずがない．
後者については観測には外れ値が含まれるという前提を置けば必須．
誤差の二乗和を単にとるのではなく，M-estimatorを使ったり中央値を取ればよい．


* 他の時系列フィルタとの関係は？

カルマンフィルタ，拡張カルマンフィルタと比較する．

カルマンフィルタはシステムの状態方程式が線形で表せる必要があった．
拡張カルマンフィルタは状態方程式が非線形でもよいように拡張されている．
これに対し，パーティクルフィルタはぶっちゃけ尤度関数さえ定義できればなんでも解ける．
誤差共分散行列やヤコビアンの準備も要らないので非常に簡単に実装できる．

ただし，（拡張）カルマンフィルタが決定論的にひとつの解を出力する，i.e.計算が一回でよいのに対し．
パーティクルフィルタはパーティクルの数だけ尤度を計算しなければならない．
つまりパーティクル数をnとすると計算時間はO(n)に従う．

* 関連

高速な非復元抽出を行う Walker&#039;s alias method
http://d.hatena.ne.jp/koiti_yano/20070826/p1
http://d.hatena.ne.jp/higotakayuki2/20070826/p1    </description>
    <dc:date>2011-03-24T01:31:58+09:00</dc:date>
  </item>
    <item rdf:about="http://www23.atwiki.jp/yahirohumpty/pages/18.html">
    <title>同次座標変換行列</title>
    <link>http://www23.atwiki.jp/yahirohumpty/pages/18.html</link>
    <description>
      = 同次座標変換行列 =

並進と回転を一つの行列で表す方法

== 同次座標形式 ==

このページでは右手座標系としベクトルは列ベクトルであらわす．
同次座標形式では方向ベクトルと位置ベクトルを区別するための符号を最後に付加する．
変換行列を掛けることで座標変換の合成ができるため，定式化をしやすい．

== 変換行列の性質 ==

回転行列の行列式は
右手座標系では常に1になり，
左手座標系では常に-1になる．
一番最後の要素（4行4列目）は常に1になる．

== 実装形態 ==

システムや分野によって異なる．
* 工学では列ベクトル，右手座標系がもっとも一般的．
* OpenGLは行ベクトル，右手座標系．
* DirectXは行ベクトル，左手座標系．

== 変換 ==

変換行列の変換
&lt;math&gt;
{^0 T _1} {^1 T _2} =
\begin{bmatrix}
^0 R _1 &amp; ^0 t _1 \\
0 &amp; 1 \\
\end{bmatrix}
\begin{bmatrix}
^1 R _2 &amp; ^1 t _2 \\
0 &amp; 1 \\
\end{bmatrix}
=
\begin{bmatrix}
{^0 R _1}{^1 R _2} &amp; {^0 t _1}+{^0 R _1}{^1 t _2} \\
0 &amp; 1 \\
\end{bmatrix}
= {^0 T _2}
&lt;/math&gt;

位置ベクトルの変換
&lt;math&gt;
{^0 T _1} ^1 P =
\begin{bmatrix}
^0 R _1 &amp; ^0 t _1 \\
0 &amp; 1 \\
\end{bmatrix}
\begin{bmatrix}
^1 p \\
 1 \\
\end{bmatrix}
=
\begin{bmatrix}
{^0 t _1}+{^0 R _1}^1 p \\
1 \\
\end{bmatrix}
= {^0 P}
&lt;/math&gt;


== 逆変換=逆行列 ==

その性質上逆行列は乗算のみで記述できる．

&lt;math&gt;
\begin{bmatrix}
R &amp; t \\
0 &amp; 1 \\
\end{bmatrix}
^{-1}
=
\begin{bmatrix}
R^T &amp; -R^T t \\
0 &amp; 1 \\
\end{bmatrix}
&lt;/math&gt;


== 三次元における基本的な回転行列 ==

x,y,z各軸の回転行列

&lt;math&gt;
RotX( \phi ) =
\begin{bmatrix}
1 &amp; 0 &amp; 0 \\
0 &amp; \cos \phi &amp; - \sin \phi \\
0 &amp; \sin \phi &amp; \cos \phi
\end{bmatrix}
&lt;/math&gt;

&lt;math&gt;
RotY( \theta ) =
\begin{bmatrix}
\cos \theta &amp; 0 &amp; \sin \theta \\
0 &amp; 1 &amp; 0 \\
- \sin \theta &amp; 0 &amp; \cos \theta
\end{bmatrix}
&lt;/math&gt;

&lt;math&gt;
RotZ( \psi ) =
\begin{bmatrix}
\cos \psi &amp; - \sin \psi &amp; 0 \\
\sin \psi &amp; \cos \psi &amp; 0 \\
0 &amp; 0 &amp; 1
\end{bmatrix}
&lt;/math&gt;    </description>
    <dc:date>2011-02-11T20:11:41+09:00</dc:date>
  </item>
    <item rdf:about="http://www23.atwiki.jp/yahirohumpty/pages/22.html">
    <title>Inkscape</title>
    <link>http://www23.atwiki.jp/yahirohumpty/pages/22.html</link>
    <description>
      * Inkscape

フリーのドローツール。

公式サイト
http://inkscape.org/index.php?lang=ja


** extension

pythonスクリプトによるextensionが作れる。
情報が非常に少ない。


*** スクリプトの置き場所

Inkscape/share/extensionsに各種サンプルあり。
実行するにはInkscapeのメニューのextension（日本語版だとエクステンション）から選択。

*** スクリプトの書き方

extensionはSVGをstdinから受け取り、stdoutから出力する。
つまり単体で動作するpythonスクリプトであり、別プロセスとなる。

*** スクリプトの登録

.inx形式（中身はXML）の設定ファイルを作る。


*** 参考ページ

http://wiki.inkscape.org/wiki/index.php/Script_extensions
http://wiki.inkscape.org/wiki/index.php/PythonEffectTutorial
http://wiki.inkscape.org/wiki/index.php/Python_modules_for_extensions
http://wiki.inkscape.org/wiki/index.php/INX_extension_descriptor_format    </description>
    <dc:date>2011-01-22T19:47:36+09:00</dc:date>
  </item>
    <item rdf:about="http://www23.atwiki.jp/yahirohumpty/pages/21.html">
    <title>Fern</title>
    <link>http://www23.atwiki.jp/yahirohumpty/pages/21.html</link>
    <description>
      * Fern

画像中の特徴点マッチングを行うための手法．
SIFT,SURFとは異なり，
学習によって画像パッチをランダムに変形させたときの特徴を覚えておき，
照合時には画像変形を行わない．そのため高速にマッチングすることができる．

** OpenCV2における実装

sample/c/find_obj_ferns.cpp
にサンプルがある．

*** 下準備
GaussianBlurで平滑化
BuildPyramidで画像ピラミッド構築


*** 学習
LDetectorは特徴点抽出？
PatchGeneratorはパッチの変形にかかわるパラメータ？

PlanarObjectDetector::train()


*** マッチング
PlanarObjectDetector::operator()



** 参考サイト
- 作者サイト
-- http://cvlab.epfl.ch/alumni/oezuysal/ferns.html    </description>
    <dc:date>2010-12-07T18:33:03+09:00</dc:date>
  </item>
    <item rdf:about="http://www23.atwiki.jp/yahirohumpty/pages/12.html">
    <title>SURF</title>
    <link>http://www23.atwiki.jp/yahirohumpty/pages/12.html</link>
    <description>
      * SURF

Speeded Up Robust Feature.
SIFTと同様の機能を提供する．
64次元ベクトルで特徴ベクトルを構成する．
OpenCV1.1pre1から使えるようになり超便利．
OpenCVではSIFTと同じく128次元の特徴ベクトルで一つの特徴点を表す．
ただし互換性はなく，さらにラプラシアンの符号も考慮する必要がある．

** 参考リスト
- 作者サイト
-- http://www.vision.ee.ethz.ch/~surf/
- OpenCV1.1pre1以降のsamples/find_obj.cppに使い方が書いてある．    </description>
    <dc:date>2010-12-07T17:08:48+09:00</dc:date>
  </item>
    <item rdf:about="http://www23.atwiki.jp/yahirohumpty/pages/20.html">
    <title>Tamura features</title>
    <link>http://www23.atwiki.jp/yahirohumpty/pages/20.html</link>
    <description>
      * Tamura features

画像処理における特徴量．

** 特徴量の詳細

以下の六つの要素から特徴ベクトルを構成する．

$$ (f_{crs}, f_{con}, f_{dir}, f_{lin}, f_{reg}, f_{rgh}) $$

*** Coarsness

まず各点の $$ 2^n \times 2^n $$ サイズの近傍の平均を求める．
1-32あたりまでを使う？
点 $$ (x,y) $$ の $$ 2^k \times 2^k $$ 近傍の平均は以下のように求められる．

$$ A_k(x,y) = \sum _{i=x-2^{k-1}} ^{x+2^{k-1}-1} \sum _{i=y-2^{k-1}} ^{y+2^{k-1}-1} f(i,j)/2^{2k} $$

$$ f(i,j) $$ は点 $$ (i,j) $$ のグレーレベル．

次に自分の点を中心として対称となる位置にある
重なり合うことの無い領域同士の平均の差分を
各方向において各点で計算する．

水平の場合は
$$ E_{k,h} (x,y) = | A_k(x+2^{k-1},y) - A_k(x-2^{k-1},y) | $$
（？？？何方向くらいいるだろうか？？？）

次に各点において $$ E $$ を最大化する $$ k $$ を求め，ベストなウインドウサイズを求める．
$$ S_{best}(x,y)=2^k $$
$$ E_k = E_{max} = \max (E_1,E_2, \cdots E_L) $$
1-Lはkの範囲．

最後に画像中の各ピクセルの$$S_{best}$$の平均をとる．
$$ F_{crs} = (1/(m \times n)) \sum _i ^m \sum _j ^n S_{best}(i,j) $$
m,nは有効な画素範囲を示す．

（？？？Fとfの違いは何？？？）


*** Contrast

コントラストの定義は
$$ f_2 = \sum _n n^2 ( \sum \sum _{|i-j|=n} p(i,j)) $$
$$ p(i,j) $$ は $$ n \times n $$ の gray-level spatial dependence matrix
（？？？この上の定義は触れただけで使っていないのでは？？？）

画像中のグレーレベルの分布から
尖度$$ \alpha _4 $$を以下のように求める．
$$ \alpha _4 = \mu _4 / \sigma ^4 $$
$$ \mu _4 $$ は四次モーメント，
$$ \sigma ^2 $$ は分散，$$ \sigma $$ は標準偏差．
$$ F_{con} = \sigma / \alpha _4 ^n $$
nは実験的に1/4がよいらしい．


*** Directionality

各画素のエッジのマグニチュードと角度を求める．
$$ | \Delta G | = (| \Delta _H | + | \Delta _V |)/2 $$
$$ \theta = \tan ^{-1} ( \Delta _V / \Delta _H ) + \pi /2 $$
$$ \Delta _H , \Delta _V $$ はそれぞれ水平，垂直方向のPrewittフィルタをかけた画像．

次にヒストグラム $$ H_D $$ を求める．

$$ H_D (k) = N _{\theta} (k) / \sum _{i=0} ^{n-1} N _{\theta} (i) $$
kは0から(n-1)まで．
$$ N _{\theta} (k) $$ は
$$ (2k-1) \pi /2n \le \theta &lt; (2k+1) \pi /2n $$ 且つ $$ | \Delta G | \ge t $$を満たす点の数．

元の文献ではn=16,t=12としている．

ここから $$ F_{dir} $$ を以下のように求める．
$$ F_{dir} = 1-r n_p \sum _p ^{n_p} \sum _{ \phi \in w_p } ( \phi - \phi _p ) ^2 H_D ( \phi ) $$
$$ n_p $$ はピークの数，
$$ \phi _p $$ は $$ H_D $$ のp番目のピーク，
$$ w_p $$ はp番目のピークの範囲，
$$ r $$ は $$ \phi $$ に関連した正規化要素，
$$ \phi $$ は0からn-1までの方向をあらわすコード．

ただし，ピークが二つ以上のときは考慮していない．

$$ H_D (v_{12}) / H_D ( \phi _2 ) &lt; 0.5 ,$$
$$ H_D (v_{21}) / H_D ( \phi _2 ) &lt; 0.5 ,$$
$$ H_D ( \phi _2 ) / H_D ( \phi _1 ) &gt; 0.2 $$
の三条件を満たすなら$$ n_p=2 $$,そうでないなら$$ n_p=1 $$.
ここで
$$ v_{12} $$ はピーク $$ \phi _1 , \phi _2 $$ の間の極小値の位置．
$$ v_{21} $$ はピーク $$ \phi _2 , \phi _1 $$ の間の極小値の位置．

（？？？サイクリックなので成り立つということか？？？）
（？？？二つのピークはどう決めるか？？？）


*** Line-likeness

$$ F_{lin} = \sum _i ^n \sum _j ^n P_{Dd}(i,j) \cos |(i-j)2 \pi / n | / \sum _i ^n \sum _j ^n P_{Dd}(i,j) $$

$$ P_{Dd} $$ は $$ n \times n $$の local direction co-occurrence matrix of points at distance.
ここのnというのはDirectionalityで作ったnと同じ，つまりエッジ勾配の方向を表している．
i,jもエッジ勾配の方向で，つまり画像中の各点において，
ある点pにおける勾配方向がiであったときにその勾配方向にdだけ移動し，
そのときの点qの勾配方向をjとする．これで(i,j)を決定できる．
そのときのp,qにおける勾配の大きさが$$ \Delta |G_p| \le t , \Delta |G_q| \le t $$を満たすなら+1．

（？？？ここの解釈は果てしなく怪しい？？？）
（？？？dの決め方についてはd=4でRosenfeldのd4距離関数を使っていると書いてあるように読める？？？）


*** Regularity

上の四つの各特長量の標準偏差から計算する．
$$ F_{reg} = 1-r ( \sigma _{crs} + \sigma _{con} + \sigma _{dir} + \sigma _{lin}) $$
（？？？標準偏差はどうやって計算するの？？？）
（？？？一般的かどうかを見ているということだから複数の画像から出揃ったところで計算するもの？？？）

*** Roughness

Coarsness と Contrast の和．従属変数？
$$ F_{rgh} = F_{crs} + F_{con} $$


** 参考文献
- Tamura, H., Mori, S., &amp; Yamawaki, T. (1978). Textural features corresponding to visual perception. IEEE Transaction on Systems, Man, and Cybernetics, 8(6), 460–472.    </description>
    <dc:date>2010-11-26T16:09:07+09:00</dc:date>
  </item>
    <item rdf:about="http://www23.atwiki.jp/yahirohumpty/pages/19.html">
    <title>C++で使える行列演算ライブラリ</title>
    <link>http://www23.atwiki.jp/yahirohumpty/pages/19.html</link>
    <description>
      * C++で使える行列演算ライブラリ

ちょろっと調べてみたものなので間違いあるかもしれません．

| 名称          | ライセンス | BLASの知識 | 逆行列計算 | 固有値分解 | Windows対応 |
| uBLAS (boost) | Boost Software License | いる | LUを使う | 単体ではできない？ | OK |
| CLAPACK       | BSD | いる | LUを使う | できる | OK |
| LAPACK++      | BSD | いる | LUを使う | できる | OK |
| BLITZ++       | GPL | いらない | できない | できない | 制限あり |
| tvmet         | GPL | いらない | できない | できない | OK |
| gsl           | GPL | いる | LUを使う | できる | ポートしたものはある |
| Eigen         | GPL | いらない | 直接書ける | できる | OK |
| liboctave     | GPL | いらない | 直接書ける | できる | OK |
| IT++ (itpp)   | GPL | いらない | 直接書ける | できる | 難易度高い？ |

** uBLAS
- http://www.boost.org/
- みんなだいすきBoostの一部

** CLAPACK
- http://www.netlib.org/clapack/
- LAPACK(Fortran)のC版

** LAPACK++
- http://math.nist.gov/lapack++/
- CLAPACKをさらにC++にしたもの

** Blitz++
- http://www.oonumerics.org/blitz/

** tvmet
- http://tvmet.sourceforge.net/

** gsl
- http://www.gnu.org/software/gsl/

** Eigen
- http://eigen.tuxfamily.org/index.php?title=Main_Page
- ROSでも使われている

** liboctave
- http://www.gnu.org/software/octave/
- gnu octaveをc++から使えるようにしたもの
- ATLAS,FFTW3に依存している

** IT++
- http://sourceforge.net/apps/wordpress/itpp/
- BLAS,LAPACK,FFTW3に依存している


* 公式以外の参考文献

- http://vision.kuee.kyoto-u.ac.jp/~hiroaki/numerical/wiki/
-- liboctave,IT++の詳解    </description>
    <dc:date>2010-11-03T21:24:40+09:00</dc:date>
  </item>
    <item rdf:about="http://www23.atwiki.jp/yahirohumpty/pages/9.html">
    <title>カルマンフィルタ</title>
    <link>http://www23.atwiki.jp/yahirohumpty/pages/9.html</link>
    <description>
      * カルマンフィルタ

誤差が正規分布であると考えられるときに現在の状態と誤差分布を求めることができる．
ここでは構成法にのみ注目する．
詳しい解説についてはWikipediaか関連書籍を読むとよい．

カルマンフィルター - Wikipedia
http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AB%E3%83%9E%E3%83%B3%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC


** 利用するために必要な定式化

とりあえず決めなければならないことは，
状態ベクトル $$x_t$$ と計測ベクトル $$z_t$$ の構成である．

それができたら，状態方程式を構成する．
$$x_t = A_t x_{t-1} + B_t u_t + e_t$$
$$u_t$$は入力ベクトル，$$e_t$$は誤差ベクトルである．
だが，ここで注目すべきは$$e_t$$は誤差項なので計算に直接は関わらないこと．
決めなければいけないのは$$e_t$$の共分散行列$$R_t$$である．
i.e. $$R_t$$は$$x_t$$の誤差共分散行列．

次に計測方程式を構成する．
$$z_t = C_t x_t + d_t$$
現在の状態から計測値を求めるということに注意．単なる推定の逆になっている．
ここでも$$d_t$$は誤差項なので決めなくてよい.
$$d_t$$の共分散行列$$Q_t$$を決める．
i.e. $$Q_t$$は$$z_t$$の誤差共分散行列．

まとめると，カルマンフィルタでするべきことは，
- $$x_t$$と$$z_t$$を決める．ついでに$$u_t$$も決める．
- $$x_t$$と$$x_{t-1}$$の関係から$$A_t$$を決める．
- $$u_t$$と$$x_t$$の関係から$$B_t$$を決める．
- $$x_t$$と$$z_t$$の関係から$$C_t$$を決める．
- $$x_t$$の構成要素から$$R_t$$を決める．
- $$z_t$$の構成要素から$$Q_t$$を決める．

肝は$$R_t$$と$$Q_t$$をどう決めるかである．
適当な値を入れても計算はできるが簡単に発散する．
むやみに小さな値を入れても発散する．
うまいこと調整するといい．


** アルゴリズム

一時刻前の状態を$${\mu}_{t-1}$$ ,共分散を$${\Sigma}_{t-1}$$とすると，

+ $$\bar{{\mu}_t} = A_t {\mu}_{t-1} + B_t u_t$$
+ $$\bar{{\Sigma}_{t-1}} = A_t {\Sigma}_{t-1} A_t^T + R_t$$
+ $$K_t = \bar{{\Sigma}_{t-1}} C_t^T ( C_t \bar{{\Sigma}_{t-1}} C_t^T +Q_t )^{-1}$$
+ $${\mu}_t = \bar{{\mu}_t} + K_t ( z_t - C_t \bar{{\mu}_t} )$$
+ $${\Sigma}_t = ( I - K_t C_t ) \bar{{\Sigma}_{t-1}}$$


* 拡張カルマンフィルタ

カルマンフィルタはすべてが線形でないと構成できない．
拡張カルマンフィルタは線形化を施すことで非線形に拡張したもの．


** 利用するために必要な定式化

まずは状態方程式と計測方程式を立てる．カルマンが非線形なだけだから問題ないはず．
すなわち状態方程式と計測方程式はそれぞれ次のようになる．

$$x_t = g(x_{t-1},u_t) + e_t$$
$$z_t = h(x_t) + d_t$$

ここで問題なのは状態関数$$g(x_{t-1},u_t)$$と計測関数$$h(x_t)$$のヤコビアン$$G_t,H_t$$を求める必要があること．
場合によっては超難しいが高校数学を駆使すればできなくもない．
あとはMathematicaを使おう．ただし最初から使うと泥沼化しかねないので注意．

拡張カルマンフィルタですべきことは,
- 基本的にはカルマンのときと一緒だが，
- $$A_t$$の代わりに$$g(x_{t-1},u_t)$$を決める．
- $$C_t$$の代わりに$$h(x_t)$$を決める．
- $$g(x_{t-1},u_t)$$の$$x$$に関するヤコビアン$$G_t$$を求める．
- $$h(x_t)$$の$$x$$に関するヤコビアン$$H_t$$を求める．


** アルゴリズム

カルマンフィルタの一部を$$g,h,G,H$$に直しただけ．

+ $$\bar{{\mu}_t} = g( {\mu}_{t-1} . u_t )$$
+ $$\bar{{\Sigma}_{t-1}} = G_t {\Sigma}_{t-1} G_t^T + R_t$$
+ $$K_t = \bar{{\Sigma}_{t-1}} H_t^T ( H_t \bar{{\Sigma}_{t-1}} H_t^T +Q_t )^{-1}$$
+ $${\mu}_t = \bar{{\mu}_t} + K_t ( z_t - h( \bar{{\mu}_t} ))$$
+ $${\Sigma}_t = ( I - K_t H_t ) \bar{{\Sigma}_{t-1}}$$


* 補足

カルマンフィルタ，拡張カルマンフィルタは長いのでKF,EKFと略されることが多い．
誤差が正規分布にのっとらない場合は素直に[[パーティクルフィルタ]]使おう．


* 参考文献

Thrun et. al.: &quot;確率ロボティクス&quot; , 毎日コミュニケーションズ , 2007.
Amazon.co.jp： 確率ロボティクス (ROBOT books): Sebastian Thrun, Wolfram Burgard, Dieter Fox, 上田 隆一: 本
http://www.amazon.co.jp/%E7%A2%BA%E7%8E%87%E3%83%AD%E3%83%9C%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9-ROBOT-books-Sebastian-Thrun/dp/4839924015/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1222852098&amp;sr=8-1    </description>
    <dc:date>2010-10-07T16:07:34+09:00</dc:date>
  </item>
    <item rdf:about="http://www23.atwiki.jp/yahirohumpty/pages/13.html">
    <title>クォータニオン</title>
    <link>http://www23.atwiki.jp/yahirohumpty/pages/13.html</link>
    <description>
      = クォータニオン =

「四元数」とも呼ばれる．
三次元回転をコンパクトに表現できる，補間がやりやすいなどの利点があるが，
結局同次座標変換行列に落とさないと使えなかったりする．
直感的でないという最大の欠点がある．

== 回転を表すクォータニオン ==

普通のクォータニオンは

&lt;math&gt;q = (w \ V) = (w \ x \ y \ z)&lt;/math&gt;

とかあらわされる．&lt;math&gt;V = (x \ y \ z)&lt;/math&gt;は虚部．

回転を表すクォータニオンの場合，大きさが1のクォータニオンとなる．
回転量を&lt;math&gt; \theta &lt;/math&gt;,回転軸を&lt;math&gt;(n_x \ n_y \ n_z)&lt;/math&gt;としたときこれをあらわすクォータニオンは

&lt;math&gt;(\cos \theta /2 \ \ n_x \sin \theta /2 \ \ n_y \sin \theta /2 \ \ n_z \sin \theta /2)&lt;/math&gt;

当然，全要素の符号を反転させても同じ回転を表現できる．
なお，

&lt;math&gt;-q = (-w \ -V) = (-w \ -x \ -y \ -z)&lt;/math&gt;これは同じ回転を意味し

&lt;math&gt;q^{-1} = (w \ -V) = (w \ -x \ -y \ -z)&lt;/math&gt;これは逆回転を意味する

== 基本的な演算 ==

クォータニオンの乗算の定義は

&lt;math&gt; q_0 q_1 = ( w_0 \ V_0 ) ( w_1 \ V_1) = (w_0 \ x_0 \ y_0 \ z_0) (w_1 \ x_1 \ y_1 \ z_1)&lt;/math&gt;

&lt;math&gt; = (w_0 w_1 - V_0 \cdot V_1  \ \ w_0 V_1 + w_1 V_0 + V_0 \times V_1 ) &lt;/math&gt;

&lt;math&gt; = \left( \begin{array}{c} w_0 w_1 - x_0 x_1 - y_0 y_1 - z_0 z_1 \\ w_0 x_1 + x_0 w_1 + y_0 z_1 - z_0 y_1 \\ w_0 y_1 + y_0 w_1 + z_0 x_1 - x_0 z_1 \\ w_0 z_1 + z_0 w_1 + x_0 y_1 - y_0 x_1 \\ \end{array} \right) &lt;/math&gt;

ちなみに

&lt;math&gt; V_0 \cdot V_1 = x_0 x_1 + y_0 y_1 + z_0 z_1 &lt;/math&gt;

&lt;math&gt; V_0 \times V_1 = (y_0 z_1 - z_0 y_1 \ \ z_0 x_1 - x_0 z_1 \ \ x_0 y_1 - y_0 x_1) &lt;/math&gt;


回転を表すクォータニオンを合成するときは単純に乗算すればよい．


クォータニオンaをbで回転させてクォータニオンcをつくる場合．

&lt;math&gt; c = b^{-1} a b &lt;/math&gt;

コーディングの際にはたぶん展開しても簡単にならないと思うので素直に乗算で組んでしまうのがいいと思う．


== 他の表現との変換 ==

回転行列の作り方

右手座標列ベクトル形式として，

&lt;math&gt;
\begin{bmatrix}
1-2y^2-2z^2 &amp; 2xy-2wz &amp; 2xz+2wy \\
2xy+2wz &amp; 1-2x^2-2z^2 &amp; 2yz-2wx \\
2xz-2wy &amp; 2yz+2wx &amp; 1-2x^2-2y^2 \\
\end{bmatrix}
&lt;/math&gt;


回転行列からの作り方


= 回転ベクトル:axis-angle =

OpenCVでは「回転ベクトル」と呼ばれている．
回転軸＊回転角度で表される．三次元．

回転量を&lt;math&gt; \theta &lt;/math&gt;,回転軸を&lt;math&gt;(n_x \ n_y \ n_z)&lt;/math&gt;としたとき

&lt;math&gt; q_a = (\theta n_x \ \ \theta n_y \ \ \theta n_z) &lt;/math&gt;

回転の合成は直接計算では得ることができない．
クォータニオンとの変換は簡単なのでそこを経由するとよい．


== 変換 ==

回転行列への変換はRodoriguesの公式を使う．



= 対数クォータニオン:exponential map =

&lt;math&gt; q_0 \times q_1 = \exp ( \ln (q_0) + \ln (q_1)) &lt;/math&gt;

ということらしい．
が，実際には定義どおりにやってもこうはならない模様．

表現形式は文献，実装によって異なるようだが最終的に座標変換がうまくいっていれば問題はない？
DirectXでは

&lt;math&gt; \ln (w V) = (0 \ \ (\phi / \sin \phi ) V) , \phi = \cos ^{-1} w &lt;/math&gt;

axis-angleとの違いがよくわからない．





= 参考文献 =

* 四元数で回転 入門
** http://staff.aist.go.jp/toru-nakata/quaternion.html
* F. Dunn, I. Parberry, 松田晃一:「実例で学ぶゲーム3D数学」，オライリージャパン．
** http://www.oreilly.co.jp/books/9784873113777/
* 3D空間における回転の表現形式 - TMPSwiki
** http://www.tmps.org/index.php?3D%B6%F5%B4%D6%A4%CB%A4%AA%A4%B1%A4%EB%B2%F3%C5%BE%A4%CE%C9%BD%B8%BD%B7%C1%BC%B0#ya68a83d
* クォータニオン逆運動学 - TMPSwiki
** http://www.tmps.org/index.php?%A5%AF%A5%A9%A1%BC%A5%BF%A5%CB%A5%AA%A5%F3%B5%D5%B1%BF%C6%B0%B3%D8#ra10d054    </description>
    <dc:date>2010-10-07T16:05:30+09:00</dc:date>
  </item>
    <item rdf:about="http://www23.atwiki.jp/yahirohumpty/pages/17.html">
    <title>三次元点群の姿勢あわせ</title>
    <link>http://www23.atwiki.jp/yahirohumpty/pages/17.html</link>
    <description>
      = 三次元点群の姿勢あわせ =

対応が取れている三次元点群同士の姿勢あわせを一発で解く方法

== 定義 ==

文献中のクォータニオン表現は虚部，実部の順になっている．

&lt;math&gt;q = (V \ w) ^T = (x \ y \ z \ w) ^T &lt;/math&gt;

以下この表現に合わせる．

クォータニオンを行列に変換する式を定義する．

&lt;math&gt;
 Q(q) =
 \begin{bmatrix}
 wI + \lambda (V) &amp; V \\
 -V^T &amp; w
 \end{bmatrix} 
=
 \begin{bmatrix}
 w &amp; -z &amp; y &amp; x \\
 z &amp; w &amp; -x &amp; y \\
 -y &amp; x &amp; w &amp; z \\
 -x &amp; -y &amp; -z &amp; w
 \end{bmatrix} 
&lt;/math&gt;

&lt;math&gt;
 W(q) =
 \begin{bmatrix}
 wI - \lambda (V) &amp; V \\
 -V^T &amp; w
 \end{bmatrix}
=
 \begin{bmatrix}
 w &amp; z &amp; -y &amp; x \\
 -z &amp; w &amp; x &amp; y \\
 y &amp; -x &amp; w &amp; z \\
 -x &amp; -y &amp; -z &amp; w
 \end{bmatrix} 
&lt;/math&gt;

ただしここで&lt;math&gt;\lambda (V)&lt;/math&gt;は三次元ベクトルの外積行列である．

&lt;math&gt;
\lambda (V) =
 \begin{bmatrix}
 0 &amp; -V_z &amp; V_y \\
 V_z &amp; 0 &amp; -V_x \\
 -V_y &amp; V_x &amp; 0
 \end{bmatrix} 
&lt;/math&gt;

また，位置ベクトルに対応するクォータニオンを以下のように定義する．

&lt;math&gt; p = 1/2 (p_x \ p_y \ p_z \ 0) ^T &lt;/math&gt;

== 座標変換計算 ==

点対応の取れている二つの点群&lt;math&gt;
^0 p _i , ^1 p _i , i = 1 \ldots k 
&lt;/math&gt;が与えられたとき，座標系0から1への変換行列を求める．

まず，以下の行列を計算する．

&lt;math&gt;
C_1 = -2 \sum _{i=1} ^k \alpha _i Q( ^1 p _i ) W( ^0 p _i )
&lt;/math&gt;

&lt;math&gt;
C_2 = \sum _{i=1} ^k \alpha _i I
&lt;/math&gt;

&lt;math&gt;
C_3 = 2 \sum _{i=1} ^k \alpha _i (W( ^0 p _i ) - Q( ^1 p _i )) 
&lt;/math&gt;

&lt;math&gt;
A=(1/2) ( C_3^T ( C_2 + C_2^T ) ^{-1} C_3 - C_1 - C_1^T )
&lt;/math&gt;

ここで&lt;math&gt;\alpha _i&lt;/math&gt;は各点に対する重み．

次に，&lt;math&gt;A&lt;/math&gt;を固有値分解し最大固有値に対応する固有ベクトル&lt;math&gt;r = (V_r \ w_r)&lt;/math&gt;を求める．

最後に求めた&lt;math&gt;r&lt;/math&gt;から回転行列&lt;math&gt;R&lt;/math&gt;と並進ベクトル(のクォータニオン表現であることに注意)&lt;math&gt;t&lt;/math&gt;を求める．

&lt;math&gt;
R=( w_r^2 - V_r^T V_r ) I + 2 V_r V_r^T + 2 w_r \lambda (V_r)
&lt;/math&gt;

&lt;math&gt;
t=-W(r)( C_2 + C_2^T )^{-1} C_3 r
&lt;/math&gt;

なお，

&lt;math&gt;( C_2 + C_2^T )^{-1} = 1 / (2 \sum _{i=1} ^k \alpha _i) I &lt;/math&gt;

である．

== 参考文献 ==
Walker, Shao, Volz; &quot;Estimating 3-D Location Parameters Using Dual Number Quaternions&quot;, CVGIP, Vol. 54, No. 3, pp. 358-367, 1991.    </description>
    <dc:date>2010-10-04T20:30:03+09:00</dc:date>
  </item>
  </rdf:RDF>

