emcl2
役割
emcl2 は likelihood field model の Monte Carlo Localization です。particle \(x_i=(x_i,y_i,\theta_i)\) を多数持ち、odom による予測と LiDAR scan による重み更新を繰り返します。
Interface
種別 |
名前 |
型 / 内容 |
|---|---|---|
subscribe |
|
|
subscribe |
|
|
subscribe |
|
|
publish |
|
|
publish |
|
|
publish |
|
|
service |
|
|
tf |
|
推定 pose と odom pose から計算 |
尤度場
OccupancyGrid の占有 cell \(m(q)>50\) から尤度場 \(L(q)\) を作ります。占有 cell から grid 距離 \(d\) だけ離れた cell の値は、実装上は x/y の最大距離に対する線形減衰です。
ここで \(o\) は占有 cell、\(R=\lceil\mathrm{laser\_likelihood\_max\_dist}/\Delta\rceil\)、\(\Delta\) は map resolution です。範囲外は 0 です。
Motion update
odom から前回 pose \(o_{t-1}\) と現在 pose \(o_t\) の差分を求めます。
並進距離と移動方向は、
です。odom noise の標準偏差は、
です。各 particle は正規乱数 \(\epsilon_l\sim N(0,\sigma_l^2)\)、\(\epsilon_\theta\sim N(0,\sigma_\theta^2)\) を使って移動します。
Sensor update
LiDAR の base frame 内 pose を \(T_L^B=(x_L,y_L,\theta_L)\) とします。particle \(x_i\) 上での LiDAR 位置は、
beam \(k\) の hit 点は、
です。particle likelihood は valid beam の尤度場値の和です。
重みは乗算更新されます。
その後、重み和 \(S=\sum_i w_i\) が十分大きい場合だけ正規化します。
Expansion reset
ExpResetMcl2 は壁貫通率を使って破綻を検出します。抽出した particle 集合 \(P_s\) について、scan ray が地図上の壁を貫通した particle 数を \(n_p\)、検査数を \(n\) とします。
\(\alpha < \alpha_{\mathrm{th}}\) の場合、全 particle を局所的に散らします。
ここで、
です。\(r_e\) は expansion_radius_position、\(\theta_e\) は expansion_radius_orientation です。
Resampling と推定値
正規化後は systematic resampling を行います。累積分布 \(C_i=\sum_{j\le i}w_j\) に対し、
を置き、\(C_i\ge u_m\) となる particle を複製します。
推定 pose は particle 平均です。
yaw は wrap の影響を避けるため、通常平均と \(\pi\) shift した平均の分散を比較して小さい方を採用します。共分散は particle 分布から計算し、localization_pose に入れます。
設定ファイル
sample では example/sample/config/localization/emcl2/config.yaml の emcl2.ros__parameters を使います。rogi_nav.launch.py は localization.method == emcl2 のとき、この YAML を emcl2 composable node に渡します。
key |
sample 値 |
数式上の意味 |
|---|---|---|
|
|
filter loop 周波数 \(f\)、周期 \(T=1/f\) |
|
|
|
|
|
出力 pose / TF の global frame |
|
|
odom frame |
|
|
robot base frame |
|
|
valid beam 集合 \(V\) の range 条件 |
|
|
beam 間引き幅 |
|
|
初期 particle pose |
|
|
particle 数 \(N\) |
|
|
expansion reset 条件 \(\alpha<\alpha_{\mathrm{th}}\) |
|
|
reset 時の位置揺らし半径 \(r_e\) |
|
|
reset 時の角度揺らし幅 \(\theta_e\) |
|
|
壁貫通率を計算する particle 抽出率 |
|
|
壁貫通判定の連続角度幅 |
|
|
壁貫通 beam から pose を直接補正するか |
|
|
\(\sigma_{ff}\) |
|
|
\(\sigma_{fr}\) |
|
|
\(\sigma_{rf}\) |
|
|
\(\sigma_{rr}\) |
|
|
尤度場の影響距離 |
example/sample/config/localization/config.yaml は localizer 共通の選択と topic remap を持ちます。
key |
sample 値 |
対応 |
|---|---|---|
|
|
|
|
|
|
|
|
odom TF / topic 名の前提 |
|
|
|
profile 側の launch.components.localization.emcl2.enabled が false なら、method=emcl2 でも起動しません。