March 03, 2010

ビット逆転をC++テンプレートで

ちょっとビットの逆転をする必要があったので、コードを書いてみました。ビットの逆転とは、例えば入力が0b10010101なら、出力を0b10101001とすることです。せっかくなのでC++でテンプレートで実装してみました。

参考にしたのは虎の巻『ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか』です。痒いところに手が届くアルゴズムが色々とあり、とても助けられています。このお題以外にも最近では、整数演算のみでルートをとる方法を調べました。

ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか

追加情報として、この実装は可変長ビット列 long_bits.h に盛り込んであります。また今回のお題に関連して、『ビット列の性質を求める』という記事も以前に書いていました。興味があれば是非見てみてください。

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

March 14, 2010

アレの小型化の実装

『アレの小型化』という記事を書きましたが、その実装が完了しました。振動モータなどを含め動作確認もできたので、近日中にアレを"ソレ"に内蔵させようと考えているのですが、ソレにUSB用の穴をあけるべきかどうしようか悩んでいます。ソレに加工を加えるのを物凄く嫌がる方が、世の中にはかなり多くいらっしゃるそうです。

ということで実装の写真です。

p0ken_top.jpg
p0ken_bottom.jpg
表と裏。

振動モータとコイルがびろんとでている形状です。お次はバッテリー。

p0ken_battery.jpg
外付けLiPo。

バッテリーは70mAhのLiPoを使いました。入手先はラジコン屋さんのHobbyKingです。またソレが発火しても困るので、保護回路(過電流、過充電や過放電などから保護)をebayで落札して外付けで付けてあります。落札したのはPCB(Protection Circuit Board) for 3.7V Li-ion Lipo Battery (3.5A limit)

とりあえず近日中に動作の様子を映像化したいです。

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

March 16, 2010

CygwinのRubyからMatlabを扱う

とあるデータファイルがMatlabのフォーマット(*.mat)だったのですが、それをRubyから読み込めたらいいなぁ、という事態に遭遇しました。王道としてはMatlabを起動してデータファイルを読み込み、それをCSVフォーマットで吐き出させてRuby側で取り込めばいいと思います。しかし、それでは一次ファイルができてしまいクールではないので、Rubyから直接Matlabのファイルを扱えるようにしてみました。

といってもRubyにはMatlabを内部的に呼び出しデータ変換などを可能にしてくれるmatlab-rubyという便利なライブラリがあります。これを使えば解決、と思ったのは束の間、残念ながら僕が所有している環境ではうまくいきませんでした。僕の環境はWindowsのMatlab R2006b(ちょっと古いですね)とcygwinのRubyです。

ということで問題点を調べてmatlab-rubyにあてるパッチを作ってみました。matlab-ruby-2.0.3_cygwin.patch です。問題点としては、必要なヘッダのサーチパスが正しく設定されていなかったこと、Windows版Matlabには(そのままでは)cygwinのgccからリンクできるライブラリが添付されていないこと、この2つです。これらの問題がパッチをあてることで解消され、あとは通常のインストール方法に従うだけでインストールが完了します。
また、もしMatlabを標準("C:\Program Files\MATLAB")と違うディレクトリにインストールしているようでしたら、パッチ中のMATLAB_DIRを修正してください。

最後にcygwinのgccで読めるライブラリを作るにあたっては、『VC++用のDLLをCygwinで使う』がとても参考になりました。ありがとうございます。

※似たような内容で『Matlab mexでCygwin gccやg77を使う(gnumex)』という記事もあります。

※※ 2007aでも試してみました。そのままだと一部問題が発生しますので、パッチを当てた後にext/matlab_api/matlab_api_wrap.cを削除してからruby setup.rb configをしてください。そうすると当該ファイルの最新版が自動生成されてうまくいきます。

22:22 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/742

March 19, 2010

FTCJTAGのバグ取り

『Amontec JTAGkey-Tiny (FT2232) を Xilinx iMPACTから使う』という過去記事があります。これはUSBシリアルコンバータの半導体で有名なFTDIのチップFT2232を使って、FPGAやPROMなどのデバイスをJTAGでコンフィギュレーションしようというものなのですが、巷のツールと大きく異なりFPGAベンタのXilinxの純正書き込みツールであるiMPACTから扱えるため、意外と高評いただいています。それに関するお話です。

このツールですが、FTDIが提供しているJTAG制御ライブラリのFTCJTAGというものに依存しています。ところがこのFTCJTAG(現時点での最新バージョン2.0を元に話をします)には結果的にバグがありまして、PROMのコンフィギュレーションはうまくいくが、FPGAはうまくいかないことがある、という事態を引き起こしていました。ツールをより使いやすくするためにも、FTCJTAGのバグフィクスをしました。

問題はJTAGのTAPステートマシンに関するもので、例えばバッファを越えるような非常に長いビットを読み書きしたいがために、shift DR/IRの状態を維持したまま読み書き関数(JTAG_Write() / JTAG_Read() / JTAG_WriteRead())を抜けたいというところで発生します。通常の使い方は読み書きを抜ける際はさらに状態遷移を引き起こしてrun test idleまで遷移をするのが一般的でこの場合問題はおきないのですが、FPGAへビットストリームをダウンロードする際はビットストリームが長大であること、そしてその間どうやらshift DR状態を維持しなければならないこと(spartan3がそうでした)、というところで問題に気がつきました。そしてこの問題の症状は、関数呼び出し毎におけるデータストリームの最後1bitが、デバイスに送信されなくなります。

FTCJTAG_mod.png
青色が改修部分。

そこで上図のように、改修を加えました。読み書き関数が依存している大元の関数を修正してあります。FTDIで公開されているソース改修を加えたソース、および差分パッチ(FTCJTAG_src_20.patch)を公開します。

※iMPACTから使うツールについても、この修正版FTCJTAGを同梱したものに更新しました。ついでに高速版のFT2232H/4232Hにも対応しています。

18:28 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/743

March 21, 2010

Ruby open-zip.rb

テキスト処理などにとっても便利に使っているRubyですが、Rubyにはopen-uri.rbというライブラリがあります。使い方はrequire 'open-uri'をしておくと、ファイルを開くopenという関数が拡張されて、ローカルにあるファイルと同様にネット上のリソース、例えば open('http://example.com/index.html').read なんてことができます。とっても便利です。

それに倣ってzipファイルの中にあるファイルをopenで取り出せるopen-zip.rbなんていうものをこさえてみました。open('test.zip/hogedir/hoge.txt').read なんてことができます。外部ライブラリとしてZip/Rubyに依存している関係で先にそのインストールが必要ですが、これでzipファイルをいちいち展開せずとも中のファイルにアクセスできるのはとても魅力的だと思います。あとちょっと込み入った使い方として、open('root.zip/sub.zip/hoge.txt').read なんていう多段なzip内zipファイルについても内部的に再帰呼び出しをすることでそのまま扱うことができます。

最後にですが、現時点では書き込み機能は実装されていません。必要が生じたらやってみようとも考えています。

13:34 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (2) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/744

March 25, 2010

『システム同定による小型無人航空機の飛行特性の取得』

ここ3年くらい僕がやっていた話をまとめた文章をリリースします。表題は『システム同定による小型無人航空機の飛行特性の取得』。興味があるようでしたら眺めてくださると幸いです。

内容ですが、ラジコンくらいの小さな飛行機がどんなふうに飛んでいるかそれなりにまじめに調べてみたよ、という話になっています。オートパイロットシステム Super Sylphideも計測装置として非常に活躍しています。

キーワードを羅列しておくと『システム同定(System Identification)』、『小型無人航空機(Small UAV)』、『安定微係数(stability derivatives)』、『ウェーブレット変換(Wavelet Transform)』、『多重解像度解析(Multi-Resolution Analysis)』、『INS/GPS複合航法』、『エアデータセンサ(Air Data Sensor)』、『カルマンフィルタ(Kalman Filter)』、『直交変換(Orthogonal Transform)』、『部分空間同定法(Subspace Identification)』。INS/GPS複合航法は以前の文章『低精度MEMSセンサと汎用GPS受信機の融合による高精度航法システムの研究』ともリンクしています。

個人的にモヤモヤしている部分があったり、これ違うだろという部分もご指摘いただきそうな気もしていますので、あえて改訂番号(オリジナルはRev.A)をつけておきました。

以下、余談です。

その1。先日この文章をもって博士号を取得できましたので、この文章のハードコピーはおそらくそのうちに国立国会図書館でも探すことが出来るようになると思います。その節は関係者の皆様、いろいろとご迷惑おかけしました。ありがとうございます。

その2。年末年始がないよー、みたいなことを言っていましたが、表題の文章を書いていたためです。コツコツ書いていればよかったのですが、僕の性格ですとなかなかそうはいかないということがあらためてわかりました。

その3。この文章をネタに、いくつか英語の文章もつくろうと考えています。『やるやる詐欺』にならないようがんばります。

この文章に関する更新履歴は続きにあります。

続きを読む "『システム同定による小型無人航空機の飛行特性の取得』"
21:54 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (10) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/745