概要
電波を使った探知機。8つの目標を同時に検出でき、出力値は誤差を持つ。
出力値
出力されるデータは以下の表の通り。
LOGIC OUTPUTS(ロジック出力) | 詳細 |
---|---|
◆ Radar Rotation() | |
◆ Radar Data() | コンポジット出力 |
・On/Off channel 1~8 | 目標が現出された場合にオン信号が出力される |
・Number channel 1~4 | ターゲット1の相対距離・方位角・俯仰角・検出後更新されていない時間 |
・Number channel 5~8 | ターゲット2の相対距離・方位角・俯仰角・検出後更新されていない時間 |
… | … |
・Number channel 29~32 | ターゲット8の相対距離・方位角・俯仰角・検出後更新されていない時間 |
単位はそれぞれ距離[m]、角度[周]、時間[tick]である。
誤差
距離に対し±1%、角度に対し±0.001の誤差を持つ。誤差については詳しく後述する。
目標の座標を求める
初心者や数学に心得のない諸氏の中には、レーダーの情報を用いて目標の座標を求める方法を知らない方もいるだろう。ここでは、座標を求める第一段階として三角関数について解説し、まずは2次元、次いで3次元座標を求める方法について紹介する。
三角関数と極座標
画像参照元
一般的な三角関数に、sin(サイン, 正弦)、cos(コサイン, 余弦)、tan(タンジェント, 正接)がある。それぞれが表す成分は画像の通り。長さが1でθの偏角を持つ目標のx座標とy座標はそれぞれ(x,y)=(cosθ,sinθ)になる。つまり、もし長さがrでθの偏角を持つ目標があった場合、その座標は(x,y)=(rcosθ,rsinθ)となる。しかしStormworksで注意すべきなのは、θの基線が図とは異なりy軸で、加えて時計回りを正としている点である。詳細な説明は省くが、この違いによりStormworksにおける変換は(x,y)=(rsinθ,rcosθ)となる。
ここで重要なのは、「距離rと偏角θで表される目標は、座標xと座標yに変換することができる」ということである。rとθを用いた座標系を極座標、xやyを用いた座標系を直交座標と呼ぶ。
極座標から球面座標、2次元直交座標から3次元直交座標へ
画像参照元
画像のような形式で表される座標系を球面座標系と呼ぶ。極座標との唯一の違いは、θとφを用いて3次元的に点をみることができることである。数学的には、θやφは図のような基線と回転方向を持つ。極座標系と直交座標系は相互に変換できると先述したが、球面座標系についても同様で、(r,θ,φ)⇔(x,y,z)の変換が可能であり、画像参照元でも説明されている通り(x,y,z)=(rsinθcosφ,rsinθsinφ,rcosθ)である。計算方法は以下に簡易に示す。
水平方向について 長さr、偏角θより、水平距離 = rsinθ x = rsinθcosφ y = rsinθsinφ 垂直方向について 長さr、偏角θより、垂直距離 = z = rcosθ
しかし水平面同様Stormworksで注意すべきなのは、①θの基面がxy平面である、②φの基線がy軸で、時計回りが正である、の2点である。詳細な説明は省くが、この違いによりStormworksにおける変換は(x,y,z)=(rcosθsinφ,rcosθcosφ,rsinθ)となる。
相対座標と絶対座標
!作業中!
まず「相対」「絶対」の違いについてだが、例えば「前後左右」というのは、見る人の向きによって方向が変わってしまう。向き合っている二人がいるとき、一方にとっての「右」は、他方にとっての「左」になってしまう。一方で、「東西南北」は、だれにとっても不変的な方向の示し方である。「太陽は東から西へ沈む」といったら、誰しもが共通の方向を認識することができる。
この考え方は、座標にも存在する。「相対座標」と「絶対座標」と呼ばれるものがそれにあたるが、先述した計算は相対座標を求めるものに過ぎない。これを絶対座標にするには、相対座標の基準を絶対座標と同じ向きに回転させ、自身の絶対座標を足し合わせる必要がある。これには行列積を使用するため詳細な説明は省くが・・・
s = math.sin c = math.cos function onTick() self_X = input.getNumber(1) self_Y = input.getNumber(3) self_Z = input.getNumber(2) al = input.getNumber(4) be = input.getNumber(6) ga = input.getNumber(5) dst = input.getNumber(7) azi = input.getNumber(8) ele = input.getNumber(9) m = { {c(be)*c(ga), -s(ga), s(be)*c(ga)}, {c(al)*c(be)*s(ga) + s(al)*s(be), c(al)*c(ga), c(al)*s(be)*s(ga) - s(al)*c(be)}, {s(al)*c(be)*s(ga) - c(al)*s(be), s(al)*c(ga), s(al)*s(be)*s(ga) + c(al)*c(be)} } local_X = dst*s(azi)*c(ele) local_Y = dst*c(azi)*c(ele) local_Z = dst*s(ele) global_X = m[3][1]*local_Z + m[2][1]*local_Y + m[1][1]*local_X + self_X global_Y = m[3][2]*local_Z + m[2][2]*local_Y + m[1][2]*local_X + self_Y global_Z = m[3][3]*local_Z + m[2][3]*local_Y + m[1][3]*local_X + self_Z end
誤差の問題と抑制
レーダーは距離に対し±1%、角度に対し±0.001の誤差を持つと先述したが、これは例えば目標の真の相対距離が1000mの場合、水平面にして約251㎡、三次元的には約3158㎥の誤差を持つことになる。これは相当大きいうえ、目標の速度を求めるための時間微分はふつう誤差を増幅させる。このため、目標の位置・速度情報を火器管制など高度な用途で利用したい場合、この誤差を抑制するデジタルフィルタの設計が重要になる。なお、フィルタリングはレーダーの生データ(距離や角度)に適応するのではなく、算出後の座標に対して適応すべきである。
デジタルフィルタ
デジタルフィルタは、コンピュータの計算を用いてフィルタリングを行うフィルタである。ここでは初歩的なノイズフィルタであるローパスフィルタ(LPF)と、少し応用的なα-βフィルタ(ABF)について紹介する。
LPF
ローパスフィルタ(LPF, Low-Pass Filter)は、日本語では低域通過フィルタと呼ばれ、高周波成分を除去するために用いられる。レーダーのノイズは検出ごとに(つまり、これ以上細かくできない時間ごとに)値が変化するため、細かい変化を抑制するLPFはノイズのフィルタリングに最適である。
LPFは以下のようなアルゴリズムにより容易に実行できる。
k = 0.02 x = 0 function onTick() y = input.getNumber(1) x = x*(1-k) + y*k output.setNumber(1, x) end
この場合、yが入力された値(例えば、レーダーのデータ)であり、xがフィルタされた値である。上記のアルゴリズムを用いることにより、以下の画像のようなデータが得られる。
オレンジ色が真値、灰色がノイズが付与されたデータ、赤がLPFによりフィルタリングされたデータである。LPFはノイズをうまく除去できているが、真値とのずれ(位相ずれと呼ぶ)が顕著である。kは小さければ小さいほどフィルタ率が高くなるが、遅延が大きくなる。ふつうkは0~0.5の範囲で設定する。
ABF
α-βフィルタ(ABF, α-β Filter)はローパスフィルタの応用といえるフィルタで、LPFで問題となる遅延を解消するため、目標の推定速度を利用して補正を行う。
ABFは以下のようなアルゴリズムにより実行できる。
a = 0.02 b = 0.002 target_pred = 0 target_est = 0 target_ddt = 0 function onTick() target_current = input.getNumber(1) target_pred = target_est + target_ddt residual = target_current - target_pred target_est = target_pred + a*residual target_ddt = target_ddt + b*residual end
この場合、target_は目標で、currentは観測値、predは未来予測値、residualは残差、estは推定値、ddtは時間微分値(速度)である。上記のアルゴリズムを用いることにより、以下の画像のようなデータが得られる。
凡例はLPFの図に同じ。ABFはLPFとは異なり、直線的に移動する目標の位置をほとんど完璧に推定できている。ただし、αとβの設定が重要で、α=0.02に固定したとき、β=0.002の時はうまくフィルタリングできているが、β=0.02の時は振動が発生している。一般にβはαより小さくするのが好ましく、β=α/10程度を目安にするとよい。
LPFとABFの比較
ノイズが付加された正弦波を両フィルタでフィルタリングした場合のデータを示す。
正弦波のようにy=ax+bのような形で表せない関数を非線形関数と呼ぶ。LPFもABFもノイズをうまく除去できているが、LPFは遅延が、ABFはオーバーシュートが見られる。LPFはともかく、ABFは線形関数を推定することを目的としたフィルタであることには注意したい。今回の正弦波のような非線形関数を推定したい場合、非線形カルマンフィルタなどのより高度なフィルタが必要になる。