April 02, 2006

Open source GPS 計画編

少し前にオープンソースGPSの話を記事にしましたが、その後、日本人でオープンソースGPSの開発に関わっている海老沼さんという方からメールを戴き、色々と話を伺うことができました。その中でわかったことは、RF段から挑戦するのは少しハードルが高いということです。
ということでRF段から取り掛かるという方針を変更し、次のようなマイルストーンを考えてみました。

  1. 既存の受信機をハッキングし、RFをIFに落としA/D変換した後のデジタルデータをUSBで取り込むハードウェアを作成する
  2. そのデータをPCで信号処理できるようにし、GPSのC/Aコードマッチ、ナビゲーションデータ取得、搬送波位相や擬似距離測定などできるようにする
  3. RF段を完成させ、全て自前の機器に置き換える
そういうわけで、今は一番目と二番目の部分を同時に考えていくことにしました。

SuperStar2_hack.png海老沼さんより戴いた図。

一番目の部分については海老沼さんより、GPS受信機では有名なメーカであるNovatelSuper Star 2という製品なら簡単にデータを取り出すことができると教えていただきましたので、それでチャレンジしてみることにします。上図はSuper Star 2からデジタルデータを取り出す方法です。
またUSBの方は勿論、USB-ADC2で使用したCypress FX2LPでいきます。

二番目の部分ですが、以前ソフトウェアGPSの本としてFundamentals Of Global Positioning System Receivers: A Software Approachをこのブログで紹介しましたが、この著者の方はレーダーの専門家らしく、実際信号処理方法はFFTしまくる、これは組込みまで考えると一般的な方法ではないとのことです(PCで処理する分には問題ありません)。そこで薦めていただいたのが、精説GPSという本です。実はこの本は持っているのですが、あまり読み進めていませんでした(笑)。
あとこの本ですが、一般的な書店では取り扱っていません。入手は上記書籍のリンクの『販売』の部分を参考にしてください。

最後にですが、色々と教えてくださった海老沼さんに感謝を表したいと思います。海老沼さん自身は現在、海外製オープンソースGPSのARMへの移植をされています。詳しくはご本人のページをどうぞ。
ブログをやっていると海老沼さんのように親切に色々と教えていただける方がたくさんでき、本当に嬉しい限りです。

※その後、C/Aコードの抽出をしてみました

※※質問を戴いたので、いくつか補足をしておこうと思います。

[フロントエンド(GP2015)とベースバンド処理チップ(GP4020)の関係について]
フロントエンド(GP2015)では、GPSの電波(L1=1575.42MHz)を、低い周波数(通常数MHz)にダウンコンバート、A/D変換を行って後段の相関器やプロセッサが処理しやすい形に作り変えています。従って、その中身は局部発信器やミキサー、A/D変換機など、非常にアナログな要素で構成されています。
一方のペースバンド(GP4020)ですが、フロントエンドで処理された信号に対してまずばじめに、相関器などを用いて信号をトラッキングすることが行われています。さらに信号を絶えずトラッキングした結果を用いて、衛星からの距離(信号の到達時間を計測)や速度(ドップラー効果による信号の遷移を観測)をプロセッサが処理し出力している次第です。従ってベースバンドはデジタルな世界です。
多くのソフトウェアGPSは、ベースバンドが担当している部分(通常のベースバンドチップは、H/Wによる相関器、その他の部分を処理するためのソフトが動作する汎用プロセッサ、2つの部品で構成されている)全てを(相関器も含めて)ソフトウェアで補おうという計画で、受信する信号の形態が多少変わった際もソフトウェアの変更のみで比較的柔軟に対応しようというアイデアです。

[図にある「Super Star 2」の端子から信号を取り込む方法]
この端子から出力されるのはデジタル信号ですので、簡易的には市販のロジックアナライザなどを使って信号を取り込むことが可能です。電子工作の知識があればCypressやFTDIのチップを使ってUSB経由で取り込むというのがいいかもしれません。

[とりあえず、測位計算のみ検討してみたい場合]
測位演算部分をPC等、別のプロセッサで処理したいのであれば、ベースバンドで計算されている比較的生な情報(擬似距離、キャリアフェーズ、デルタレンジ等)がとれる受信機を利用するのがよいと思います。
多くの安価な受信機はこれらの情報が隠蔽されてしまうため、適さないのですが、僕がメインで使用しているu-bloxの受信機は比較的安価(最安モデルで100ドル程度)ながら、これらの情報を利用することができます。接続はSCI(3.3V)かUSBですので、マイコンやPCでも接続が容易です。

※※秋月で購入できるようになったGPSモジュールでも同じようなことができそうです。

23:25 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/476

April 06, 2006

たまる電子部品

研究の関係で、なかば趣味と化してしまっている電子部品の収集活動。『これは今度、こういうことに使おう!』と意気込んで手配するまではいいのですが、実際遊んでみる時間がなくそのまま放置ということがかなりありました。そこで新年度になったことでもありますし、戒めの意味をこめてこれまでの行いを晒そうと思います。

とりあえず隅々まで調べて列挙するとかなり大変になりそうなので、思い浮かぶ物のみを列挙しておきます。

  • トラ技に付属のR8C基板
  • トラ技に付属のCPLD基板
  • トラ技に付属のアナログ回路入門基板
  • Design Wave付属のXilinx基板
  • Design Wave付属のAltera基板
  • Design Wave付属のARM7基板
  • NECからもらった小ピンマイコン評価基板
  • Freescaleの加速度計
  • 秋月電子で購入したモータードライバ4個入り
  • 鈴商で購入した192 x 384の液晶(1260円でお買い得)
  • アナデバからもらったサンプルの数々
  • Maximからもらったサンプルの数々

がんばって消化していきたいと思います。いつになるかはわかりませんが、まずは液晶の予定です。

21:37 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | コメント (2) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/477

April 11, 2006

JAXA NEXST-1

JAXA_NEXST.jpg

先週の日曜日、お台場の近くにある科学未来館というところに遊びに行ってきました。目的はJAXAの小型超音速実験機『NEXST-1』の実機展示です。実際にオーストラリアで打ち上げられたものを会場で生展示していました。
やっぱり生はいいですね。こういうものを見るとモチベーションがあがります。

その他の展示も見てきましたが、興味深いものが多かったです。特別展示の脳の話は体験型学習ができ非常におもしろかったです。

23:59 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | コメント (6) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/478

April 15, 2006

Open source GPS C/A信号の抽出

オープンソースGPSを作ろうという企画ですが、ぼちぼち作業をしています。少し進展がありましたので、その経過報告ということで記事にしてみます。

今回の報告は以前の3段階フェーズ分けに従うと、第2段階の信号処理、つまり受信機用ソフトウェアの段階のことで、その段階の中でもかなりはじめの部分になります。今後、こういった報告記事が続くと思いますので、までは、整理の意味をかねて、GPSの信号処理がどういった段階に分けられるか紹介しておこうと思います。

  1. GPSのハードウェアによってデジタル化されたデータからC/Aコードと呼ばれる粗い測位用のコードを探す
  2. 一度C/Aコードが見つかったら、それを時間的に補足しつづける
  3. C/Aコードよりもかなり遅い速度で伝送されてくる航法データの取得
  4. 擬似距離の計算
  5. 測位情報(位置や速度、時刻等)の生成
今回はその1の『C/Aコードを探す』部分です。

まず本題に入る前に、C/Aコードについて簡単に説明したいと思います。
C/Aコードというのは、GPS衛星ごとに割り付けられている識別用のデータです。これが受信した信号の中のどの時刻にあるかどうかで、現在どの衛星が見えているのか、そしてどの衛星の電波をどういったタイミングで受信できたか、というのがわかります。
このC/Aコードはとても面白い性質をもっており、複数のC/Aコードが重なっていても、どれがどれであるのか、また同じ衛星のC/Aコードでもタイミングが違えば、両者を識別することが可能となっています。GPSがシステムとして同じ周波数帯を全衛星で共有しても混信しないのは、このコードのお陰です。こういったコードを使う方式はCDMA方式と呼ばれるもので、実は携帯電話もこの技術を使用しています。
ということでGPSの信号処理は、このC/Aコードを抽出することからはじまります。

C/Aコードですが、実は受信信号を見てもあるのかないのか簡単にはわかりません。感覚的に言えば宝捜しをしているような感じです。
理由はいくつかあります。
まずGPS衛星の放出している電波が地上に届くまでに非常に弱くなっているため、受信した信号自体は一見ノイズと区別がつきません。
そして次は、どのGPS衛星が見えているのか、位置や時刻がわらない場合にはわからないことによるものです。そのため、受信した電波に対して、どの衛星のC/Aコードがあるのか、複数または最悪全部をしらみつぶしに探す必要があるためです。
また、C/Aコードは一定時間間隔で繰り返されているので、いいタイミングでキャッチしないと目的のC/Aコードがあるのかないのかわかりません。
さらにはGPS衛星は宇宙空間でかなり高速に動いているので、送信されてくる信号にはドップラー効果が加わり、送られてくる周波数も完全な決め打ちの周波数ではありません。

では実際のところどうすればいいのでしょうか?
いくつか方法があるようですが、全ての方法について共通して言えることは、この辺にこういったあるC/Aコードが存在するはずだというのを処理する側で作ってやり(レプリカ生成)、それと受信信号を比較することによって特定のC/Aコードの有無を判定するというものです。
今回は以前紹介したTSUIさんという方の本(今後、TSUI本と称することにします)の8.7章の方法を使いました。FFTをしまくる方法で、専門用語でいうとCircular Correlation(循環相関方式とでも言うのでしょうか)というらしいです。

AQ_CA.png
出っ張っているのに注目!

前の記事で紹介したNovatel受信機から取り出したデータをこの方法で処理しC/Aコードの有無を調べてみました。図はその結果を示したものです。
結果、衛星番号4,17,24,28のGPS衛星が放出したC/Aコードを抽出することに成功しました。メインソースC/Aコードに関するソースを置いておきます。その他必要なソースはcommonディレクトリ内のどこかにあると思います。

23:59 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/479

April 18, 2006

室内飛行機 航法系の検討

訳あって、体育館などの室内で飛ばせる模型飛行機の自律飛行を検討しています。室内で飛ばせる、というのが非常に制約になっていて、まず機体が小さくなければいけません。重さでいうと、全体の重量では150g以下、制御用のハードウェアに割り当てられる重量は最大でも50g程度、と軽いものでなければいけません。そしてGPSといった便利なものを使うこともできません(予算の関係で、室内用のLocal Positioning SystemはNG)。

目標としては、室内で旋回飛行等の簡単な自律飛行ができればよいとのことで、また模型飛行機の制御用の数値モデルはある程度推算することができる予定なので、問題となるのは制御系ではなく、現在の位置や姿勢を求める航法系の部分になります。ということで、航法系を検討することになりました。
その航法系についてですが、今のところ、2つほどプランがあります。

まず1つは機体に超音波センサ加速度計を搭載するプランです。超音波センサによって壁までの距離、つまり旋回のタイミングを計測し、かつ加速度計で重力方向をみることによって機体の姿勢を推定しようという作戦です。
ところがこのプランですが、うまくいくかどうか自信がまったくありません。なぜなら、問題点として、壁に対してできるだけ垂直に飛行しないと壁が検出できないのではないか、また乱暴な飛行をすると重力以外の加速度が発生し重力方向がわからなくなるのではないか、という点が考えられるからです。やってみてどうなるか、といったところでしょうか。
なおセンサについては秋月千石で手に入るものを考えています。

もう1つはビデオカメラを使用して、機体の外部から位置や姿勢を推定してあげようというプランです。まず、機体にマーカーをいくつかつけておき、それを左右に配置した2台のビデオカメラから撮影して三角測量を行うことにより位置や姿勢が推定できるのではないか、と考えています。ビデオカメラ自体は幸い近くに何台かDVカメラがあり、また動画の処理についてもFirewireでパソコンと接続し、DirectShowのAPIを叩けばできそうな感じがしています。DirectShowの参考ページとしては、DirectShowのビデオキャプチャプログラミングDirectShowプログラミング [VC++]がありました。

もしこれらの方法についてご感想・ご意見あれば是非コメント戴きたく思います。また、これら以外の方法も大募集中です、是非お教えください。

※その後、プロポとPCを接続して飛行機を制御する方法を検討しています。
※その後、機体側の検討をしています。
※その後、機体側に載せる基板のコードが完成しました。
※さらに、実験ではいわくつきですが、自律旋回飛行に成功しました。
※わかりやすい綺麗なコンセプト図も書きました。

23:59 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | コメント (6) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/480

April 23, 2006

Mother3

[Timely]

MOTHER3
とうとう4/20に発売されたMother3、皆さんやっていますか?Motherシーリズは大好きなので、Mother3の開発が一旦中断されたとき以来、本当に待ちに待たされたという感じです。そんなわけで、ここ数日は寝る間も惜しんでプレーしています。現在プレー時間は10時間程度ですが、だいたいテイストは掴めてきたので、紹介記事を書いてみたいと思います。

まずストーリーですが、惜しみなく糸井重里ワールドが展開されています。現代のゲームにみられるような派手な演出はまったくなく、のほほんとした中に非日常的な事件がおきるという、昔のゲームの箱庭感がプンプン臭っています。ゲームをしていると知らないうちに引き込まれてしまっている、というわけです。
ストーリー全体だけでなく、言葉の使い方も非常に繊細で考えさせられるものがありますね。ちょっとネタバレしてしまいますが、『シアワセのはこ』とか。現代社会のブラックユーモアがあって面白いです。

グラフィックについては従前どおり、3次元を見下ろした感じの平面になっています。こういった現代のゲームから見れば非常にチープな感じも、箱庭的なストーリーを強調するのに一役買っていると思います。

音楽も楽しいですね。音楽に絡んだ話なのですが、新しいシステムとしてサウンドバトルというのが面白いですね。このシステムを簡単に説明すると、リズムにあわせてボタンを押すと、戦闘時のダメージが増えていくというシステムです。RPGなのにポンポンAボタンを叩いている、そのゲームは間違いなくMother3です。

待たされたのを十分に満足させる出来だと思います。結論をいってしまえば、皆さん是非やりましょう、ということです(笑)。

21:51 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/481

April 28, 2006

Rubyでgnuplot

最近グラフを書く機会が多いのですが、ただ単純にデータファイルをプロットすればいいという単純な作業はむしろ少なく、データファイルを読み込んでそれから何がしかの計算をした結果をグラフとして出力するという少々込み入った作業が大半を占めています。いちいち中間ファイルを作ると後からみてわけがわからなくなるので、できるだけ計算とグラフ描画はひとつの処理としてまとめてしまいたいと考えました。そこでRubyからgnuplotをコントロールすることを考えました。

以前『リアルタイム Gnuplot』と称してC++からGnuplotに(擬似)リアルタイム描画させるということを紹介しましたが、今回も基本コンセプトは同じで、RubyからパイプでGnuplotにコマンドを発行してやり、グラフを描画することになります。しかしC++のときのように一から作りこむ必要はなく、そのような用途向けのライブラリが既にRubyにはあります。今回はそのライブラリの一つであるRgplotというものを試してみました。

RgplotのExamplesにあるとおり、非常に簡単にデータをグラフ描画させることができます。
このままでも十分使い出があるライブラリなのですが、多くの場合はGnuplotでepsファイルを書かせるということがメインの作業になると思いますので、ライブラリを少し拡張してepsファイルを吐かせるメソッドを作ってみました。

class Gnuplot
    def Gnuplot::plot_eps file_name #2次元プロット
        Gnuplot.open{|gp|
            Gnuplot::Plot::new(gp){|plot|
                plot.terminal "postscript eps enhanced color"
                plot.output file_name
                yield plot
            }    
        }
        
    end
    
    def Gnuplot::splot_eps file_name #3次元プロット
        Gnuplot.open{|gp|
            Gnuplot::SPlot::new(gp){|plot|
                plot.terminal "postscript eps enhanced color"
                plot.output file_name
                yield plot
            }
        }
    end
end
あとは
Gnuplot::plot_eps(file_name){|plot| データの設定等の処理}
すればfile_nameで指定したファイルにepsが吐かれます。現在これを利用して快適にepsファイルを作成しています。

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