matlab-simulate-radar-detections について
radarScenario 内の radarDataGenerator を使い、検出レベルの統計的なレーダーシミュレーションを行う MATLAB スキルです。ハードウェア仕様や性能要件をシナリオ設定に落とし込み、波形レベルのモデル化との違いも明確にします。
主な機能
- 01radarScenario と radarDataGenerator の設定
- 02ハードウェア仕様からシミュレーション値を導出
- 03スキャン、ターゲット、検出性能のモデル化
- 04スキャン方式とカバレッジの比較
- 05トラッキング用検出データの生成
活用シーン
- 01移動ターゲットの検出評価
- 02機械走査と電子走査の比較
- 03レーダーのカバレッジや配置の検討
- 04トラッカー向け検出データの生成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ matlab/ matlab-agentic-toolkit --skill matlab-simulate-radar-detectionsインストール後、Claude Code で/matlab-simulate-radar-detectionsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
manifest.yamlreferences/coordinates-and-transforms.mdcoupled-parameters.mddetection-model.mdfov-and-scan.mdinteraction-flow.mdradar-equation-tools.mdrequirements-sheet-template.mdterrain-clutter-atmosphere.mdtrajectories.mdvisualization.md詳細
レーダーデータ生成器 — 統計的検出シミュレーション
radarScenario 内で radarDataGenerator を使用して、検出レベルのレーダーシミュレーションを構築します。このスキルは、ユーザーのハードウェア仕様や性能要件を Radar Toolbox の統計シミュレーション API に結び付けます。
使用する場面
- ユーザーが移動するターゲットのレーダー検出をシミュレーションしたい場合
- ユーザーがレーダーのハードウェア仕様(データシート)や性能要件を持ち、シミュレーションを構築したい場合
- ユーザーが監視レーダー、スキャン、再訪時間、検出確率、レーダーのカバレッジについて言及した場合
- ユーザーがスキャン戦略(機械式、電子式、ハイブリッド)を比較したい場合
- ユーザーがトラッカー(trackerGNN、trackerJPDA)に渡す検出データを生成したり、センサーフュージョンを行ったりしたい場合
- ユーザーがモンテカルロ解析、トレードスタディ、またはリンクバジェット予測に対する検証を行いたい場合
- ユーザーがカバレッジを最大化するためのレーダー配置やジオメトリを調べている場合
- ユーザーが既存の
radarDataGeneratorコードを使用しているが、未検出や設定エラーなどの問題がある場合 - ユーザーがシミュレーション結果を期待される性能に照らして検証したい場合
使用しない場面
- ユーザーが I/Q レベルの波形シミュレーションを必要としている場合(
radarTransceiverとパルスドップラーチェーンを使用してください) - ユーザーが CFAR 検出器の設計やビームフォーミングを必要としている場合
- ユーザーが波形設計を必要としている場合(曖昧度関数、チャープ最適化)
- ユーザーがすでに検出データを持っており、それを処理したい場合
- ユーザーがバイスタティックまたはマルチスタティックレーダーの構成を必要としている場合
- ユーザーが干渉やジャミングのモデル化を必要としている場合(EW シナリオ)
- ユーザーがカスタムシミュレーションループで
radarScenarioを使わずにradarDataGeneratorを単独で呼び出したい場合
ユーザーが信号レベルの忠実度を必要としている場合は、トレードオフを説明して引き継いでください。
検出経路
radarDataGenerator は、2 つの検出経路をサポートしています。このスキルでは、ターゲット姿勢経路のみを使用します。
| 経路 | 呼び出しシグネチャ | 検出を決定する要素 | 使用場面 |
|---|---|---|---|
| ターゲット姿勢(このスキル) | detect(scenario) | DetectionProbability、FalseAlarmRate、ReferenceRange、ReferenceRCS | 標準的なレーダーシミュレーション — ターゲットを軌道を持つプラットフォームとして定義します |
| 放射信号 | detect(scenario, propagatedEmissions) | Sensitivity、DetectionThreshold | ESM 受信機、明示的な放射信号の伝搬を伴うバイスタティック構成 |
一方の経路のプロパティは、もう一方の経路にはまったく影響しません。ターゲット姿勢経路で Sensitivity または DetectionThreshold を設定すると、「関連なし」という警告が表示されます。
スタンドアロンモード: radarDataGenerator はシナリオの外でも呼び出せます:[dets, numDets, config] = rdg(targetPoses, simTime)。カスタムループ(Simulink、イベント駆動型)への統合に使用します。このモードでは、advance()、軌道の自動化、マルチセンサー集約、カバレッジの可視化は利用できません。スタンドアロン API と姿勢構造体の要件については、references/detection-model.md を参照してください。
ワークフロー
以下の 9 つのステップを対話形式で進めてください。パラメーターを黙って選択してはいけません。各判断点でユーザーに確認してください。
ステップ 1:アプローチの提案
radarScenario 内で radarDataGenerator を使用する統計レベルのシミュレーションを提案してください。シナリオ設計をすばやく反復できる一方で、信号処理の制御性は低くなるというトレードオフを説明してください。ユーザーが I/Q レベルの忠実度を必要としている場合は、代替手段(radarTransceiver + パルスドップラー + CFAR)を示し、構造化された 9 ステップのフローを終了してください。
統計レベルのシミュレーションをユーザーが確認したら、アプローチを伝え、使用する API(radarScenario、radarDataGenerator、platform、waypointTrajectory/kinematicTrajectory/geoTrajectory)を示してください。
ステップ 2:ユースケースを確認する
ユースケース(例:地上から特定のセクターを走査する監視)を提案します。以下を確認します。
- 走査タイプ: 機械走査を提案し、電子走査または両方を選択肢として提示します。
- 座標系: NED(デフォルト)、ENU、または地球中心座標系。各座標系の影響を説明します。
- 構成: モノスタティックであることを確認します。
- 伝搬環境: デフォルトは FreeSpace(屈折なし)です。ユーザーが長距離、仰角の低いターゲット、または見通し線外について言及した場合は、大気モデル
atmosphere(scenario, model)を提示します。選択肢は'EffectiveEarth'(半径の 4/3)、'RefractivityGradient'、または'CRPL'です。これらは伝搬経路に屈折バイアス(光線の湾曲)を加え、報告されるターゲット位置に影響しますが、リンクバジェットに大気減衰を加えるものではありません。気象や降水は統計的なレベルではモデル化されません。
ステップ 3:パラメーターの指定方法を確認する
「どの方向で進めますか?トップダウン(要件を指定してハードウェアを導出)、ボトムアップ(ハードウェアを指定して性能を導出)、それとも両方を組み合わせますか?」
ユーザーがデータシートを提示した場合は、references/coupled-parameters.md のデータシート取り込み手順に従います。パラメーターを抽出し、グループに対応付け、不足項目を特定し、リンクバジェットを確定して、矛盾があれば明示します。
ここでフローが分岐します。
トップダウンの経路(ステップ 4 → 5):ユーザーがまず性能要件を指定し、その後ハードウェアを導出します。
- ステップ 4:基準性能(距離、RCS、Pd、Pfa)を提案します。
- ステップ 5:関連パラメーターの表を提示し、要件を満たすために必要なハードウェアを導出します。
ボトムアップの経路(ステップ 5 → 4):ユーザーがまずハードウェアを指定し、その後性能を導出します。
- ステップ 5:関連パラメーターの表を提示し、ハードウェア仕様(電力、ゲイン、NF、帯域幅など)を収集します。
- ステップ 4:ハードウェアから
radareqrngを使って基準性能を導出し、提示します。
混合/データシート: ユーザーが提示した情報を収集し、両方の方向から不足項目を補い、矛盾があれば明示します。
どちらの経路もステップ 6(ターゲットセットの設計)に合流します。
ステップ 4:基準性能を提案する
基準ターゲット仕様として、以下を提示します。
- 基準距離、基準 RCS(
ReferenceRCSの単位は dBsm であることに注意) - 検出確率、誤警報率(有効範囲:[1e-7, 1e-3])
- 積分タイプとパルス数(コヒーレントを前提とし、N または CPI を確認)
- モノスタティック、晴天
トップダウン: 具体的なデフォルト値を提示します。ユーザーに確認し、変更を受け付けます。
ボトムアップ: ユーザーのハードウェアから導出した値を提示します。導出過程(使用した関数と入力値)を示します。積分についてはコヒーレントを前提とし、パルス数または CPI の継続時間を確認します。必要な SNR には detectability(Pd, Pfa, 1, 'SwerlingN') - 10*log10(N) を使います。Swerling 引数は文字列です:'Swerling0'、'Swerling1'、…、'Swerling4'。コヒーレントシステムでは、detectability に N を渡してはいけません。これは非コヒーレント損失を適用します。詳しくは references/interaction-flow.md § ステップ 4 の完全な判断表を参照してください。
ステップ 5:関連パラメーターの表を提示する
references/coupled-parameters.md にあるパラメーター間の関係を示す表を提示します。これにより、信頼性と追跡可能性を示し、修正を促します。
トップダウン: 表を使って、合意した基準性能を満たすために必要なハードウェアを導出します。 ボトムアップ: 表を使ってユーザーのハードウェア仕様を収集し、制約されているグループを特定します。
ステップ 6:ターゲットセットの設計
幾何条件(レーダーの配置、走査セクター、空中ターゲット)を確認します。次の項目が異なる、実際の環境を反映したターゲットを提案します。
- RCS(UAV:約 0.01 m²、戦闘機:約 1 m²、民間航空機:約 10 m²)
- 速度(回転翼機:50 m/s、ジェット機:250 m/s、高速移動体:300 m/s 以上)
- 高度(低空飛行:500 m、中高度:5 km、高高度:10 km)
Swerling モデル(I=緩やかな変動、III=支配的な散乱体)を提案します。各プラットフォームの Signatures プロパティにある rcsSignature で、ターゲットごとの RCS を設定します。設定例については、references/detection-model.md を参照してください。デフォルトのプラットフォーム RCS は 10 dBsm(Swerling0)です。
続行する前の健全性チェック:
-
horizonrange(antennaHeight)を使用して、ターゲットの位置がレーダーの地平線内にあることを確認します。指定された高度で LOS を超えるターゲットがある場合は、ユーザーにその旨を伝えます。 -
各ターゲットについて、Pd 0.9 の基準距離を計算します。次のような表を提示します。
| ターゲット | RCS (dBsm) | Swerling | 距離 (km) | 予測 Pd |
|---|---|---|---|---|
| UAV | -20 | 1 | 15 | 0.72 |
| 戦闘機 | 0 | 1 | 40 | 0.95 |
次の式を使用します:SNR_at_R = RadarLoopGain + RCS_dBsm - 40*log10(range)。その後、正しい Swerling の式で SNR を Pd に変換します(references/radar-equation-tools.md を参照)。予測 Pd が 0.5 未満のターゲットがあれば、その旨を伝えます。ユーザーがシミュレーションを実行する前に、検出の信頼性が低いターゲットを把握できるようにします。
次のように質問します。「地形や地上反射が必要ですか。それとも自由空間で十分ですか?」
ステップ 7:地形/遮蔽
該当する場合は、地形のオプションについて references/terrain-clutter-atmosphere.md を参照してください。検出を自由空間で検証した後に、地形と遮蔽を追加します。landSurface は標高マップ、seaSurface は海況、customSurface はユーザー定義のサーフェスに使用します。landSurface には LOS の遮断を判定する occlusion() があります。radarDataGenerator の HasOcclusion はターゲット間の遮蔽を示します。
ステップ 8:シミュレーション時間
秒数、走査回数、ターゲットへの照射回数、イベントベースのいずれかで、ユーザーが指定する単位を尋ねます。走査パラメーターが確定したら、これらの単位を相互に換算します。
ステップ 9:要件シートの作成
3 つのセクションからなる独立したドキュメントを生成します。references/requirements-sheet-template.md を参照してください。
主な機能
| 機能 | 用途 | ツールボックス |
|---|---|---|
radarScenario | シナリオのコンテナ(プラットフォーム、時間、検出) | Radar |
radarDataGenerator | 統計的検出センサー | Radar |
platform | シナリオにプラットフォームを追加 | Radar |
waypointTrajectory | ローカル座標でのウェイポイントベースの動作(ReferenceFrameを持ちます) | Radar |
kinematicTrajectory | ローカル座標での状態ベースの動作(ReferenceFrameはありません) | Radar |
geoTrajectory | 測地座標(緯度/経度/高度)でのウェイポイントベースの動作 — IsEarthCentered = trueが必要です | Radar |
radareqrng | レーダー方程式から最大検出距離を算出 | Radar |
radareqpow | 必要な送信電力 | Radar |
radareqsnr | 距離における受信SNR | Radar |
detectability | Pd/Pfa/N/Swerlingに必要なSNR(検出可能性係数) | Radar |
albersheim | Pd/Pfa/Nに必要なSNR(Swerling 0のみ) | Phased Array |
shnidman | Pd/Pfa/N/Swerling 0~4に必要なSNR | Phased Array |
horizonrange | アンテナ高からレーダーの見通し距離を算出 | Radar |
height2el | 目標の高度と距離から仰角を算出 | Radar |
freq2wavelen | 周波数から波長を算出 | Phased Array |
rangeres2bw | 距離分解能から帯域幅を算出 | Phased Array |
bw2rangeres | 帯域幅から距離分解能を算出 | Phased Array |
speed2dop | 速度からドップラーシフトを算出。片道の規約 — モノスタティックの往復の場合:fd = 2*speed2dop(v, lambda) | Phased Array |
dop2speed | ドップラーシフトから速度を算出。片道の規約 — モノスタティックの往復の場合:v = dop2speed(fd, lambda)/2を使用するか、直接lambda*fd/2を使用します | Phased Array |
beamwidth2gain | 半値幅からアンテナ利得を算出。[azBW; elBW]の列ベクトルを渡す必要があります — スカラーの場合は対称ビームを仮定します。 | Phased Array |
aperture2gain | 有効開口面積からアンテナ利得を算出 | Phased Array |
gain2aperture | アンテナ利得から有効開口面積を算出 | Phased Array |
ap2beamwidth | 開口長と波長からビーム幅を算出 | Phased Array |
beamwidth2ap | ビーム幅と波長から開口長を算出 | Phased Array |
effbeamwidth | 往復の実効ビーム幅(送信+受信)→ AzimuthResolution/ElevationResolutionに対応します | Phased Array |
systemp | システム雑音温度 | Phased Array |
noisepow | 温度と帯域幅から雑音電力を算出 | Phased Array |
theaterplot | シナリオの可視化 | Radar |
coverageConfig | カバレッジ図 | Radar |
radarmetricplot | 目標値/しきい値の線と信号機表示を付けて、距離に対する指標をプロット | Radar |
orientationPlotter | ビームの指向方向を可視化(theaterPlotプロッター) | Radar |
detectionPlotter | theaterプロット上に検出結果を可視化 | Radar |
landSurface | 静的な地形(高さ行列またはDTED)— IsEarthCentered=trueの場合のみ遮蔽に使用されます | Radar |
seaSurface | 動的な海面(スペクトルモデル、風、フェッチ) | Radar |
customSurface | クラッター用の偏波散乱行列サーフェス | Radar |
surfaceReflectivityLand | 陸上クラッター反射率モデル(Barton、GITなど) | Radar |
surfaceReflectivitySea | 海上クラッター反射率モデル | Radar |
clutterGenerator | シナリオにクラッターを追加(レーダーセンサーと1対1で対応し、サーフェスが必要です) | Radar |
ringClutterRegion | 明示的なクラッター領域を定義(UseBeam=falseの場合に必要です) | Radar |
getClutterGenerator | レーダー用の既存のクラッター生成器を取得 | Radar |
規約
トレーサビリティ
- すべての確率的な量は、設定済みのパラメーターに追跡可能です
radarDataGeneratorには組み込みのトレーサビリティがあります — プロパティ名自体がドキュメントです- 計算を手作業で実装する場合は、モデル、そのパラメーター、およびシステム設計との関連をコメントに記載してください
座標フレーム
- フレームを1つ選び、全体で一貫して使用します
waypointTrajectoryには'ReferenceFrame'プロパティがあり、'NED'または'ENU'を指定します。IsEarthCentered = falseと組み合わせて使用しますkinematicTrajectoryにはReferenceFrameがなく、シナリオから継承します。IsEarthCentered = falseと組み合わせて使用しますgeoTrajectoryは [lat, lon, alt] の地理座標ウェイポイントを [deg, deg, m] で使用します。IsEarthCentered = trueが必須です- 速度と向きの解釈には
'ReferenceFrame'('NED'/'ENU')を使用します Velocitiesの代わりにCourse、GroundSpeed、ClimbRateも使用できますDetectionCoordinates = 'Scenario'は緯度/経度ではなく、ECEF(メートル単位)で値を報告します- ウェイポイントが1つの場合、プラットフォームは静止します(
TimeOfArrivalは無視されます)
- 速度と向きの解釈には
- 制約: 軌道の種類と
IsEarthCenteredは厳密に連動しているため、組み合わせが一致しない場合はエラーになります - NED:仰角は水平線より上で負になります。ENU:仰角は水平線より上で正になります
- 必ず検証します。期待される仰角を解析的に計算し、測定値と比較します
パラメーターソースタグ
要件シートの各パラメーターにタグを付けます。
- ユーザー提供 — ユーザーから提示された値です
- ドメイン上の仮定 — 妥当なデフォルト値であり、その根拠を示します
- 導出値 — 他のパラメーターから計算した値です(使用した関数を示します)
システムパラメーターとシミュレーションパラメーター
ユーザーの要件とユースケースを確認した後(ステップ2~6)、次のように区別します。
- システムパラメーター(ユーザーの設計):FieldOfView、CenterFrequency、Bandwidth、MaxAzimuthScanRate、ReferenceRange、アンテナの高さなど。シミュレーションの問題を修正するために、これらを変更してはいけません。
- シミュレーションパラメーター(こちらで設定する項目):UpdateRate、RangeLimits、シナリオの UpdateRate、DetectionCoordinates、シミュレーション時間。これらは自由に調整できます。
シミュレーション上のアーティファクトが発生した場合(例:ビームのステップ移動による検出漏れ)、シミュレーションパラメーターを調整して修正します。修正にシステムパラメーターの変更が必要な場合は、物理的な直感を交えてユーザーに伝えます。これは設計上の洞察であり、シミュレーションの修正ではありません。
整合性の検証
すべてのパラメーターを導出した後、一連の処理が整合していることを検証します。
- ハードウェアの値から
radareqrngで Rmax を計算します ReferenceRange= Rmax に設定します- シミュレーションを実行し、基準距離で約 Pd となることを確認します
- 不一致がある場合は、原因を診断して明示します
よくある間違い
| 間違い | 誤りである理由 | 正しい方法 |
|---|---|---|
release() を呼び出さずに調整不可のプロパティを変更する | radarDataGenerator は System オブジェクトです。調整不可のプロパティ(FieldOfView、ScanMode、AzimuthResolution、スキャン制限)は、最初に detect() を呼び出した後はロックされます | 調整不可のプロパティを変更する前に release(radar) を呼び出し、再実行する前に restart(scenario) を呼び出します |
ReferenceRCS に線形の m² を指定する | このプロパティが要求するのは dBsm です | 変換します:10*log10(rcs_linear) |
range2bw / bw2range | 非推奨です | rangeres2bw / bw2rangeres を使用します |
MechanicalScanLimits | 存在しません | MechanicalAzimuthLimits、MechanicalElevationLimits を使用します |
電子走査で MaxAzimuthScanRate を設定する | 無視されます(警告が表示されます) | 電子モードでは、ビームは更新ごとに FieldOfView(1) ずつ移動します |
detect(scenario) と detect(platform, time) を混同する | シグネチャが異なります。シナリオレベルでは、すべてのセンサーの検出結果がまとめて返されます | dets = detect(scenario) または [dets, configs] = detect(scenario) のどちらも有効です。プラットフォームごとの場合は [dets, ~, configs] = detect(platform, time) です |
| NED の仰角の符号を忘れる | 地平線より上にあるターゲットの仰角は負になります | 符号を確認します:NED では el = -asind(alt/range) です |
Custom 以外のスキャンで HasScanLoss を使用する | ScanMode='Custom' の場合にのみ適用されます | Mechanical/Electronic モードでは省略します |
| 軌道の参照座標系を混在させる | 位置に関するエラーが通知されないまま発生します | すべての waypointTrajectory オブジェクトで同じ 'ReferenceFrame' を設定します |
waypointTrajectory が StopTime より短い | シナリオは StopTime ではなく、軌道の最大終点で停止します。軌道の終了後、プラットフォームの位置は NaN になり、検出されなくなります(通知はありません)。 | すべての waypointTrajectory の終点を StopTime 以上に延長します(停止用のウェイポイントを追加します)。または、一定速度のプラットフォームには kinematicTrajectory を使用します。 |
radar/waypointTrajectory と drivingScenario の軌道を混同する | API が異なります。drivingScenario では、このクラスではなくアクターのウェイポイントを使用します | radarScenario では、常に waypointTrajectory、kinematicTrajectory、または geoTrajectory を使用します |
前方を見るセンサーを搭載した移動プラットフォームに kinematicTrajectory を使用する | 機体座標系の向きは固定されます(デフォルトは恒等行列=シナリオ座標軸)。速度に合わせて回転しないため、前方を見るセンサーは飛行経路を追跡しません。 | センサーを搭載した移動プラットフォームには waypointTrajectory または geoTrajectory を使用します。これらでは機体座標系が進行方向に合わせて回転します。 |
ハードコードされたノイズ(例:0.2*randn)を使用する | 追跡できず、自己整合性が損なわれます | radarDataGenerator の組み込みノイズモデルを使用するか、出典をコメントに記載します |
センサーの UpdateRate を設定しない | デフォルトは 1 Hz です。スキャンレートは FoV(1)*1 となり、非常に遅くなります | radarDataGenerator では常に 'UpdateRate' を明示的に設定します |
シナリオの UpdateRate がセンサーの UpdateRate より小さい | エイリアシングが発生し、FoV の滞留位置の一部しかサンプリングされません。サンプリング位置の間にあるターゲットは、通知なしに検出数がゼロになります。 | 検出漏れのないシミュレーションでは、シナリオの UpdateRate をセンサーの UpdateRate と同じ値に設定します。 |
| センサーの直交座標測定値をシナリオ座標系の真値と直接比較する | センサーの直交座標はビーム回転座標系です。各検出の座標系は、検出時にビームが向いていた方向によって異なります。測定値をそのまま使うと、真値から数十 km ずれることがあります。 | 検出ごとの MeasurementParameters(1) を使用します:scenarioPos = Orientation * Measurement + OriginPosition。Orientation 行列には、取り付け方向と現在のスキャン角度が反映されます。 |
| 球面測定値の順序が [range, az, el] だと想定する | 'Sensor spherical' の実際の順序は [az, el, range] です | DetectionCoordinates の設定を確認します。デフォルトは 'Body'(直交座標)です |
RangeLimits を設定しない | デフォルトは [0, 100 km] です。100 km を超えるターゲットは、通知なしに検出されません | 'RangeLimits', [0, R] を設定します。R は max(maxTargetRange, ReferenceRange * 1.2) です |
MechanicalElevationLimits とともに 'Sector' を使用する | 'Sector' は HasElevation=false に設定するため、仰角制限は無視されます(警告が表示されます) | 仰角スキャンが必要な場合は、HasElevation=true を指定した明示的な 'ScanMode','Mechanical' を使用します |
検出の問題について HasElevation を設定したり調査したりする | HasElevation はターゲットが検出されるかどうかに影響しません。仰角が測定されるかどうか、およびビームが仰角方向にスキャンするかどうかだけを制御します。デフォルトは false(方位角のみ)です。 | HasElevation=false は設定しないでください(すでにデフォルトです)。検出漏れのデバッグ時に HasElevation を調査しないでください。検出漏れの原因にはなりません。検出漏れの原因は、RangeLimits、ターゲットがスキャンセクターの外にあること、不十分な ReferenceRange/ReferenceRCS、または低すぎる UpdateRate です。 |
IsEarthCentered=false の状態で atmosphere(scene, model) を呼び出す | 「IsEarthCentered property must be true to modify the atmosphere model」というエラーが発生します | すべての大気/屈折モデルでは IsEarthCentered=true が必要です。平面地球シナリオは常に自由空間です。 |
IsEarthCentered=false でも地形がターゲットを遮ると想定する | detect() による地形遮蔽は IsEarthCentered=true の場合にのみ機能します | 地形によるマスキングが重要な場合は、geoTrajectory を使用した地球中心シナリオを使用します |
HasOcclusion と地形遮蔽を混同する | HasOcclusion はターゲット間の遮蔽(拡張オブジェクト)を扱います。地形の見通し線は SurfaceManager を介して処理されます | 地形によるマスキングには、IsEarthCentered=true と landSurface を使用します。ターゲット間の遮蔽には HasOcclusion=true を使用します |
地表面を設定せずに clutterGenerator を使用する | 通知なしにクラッター検出数が 0 になります | クラッタージェネレーターを作成する前に landSurface(scene) または seaSurface(scene) を追加します |
radarDataGenerator で ScattererDistribution='RangeDopplerCells' を使用する | detect() でエラーが発生します | radarTransceiver でのみ機能します。radarDataGenerator では 'Uniform'(デフォルト)を使用します |
ringClutterRegion なしで UseBeam=false を設定する | クラッター検出数が 0 になります | 明示的な領域を追加します:ringClutterRegion(cg, minR, maxR, azSpan, azCenter) |
ターゲット姿勢モードで Sensitivity または DetectionThreshold を設定する | 「該当しません」。これらは放射経路でのみ使用されます | ターゲット姿勢の経路(detect(scenario))では、検出は Pd/Pfa/ReferenceRange/ReferenceRCS のみで決まります |
表面クラッターをシミュレートするために FalseAlarmRate を増やす | FalseAlarmRate は一様分布の誤検出(白色雑音)を生成します。現実的なシグマゼロ、幾何形状、ドップラーを持つ、空間的に相関した表面クラッターはモデル化しません | 表面(landSurface/seaSurface)と反射率モデルを用いて clutterGenerator を使用します。terrain-clutter-atmosphere.md を参照してください。 |
radarDataGenerator で信号処理による損失(MTI、STAP、CFAR)をモデル化できると想定する | 統計モデルでは、クラッター除去フィルターによる損失、STAP の適応重みによる損失、レンジ・ドップラー空間のクラッターリッジ付近での検出能力低下はシミュレートされません | これらの効果を再現するには、I/Q レベルのシミュレーション(Phased Array System Toolbox の波形と受信機チェーン)が必要です。統計レベルで近似するには、リンクバジェット(radareqsnr)の Loss パラメーターで想定される処理損失を加えるか、クラッターの影響を受ける領域で DetectionProbability を下げます。 |
モノスタティックの速度分解能に dop2speed(1/CPI, lambda) を使用する | 正しい値の 2 倍(1.5 m/s ではなく 3.0 m/s)になります | dop2speed は片道の規約を使用します。モノスタティックの速度分解能は lambda/(2*CPI) です。手動の式を使用するか、dop2speed(fd,lambda)/2 を使用します。 |
radareqrng(SNR, lambda, ...) を呼び出す(引数の順序が誤り) | エラーなしで誤った値が返されます | 正しくは radareqrng(lambda, SNR, Pt, tau, ...) です。lambda が先です |
線形値の Gain を radareqrng に渡す | 非現実的な距離(10^49 km)になります | Gain は線形値ではなく dBi です。1000 ではなく 30 を渡します。 |
dBsm の RCS を radareqrng に渡す | 3 倍ずれた値になるか、負の値でエラーになります | RCS は線形の m²です。変換します:db2pow(rcs_dBsm) |
平均電力を Pt として radareqrng に渡す | 距離を過小評価します | Pt はピーク電力(Watts)です。次のように算出します:Ppeak = Pavg / (tau * PRF) |
アンテナゲインの導出に FieldOfView を使用する | FoV ≠ ビーム幅の場合、ゲインが誤ります | ゲインは beamwidth2gain([AzimuthResolution; ElevationResolution]) から求めます。ビーム幅は両方必要です。スカラー入力では対称ビームが仮定されます(ファンビームでは最大 10 dB の誤差)。FoV はスキャン位置ごとの角度範囲であり、必ずしも受信ビーム幅と等しいとは限りません。 |
FieldOfView は AzimuthResolution と等しくなければならないと想定する | AESA または広い Tx 構成でスキャンステップが誤ります | FoV と分解能は独立しています。FoV は通常 Tx ビーム幅です。開口を共用する場合、FoV = AzRes です。広い Tx と狭い Rx の場合、FoV > AzRes です。 |
| デフォルト(Swerling0)のターゲットに Swerling I の Pd 式を適用する | 基準距離で Pd を約 40%過小評価します(0.52 に対して 0.89) | target.Signatures{1}.FluctuationModel を確認します。デフォルトは Swerling0 です。marcumq を使用します。Swerling1 ターゲットの場合は Pfa^(1/(1+SNR_lin)) を使用します。 |
スキャンモード早見表
| モード | 主な動作 |
|---|---|
'Mechanical' | actualRate = min(FieldOfView(1) * sensorUpdateRate, MaxAzimuthScanRate)。以下のスキャンレートモデルを参照してください。 |
'Electronic' | 更新ごとにビームが FieldOfView(1) ずつステップします。MaxAzimuthScanRate は無関係です。 |
'Mechanical and electronic' | 機械式スキャンで粗く指向し、電子式スキャンで補正します。 |
'No scanning' | ビームを固定して照射します。 |
便利なコンストラクター:radarDataGenerator(id, 'Raster')、'Rotator'、'Sector'、'Custom'。
機械式スキャンのレートモデル(重要)
機械式モードの実際のスキャンレートは次のとおりです。
actualScanRate = min(FieldOfView(1) * sensorUpdateRate, MaxAzimuthScanRate) [deg/s]
stepPerScenarioUpdate = actualScanRate / scenarioUpdateRate [deg]
センサーのデフォルトの UpdateRate は 1 Hz です。 明示的に設定しない場合、MaxAzimuthScanRate にかかわらず、2 度のビームはわずか 2 度/秒でスキャンします。センサーの UpdateRate は必ず明示的に設定してください。
radar = radarDataGenerator(1, 'Sector', ...
'UpdateRate', 20, ... % MUST set — default 1 Hz causes very slow scan
'FieldOfView', [2; 20], ...
'MaxAzimuthScanRate', 36, ...
...);
% actualRate = min(2*20, 36) = 36 deg/s ✓
ビーム幅を狭く保ちながら、希望するスキャンレートを実現するには:
sensorUpdateRate >= desiredRate / FieldOfView(1)- 例:ビーム幅 2 度で 36 度/秒を実現するには、
UpdateRate >= 18Hz が必要です。
シナリオとセンサーの UpdateRate
センサーは自身の UpdateRate で動作します。シナリオの UpdateRate は、advance()/detect() の実行頻度を制御します。シナリオのレートがセンサーのレートより低い場合、滞空位置の一部しかサンプリングされず、サンプリング位置の間にあるターゲットは検出されないままになります。
ルール: 検出頻度を意図的に疎にする場合を除き、シナリオの UpdateRate はセンサーの UpdateRate と必ず同じ値に設定してください。
検出モデル
SNR = RadarLoopGain + RCS_dBsm - 40*log10(Range)
RadarLoopGain:読み取り専用です。ReferenceRange、ReferenceRCS、DetectionProbability、FalseAlarmRateから導出されます。基準 SNR では内部的に Swerling0(変動なし)を使用し、ターゲットの変動モデルは検出時に別途適用されます。- ハードウェアの調整項目(Pt、Gain、NF)はありません。すべてが基準性能にまとめられています。
CenterFrequency/Bandwidthが影響するのは分解能のみで、検出距離には影響しません。- 測定精度:
σ² = (Δ/√(2·SNR))² + (BiasFraction·Δ)²— クラメール・ラオ下限にバイアスの下限値を加えたものです。デフォルト値:AzimuthBiasFraction=0.1、RangeBiasFraction=0.05、ElevationBiasFraction=0.1。SNR が高い場合はバイアスの下限値が支配的になります(方位角 0.3°、距離 3.75 m)。 - 距離に対する Pd はターゲットの FluctuationModel に依存します — デフォルトのプラットフォームは Swerling0(変動なし)です。Swerling0 には
marcumq、Swerling1 にはPfa^(1/(1+SNR))を使用してください。誤った式を使用すると、Pd に約 40% の誤差が生じます。詳しい手順は references/radar-equation-tools.md を参照してください。
エージェントの役割は、レーダー方程式ツールを変換レイヤーとして使用し、ユーザーのハードウェア仕様とこの統計的インターフェースの間をつなぐことです。
トラブルシューティング
| 症状 | 考えられる原因 | 診断/対処方法 |
|---|---|---|
| 検出がまったくない | RangeLimits が短すぎます | radar.RangeLimits(2) が最大目標範囲以上であることを確認します |
| 検出がまったくない | センサーの UpdateRate が 1 Hz(デフォルト)です | ビームの走査が遅すぎます。UpdateRate を明示的に設定します |
| 検出がまったくない(UpdateRate は設定済み) | シナリオの UpdateRate がセンサーの UpdateRate より小さいです | FoV の滞留時間のエイリアシングが発生しています。サンプリングされた位置でのみ検出されます。シナリオの UpdateRate をセンサーの UpdateRate と同じに設定します。 |
| 検出がまったくない | 目標がビームの FoV の外側にあります | coverageConfig(radar) を使って現在のビーム方向を取得し、目標の方位と比較します |
| 一部のスキャンでしか検出されない | 目標がビームのステップ境界付近にあります | 機械走査では正常な動作です。ビームのステップ位置に方位が一致する高速目標は、一部の走査で見逃されることがあります。ステップサイズを小さくするには、センサー/シナリオの UpdateRate を上げます(シミュレーション上のアーティファクトを修正するために、FieldOfView などのシステムパラメーターは決して変更しないでください)。 |
| 検出が多すぎる | 自己検出(レーダープラットフォーム) | フィルターを適用し、TargetIndex == radar platform ID(通常は 1)の検出を無視します |
| Pd が設定値より大幅に低い | 目標が ReferenceRange を超えています | SNR は 40·log10(R) に従って低下します。これは想定どおりです。Pd は基準範囲でのみ指定されています |
| Pd が予想より高い | 目標の RCS が ReferenceRCS を超えています | RCS が高いほど SNR が上昇します。目標プラットフォームの rcsSignature を確認します |
| 実測 Pd が 1.0 を超える | 照射回数ではなくスキャン回数で検出数を割っています | 機械走査は双方向です。セクタースキャンでは照射回数 = 2 × スキャン回数です。IsScanDone からビームの通過回数を数えるか、スキャンのタイミングから計算します:nIlluminations = StopTime / (sector / scanRate)。 |
| 測定位置が真値から大きく離れている | シナリオ座標系の真値と生の .Measurement をプロットしています | 必ず最初にシナリオ座標系へ変換してください。 MeasurementParameters.Orientation と .OriginPosition を使って変換します。「方位角 0」はセンサーのボアサイトであり、北ではありません。変換方法の例は API Answer Key を参照してください。 |
| 距離制限と LOS 制限の違い | 目標がレーダーの地平線を超えています | horizonrange(antennaHeight) を使って確認します。LOS により検出されないことが想定される箇所には、コード内にコメントを記載します。また、コードを書く前の妥当性チェック(ステップ 6 — 目標のジオメトリがレーダーの地平線内にあることを確認)でも検出する必要があります。 |
| 自己整合性チェックに失敗する | ハードウェアから導出した Rmax ≠ 設定済みの ReferenceRange | radareqrng の入力値が、導出に使用したハードウェア仕様と一致しているか再確認します |
プログラムによる検証
検出精度のチェック — 測定誤差が想定範囲内であることを確認します。DetectionCoordinates モードを考慮する必要があります。'Scenario' モードを使用しない限り、生の .Measurement 値をシナリオ座標系の真値と比較することはできません。
% Convert detection to scenario frame FIRST (required for all non-Scenario modes)
mp = dets{k}.MeasurementParameters(1); % first element = position transform
meas = dets{k}.Measurement;
switch mp.Frame
case 'Spherical'
az = meas(1); el = meas(2); R = meas(3);
posSensor = [R*cosd(el)*cosd(az); R*cosd(el)*sind(az); R*sind(el)];
measScenario = mp.Orientation * posSensor + mp.OriginPosition(:);
case 'Rectangular'
measScenario = mp.Orientation * meas(1:3)' + mp.OriginPosition(:);
end
posError = norm(measScenario - truthPos);
expectedSigma = sqrt(trace(dets{k}.MeasurementNoise(1:3,1:3)));
assert(posError < 5*expectedSigma, 'Position error exceeds 5-sigma');
SNR のチェック — 報告された SNR がリンクバジェットの予測と一致することを確認します(約 1 dB 以内)。
expectedSNR = radar.RadarLoopGain + rcs_dBsm - 40*log10(slantRange);
reportedSNR = dets{k}.ObjectAttributes{1}.SNR;
assert(abs(reportedSNR - expectedSNR) < 1.0, 'SNR mismatch > 1 dB');
モードを考慮した検証パターンの全例については、座標と変換 — 検証を参照してください。
デバッグ: ビームポインティングの切り分け
「検出がまったくない」または予期しない検出ギャップを診断する際は、問題がビームポインティングにあるのか、それとも別の要因にあるのかを切り分けます。
- センサーを解放してから、全方向モードに切り替えます:
origFoV = radar.FieldOfView;
origScan = radar.ScanMode;
release(radar);
radar.FieldOfView = [360; 180];
radar.ScanMode = 'No scanning';
- 再起動してシナリオを再実行します (
restart(scenario)+ 進行ループ) - 結果を解釈します:
- 検出が現れる → 問題はビームポインティング (スキャン範囲、MountingAngles、FoV、ターゲットを飛び越すスキャンステップ)
- それでも検出がない → 問題は別の箇所 (RangeLimits、UpdateRate のエイリアシング、ReferenceRange、水平線、ターゲット RCS)
- 続行する前に解放して元の構成に戻します:
release(radar);
radar.FieldOfView = origFoV;
radar.ScanMode = origScan;
注意: radarDataGenerator は System オブジェクトです。detect() を呼び出した後は、先に release(radar) を呼び出さない限り、調整不可のプロパティ (FieldOfView、ScanMode、AzimuthResolution、スキャン範囲など) を変更できません。調整不可のプロパティを変更する前には、必ず release() を呼び出してください。
これは個々のパラメータを掘り下げる前に実施してください。1 回のテストで問題の範囲を半分に絞り込めます。
デバッグの順序
- 全方向モードによる切り分け (上記) — 1 回のテストでビームポインティングの可能性を除外します
- 系統的な原因の調査 — RangeLimits のゲート、スキャンセクターの境界、UpdateRate のエイリアシング。これらは決定論的な失敗 (検出確率 0%) を引き起こし、1 回の実行で特定できます。
- モンテカルロ試行 (最後) — 系統的な原因が除外された後にのみ行います。反復実行を用いて確率的な挙動を特徴づけます: Swerling ゆらぎ、検出境界付近での断続的な検出、経験的 Pd と解析的 Pd の比較。検出が 0 件になるターゲットの診断にモンテカルロを実行しないでください。それは常に系統的な原因です。
前向きの修正: ステップ階層
検証が失敗した場合、誤りである可能性がある最新のステップを修正します。シナリオの選択 (ステップ 6〜7) に合わせるためにシステムパラメータ (ステップ 1〜5) を決して変更しないでください。レーダーの FoV がターゲットを覆っていない場合、そのターゲットはカバレッジ外です。「修正」するために FoV を広げないでください。真の設計上の誤りがある場合にのみ、以前のステップに戻って検討します。
シミュレーション出力の分析
サイレントエラーを引き起こす重要な NED の落とし穴:
- 幾何学的仰角 (上が正):
atand(-dx(3) ./ horizRange)— 空中ターゲットが正の角度になるように D 軸を反転します。センサーの球面仰角は NED では符号が逆になります (センサーの +z = Down): 空中ターゲットは負のelになります。 - 方位角:
atan2d(East, North)— 引数を入れ替えると方位角が東基準になります (90° の誤差) - 経験的 Pd:
platformID = targetIndex + 1(レーダーはプラットフォーム 1) — 1 ずれるオフバイワンがよくあります - 解析的 Pd: デフォルトは Swerling0 (
marcumq) であり、Swerling I ではありません — 誤った式を使うと 40% の誤差になります - SNR:
RadarLoopGain + RCS_dBsm - 40*log10(R)— 積分利得を加算しないでください (RLG にすでに含まれています)
完全な変換レシピと検証パターンについては、座標と変換を参照してください。
出力要件
- 要件シート — 独立した文書 (references のテンプレートを参照)
- MATLAB スクリプト — 実行可能で、設計根拠のコメントと結合パラメータ表を含むもの
- 検証 — シミュレーションの検出結果を解析的予測と比較する
コード生成のルール
radarDataGeneratorのデフォルトに決して頼らないでください。 デフォルト値を使用する場合でも、コンストラクターで関連するすべてのプロパティを明示的に設定してください。これによりコードが自己文書化されます。読者はドキュメントを参照することなく、すべてのパラメータの選択を確認できるべきです。隠れたデフォルトは隠れた前提です。例外 — プロパティのゲーティング: 現在の構成に関係のないプロパティは設定しないでください。ゲートされたプロパティを設定すると警告が発生します (「この構成では関係ありません」)。以下のプロパティゲーティング表を参照してください。- 各パラメータ値をその出所 (ユーザー提供、導出 (どの入力からか)、またはドメインの前提 (根拠付き)) でタグ付けしてください。
プロパティのゲート条件
Has* フラグでゲートされるプロパティ:フラグが false の場合は設定しないでください。
ゲート(false の場合) | 設定しないプロパティ |
|---|---|
HasElevation | ElevationResolution、ElevationBiasFraction、MaxElevationScanRate、MechanicalElevationLimits、ElectronicElevationLimits |
HasRangeRate | RangeRateResolution、RangeRateBiasFraction、RangeRateLimits、HasRangeRateAmbiguities |
HasRangeAmbiguities | MaxUnambiguousRange |
HasRangeRateAmbiguities | MaxUnambiguousRadialSpeed |
ScanMode でゲートされるプロパティ:
| ScanMode | 設定しないプロパティ |
|---|---|
'No scanning' | MaxAzimuthScanRate、MaxElevationScanRate、MechanicalAzimuthLimits、MechanicalElevationLimits、ElectronicAzimuthLimits、ElectronicElevationLimits |
'Mechanical' | ElectronicAzimuthLimits、ElectronicElevationLimits |
'Electronic' | MechanicalAzimuthLimits、MechanicalElevationLimits、MaxAzimuthScanRate、MaxElevationScanRate |
'Mechanical and electronic' | (すべてのスキャンプロパティが有効) |
HasScanLoss は決して設定しないでください。すべてのスキャンモードで警告が表示されます(現在のどの構成でも有効ではありません)。
EmissionsInputPort=true の場合:ScanMode、FieldOfView、またはスキャンの制限値/レートプロパティは設定しないでください(スキャンはエミッションによって制御されます)。
TargetReportFormat でゲートされるプロパティ:
| Format | 設定しないプロパティ |
|---|---|
'Clustered detections' または 'Detections' | FilterInitializationFcn、ConfirmationThreshold、DeletionThreshold、TrackCoordinates |
'Tracks' | DetectionCoordinates |
DetectionMode でゲートされるプロパティ:
| Mode | 設定しないプロパティ |
|---|---|
'ESM' | ReferenceRange、ReferenceRCS、DetectionProbability |
参考資料
タスクに必要なものだけを読み込んでください。プロンプトごとにすべての参考資料を読む必要はありません。
| 参考資料 | 読むタイミング |
|---|---|
| 検出モデル | レーダープロパティの設定、プロパティ名のデバッグ、検出経路の理解 |
| FoV とスキャン | FieldOfView の設定、スキャンモードの構成、UpdateRate/スキャンレートの導出 |
| 座標と変換 | 検出結果の解釈、座標系の変換、NED の仰角/方位角、プロット |
| 軌跡 | ターゲットの動き、静止プラットフォーム、シナリオの継続時間、機体座標系の向き |
| 地形、クラッター、雰囲気 | 表面の追加、クラッター生成器、雰囲気モデル、遮蔽 |
| レーダー方程式ツール | ボトムアップの導出、ハードウェアから ReferenceRange への橋渡し、距離に対する Pd |
| 可視化 | theaterPlot、カバレッジプロット、radarmetricplot |
| 連動パラメーター | ステップ 5:パラメーター関係表、データシートの取り込み |
| 対話フロー | 推奨表現を含む 9 ステップのワークフロー全体 |
| 要件シートのテンプレート | ステップ 9:3 セクションから成る出力成果物の構成 |
Copyright 2026 The MathWorks, Inc.