2011-04-14[n年前へ]
■「Ruby+Thinkpad」で作る地震震度計
地震が続く今日この頃、めまいと地震を区別できない…というシチュエーションのために、昨日は「お手軽な地震検知器」を作ってみました。今日は、その続きとして、Ruby(とIBM産ノートPCを使って)で地震検知器を作ってみることにしました。
地震の震度は、大雑把に言えば、加速度と揺れ動く時間とその周波数で決まります。以前、ノートPCで作る地震警報システムを作ろうとしたことがあります。加速度センサを備えた機器は多いわけですから、身の回りにある機器で地震の震度を算出する…なんていうことは、実に簡単に「できる」ものです。
今日は、以前作った「Ruby版 Thinkpad 加速度センサ類取得クラス」を使って、「地震の震度スクリプト」を書いてみました。ノートPC(Thinkpad)の内蔵センサからの加速度を得て、その上で「揺れ動く時間」と「その周波数」というパラメータを適当にネグった上で(=無視した上で)適当に加速度から揺れ動く(地震の)震度を近似計算するスクリプトを書いてみたのです。このスクリプトは、語句単純に「ruby hoge.rb "スクリプトを走らせる秒(s)数"」という風に走らせることで、100ms毎に検知した加速度から震度を計算し続けて、もしも地面が揺れていると判断された時には、地震の震度を一秒に一回づつ、たとえば、
3 5 (=震度5弱) 5.5 (=震度5強) …といったように表示する、というものになります。そのRubyコードは下のようになります。「Ruby版 Thinkpad 加速度センサ類取得クラス」を、このスクリプトと同じディレクトリにでも置いた上で、このスクリプトを実行させれば、上に示した例のように動きます。
require 'accelerometer' include Math waitSec=0.01 # = each 100ms averageNum=(1.0/waitSec).to_i def send si puts si end def process(gxy) si=nil si=1 if gxy> 0.5 si=2 if gxy> 2 si=3 if gxy> 5 si=4 if gxy> 20 si=5 if gxy> 40 si=5.5 if gxy> 100 si=6 if gxy> 140 si=6.5 if gxy> 200 si=7 if gxy> 400 send(si) if si&&si>3 end class Array def average val=0.0 self.length.times{|i| val+=self[i] } return val/self.length.to_f end end period=ARGV[0].to_i*(1.0/waitSec).to_i acc=Accelerometer.new gdatum=Array.new(averageNum) {|i| 0.0 } gi=0 period.times do |i| gx,gy=acc.getAccelerometerData.map{|v| 980.0*tan((v.to_f)/50.0*22.5/360.0*6.28)} gdatum[gi]=sqrt(gx*gx+gy*gy) gi=gi+1 if gi==averageNum process gdatum.average gi=0 end sleep waitSec end
Thinkpad(やそれと似た同類の危機)に搭載されている加速度センサでは、震度1とか2程度の震度を正確に検知することはできません(その理由は後ほど書きます)。…その一方で、「日本全国の机の上に置かれていて(スマートフォンは、残念ながら、机の上には置かれていないのです)、さらに、その機器を使って”震度”を算出することができる値を刻々計ることができる計測器」というものが、ノートPCほどちまたに溢れているわけでもありません。
今日は、そんな貴重な道具を使ったスクリプトを書いてみました。こんなスクリプト、手元のPC向けのクライアント用スクリプトだけでなく ネットワークに接続しているたくさんの人たちが動かしたら一体どうなるか、ということについては、また明日にでも書いてみたいと思います。
2011-04-15[n年前へ]
■「Ruby+Thinkpad」で作る地震震度クライアント・サーバ・システム
「地震の揺れ」は場所ごとにずいぶん違います。「場所」というのは宮城県とか茨城県といった大雑把なものだけでなく、□△町にある○×ビルの△階…といった場所ごとに「地震の揺れ」は違います。震源地の方向や揺れのモードと建物構造…といったものによって、ずいぶんと「揺れ」は違ってくるものです。
「Ruby+Thinkpad」で作る地震震度計を作ったならば、さまざまな場所で(机の上に置かれたノートPCを用いて)計測した震度をサーバ上に集め、いろいろな場所(条件)下の震度情報を眺めてみたくなります。
というわけで、今日はThinkpadの加速度センサを用いて震度を刻々計測しつつ・それを情報管理サーバに送るクライアントと、クライアントから送られる震度情報を管理する震度情報管理サーバソフトを、それぞれRubyで書いてみました。クライアントソフトは加速度センサからの情報をもとに刻々の震度情報を計算し、揺れが発生している時にはサーバソフトに自分の場所情報や震度情報を送りつけ、サーバソフトはクライアントから送られた情報を格納しつつ、ブラウザからの閲覧に対応する、という作業を行います。
ここに置いた3つのソースコードを同じフォルダにでもダウンロードした上で、サーバにするマシン上でclient.rbの5行目にある
SERVER 192.168.0.1を適当なアドレスに設定してから、
ruby server.rb 8080とサーバを起動させれば、まずは震度情報管理サーバが立ち上がります。さらに、各クライントPCで
ruby client.rbという具合に震度計測クライアントソフトを起動させれば、各クライアントPCが震度情報を刻々とサーバに送信するようになります。そして、震度情報管理サーバは格納された震度情報を(8080ポートの'/'から)ブラウザを用いて眺めることができるようにもしたりする、というわけです。
今日書いてみたサンプルは、簡単なスケルトンです。簡単なスケルトンには、さらなるアイデアをたくさん詰め込むことができるはずです。
…たとえば、「各クライアントPCが震度情報をサーバに送信すると同時に、サーバは他の場所での震度情報(警告情報)をクライアントに教えてあげる・クライアントはどれと同時にビープ音を発する」「建物の何階にいるかということと震度情報の対応を算出する」「全国の震度情報をGoogle Maps上にリアルタイムレンダリングする」…たくさんのアイデアを量産実装したいものです。
2012-05-21[n年前へ]
■「ギークな”遠近両用メガネ”」や「スマホのゴロ寝表示モード」が欲しい!
Kinectのような距離センサや(カメラに搭載されている)視線入力や流体レンズを組み合わせ、どこにでもピントが合って見える”遠近両用メガネ”」が欲しい、というつぶやき。
距離センサ+視線検知(入力)+流体レンズ…な「遠近両用メガネ」が欲しい。
11:14 AM - 21 May 12
そしてまた、ゴロ寝しながらスマートフォンを眺めるダメ人間気分の時のために、「スマホのゴロ寝表示モード」が欲しい!というつぶやき。
スマートフォンの「ゴロ寝モード」=重力上方を(表示の)上方とするのでなく、重力に直交する方向を(表示上野)上方・上向きとする。重力に直交する方向は2方向あるが、その2方向から、スマートフォン規定の1方向を上方向として設定・表示する(←より良い方法がありそう)
4:04 AM - 23 May 12
2013-06-29[n年前へ]
■500円で作る「Oculus Rift動画観賞用メガネ」
Oculus VR社のバーチャルリアリティ用ヘッドマウントディスプレイ Oculus Rift が「没入感が凄い!」と評判になっています。そんなOculus Rift で遊んでる(持ってる)人たちが羨ましくて、Oculus Rift動画用メガネを500円で作ってみました。それが、右の「特殊メガネ」です。ちなみに500円の内訳は、100円ショップで買ったスタンドルーペ(×4個)、仮装用メガネ(×1個)です。
スタンドルーペのレンズを取り出し、仮装用メガネに片側あたり2個ずつ取り付けると、数cm先の液晶画面を超拡大して眺めることができる「Oculus Rift動画観賞用メガネ」のできあがり、です。
完成したメガネを掛けると、右の写真のような具合です。鼻カバーがあるおかげで、顔へのフィッティング度合いはバツグンです。このメガネを掛けて、iPad mini等でOculus Rift動画を眺めると、結構なパノラマ感覚を味わうことができます。
こんなメガネを掛け・iPad miniを顔の前に貼り付けて、Oculus Google Street Viewerみたいなコンテンツをipadの加速度センサにでも連動させてグリグリ動かせば、ちょっと面白そうです。ビンボーな感じが満ちあふれていることは、否めませんが…。