March 15, 2014

Super Sylphide 進捗状況(75) -- RTKLIB探訪 rtksrv.c編

最近、オートパイロットシステムTinyFeatherのGPS機能を充実しようとしています。搭載しているGPS受信機から、できるだけ生情報に近い部分を使うことで、より高精度な測位をすることを目標としてみました。GPSに関連する情報を処理するのは、高須先生がソースを公開されているRTKLIBです。RTKLIBはPCのアプリとして動かすにはとてもよくできているのですが、TinyFeatherはPCとは入出力やスレッドをはじめとしてかなり環境が違いので、組み込むにあたってプログラム構造を理解する必要がありました。今回の記事はある程度理解が進んだので、そのまとめとなります。
なお、高須先生のコードからforkして、TinyFeatherなどの組み込み環境向けRTKLIBを独自に公開しています。記事を書いている時点では、できる限り少ないコード(ファイルやスレッドを使わない)で測位部分のみを抽出したminimal_rtkposが大きな追加部分となっており、その他もファイルやスレッドを使わないような分岐(それぞれWITHOUT_FILE, WITHOUT_THREADというマクロ)が施してあります。

RTKLIBは、共通の部分(ディレクトリでいうとsrc)とそれを覆いこむいくつかのアプリケーション(同じくapp)として提供されているのですが、そのうち注目したのはCUIベースのrtkrcvというプログラムです。GUIがない測位機能中心のプログラムなので、これを解析していくことにしました。

rtkrcvは、RTK測位のサーバ機能を提供するrtksvr.cを中心としたプログラムになっています。この構造は下図のとおりです。

rtksvr.png
rtksvr.cの構造

rtksvrthreadというスレッドの中で無限ループがあるのが特徴で、そのスレッドはrtksvrstartで生成、rtksvrstopで破壊されます。スレッドないの無限ループでは、測位(rtkpos)が行われ、それに付随する入出力、すなわち、搬送波位相などの観測情報をはじめとしたデータの受信(strread)と、解析結果の送信(strwrite)が行われています。つまるところrtkposが一回の測位に相当しますので、TinyFeatherをはじめとした組み込み環境では、rtkposをループで叩き、その入出力をなんらかの形で行ってやればよいということがわかりました。

冒頭で紹介したminimal_rtkposは、rtkposを1回走らせるための最小限の入出力をつけたもので、ファイルやスレッド機構がなくとも動作します。rtkposを動作されるためには、引数となる構造体に対してどのような値を設定し、また出力としてどのような値が返されているのか把握することがとても重要でした。この関係を把握するにあたってはrinexファイルからの読み込みを記したrinex.cや、u-blox受信機の出力をパースするrcv/ublox.cが大変参考になりました。

以後、得られた理解をもとにTinyFeatherへのRTKLIBの移植を進めます。

※次の進捗は、ちょっとすごいロガーにテレメトリを追加した話です。

09:40 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | トラックバック
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/906
コメント
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。