Repo

kjana00@gmail.com

older <-

2013-01-29 00:43:24

今朝はくもり。朝ごはんはパンとサラダとソーセージ。晩にも雪が降ってたみたいで土手だの車の上だのに雪が残ってる。で、日が無いとなると何とも寒々しい……という程でもなく。新大阪に出る頃には晴れ渡ってきてあったまってきた感じ。良い。

切りのいいところで別件の方にも手を付けておこうかなということで一日かかり切りになってみた。制御の方はもらえるっていうことになってたけど、どうやら向こうは十分にものを渡したつもりらしい……ということで、仕様書と C コードとこの辺がいるっていうメールの文言からコードを起す作業になる。いいよ、もうっていう感じで。

実際のところ今いるのは PID 制御に毛が生えたような部分までなんでそれで多分何とかなるし、とやってて引っ掛かっては悩みしつつ。単に 1 ステップを切り出して元と同じインターフェースのラッパー関数に包んでおくっていうのにちょっとかかったり、今一つ制御側のインターフェースが決まらなくてあれこれしたり。結局フィルタかけた引数のデータ全部時系列で保つ必要無いし、このステップの計算で使う前のステップの値っていうので持った方が作り自体も簡単になるしということでそのように。パラメータ置いてる構造体にフィールド足してデータを持たせるという手抜き。でもまあ、どうせ構造体、値渡ししか出来ないから、中でどう扱っても外には影響無いし。

出来上がったものを組合せてシステムとして動かしてみると何だか単なるオンオフ制御やってるようにしか見えません、っていうのでまたしばらく悩んでみる。パラメータがいい加減だからっていう面もあったけど、っていうかそれが主な理由だったり。ちょっと別のバグもあったはずだけど、何を直したんだか覚えてないぐらいだから大したこと無かったんだ、多分。これで全体が同じサンプリング周期で動く場合についてはひとまず完成、でいいか。

次に実は制御は違うサンプリング周期で動くんだけどね、というのを実装するのにはまってみる。基本、プラント側が吐いたものをリサンプリングして制御に渡して、制御が吐いたものをリサンプリングというか、こっちは時刻に大して最後の値を拾ってきてやればいいはずではある。あるんだけど、何か変。具体的に言うと、サンプリング周期同じにしても出来たって喜んだやつと結果が一致しない。

最初の方でも制御出力が違うなっていうのを眺めてて、リサンプリング後に計算する数が最初合ってないのに気付く。サンプリング周期同じにした場合、時刻 1 での値に対して 1 回の計算でいいんだよ。何で 2 回計算してるのかっていうと、時刻 0 での計算をループ外でやった時に、リサンプリングしたデータ作ってないから、か。ループの中ではデータのベクタ長が前回とどう変わったかで計算回数決めてるから。そこを合わせて、もうちょっと何か直したらまともになった。これでとりあえずはいいかな。

サンプリング周期を実際に使うはずな辺りに設定してみると著しく遅いという問題を抱えつつもとりあえず今日はおしまい。interp1 が遅いのか、リサンプリングしたデータ全部残してるのがメモリを圧迫してるのか…… double の 5000 点を 20 倍したぐらいだから一つにつき 800,000 bytes? 1 Mbytes にもならないのか。それだとやっぱり interp1 かな……制御のサンプリング周期が違うっていったって、他と全然同期しないっていうことはないわけで。全体に対して単純な 1:n の比になるようなら、普通に差分計算して制御のステップ毎に足してやるっていう補完をしたら interp1 の補完よりはずっと軽いはず……かな?

そんなこと考えつつ帰る。晩ごはんは豚汁うどん。やっぱりねぎ入れた方が豚汁、おいしい気がするなとねぎを買って帰って。うん、やっぱり、何か味が違うよね。問題は、ねぎの残りをどうしようかっていうことだ……

後は WWW 見たりゲームしたり。20 階うろうろしてからオークの洞窟に通い出すまで。ちょっとこの辺り地道に進まざるを得ないっていうか、魔道具術師なんていい魔法使えるようになるまでは地味に地道にってそればっかりなわけだけど。気温が下がってきてるんだか、無闇と爪先が冷えるのが辛い。そんなこと言ってる間に寝るといいのかもしれない。

older <-

goto

hint can be:

Tags

old

2007-05 -- 2006-12

ゲーム関係の古い記録

before 2005-12