|
About this page
カテゴリー Aero & Astroに属する記事の一覧ページです。
現在このカテゴリーには71本の記事があります。 カテゴリー Aero & Astroの説明: 航空機、宇宙機に関することについて書いてあります。 Latest 5 Entries
Super Sylphide 進捗状況(19) --最近の飛行試験オートパイロットシステム Super Sylphideですが、順調に開発が続いています。先日の模型飛行機を使った飛行試験では、以前の記事『i2cでサーボインターフェイス』で書いたシステムを利用して、パイロットの入力を50Hzで取得することに成功しました。 入力履歴をとるとこんな感じでした。 機体の特性把握(いわゆるシステム同定)に向けた特殊な入力も、名パイロットの"社長"氏にお願いして、マニュアル操縦で入力してもらいました。うまく入力できているみたいです。 残念ながら機体の挙動は、モーターの振動が加速度計を共振させてしまっているようで、ちゃんと取得はできませんでした。ペイロード重量の関係で防振対策ジェルを入れられなかったのが敗因です。次回までのこの部分は徹底究明する必要がありそうです。 このまま順当にいけば、数回の実験による飛行データをもとに誘導、制御に取り掛れそうです。また開発が佳境に入ってきたこともあり、チームプレーになってきました。パイロットの"社長"氏、機体整備のY氏、発進担当のM君、ピトー管を作っているH君、これからもよろしくです。 ※その後、コメント欄にちょっと書いてあるカメラモジュールの基板を企画してみました。 『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版ではあることがわかりました。
またさらに以下の疑問点があったので、問い合わせております(→その後、いずれの項目も指摘のとおりという返答をいただきました)。
いずれの問題点も、GPSの仕様書『GLOBAL POSITIONING SYSTEM STANDARD POSITIONING SERVICE SIGNAL SPECIFICATION』(PDF)と付け合せた上での結論です。 ※その後、プログラムを公開を坂井先生にご快諾していただきました。080205_gpsフォルダからダウンロードできます。このプログラムの使用にあたっても、元のCプログラム同様、以下の条件でお願い致します、とのことです。
内容は4章までではなく5章までとしました。実行はVC2005 Express Editionとg++-3.4.4で確認しました。一部別ディレクトリ(commonとnavigation)のヘッダが必要になると思いますが、実行環境に応じて調整を行ってください。 ※(2008/6/27 追記)富士通 近藤様よりプログラムについてご指摘を戴きました。衛星位置の計算の際に、昇降点の経度を求めるのですが、その補正項について解釈を誤っていたようです。この昇降点は『電波が到達した時刻のECEF座標系における値』でなければならないのですが、補正の際には送信時刻ベース(伝播時間を差し引いた時間)の補正であるエフェメリスからの補正、並びに受信時刻ベース(伝播時間を差し引かない時間)の補正である地球自転の2つがあり、それを混同していたようです。これに基づいてプログラムの修正を行いました。修正前の状態は __MISUNDERSTANDING_ABOUT_OMEGA0_CORRECTION__ をdefineすることで再現できるようにしてあります。『理解するためのGPS 測位計算プログラム入門』の質問コーナーにも同等の内容が触れられており、そちらも参考にしました。 学生室内飛行機コンテスト航空機について学んでいる大学生・大学院生への教育活動として、手作りの室内飛行機/飛行船の競技会『全日本学生室内飛行ロボットコンテスト』が今年も開催されるようです。今年で3回目のこの競技会は年々規模が大きくなるようで、先日の申し込み締切りの時点では国内、そして海外から約40チームがエントリしたと聞いています。前回の大会ではニュースに取り上げられていたようですね。 競技会のルールの概略を紹介すると、体育館において手作り小型ラジコン飛行機または飛行船を飛ばし、その機体に搭載された無線ビデオカメラで地面の様子を撮影・転送、地面には文字の書かれた紙が置かれているのですが、その文字を人間がどれだけ判読できるかで主に勝敗が決定します。飛行機について言えば、求められる性能は低速飛行時の安定性や最小旋回半径といったところではないでしょうか。文字が判読できるかどうか、以外にも、機体の独創性やプレゼンテーション(今年から英語のようです)なども評価対象のようです。 さらに今年からは各チーム進捗状況報告を兼ねてブログをつけることがルールに盛り込まれたようです。興味を引かれる内容がありましたら、その際はこちらのサイトでも取り上げたいと思います。開催は来年3月で、応援していきたいと思います。 ※その後、各チームの進捗状況を一度にさらう方法を記事にしてみました。 Super Sylphide 進捗状況(14) -- McBSP(SPI)におけるCPU割込とEDMAの協調製作中のオートパイロットシステムsuper Sylphideですが、DSP上で動作するプログラムのブラッシュアップを進めています。その中でDSPにかかるCPU割り込みが予想外に多く、処理負荷を上げていることがプロファイラによって判明しました。これは以前の記事『DSP/BIOSを利用した割込みMcBSP(SPI Slave)』にもあるとおり、SPIモードで利用しているMcBSPにおいて、4bytesつまり32bits受信するたびにCPUに割込みをかけて受信後の処理をしていたためです。そこで今回はCPU割り込み+CPUに負荷をかけることなくメモリの転送が行えるEnhanced DMA(EDMA)を協調させることによってCPU負荷軽減を目指してみました。 ここで、なぜEDMA単体ではなくCPU割込みと協調なのか、と疑問を持たれる方がいらっしゃるかもしれません。SPIやI2CといったCPUから見れば非常に低速なペリフェラルに対して適用されるDMAは、複数バイトをブロック処理するために使われることが多く、電源ONから電源OFFまでDMAは起動しっぱなし、CPU本体はDMAの起動、停止をいちいち行わない、というのが普通であると思います。特にターゲットとしているDSPのTMS320C6713に搭載されたEDMAは単体でピンポンバッファ(ダブルバッファといったほうが一般的でしょうか)を構成できるので、CPUがEDMAの起動、停止を動作中に変更する必要は全くありません。 ところが残念ながら以前の記事でも書いたとおり、McBSPをSPI互換モード(クロックストップモード)で動作させると、ハードウェアでは複数バイトで意味を構成するフレーム転送がサポートされません。そこでフレームの頭だしをソフトウェアで行うために、CPU割込みが必要となってきます。CPU割込みによって頭だしが行えたらCPU割込みを停止、EDMAを起動して1フレーム分溜まるまでEDMAを動作、EDMAによる1フレーム受信完了後、EDMA終了割込みによってCPU割込みを復活という動作によって解決を図りました。図で示すと、以下のような動作になっています。
このアイデアを実装すると公開中のソースコードのようになりました。この記事を書いている時点でのCVSの管理番号はmain.cpp.1.34です。 最後に、このコードを書くにあたって2点ほど苦労しました。参考になる方がいらっしゃるかもしれませんので記録をつけておこうと思います。 一つはEDMA先がL2キャッシュが効いているCS0上のSDRAMであるため、EDMAを起動する以前にCACHE_wbInvL2()やCACHE_wbL2()によってキャッシュの掃除をしておく必要がありました。これを忘れると、SDRAMに受信内容が書き込まれていなかったり、送信内容が古いままになってしまいます。 もう一つはEDMAとMcBSPの初期化手順です。spra488『TMS320C6000 McBSP Initialization』に厳密な規定があり、これを守らないとEDMAがうまくかかりません。ここには先述のより一般的な使用方法であるEDMAが電源ONからOFFまで起動しっぱなし、というサンプルコードがあり、今回のコーディングはこのサンプルコードをもとに行いました。 ※その後、I/O拡張基板の設計をしました。 Super Sylphide 進捗状況(12) -- DSPプログラムROM化オートパイロットシステムsuper Sylphideですが、航法(INS/GPSナビゲーション)部分がほぼ完成したので、プログラムをROM化しスタンドアローンで動作するようになりました。現在、倍精度浮動小数点(double)で、18状態量(位置で5、速度で3、姿勢で4、センサバイアスで6)、カルマンフィルタの誤差共分散行列では16 x 16のアルゴリズムが100Hzで回っています。 長くなりそうなので、トップページからこられた方を続きをどうぞ。 ※その後、Super Sylphide絡みでTime Keeperのファームウェアを公開しました。 続きを読む "Super Sylphide 進捗状況(12) -- DSPプログラムROM化"Old Entries @ Aero & Astro
| |