『GPSのための実用プログラミング』
最近このサイトへアクセスしてくださる方の傾向を観ると、GPS関係のキーワードで検索エンジンから来られる方が多いようで、特に自作GPSロガーは大人気となっています。そのような流れを受けて、今後もできるだけGPS関連の情報は充実させていきたいと考えています。その長期計画の一環として、GPS参考書『GPSのための実用プログラミング』の紹介、並びに掲載されているC言語コードをC++化したことについて、この記事では触れたいと思います。
僕はGPSの受信機をソフトウェアで構成することに元々興味があったので、以前は『Open source GPS C/A信号の抽出』の記事にもあるとおり、GPSのL1電波(1575.42MHz)から意味のある情報、例えば擬似距離(pseudo range)や搬送波位相(carrier phase)を抽出する、といった信号処理側から攻めていました。ところがこの攻め方はあまりメジャーのようではなく、その意味のある情報から更に計算を行って、現在位置といった測位を行うほうに興味がある方が多いようです。そのような方にお勧めしたい本として、電子航法研究所の坂井先生が書かれた『GPSのための実用プログラミング』という本があります。出版元は東京電機大学出版局です。
この本は上記測位の点に要点を絞って解説された本で、C言語のコードと共に測位計算の手順が紹介されているので非常にわかりやすい本です。GPSの計測データの保存フォーマットとして一般的なRINEXファイルについても触れられているので、たとえGPS受信機を持っていなくてもIGS等のインターネット上に公開されているRINEXファイルを元に測位計算を体験してみることができます。
掲載されているC言語のコード(某所で公開されていますが、本の購入者のみ利用可能ということなのでリンクは控えさせていただきます)は非常に役に立ちましたが、僕自身の理解を深めるにためにも掲載コードの一部(第2章~第4章)を、色々と構造化して僕の好きなC++風に書き換えてみました。せっかくなのでコードを公開しようと思いますが、著作権の問題もあるかと思いますので、現在問い合わせ中です(肩透かしでごめんなさい→その後公開しました、記事末尾参照ください)。
ちなみに本を読み進めるにあたって、いくつか疑問点があり坂井先生に質問したところ、以下のような正誤が第1版ではあることがわかりました。
- P.55 表3-2 離心率(e)のLSBでビット位置 (誤)159 => (正)167
- P.55 表3-2 Δn のスケール (誤)-31 => (正)-43
- P56 表3-3 軌道傾斜角(i_0)のビット位置 (誤)139 => (正)137
またさらに以下の疑問点があったので、問い合わせております(→その後、いずれの項目も指摘のとおりという返答をいただきました)。
- P.63 表3-7 クロック補正係数(a_f2, a_f1, a_f0)の順が逆、正しくはa_f0, a_f1, a_f2ではないか
- P.112 (3.16)のピアースポイント計算式 (誤)0.00137 => (正)0.0137ではないか
いずれの問題点も、GPSの仕様書『GLOBAL POSITIONING SYSTEM STANDARD POSITIONING SERVICE SIGNAL SPECIFICATION』(PDF)と付け合せた上での結論です。
ちなみにGPSは上記仕様書によると、その仕様上の定数を世界測地系WGS84に沿って定めているのですが、WGS84で元々定められた地球の自転速度(7292115E-11[rad/sec])ではなく、新しい時刻規定に基づいてWGS84で定められた自転速度(7292115.1467E-11[rad/sec])を使っている(WGS84仕様書(PDF)の3.2.4 参考)等、細かな違いがありプログラムを組む上でかなりはまりました。微細な違いに思われるかもしれませんが、光速からmm単位まで、様々なオーダーが入り乱れるGPSのことですから、このような微細な違いでも確実に効いてきます。
※その後、プログラムを公開を坂井先生にご快諾していただきました。080205_gpsフォルダからダウンロードできます。このプログラムの使用にあたっても、元のCプログラム同様、以下の条件でお願い致します、とのことです。
★プログラム例および関連するデータファイルの利用について
このプログラムは,本書(注:『実用GPSプログラミング』)をお買いあげいただいた方のみご利用いただけます。各データ(注:元のC言語プログラムならびに付属データ)の著作権およびその他の権利は,著者(注:坂井先生)が有します(注:ここで公開しているC++言語のプログラムについては加えてこのサイトの所有主のfenrirが有します)。読者個人による利用については特に妨げませんが,利用の際には,修正の有無にかかわらず本書を出典として明示してください。内容の無断複製・転載・再配布などはしないでください。各データは,すべて使用者の責任においてご使用下さい。使用したことにより生じた,いかなる直接的,間接的損害に対しても,著者(注:坂井先生)・当出版局(注:東京電機大学出版局)は一切の責任を負いません(注:ここで公開しているC++言語のプログラムの使用による損害ついてもfenrirはその責任を一切負いません)。
内容は4章までではなく5章までとしました。実行はVC2005 Express Editionとg++-3.4.4で確認しました。一部別ディレクトリ(commonとnavigation)のヘッダが必要になると思いますが、実行環境に応じて調整を行ってください。
また応用を考え、ヘッダとして切り出したものも作りました。座標系についてのcoordinate.h、GPSのC/AコードやEphemerisについてまとめたGPS.h、RINEXフォーマットについてまとめたRINEX.hがあります。ex_header_sect5.cpp(5章の内容を上記ヘッダの組み合わせで実現するもの)を参考にすれば使い方がわかると思います。
※(2008/6/27 追記)富士通 近藤様よりプログラムについてご指摘を戴きました。衛星位置の計算の際に、昇降点の経度を求めるのですが、その補正項について解釈を誤っていたようです。この昇降点は『電波が到達した時刻のECEF座標系における値』でなければならないのですが、補正の際には送信時刻ベース(伝播時間を差し引いた時間)の補正であるエフェメリスからの補正、並びに受信時刻ベース(伝播時間を差し引かない時間)の補正である地球自転の2つがあり、それを混同していたようです。これに基づいてプログラムの修正を行いました。修正前の状態は __MISUNDERSTANDING_ABOUT_OMEGA0_CORRECTION__ をdefineすることで再現できるようにしてあります。『理解するためのGPS 測位計算プログラム入門』の質問コーナーにも同等の内容が触れられており、そちらも参考にしました。
また近藤様には、その他に効率的なニュートン法による解法についてもご指導を賜りましたが、こちらについてはまたの機会に反映する予定です。近藤様、大変ありがとうございました。
コメント
>春名さん
コメントありがとうございます。僕としてはGPSの単体測位にしか興味がなくDGPSについては知識があまりありません。ここで下手な回答をしてしまうとおそらくご迷惑をおかけしますので、ご自身で専門書などをあたられるとよいかと思います。
単独測位に特化されているとのことですが、
市街地での単独測位GPS利用の研究はされているでしょうか?
>春名さん
コメントありがとうございます。市街地というと、マルチパスや準天頂絡みでしょうか。僕が想定している応用用途が航空機であるため、そちら方面はあまり詳しくないです、申し訳ありません。
1. DGPSの補正ELEMENTについては、わたくしの質問に間違い はないはずです。
2.マルチパスの問題について、ある原因についてはすでに
解決策(測位精度改善)がなされています。いっぽう
いまだ解決困難な現象に基づくものがあり、
その現象を検証しているところはいくつかありますが、
解決にむけ取組みが進んでいるのは、公開された資料から みると(メーカーでは公開せず研究しているところもあり でしょう)、東京海洋大学という印象です。
春名浩一
>春名さん
いろいろと教えてくださり、ありがとうございます。
GPS受信機を用いて、RINEXの取得する時間は12分30秒以下になったら、正しい測位計算できませんですか?
Posted by: akira : December 20, 2012 05:43 PM>akiraさん
コメントありがとうございます。アルナマックを全部取得するのに12.5分かかるわけですが、最近のGPS受信機なら間違いなく前回起動時の情報を保持しているので、12.5分待たなくとも長くとも数分程度で補足ができると思います。解析をオフラインでするのでしたら精密暦を別ルートで取得すれば問題ありません。
参考になるかどうかわかりませんが、MITでの高速FFTを活用した、
GPS受信の一例です。
http://www.sigmobile.org/mobicom/2012/slides/Hassaneih.pdf
>mad-ssさん
fenrirです、情報ありがとうございます。
コメントする
- 匿名でのコメントは受け付けておりません。
- お名前(ハンドル名可)とメールアドレスは必ず入力してください。
- メールアドレスを表示されたくないときはURLも必ず記入してください。
- コメント欄でHTMLタグは使用できません。
- コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
- コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。
- 投稿ボタンを押してエラーがでなければ、投稿は成功しています。反映されるまでには少し時間がかかります。
DGPSについて 以下お教えいただきたく
①DGPSデータのエイジ(秒)
GPGGAの最後にOUTPUTされますが
これは何でしょうか?
なにかの計算の結果で、何かの評価に使われるのでしょうか?
②
PR=PRM(T)+PRC(T0)+RRC(T-T0)
PR:従局の補正後の擬似距離
PRM:従局で測定した擬似距離
PRC:時刻T0で主局で計算された擬似距離の補正値 RRC:主局で計算された距離変化率の補正値
とあるWEB SITEにでていますが、
T;従局での測位時刻でしょうか?
RRC:主局で計算された距離変化率の補正値
とありますが、
計算された距離変化率の補正とは、
計算上の幾何学上の距離変化率をいっているのでしょ うか?
実測の主局の擬似距離の変化率を言っているのでしょうか?
それとも何かの変化率の補正を言っているのでしょうか>
MTI 春名浩一