line_detector
役割
line_detector は LaserScan を 2D 点群へ変換し、RANSAC で直線を検出し、直線上の点列を線分へ分割します。
Interface
種別 |
名前 |
型 / 内容 |
|---|---|---|
subscribe |
|
|
publish |
|
|
publish |
|
|
publish |
|
|
parameter |
|
RANSAC 条件 |
parameter |
|
inlier 距離しきい値 \(d_{\mathrm{th}}\) |
parameter |
|
線分分割しきい値 \(g_{\mathrm{th}}\) |
scan 点変換
beam index \(i\) の角度と点は、
です。range と angle filter を通った点だけ使います。
RANSAC
2 点 \(p_1=(x_1,y_1)\)、\(p_2=(x_2,y_2)\) から直線を作ります。
正規化後の直線は \(ax+by+c=0\)、\(a^2+b^2=1\) です。
点 \(p_j\) の距離は、
inlier 集合は、
です。max_iterations 回の候補から \(|I|\) 最大の直線を選び、\(|I|>\mathrm{min\_inliers}\) の場合に採用します。
直交最小二乗 refine
inlier のサンプル集合 \(I_s\) から平均と共分散を求めます。
直線方向角は共分散の主軸です。
更新後の直線係数は、
採用後は inlier を削除して次の線を探します。
線分化
直線方向ベクトルと基準点を、
とします。inlier 点を射影します。
\(t_j\) で sort し、隣接点距離が次を満たす場所で分割します。
各クラスタ端の射影値から線分を作ります。
corner
2 直線の交点は、
です。\(|D|<10^{-8}\) は平行として無視します。
設定ファイル
sample では example/sample/config/sensing/config.yaml の line_detector.ros__parameters を使います。
key |
sample 値 |
数式上の意味 |
|---|---|---|
|
|
RANSAC 試行回数 |
|
|
検出する最大直線数 |
|
|
採用条件 {math}` |
|
|
refine に使う最大 inlier 数 |
|
|
inlier 条件 \(d_j<d_{\mathrm{th}}\) |
|
|
線分分割条件 \(g_{\mathrm{th}}\) |
|
|
scan 点 filter |
|
|
scan 点 filter |
rogi_nav.launch.py は同じ値から refinement_sample_count を抜き出し、launch argument ransac_refinement_sample_count としても渡します。結果として sensing_config_path の値を読み込んだ後、この値だけ明示上書きされます。
入力 topic は localization/config.yaml の topics.localization_scan で決まり、sample では /scan_for_localization です。profile 側では launch.components.sensing.line_detector.enabled が起動可否です。
scan の購読は SensorDataQoS(best effort)、線・線分・corner の publisher は深さ10です。test / nhk_2027 は sensing/<profile>/config.yaml を使用します。