2008-07-26[n年前へ]
■Simulinkで”日焼け対策”を最適化 Vol.1 [はじめに 編]
先日、Mathematicaで肌の色や日光の色スペクトルを表現するためのライブラリを作り、いくつか計算をしてみました。また、昨日は、「日焼けに影響を与える日照時間」の変化・「気温の変化」「化粧品の商品切り替え時期」「日焼け対策を行う時期」について考えてみました。
そんなことを考え出すと、究極の”日焼け対策”・至高の”日焼け対策”はどういう風にすれば良いだろうか、という技術的な興味が湧いてきます。もちろん、外に一切出ない・顔には紫外線反射膜をコーティングする、といったような対策もあるわけですが、そんな対策をしても「そんな毎日でいいのか?」という疑問を感じるに違いありません。やはり、色々な観点を含めた上で、それらの観点を少しづつ満たすような”日焼け対策の最適化”を考えなければならないように思われます。
そこで、Simulinkを使って、(動的なシステムのモデル化・制御システム構築・プロトタイピングを簡単に行うことができる)MATLAB社のSimulinkで”日焼け対策”を最適化に挑戦してみたくなりました。そこで、今日はまず[はじめに]ということで、平均日照時間と平均気温をSimulinkでグラフ表示してみました。
とりあえず、下の微分方程式のように平均気温(TEMP)の変化は平均日照時間(SUN)に比例するとおくと、
d TEMP /dt = SUN平均気温は平均日照時間を積分したもの、ということになります。そんな関係をSimulinkでモデル化し(数値はまだ合わせていません)、グラフ表示してみたのが下の図です。気温が日照時間に対する「位相遅れ」を持っていることがわかります。
・・・と、ここまでは当たり前の結果ですが、こんな感じで「日焼け対策の最適制御」について色々考えていこうと思います。
2008-08-08[n年前へ]
■LEGO Mindstorms NXT でロボット開発
リアルタイムOSであるOESK RTOS(TOPPERS/OSEKをLEGO NXT 向けに移植した nxt OSEK)で動く LEGO Mindstorms NXT を見ていると、自分でも色々なロボットを作ってみたくなる。たとえば、下の動画は Simulink(…と各種ToolBox) でロボットの制御プログラムを書き、Embedded Coder Robot NXT で LEGO Mindstorms NXT 用にコンパイル・実行したものである。まさに、昔子供(こども)だった大人心をくすぐる「大人の玩具(おもちゃ)」だ。
もちろん、Simulink といった値の張るツールを使わずとも、複雑な色々な制御を短時間にコーディングしようと思わなければ、制御プログラム開発はできそうだ。というわけで、「nxtOSEKアプリケーション動画」の数々を眺めていると、小中学生のこどもの「夏休みの課題」にかこつけてLEGO ロボットを購入し、ロボット・ハッキングで真夏の暑い夜を過ごしてみたくなる大人も多いはず。
2008-09-22[n年前へ]
■アクティブ・ノイズ・キャンセリング PC を作る
「周りの騒音が大きな場所で、集中してPC作業をしたい」と思うことがあります。そんなときに、ふとこんなことを思いつきました。
PCのマイク入力から環境音を取得して、その逆位相の音をスピーカーから出力したら、PCのごく近くの領域だけは、ノイズ=ゼロの理想的な作業環境が生じるのではないだろうか?というわけで、アクティブ・ノイズ・キャンセリング PC を作ってみました。やったことはとても簡単、SimuLinkを使って、サウンド入力の逆位相の音をスピーカーから出力するモデルを作ってみたわけです。一言で書けば、サウンド入力×-1の音声をサウンド出力するだけのモデルです。
1分クッキングで作った「サウンド入力の逆位相の音をスピーカーから出力するモデル」が下中央で、(試しに動かした時の)下左画像はサウンド入力の波形で、下右画像はサウンド出力画像になります。なお、両者ともオートスケールなので、一見するとDCレベルが違っているように見えますが、DCレベルは同じです。(そもそもDC成分はサウンド入出力では無視されますし)
PC周囲の騒音を逆位相の音波で消せたか・・・というと、その効果は全然わかりませんでした。大雑把な計算では、低音騒音は消せそうな気がしたのですが、1分クッキングのアクティブ・ノイズ・キャンセリング・モデルでは何の効果もありませんでした。・・・というわけで、「アクティブ・ノイズ・キャンセリング PC を作る」という楽しい課題がここに生まれたのです。
2008-10-03[n年前へ]
■Simulink と Ada
「いつか触れてみたい Ada」で書いたように、「ボーイング777やF-22戦闘機、あるいは、ニューヨークやパリの地下鉄を動かしている」プログラミング言語Adaを使ってみたい、と思うことがある。
Simulinkを使っていると、CやC++でSimulink の MEX(ユーザーが他言語で作った拡張機能)を作ることが多い。Simulinkは、グラフィカルにコンポーネントをワイヤーで結んでいくのが大きな特徴の一つであるとはいえ、細かな部分分はコードを書く方が楽でわかりやすかったりするからである。
Simulink の MEX 関連サンプルを読んでいると、FORTRAN,C,C++,そして、Ada によるMEXの作り方が書いてある。Adaをよく知らない頃は、なぜAdaが・・・?と思っていた。だけれど、「Adaは信頼性・保守性に優れ主として組み込みシステム向けの言語」ということを知ると、なるほど何より先にAdaの例が登場するのが当然なのだな、と納得することができる。
2008-10-14[n年前へ]
■SumulinkのMex S-Function をどう書くか
「SumulinkのMex S-Functionで非線形なモデルををどのように書くか」よく考える。考えるけれど、いつも、連続的なモデルでなく離散的なモデルとして書いてしまう。最終的には離散モデルとして書き下さなければならないのなら、最初から離散モデルとして書き始めた方が作業が少ないような気がするからである。
それに、連続モデルとして書くにせよ、各状態量の微分量は計算しておいてやらなければならない。それなら、精度が低くても、自分なりのコードで離散時間に対する処理を書いた方が、どのように動いているかを自分なりに単純に把握できて良いような気持ちになる。
他の人たちは一体どのようなスタイルでMEX S-Function を書くのだろうか。特に、C++でMEXを書いたりすることがある人たちのアドバイスを聞いてみたい。