2015年12月4日金曜日

Arduino とレゴで倒立振子(3)電源の性能

かなり前に
という記事を書きましたが,その後これに関連して学会発表をしたり特集号の記事を書いたりしてブログの更新を忘れていました.

特集号の記事は
にあります.現在は計測自動制御学会の会員でないと全文が読めませんが,一年後(2016/3)から無料で読めるようになるはずです.

また,記事の補足として実験機が動作している動画を公開しておきます.


この実験は安定化されているモバイルバッテリーを電源にしていることのメリットを示すためのもので,ギリギリ安定化できている程度の性能が悪い(=よく揺れる)制御器でも14時間程度連続して倒立しており,電源の消費によって実験の再現性が損なわれていないことを確認するものです.

制御器を完全にチューニングすれば持続時間は日単位になると思いますが,あまり意味がないわりに面倒な実験なので試していません.長時間動作させる実験では,地面の起伏とタイヤの滑りで倒立振子が予想できない方向にじわじわ動いていくために,意外と広い実験場所が必要になることと,実験を記録するためのカメラの持続時間が問題になります.もし同様の実験をされる方がいらっしゃいましたら参考にしてください.

3年間授業でこの倒立振子を使っているうちに,いくつか新しい技術が利用可能になり,改善したい点もでてきたので,そのうちまた実験機と記事をアップデートすると思います.

2015年11月18日水曜日

Kindle版の発売日を推定するためのWebサービスを作りました

Kindle版が紙媒体の書籍からどれくらいの時間差で発売されるかは,特に出版社ごとに決まった法則があるわけでもなく,本によってケースバイケースのようです.

しかし,漫画のようにコンスタントに続巻が発売されるものでは,発売日を順番に並べてみるとそれなりに規則性があり,十分に発売日を予測可能なように思われます.

というわけで,Kindle版・コミック版などの発売日を検索し,並べて表示するサイトを作りました.

刊行ペース検索
Kindle版に限らず発売日の予測に便利なので,ぜひご利用ください

以下は技術的なメモです.

2015年6月19日金曜日

netduino 3 wifi で雨量確認ガジェットを作る




最近,研究に使う関係で色々なマイコンを調べていますが,その中でも比較的最近発売された netduino 3 wifi というのがおもしろそうだったので,個人的に購入して遊んでみました.

2015年6月15日月曜日

TeX Live 2015 でアップデートされたパッケージ

TeX Live が2015にアップデートされました.
たまにアップデートされたパッケージが原因で不具合がでることがあり,
原因の特定に手間取るので,2014を消す前に差分をメモしておきます.

以下のリストは適当なスクリプトで自動生成して特にチェックしていないので
重大な間違いがある可能性があります.ご注意ください.

2015年3月5日木曜日

dvipdfmxやdvioutでGhostscript 9.15が\undefinedresourceエラーを出す場合の対処

dvioutやdvipdfmxがeps形式の画像を処理する場合,Ghostscriptが呼ばれます.
最近 TeX Live 2014 をインストールしたマシンでこの処理が

Error: /undefinedresource in resourcestatus
Operand stack:
   false   ct_StyleDicts   --dict:0/4(L)--   Adobe-Japan1   --dict:0/4(L)--   Serif   HeiseiMin-W3-83pv-RKSJ-H   Font   HeiseiMin-W3   CIDFont
Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push   1983   1   3   %oparray_pop   1983   1   3   %oparray_pop   1982   1   3   %oparray_pop   --nostringval--   1966   1   3   %oparray_pop   1852   1   3   %oparray_pop   --nostringval--   %errorexec_pop   .runexec2 --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   1931   10   9   %oparray_pop
Dictionary stack:
   --dict:1196/1684(ro)(G)--   --dict:0/20(G)--   --dict:87/200(L)--   --dict:57/75(L)--   --dict:2/10(L)--   --dict:39/70(L)--   --dict:0/4(L)--   --dict:0/4(L)--   --dict:20/27(ro)(G)--   --dict:20/26(ro)(G)--
Current allocation mode is local
Last OS error: No such file or directory
GPL Ghostscript 9.15: Unrecoverable error, exit code 1

という感じのエラーを出していたので,いろいろ調べてみたところ
TeX Live に付属のGhostscript(tlgs)がバージョン 9.15になったときの変更で
動作しなくなったようです.

場当たり的な対応ですが,とりあえず
http://www.ghostscript.com/GPL_Ghostscript_9.10.html
からバージョン9.10のGhostscriptをインストールして
C:\Program Files (x86)\gs\gs9.10\bin
の内容を
C:\texlive\2014\tlpkg\tlgs\bin
にコピーすれば動くようになります.

Ghostscriptの置き換え方については↓のQ&Aを参考にしました.
http://tex.stackexchange.com/a/204490

あまりよいやり方ではなく,TeX Live をアップデートした拍子に新しいバージョンで
上書きされたりしそうなので,よりよい方法をご存知の方がおられましたら,ぜひ教えてください.

2014年7月27日日曜日

three.jsでブラウザ上で動くインタラクティブな倒立振子シミュレータを作る

引っ越しを機に研究室のサイトを現代的に改装することになりました.

上の倒立振子振り上げアニメーションはサイトのトップページを15年間飾っていた年代物ですが,これもその一環として現代の技術水準で更新することにしました.目標は滑らかでインタラクティブ(ユーザーが外乱を与えて制御系の反応を観察できる)なアニメーションを設置することです.
そのためには
  • ブラウザでリアルタイムに動作する倒立振子振り上げ制御器を実装する
  • ブラウザでリアルタイムに倒立振子の3Dグラフィックスを描画する
必要があります.今後改装を行うときのために,これらのポイントについてメモしておきます.
なお,完成品は以下の様な感じです.


手での操作が可能な完全版は研究室のトップページ

リアルタイム倒立振子振り上げ制御

ユーザーが与える外乱は事前に予測不可能なので,ブラウザ上でリアルタイムに動作する制御器で2本の倒立振子の振り上げを実現する必要があります.最高の効率(最小の制御動作)でこれを行うことは非常に困難な問題ですが,効率に目を瞑ればそれほど難しい問題ではありません.今回はインスピレーションで簡単な切替え制御則を設計しました.実装は
にあります.振り上げたあとの安定化は研究室内学生実験の成果を利用しています.ちなみに倒立振子のモデルは
です.基本的にはアーム部分の加速度を自由に制御できる物として運動方程式を立てただけですが,リアリティを出すためにモデルでもモーターに速度リミッターをつけています.
なお,実装において必要となる演算には Numeric.js を利用しました. Numeric.js は行列計算に加えて数値積分のルーチンまで持っているので,倒立振子シミュレータもこの機能を使って実装しています.
倒立振子のシミュレータに物理エンジンを使えば後々おもしろい拡張も可能かと思いましたが,現状では少し動作が重いようだったので割愛しました.自分のサイトでは重さを度外視して物理エンジンを使ったセグウェイライクな自走式倒立振子シミュレータを設置しているので興味があれば遊んでみてください.

ブラウザ上での倒立振子の3D描画

15年前にはブラウザ上でリアルタイムに3Dグラフィックスを描画するのはほぼ不可能でしたが,最近はブラウザ上でもWebGLという標準仕様で効率的に3Dグラフィックスを描画することができます.しかしWebGLを使って直にプログラムを書くのは大変手間らしく,three.jsというのを使うのが楽なようです.

実際 three.js を使った描画は非常に簡単で,MATLAB用の描画プログラムから特に苦労することもなく倒立振子を描画するルーチンを作成することができました.ただ,作ってから気がついたのですが
  • safari (iPhoneのブラウザ) が WebGL にデフォルトで対応するのはおそらく9月
  • Windows上ではWebGLで DirectX が描画に使われる関係で太い線を描画できない
という問題があったので,現時点では three.js の renderer として WebGLRenderer ではなく CanvasRenderer を使っています.
それほど複雑な物体を描画するわけではないので,こちらのほうが多くの環境で快適に動作するはずですが,何年かしたら WebGLRenderer に切替えてもいいかもしれません.

その他

ワイヤーフレームでの四角形面の描画について

three.jsは,あるバージョンから四角形面を描画する機能が省かれた(3角形2つに分割される)ようです.通常の描画であれば全く問題ありませんが,ワイヤーフレームで描画した場合線が増えて鬱陶しいので,やや古いバージョン(r59)を使っています.最近もバージョンアップで描画性能が向上しているようなので,状況が変われば three.js のバージョンを上げるべきかも知れません.

背景の写真との整合について

背景の写真と倒立振子でパースが狂っていると気持ち悪いので実物の倒立振子が写真に写っていた場合と同じ見え方になるように計算しています.
といってもthree.jsのカメラ設定時に写真撮影時と同じ情報を指定するだけです.
なおthree.jsに指定する画角は画面の縦幅に対応する画角なので,$d$をレンズ焦点距離,$h$をカメラのセンサーの縦幅として
\[
2\tan^{-1}\left(\frac{h}{2d}\right)
\]
で計算される角度にすれば良いと思います.

safariでテクスチャが歪む問題について

three.js の CanvasRenderer と safari (iPhone iPad 等の mobile safari 含む)の組み合わせでテクスチャが正しく表示されない問題がありました.
safariのバグらしいのでそのうち直るかもしれませんが,とりあえずgithubのこのコメントにしたがって
texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
texture.repeat.set( 1, 1 );
とすると正常に表示されます.


2013年9月5日木曜日

Sublime Text の BeautifyRuby プラグインが check your ruby interpreter settings エラーを出すときの対策

Sublime Text で Ruby のコードを書いていて,自動整形が欲しくなり BeautifyRuby プラグインをインストールしたものの "check your ruby interpreter settings” エラーが出て困ったので対策をメモ.

cygwin で Ruby をインストールしていてバージョンが 1.9 以上という場合に限ると思いますが Preferences → Package Settings → BeautifyRuby → Setting で出てくる設定ファイルで "ruby" の行を

  "ruby": "C:\\cygwin64\\bin\\ruby -Eutf-8",

とすると動きました.マニュアルには Windows では "ruby" : "ruby" と設定するように書いてありますが,日本語を含んでいるファイルを整形した場合
  "invalid byte sequence in Windows-31J (ArgumentError)”
というエラーが発生しているようだったので -Eutf-8 オプションを ruby 実行時に与えてみたところ動くようになったという感じです.