About this site
このサイトは、航空・宇宙コンピュータ電子工作といった時代の最先端のことから、登山といった文明生活から遥かにかけ離れたことまで、思うがままに書いてあります。写真も大好きです。
興味がある方にしかおもしろくないと思いますが、どうぞ楽しんでいってください。あと、MovableTypeのカスタマイズ情報を提供しています。

If you are interested in "Super Sylphide", an autopilot system for small UAVs, please visit this page.

最後に、はてなアンテナやRSSリーダーで読む場合はこちらからどうぞ。
Entries @ recently

July 01, 2009

SWIGでiostreamを引数にとる関数のラップ(Rubyの場合)

とあるC++プログラムをRubyから使いたいということになりました。こんな時はCまたはC++のプログラムを、スクリプト言語から呼び出せるよう、ほぼ全自動でラッパーを生成してくれるSWIGの出番です。このSWIGはかなり賢いので、そんじゅそこらのプログラムでしたら、2,3行のインターフェイスファイルを書くだけで、スクリプト言語とC/C++の間を取り持ってくれます。
しかしながら困ったことに、今回はiostreamを引数にとる関数に遭遇してしまいました。intやchar *といった基本的な型であれば、スクリプト言語のオブジェクトを自動的にそれらの型に変換してくれるのですが、iostreamともなると少々手を入れてやる必要がありました。
なお、C++のiostreamをスクリプト側から使いたいという要望でしたら、こちらは簡単で、標準添付のstd_iostream.iというインターフェイスファイルが要望を満たしてくれます。

まずはじめに、実装が完成した際のプログラムのコードが、こんなにもエレガントになるということを語らせてください(笑)。以下に例を示します。invoked.hがSWIGでラップされる側、invoker.rbがそれを呼び出すRubyのコードです。

// invoked.h
#include <iostream>
struct InvokedCppClass {
    void stream_op(istream &in, ostream &out){
        // read from in and write to out ...
    };
};

// invoker.rb
require 'invoked.so'
invoked = Swig_Wrapped_Module::InvokedCppClass::new
open(src_file){|src|
    open(dist_file, 'w'){|dist|
        invoked.stream_op(src, dist)
    }
}

Rubyの文法と融合しているのが素敵だと思いませんか? 少なくとも僕は満足しています(笑)。

このようにラップをするためには、残念ながらSWIGで水面下でバチャバチャする必要があります。基本方針としては、typemapで呼び出し時に自動的にRubyのIOオブジェクトがiostreamに変換されるようにすることです。そのために、iostreamを生成するのに必要となるstreambufを使ってRubyのIOオブジェクトをラップするクラスを作成しました。この主要な部分をインターフェイスファイルに記述した結果、arg_std_iostream.iのようになりました。

使い方としては以下のようなインターフェイスファイルを作成してSWIGで処理をします。

// invoked.i
%module Swig_Wrapped_Module
%{
#include "invoked.h"
%}

%include arg_std_istream.i
%include invoked.h

確認した限りではファイルをストリームの元とする際は正常に動作しています。しかしcygwinのRubyにおいて、IO::pipeで作成したストリームでは読み書きするデータ量が多いとハングしてしまう問題を発見しました。おそらくcygwinならびにM$特有の問題だと思われるので、今回のコードが悪さをしているのではないと信じたいです。

またSWIGのRubyは多重継承を完全にはサポートしていないようで、ストリームはistreamまたはostream、すなわち読み書きのどちらか一方に絞る必要がありました。この記事のタイトルを正確に書くならば『...istreamまたはostreamを引数にとる...』ですね。

23:59 fenrir が投稿 : 固定リンク | このエントリーを含むはてなブックマーク | この記事をLivedoorでクリップ! | この記事をdelicious.comでブックマーク | この記事をドリコムRSSにクリップ | コメント ←ここから投稿できます!! | トラックバック (0)
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/708

June 25, 2009

猫カメラ、空を飛ぶ!!

某所での実験にて空から一枚。

090623_CatCAM_taiki.jpg

Google先生の地図と比べてみます。

余興として猫カメラを載せてもらった結果です。はやく動画がとれる次バージョンを作りたいにゃあ。

20:39 fenrir が投稿 : 固定リンク | このエントリーを含むはてなブックマーク | この記事をLivedoorでクリップ! | この記事をdelicious.comでブックマーク | この記事をドリコムRSSにクリップ | コメント ←ここから投稿できます!! | トラックバック (0)
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/707

June 20, 2009

シリアルポートをstd::iostreamと同等にMacOSXでも扱う

以前、Windowsでのシリアルポートの読み書きを、C++で標準的な入出力インターフェイスであるiostreamと等価的に扱うためのヘッダを『シリアルポートをstd::iostreamと同等に扱う』という記事で公開しましたが、その後、MacOSXにも対応させました。ことの経緯としては、MacOSXから猫カメラの情報を搭載されたBluetoothで読み出したい(Bluetoothはシリアルポートとして認識されています)ということがあり、対応した次第です。おそらくLINUX/UNIXでも使えると思います。

ということで、最新版のヘッダcomstream.hです。

上記にあげた以前の記事では、*NIX系ならシリアルポートはファイルと等価に扱えるので、特に苦労はしない、のような話を書きました。しかしながら、読み書きの前にボーレートの調整やタイムアウトの設定など、初期化についてはそれなりにやることがあるようなので、やはりヘッダにまとめておいたほうが便利だと思います。そういう意味でもこのヘッダの価値はあるのではないかと思います。

それにしてもiostreamは良くできたクラスだと思います。バッファリングのなし、ありの両方において拡張性が確保されているので、シリアルポートといったハードウェア絡み(ブロッキング動作なのでバッファなしのことが多いと思います)から、プロトコル実装といったソフトウェアアルゴリズム(通常ノンブロッキング動作なのでバッファありが多いと思います)まで、このクラス群ひとつで幅広く対応できてしまうのが素敵です。

17:17 fenrir が投稿 : 固定リンク | このエントリーを含むはてなブックマーク | この記事をLivedoorでクリップ! | この記事をdelicious.comでブックマーク | この記事をドリコムRSSにクリップ | コメント ←ここから投稿できます!! | トラックバック (0)
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/706

June 14, 2009

宇宙がアツいようです

あまり更新がないのもアレなので、最近の話題を書いてみることにします。お題は『宇宙がアツいぜ!!』。箇条書きでいきます。

まずはNHK、『ふたつのスピカ』の実写版をやるようですね。アニメが大変良かった記憶があります(アニメもBS-hiで6/30から再放送らしいです)。未来の話なのに、哀愁がただよっている感じ(主題歌が『見上げてごらん夜の星を』だったはず)が好きです。実写版でライオンさんをどうするのか、ちょっと気になる次第ですが。

かぐやお疲れ様でした。しきしまふげんさんによる衛星擬人化本『現代萌衛星図鑑』も出たことですし、萌えますね。

現代萌衛星図鑑

そういえば最近、攻殻機動隊のテレビシリーズを復習しました。2nd GIGではタチコマのAIが米帝の衛星に乗っていたわけですが、最後の衛星落下シーンで流れる『手のひらを太陽に』には泣かされます。近いうちにBlue-rayででるようです。

宇宙を舞台にした人間ドラマ作品が多いことも事実ですが、そういったあたりに僕はグッとくるようです。

※2009/06/27 衛星萌本入手しました。というかナメていました、この本。いい意味で『イラストよりもテキストの方がぜんぜん濃いじゃないか!!』という内容で、引き込まれます。萌えに興味ない方も購入しやすいようタイトルに『萌』を入れる必要がないんじやないかと思うくらいです。

23:59 fenrir が投稿 : 固定リンク | このエントリーを含むはてなブックマーク | この記事をLivedoorでクリップ! | この記事をdelicious.comでブックマーク | この記事をドリコムRSSにクリップ | コメント(2) | トラックバック (0)
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/705

June 07, 2009

SEED-XDS560Plusとか VS6724 とか

あまりにも更新がないのも申し訳ないので、軽めの近況報告2つでお茶を濁したいと思います。

まずは1つめのお話ですが、オートパイロットシステムSuper SylphideでTIのDSPを使っている関係で、そのDSPの開発環境を強化しました。購入したのはSEED Internationalという会社の560クラスエミュレータで、SEED-XDS560Plusという製品です。日本の代理店、立野電脳さんから購入しました。いままでは下位機種の510クラスのSpectrum Digital XDS510 USBを使っていたのですが、HS-RTDXという高速データ入出力環境を使いたいがために購入に踏み切りました。
現在、統合開発環境(IDE)のCode Composer Studio 3.3 Service Release 11(CCS3.3 SR11)と組み合わせて快適に使えています。最新パッチのSR12ではドライバがまだ提供されていないので動きません。直接SEEDに問い合わせてみたのですが、『ドライバ開発に必要なキットEPKがTIから提供されていないから、出せないんだよ』と言われてしまいました。eclipseベースの新しいCCS4がリリースされる前に3.3SR12対応になるのか、気になるところです。
なお余談になりますが、TIのDSP関係にはかなりの資本投入をしているので、しばらくは離れることはないと思います。ということは次期SylphideもTIのDSPな予感がしています(笑)

2つ目の話としては、STMicroのUXGAカメラモジュールVS6724を、新しい猫カメラに使おうと考えています。この構想は、自作耳掛けMP3プレーヤTimpyでお馴染みのちあきさんMTM03でお会いした際、VS6724を1個買わせていただいたことに端を発しています。ご対応いただきありがとうございました。
現在搭載されているsparkfunで買った東芝のTCM8240MD(現在在庫切れのようです)と違い、VS6724は立派なデータシートが手に入るので、どのレジスタがどの設定(例えば生出力とJPEGの切り替え等)に対応しているのか、手探りをしなくてもよいというわけです。TCM8240MDではJPEGのフォーマットがわからず挫折した経験からいうと、現行品ではないためVS6724の入手に難儀していること、半田パッドの形状が特殊なのでできれば嵌合するソケットのSMK製CLE9124-1501FとCLE9124-1401F(リンクは製品PDF)も入手したいこと、それを差し引いてもデータシートがあることは大きいと思います。
現在も捜索中なのですが、もしVS6724とそのソケットの少量入手経路をご存知の方がいたら、教えていただけると大変助かります。ちあきさんの掲示板に質問させていただいたところ、海外在庫品がキーワードのようでした。

23:43 fenrir が投稿 : 固定リンク | このエントリーを含むはてなブックマーク | この記事をLivedoorでクリップ! | この記事をdelicious.comでブックマーク | この記事をドリコムRSSにクリップ | コメント ←ここから投稿できます!! | トラックバック (0)
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/704

May 30, 2009

Super Sylphide 進捗状況(24) -- DSP航法ファームウェア開発遍歴

しばらく更新をしていなかったオートパイロットシステム Super Sylphide関連の話です。色々と大人の事情(世の中こういえば許されるらしい?、笑)があって記事を更新していなかったのですが、自分で設計したDSP基板自分が考えた航法アルゴリズム(注:リンク先は搭載されているアルゴリズムの一部に過ぎません)が走るというのは気持ちがいいものです、という状況にようやく到達しました。そこで現在に至るまでDSPの開発遍歴をまとめておきたいと思います。

まずは象徴的な図を一枚あげます。

DSP_devel.png
番号1~3の順に開発が進行してきた

当初いきなりDSPで動くアルゴリズムをプログラムするのは難しいと考えました。そこでSylphideから取得したセンサの生データをPCで後から処理するためのプログラム analyze.exeをまずは書きました。analyze.exeは最も時間的制約が緩く、データを都合のよい順に並べ替えて処理しているので、オフラインでの解析に相当します。
ここで並べ替えをしている理由について軽く触れておきます。A/D変換を行う加速度計、ジャイロから出力されるデータは時間遅れが無視できるほど小さいため問題がないのですが、GPSなど内部で複雑な処理を行うものについては無視できない時間遅れが発生するため、データの到着時刻と、そのデータが表現する状態の時刻は一致していません。そのためanalyze.exeでは並べ替えによってこの問題に対応しました。
なおanalyze.exeについてはその後高機能化し、複数GPSアンテナによる解析等を行えるようにしました。

その後、それをリアルタイム化したanalyzeRT.exeというPCで動くプログラムをリリースしました。analyzeRT.exeでは、データの到達順に逐次処理、言い換えれば遅れて入ってきたデータについても最新の状態まで追いかけ処理することによって、時間的に常に最新の状態が出力されるようにしてあります。このプログラムは入力として、analyze.exeと同じSylphideで取得された生データログファイル、あるいはSylphideをPCにUSB経由で接続する際に作られる仮想COMポートから流れてくる生データストリーム、の両者を受け取れるようにしてあります。これでリアルタイムのアルゴリズム的な動作検証を行いました。

最後にDSPへのanalyzeRT.exeの移植をし、NAV2_Coreファームウェアを作成しました。行列計算等の基本演算部分はDSPの特性が生かせるPCのコードを変更しましたが、肝心のアルゴリズム部分はPCと共通のヘッダとし、新たな問題がうきる可能性をできうる限り回避しました。PCとコードを共通化できたのは、使用したDSPがC++でコーディング可能であることによっています。
DSPのデバックフェーズでは検証のしやすさを優先させ、Sylphideのデータを直接処理させずに、DSPの統合開発環境(IDE)であるCode Composer Studio (CCS)に搭載されたRTDX(Real-time Data Exchange)の機能を活用し、PCからデータを送りつけてDSPでそれを処理、またPCに回収するという流れを使いました。行ったのは2つの検証です。1つはanalyzeRT.exeの結果と比べことによるDSP内での処理の妥当性、もう1つはCCSに搭載されたプロファイラによる負荷の見積もりです。両内容ともクリアし、後者によれば加速度計、ジャイロによる20Hzの時間更新(行列の積算、加算が中心)と、GPSによる4Hzの観測更新(行列の加算、逆行列計算が中心)で、最適化オプション-O2で約20Mticks/secの演算量でした。使用しているDSPは200MHzで200Mticks/secの演算能力があるのですが、更新レートが同じであればオーバーヘッドを考えても最大でDSPの演算能力の3割以内くらいで済むと予想しています。これなら航法の後に続く誘導、制御にも相当の能力を割り当てられそう、とほっと胸を撫で下ろしています。

文章にまとめてしまうと量をあまりこなしているようには見えませんが、試行錯誤、紆余曲折をしつつ現在に至っていますので、かけた時間はかなりのものになりました。今後の誘導、制御ルーチンの開発では今回までに獲得した検証スキームを有効活用して効率化をはかりたいと思います。

11:09 fenrir が投稿 : 固定リンク | このエントリーを含むはてなブックマーク | この記事をLivedoorでクリップ! | この記事をdelicious.comでブックマーク | この記事をドリコムRSSにクリップ | コメント ←ここから投稿できます!! | トラックバック (0)
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/703

May 23, 2009

MTM03

[Timely]

風にも負けず、というかインフルエンザ騒動にも負けず(笑えない)、行ってきましたよ!! Make Tokyo Meeting 03。どれも面白かったのですが、写真をいくつか撮ってきたのでアップしてみます。

CA340085.jpg

自作MP3プレーヤー Timpyのchiakiさん。歴代Timpyです。私信ですが、カメラモジュール活用させていただきます。

CA340082.jpg

尻P先生のカルマン渦ミク。工学的に非常に深い現象だったりします。カルマンフィルタのカルマンさんとは、違うカルマンさん(笑)

CA340080.JPG

実物見ることができるとは思っていませんでした。桁ごとクロック KetaClock。桁ごとに独立して売られていて集める楽しみがあるのだとか、ないのだとか(笑)。

CA340083.jpg

タコルカ帽。かぶれます。仕様どおり浮いていますよ。

CA340081.jpg

澪ちゃん…、ではなくて、ビーズは多色でいいですね(意味深い)

他にもアレやコレがあるわけで、興味がある方は明日もありますので是非どうぞ!!

22:15 fenrir が投稿 : 固定リンク | このエントリーを含むはてなブックマーク | この記事をLivedoorでクリップ! | この記事をdelicious.comでブックマーク | この記事をドリコムRSSにクリップ | コメント(3) | トラックバック (0)
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/702