2008年11月28日金曜日

xPC Target で CNT24-4D(PCI)H を使う

大学のMATLABのライセンスが統合された関係で,xPC Targetが使えるようになりました.研究室は古いPCがあまりがちなので,これを実験機に回せば安上がりにラピッドプロトタイピングな環境を構築できそうです.

しかし,xPC Targetに対応してるIOボードというのは意外と少なくて
に列挙されてるやつだけです.しかも互換品で型番が違うだけみたいなボードもPCIボードの VendorID / DeviceID で完全にはじいてしまうようです.研究室にあるContecのボードのいくつかは上のリストに挙げられてるんですが,エンコーダ用のカウンタは,すでに廃品種の CNT24-4D(PCI) しか対応して無くて研究室にある現行の CNT24-4D(PCI)H はDeviceIDが違うので認識されません.

幸いなことに xPC Target の IOボードのドライバのコードは書き換えることが出来て,mexなコンパイラの設定をすれば(とりあえず Visual C++ 2008 Express editionが使えた・・)コンパイルして使うことが出来ます.

とりあえず,CNT24-4D(PCI)Hに関してはCNT24-4D(PCI)用のソースの簡単な書き換えだけで対応できることを確認しました.二慣性共振系の実験装置に早速つないで使ってみましたがなかなかいい感じです.実験は本業じゃないし,簡単に実験できるのはいいことですね〜

実は研究室には Interface社のボードの方が多いので,ドライバを書いて使えるようにしたいところです.DAとADくらいならドライバを書くのもそんなに難しくなさそうですしね.というかInterfaceさんが出してくれたりしないかなぁ・・

2008年9月29日月曜日

六足歩行機構

昔作ったものをあさってたら六足歩行機構が出てきました.
ブログのタイトルのところにあるアニメーションのような機構で,モーター1つで歩いてるような動きが出来ます.

完成図
実際の動作の様子

2008年9月24日水曜日

MATLAB対応のSyntaxHighlighter


!! ここの内容はもう古いです.新しいバージョンを作りました !!

MATLABのソースファイルに対応したBloggerで使える整形ツールを探してたんですが,無いようなのでSyntaxHighlighterを改造してみました.

やっぱり人の書いたプログラムもたまには見てみるものですね.勉強になります.
ちなみに追加したコードはこんな感じ.
dp.sh.Brushes.Matlab = function()
{
var keywords = 'break case catch classdef continue else elseif ' +
   'end for function global if methods otherwise ' +
   'persistent properties return switch try while';
this.regexList = [
{ regex: new RegExp('%.*', 'gm'),    css: 'comment' },   // one line comments
{ regex: dp.sh.RegexLib.DoubleQuotedString,     css: 'string' },   // strings
{ regex: dp.sh.RegexLib.SingleQuotedString,     css: 'string' },   // strings
{ regex: new RegExp(this.GetKeywords(keywords), 'gm'),  css: 'keyword' }   // c# keyword
];

this.CssClass = 'dp-c';
this.Style = '.dp-c .vars { color: #d00; }';
}

dp.sh.Brushes.Matlab.prototype = new dp.sh.Highlighter();
dp.sh.Brushes.Matlab.Aliases = ['matlab', 'MATLAB'];
Firefoxでは折り返しがうまく行きませんね.そのうち改善されるかな?
PSOのプログラムとかをこれを使って密かに追加したので良かったら見てくださいませ.

2008年9月21日日曜日

MATLAB用PSOクラス

(English version is HERE.)
MATLABの2008aからオブジェクトの新しい書き方が導入されました.
あんまりオブジェクト指向なプログラミングの経験はないのですが,新しい書き方はだいぶ簡単で使いやすいと思います.

というわけで,とりあえず PSO のルーチンを2008a仕様に書き換えてみました.

pso.m -- PSOクラス
psotest.m --- pso.mの使用例,ベンチマーク問題を解きます.
psotest2.m --- pso.mの使用例,簡単な制約付き最適化問題を解きます.

使い方はpsotest2.mを見ればだいたいわかるはず‥

PSOによる固定構造補償器設計

韓国のIFACではPSO(Particle Swarm Optimization)という最適化アルゴリズムを使った固定構造補償器設計について発表してきました.

発表のメインは,制御系設計で必要となる拘束条件(閉ループの安定性とか)を簡単に扱う方法の提案で,これによってPSOのお手軽さを損なわずに制御系設計をすることが出来ます.

PID制御器のチューニングみたいな,設計変数が少なくて,それでいてパラメータの増減と性能との因果関係がそこそこ強い問題に関しては,PSOは強くてお手軽です.

あまりにもお手軽なので,解析解があるような場合にもPSOで設計しちゃっていいんじゃないかと思うほどです.
理論を研究する立場としては,おもしろくないことこの上ないですが(笑).

しかし,前提となっているのはしっかりしたプラントのモデルで,実用上はこっちの方がネックになるでしょうから,次は連続時間のシステム同定と制御系設計を同時に行えるような理論の構築を目指したいなーとか思っています.
Campi先生のVRFTとかはすごく良いと思うのだけど,やっぱり離散時間システムのいやらしさというか,サンプリング間隔を短く取ることが必ずしも結果に寄与しないというのが単に腹が立つだけでなく,実用上も問題だと思うので.

一応,興味を持たれた方のために発表の参照情報を置いておきます.
Automaticaに投稿した段階では,制約条件の扱いをALPSOという方法で行っていましたが,これは複雑な上に性能が優れているわけではないので,IFACで提案した方法の方が優れていると思います.
I. Maruta, T.H. Kim, T. Sugie:
Synthesis of fixed-structure H-infinity controllers via Constrained Particle Swarm Optimization,
Proceedings of the 17th IFAC World Congress, Seoul, Korea, pp. 7843-7848  (2008. 7)
発表スライド(PDF)
ちなみに発表ではH∞ノルムに基づいた設計仕様を扱っていますが,応答とかに関する仕様を与えても,十分実用的に動くはずです.
そういう場合だと解析解が存在するケースや,もっと効率的な方法がある場合も少なくないでしょうが,PSOよりお手軽な方法はそうないでしょうから,PSOで失敗してから検討してみても良いと思います(笑)

PSOの実装については(自分でやっても大した手間ではないのですが‥)後日また書く予定です.

2008年8月21日木曜日

LDAPとNFS使ってるMacでTeXが遅い問題

研究室のMacはLDAPによる管理で
ホームディレクトリはNFSでマウントされてます.

なんかマシンによってはネットワークユーザーのアカウントでだけ
texとかxdviの動作が異様に遅い・・・

最初はNFSの性能を疑ったんですが
結論はLDAPからのマッピングのところでNFSHomeDirectoryの項に
#Users/netusers/$uid$/macprof
とすべきところが
#Users/netusers/$uid$/macprof/
となっていたことが原因でした.

2008年8月20日水曜日

MacPortsとプロキシ

最近研究環境をMacに移しつつあります。
その一環としてMacPorts入れようとしたら
プロキシの影響でselfupdateのrsyncがうまくいかなかったんですが
なんとか解決。

基本的には
export RSYNC_PROXY="proxy.hoge.net:8080"
みたいなのを実行して
sudo port selfupdate
で良いんですが、
Lepardからはsudo時に限られた環境変数しか引き継がれないらしく
/etc/sudoersに
Defaults    env_keep += "RSYNC_PROXY"
みたいなのを追加する必要があります。

同様の問題で困ってる人は試してみてくださいな。

2008年7月31日木曜日

LQGによる倒立振り子の制御実験

久しぶりにロボット的なものを作りたくなったので
どうせなら制御理論の検証ができるものを…
というわけで、Segway的な倒立振り子を作ってみた。

全体図



機械部分は入手性がよくて組み立て簡単な田宮模型の部品で固めました。
本体はユニバーサルプレートで、たまたま手に入った透明プラスチックバージョンを使ってます。
車輪はナロータイヤセット、ギアはハイパワーギアボックスHEだったと思います。
もうちょっとギア比が低いハイスピードギアボックスの方がベターかもしれません。

電池ボックスは熱に強い金属のやつを買ってきました。
一度熱で端子付近のプラスチックが溶けたことがあるので…

回路を実装する基板はSunhayatoのICB-88

電池ボックスも基板もいい感じにユニバーサルプレートにくっつきます。

回路


回路も今後の補修のために部品の入手性がいいやつで…

右の緑色の基板はトランジスタ技術の付録についてたR8C/Tinyの基板です。
これはSunhayatoからも互換性のあるものが出てますね。

真ん中の青色はSunhayatoの加速度センサーモジュールMM-2860

左の青い基板は同じくSunhayatoのモータードライバモジュールMM-531です。
電流容量0.7Aは心もとないので、2回路をパラレルにして使っています。
同じチップなら特性もわりとそろっているので問題ないと思いますが
あんまり誉められたもんじゃないですね。

左下のディスクリート部品的な部分で2.4Vの電源から3.3Vの電源を作ってます。
モーターの電源は電池直結です。

右端のコネクターはE8aエミュレータを接続するためのもので
上の3線は角速度ジャイロ(KRG-3)
下の2線はデバッグ用のブザー
左の4線は電池とモーターです。

側面




機械部分にあんまりこりたくないのでユニバーサルプレートと
ねじとスペーサーでしのいでいます。
基板を固定するビスがかなり長いのは転倒時に基板が地面に当たるのを防ぐためです。

モーター



モーターについてるセラミックコンデンサはブラシで発生するノイズを
吸収するためのものです。
マイコンと一緒にDCモーターを使う場合には必須らしいです。
たしかに昔PICマイコンを使ってたときにはこれで誤作動しなくなりましたが
最近のマイコンでも必要なのだろうか…

ちなみにエンコーダはついてないので
車輪の回転角は制御していません。角速度のみの制御です。

制御



最初は適当にPID的な制御でも立つかなーと思っていたのですが
意外とチューニングに苦戦したので
おとなしくモデルを構築してLQGを使ってみました。
制御器が不安定システムになるようなので
まぁなるべく極が左の方に来るように調節しています。
制御器は3次のシステムで制御周期は10msです。
R8Cでこの制御周期だと5次くらいまでなら何とかなるかな〜という感じでしょうか。

やっぱりモーター周りのモデルが怪しいのですが、
ロバスト制御の代名詞であるH∞制御とかだとこの手の怪しさは扱いにくいですね。
そのあたりを扱える理論が必要なのだろうか…

2008年4月22日火曜日

MATLABで無名関数

ずっと先輩のコードとかを見て何となく
MATLABのプログラムを書いていたんだけども、
改めてチュートリアルとか読んでみると知らなかった機能が結構ある。

中でも無名関数があったのを知らなかったのは大分損してたかも。
ちなみに使い方はこんな感じ。
>> f=@(x,y) x^2+y^2

f =

  @(x,y)x^2+y^2

>> f(1,3)

ans =

  10

>>



2008年4月21日月曜日

MATLABで図をエクスポートする時に軸が変化する問題

MATLABのFigureをEPSにしようと思って保存すると、
こんな感じの図を保存したのに,


こんな感じに軸が粗くなっちゃうことがよくあります。
これはMATLABがEPSとかAIファイルへのエクスポート時に
文字のサイズを大きくしようとした結果レイアウトが変わることが原因ぽいです。
Figureのエクスポートの設定でフォントのサイズを変えないようにするとか、
スケーリング時の最小値を小さい値にしておくと期待通りの結果になります。


こんな感じに設定すると

こんな感じの結果が得られます。