2009-12-05[n年前へ]
■Thinkpad 加速度センサ+RubyによるExcel3次元グラフ動画
「Thinkpad 加速度センサでExcel3次元グラフを未来のディスプレイ風にしよう」を操作しているようすを、ケータイのカメラで撮影してみました。それが、下の動画になります。Ruby版 Thinkpad 加速度センサ類取得クラスを使い、Excel 2007のグラフを視点を操作している、という具合の動画です。パースペクティブを適切につけておくと、上下方向の視線移動に関してはかなり自然に眺めることができます。(この動画実行のためのRubyソースは上記記事を参照してください)
Excelの三次元グラフが、ElevationとRotationという、天頂近くで精度が低下しやすい座標指定方式なのと、Thinkpadの加速度センサが2軸方式で、鉛直線中心の回転を取得することができなかったりするところが(東芝のPCなどでは3軸取得が可能だったりするのですが)、「少しの変さ」をかもしだしていたりしますが、そこはそれ、Microsoft ExcelのグラフをノートPCの方向を変えると、それに応じた色々な方向から眺めることができる、というのは何だか面白い、とは思いませんか?
2009-12-06[n年前へ]
■Thinkpad加速度センサ取得用C++クラスの手直しをしました
Lenovo(IBM) Thinkpad加速度センサ取得用C++クラス(関連記事・Thinkpad加速度センサ取得用C++クラス/新しいThinkpad にも対応した加速度センサ値取得プログラム)を少し手直ししておきました。動作は全く変わりませんが前回の修正の際に不要な部分が残っていたので、その点について直しました。
Thinkpad加速度センサ取得用C++クラスをまとめたヘッダファイルソース(Sensordll.h)、および、使用サンプルソース・バイナリ(sample.cpp・sample.exe)は、ここに置いておきました(古いバージョンは、サブディレクトリに置いてあります)。
サンプル・アプリケーション例では、よく意味がわらないままに、"Temprature"も出力するようにしてあります。
sample.exe 1000 10という風にコマンドラインからアプリケーションを実行すると、
0=x, 0=y,35=temp. 0=x, 0=y,35=temp. 0=x, 0=y,35=temp. 0=x, 0=y,35=temp. 1=x, 1=y,35=temp. -16=x, -3=y,35=temp. -1=x, -1=y,35=temp.とった具合に左右方向の傾斜と奥行き方向の傾斜(とtemprature)を出力します。
2010-11-23[n年前へ]
■電車の「起動加速度」を知って、プチ鉄っちゃんになってみる!?
京浜東北線と山手線は田端から品川までの間、隣り合いつつ同じ駅を走り抜けていきます。同じホームの両側から、京浜東北線と山手線は発着するので、ほとんど同じタイミングで(京浜東北線と山手線に)列車が来ているときには、そのどちらに乗ろうか悩んでしまいます。昼間だと、京浜東北線は、各駅停車ではなく(駅を飛ばしす)快速運転をしていたりするので、山手線に乗るか京浜東北線に乗るか悩まずに済むのですが、両方とも同じ各駅停車の場合には、…右往左往してみたりするのです。
そんなとき、鉄っちゃんに、「山手線ナントカナントカ(列車の名称だが、鉄分が足りない私の耳には、ナントカナントカとしか聞き取れなかった)の起動加速度は3.0km/h/sで、京浜東北線のナントカナントカが2.5km/h/sだから、そんな時は京浜東北線に乗った方がいい!」とアドバイスされました。起動加速度とは、停止状態からの加速能力を表していて、それが3.0km/h/sなら、1秒間に時速3kmづつ速度が速くなっていく加速度を示すのだといい、山手線のナントカは、京浜東北線のナントカに対し、1.2倍のスタート時加速能力がある(らしい)というわけです。
その話に興味を惹かれたので、電車の起動加速度をつらつら眺めてみると、
- 阪神5001形 4.5km/h/s
- 京成AE100形電車 3.5km/h/s
- 新幹線N700系電車 2.6km/h/s
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-05-13[n年前へ]
■ネオジム磁石を片手に「静磁気」で物体検出をしてみる!?
iPadやiPhoneから特定物体がどの方向にあるかを検知したいと考えました。まず思いつくのは液晶側に配置されたカメラ画像で(対象物体に適当な色マーカーを取り付けたり顔検出などで)物体の検出を行って、カメラ座標から空間座標に変換するという方法です。…けれど、この方法ではカメラが搭載されていない初代iPadでは実現できないという問題や、計算量が多いというデメリットがあります。
そこで、次はこんなアイデアを思いつきました。まずは、検出したい物体に磁石を貼り付けます。そして、iPadやiPhoneに搭載された「方向検知のための磁気センサー」の値を頼りに磁石ならぬ検出対象物体の方向を見つけ出す、というわけです。(発想の手順は「計算量削減のために検出物体にカラーマーカを取り付ける?→それなら可視光という名前の電磁波でなく静磁界的に強力磁石で代用してもいいかもよ?、という流れです)
さっそくガラクタ箱をあさり、強力極まりないネオジム磁石を見つけ出し、開発用のiPhone4の周りで色々な方向から近づけ・遠ざけ、実験にいそしんでみました(ソースはここに置いておきます)。実験をしながら、ふと6年ほど前のことを思い出しました。
6年前の今頃、デバイスを持つユーザの位置を検出するために、Thinkpadに搭載された(ハードディスク保護のための)加速度センサをハックするアプリケーションを書き、Thinkpadをひたすらシェイク(揺らしまくり)しつつデバッグ/テストをしていました。ハードディスク保護設定をアクティブにしてしまうと、シェイク(揺ら)している時にハードディスクにアクセスできなくなってしまうので、ハードディスク保護のオプションを切り、そんなテストを続けていた結果、…私のThinkpadのハードディスクは不良セクタだらけになりました。
iPhone4に強力一番ネオジム磁石をこすりつけ・テストデータを取りながら、不良セクタだらけになったThinkpadを思いだし、「このiPhoneは壊れないと良いな。壊れないでいて欲しいな。お願いだから、壊れないでね」と願いつつ半泣き状態でテストを行っています。(以前、同じように願いながらテストを行ったThinkpadのハードディスクは不良セクタだらけになったわけですが…)
「下らないアイデア」は「軽く笑いながら」「賢く上手くやり抜く」ものだと奥田民生の歌から教えられました。…けれど、愚かに・泣き笑い状態で実験することが多い自分を振り返ると、頭を抱えたくなります。…その一方で、「崇高な考え」を遂行している気になるよりは「下らないアイデア」を実現している方がずっといい、と思ったりもするのです。