gps-sdr-simの衛星信号生成部分の処理を追ってみた(その1)
gps-sdr-simの概要
そもそもgps-sdr-simは何を実行するプログラム?
→地形や建物が存在しない仮定で、ある時刻と場所における受信機側に到達するGPS信号をシミュレーションします。(また、後処理として実際に衛星信号を生成することも可能です。)
-
GPS衛星の軌道計算:
入力として与えられた衛星の軌道情報と、ユーザーが指定する場所や移動経路に基づき、GPS衛星の位置を計算します。また、衛星からユーザー位置までの擬似距離の変化や信号の周波数の変化も計算に反映します。(後日別の記事でまとめる予定ですが衛星からの信号は様々な要因で一直線では届かなかったり、衛星や地球など動く対象物の影響で電波そのものが伸び縮みしたりします。) -
GPS衛星信号データの生成:
上記の計算結果を利用して、受信機側で受け取る複数の衛星から送られた信号を合成したデータを生成します。
信号処理生成部分(gpssim.c)の大まかなフロー
gpssim.cをデバッグ実行してみて以下のフローであることがわかりました。
- 実行引数の解析
- 受信位置の決定
- 衛星軌道情報ファイル(受信側ファイル形式)の読み込み
- シミュレーション(※1)開始時刻の決定
- チャネルの割り当て:空きチャネルに可視GPS衛星を割り当て、PRNコード作成および航法メッセージ(送信側ファイル形式)の整形 ※2
- 信号生成ループ:0.1秒ごとにパラメータ更新→I/Qデータ計算→ファイル書き込みのサイクル ※3
※1 建物や地形が周囲に存在しない半球上、あるいは特定の仰角(main()内の変数elvMaskに0.0でハードコードされている)以上の衛星に絞った完全見通し環境を仮定しています。
※2 PRNコードや航法メッセージなどについては別の記事で解説します。
※3 生成されたgpssim.binファイルは、gps-sdr-sim内のplayerフォルダにあるplayer.cとSDRボードを用いることで、受信機が取得する実際の衛星信号として発信できます。
全体の流れをフローチャートに書き起こしました。(書き方の作法はやや怪しいですがご容赦ください。)

実行引数の解析
以下の実行引数が存在します。
詳細は別途説明しますが要するに受信する時間や場所、シミュレーションの諸条件やファイル設定を行うことができます。
[必須]
-e :エフェメリスが記録されたRINEXファイル
[1つ選択]
-u :受信機移動経路のECEF座標(X, Y, Z)ファイル(動的モード)
-x :受信機移動経路の緯度、経度、高度ファイル(動的モード)
-g :受信機移動経路のNMEA GGA形式ストリームデータ指定
ファイル(動的モード)
-c :受信機位置をECEF座標(X, Y, Z)で固定(静的モード)
-l :受信機位置を緯度、経度、高度で固定(静的モード)
[任意]
-L :将来のうるう秒イベントのユーザー定義
(GPS週番号, 日数, 次のうるう秒)
-t :シミュレーションの開始日時指定(YYYY/MM/DD,hh:mm:ss)
-T :軌道情報ファイルの時刻(TOC/TOE)を開始日時に上書き
-d :シミュレーションの継続時間(秒)指定
-o :生成I/Q信号データファイル名前指定(デフォルト: gpssim.bin)
-s :サンプリング周波数(Hz)指定(デフォルト: 2,600,000 Hz)
-b :I/Qデータのビット数(1, 8, 16ビット)指定(デフォルト: 16)
-i :宇宙空間シナリオ向けに電離層遅延モデルを無効化
-p :信号の経路損失モデルを無効化し、受信電力レベルを一定に保つ
-v :シミュレーションされる各チャンネルの詳細情報を表示
受信位置の決定
固定点の座標かシミュレーション時間内の移動における座標(ファイル読み込み)を実行引数により指定します。座標系はECEF座標、緯度経度高度(楕円体高)、あるいはNMEA GGA形式を指定できます。
まとめ
まずはgps-sdr-sim全体が何をやっているのかをまとめました。
各フローにおける詳細や用語、現象の解説などは別の記事でまとめます。
Discussion