2016年1月30日 シニア技術者勉強会『メガネを見つける』
TRANSCRIPT
AITC シニア会めがねチーム 報告2016/1/30
近藤・吉田1
動機シナリオ ある朝、目覚める 「おや、ここは…自宅だ…」「昨夜は覚えてないけど、よく飲んだなぁ…」「もう、明るいなぁ、何時頃だろ…」 枕元に手を伸ばすいつも眼鏡を置いておく場所 「おや?あれ? な、無い!」
この時の絶望感は、眼鏡をかけてない人には絶対に分からない!(のだそうだ) 冷蔵庫の中に忘れることもあるらしい
2
解決したい課題3
家の中のどこかにあるはずの眼鏡を眼鏡をかけていなくでも探せるようにしたい
当初のアイデア 眼鏡とスマホを通信させて
位置をスマホに知らせる スマホから指示すると音がなる ピカッと光ってもいいかも …
しかし重大な問題点が発覚
4
すでにある! ステッカーとスマホの間の距離をレーダー表示 アイコンをタップで、鳴る、光る 指定した距離の外に移動すると通知 逆に、有効距離内に入った瞬間に通知 Stick-N-Find ステッカー・ファインド
2 個パック: 5,820 円( Amazon )
ステッカー側がボタン電池駆動…そんな重いものを眼鏡に貼り付けるか !?
5
やっぱり電池不要な RFID でしょ RFID とは、 (Wikipedia から )
ID 情報を埋め込んだ RF タグから、電磁界や電波などを用いた近距離(周波数帯によって数 cm ~数 m )の無線通信によって情報をやりとりするもの、および技術全般を指す。 タグの種類 : パッシブタグとアクティブタグ、双方を組み合わせたセミアクティブタグの 3 種類がある。 パッシブタグとは、リーダからの電波をエネルギー源として動作する
RF タグで、電池を内蔵する必要がない。タグのアンテナはリーダからの電波の一部を反射するが、 ID 情報はこの反射波に乗せて返される。 リーダ側は、比較的強めの電波を供給し、タグからの非常に微弱な反射波を受信・解読できる必要がある。
しかし、これにも問題が!
6
めがねに付けるのは難しいかも… タグが結構大きい(アンテナなので小さくできないし、アンテナが大きいほど遠くまで届く) リーダーが電波を飛ばすので免許が要る
免許が不要な出力だと、 30cm 程度しか読みとれない 免許は建物に対する申請なので、別の場所でデモできない
遠距離だと RFID リーダーが高い(15万円~)そもそも タグとリーダーで普通に製品になってる
7
ここで発想の転換! 家の中ならば、『眼鏡の現在位置』ではなく、『自分が昨夜どこにいたか』が分かればよい
スリッパにモーションセンサーを装着して昨夜どこを歩いたかを記録する
X
Y
8
荒本さん手持ちの加速度センサーに挑戦! LSM9DS1搭載 IMU Breakout(9DOF) 3118 円
しかし、 なんと半田付けが必要でした… しかたないので、ワイヤーを手で押さえながら… わけわからんまま一日目終了。
9
この穴にワイヤーを半田付けする
検索したらブレッドボード用のもあるよ。 3軸加速度センサーモジュールKXR94−2050 850 円
10
センサーを検索するときは「 Arduino 加速度センサー」で
Arduino 9軸モーションシールド3790 円
11
Arduino Uno にぴったり被さる。ワイヤー不要でスリッパに装着しても違和感無し! ( かな ?)
x
y
モーションシールドの仕様 BOSCH製 BNO055 を搭載
14bit精度の3軸加速度センサー (X,Y,Z) 16bit精度の3軸角速度センサー (Ωx,Ωy,Ωz) 16bit精度の3軸地磁気センサー (x,y,z)
12
物理のおさらい(1) 加速度 速度 位置 台形公式
積分 積分
t i t i+1
⊿v(ti) = ⊿t ✕ (ai + ai+1) ÷ 2⊿d(ti) = ⊿t ✕ (vi + vi+1) ÷ 2
13
物理のおさらい(2) 重力加速度 9.8m/s2 地磁気 0.45ガウス
-9.8m/s2
x
yz
センサーを水平に置いて静止した場合
0.45G
x
z
北磁極に向けて水平に置いた場合(東京)
北磁極(6 °西 )49°
0.45✕cos49°≒0.32G
0.45✕sin49°≒-0.37G
y
14
では、さっそく測ってみよう!(1)#include "NAxisMotion.h" #include <Wire.h>NAxisMotion mySensor;unsigned long lastStreamTime = 0; const int streamPeriod = 40;
void setup() { Serial.begin(115200); I2C.begin(); mySensor.initSensor(); mySensor.setOperationMode(OPERATION_MODE_AMG); mySensor.updateAccelConfig(); }
15
3 種全部のセンサーを有効にするモード
Arduino IDE の最新版にスケッチがあります。NAxisMotionライブラリの各関数の説明:http://labs.arduino.org/9+Axes+Motion
では、さっそく測ってみよう!(2)void loop() { if ((millis() - lastStreamTime) >= streamPeriod) { lastStreamTime = millis(); Serial.print("Time: "); Serial.print(lastStreamTime); Serial.print("ms "); Serial.print(" a: "); Serial.print(mySensor.readAccelX()); Serial.print(", "); Serial.print(mySensor.readAccelY()); Serial.print(", "); Serial.print(mySensor.readAccelZ()); Serial.print("m/s2 "); Serial.print("gy: "); Serial.print(mySensor.readGyroX()); Serial.print(", "); Serial.print(mySensor.readGyroY()); Serial.print(", "); Serial.print(mySensor.readGyroZ()); Serial.print("d/s "); Serial.print("mg: "); Serial.print(mySensor.readMagX()/100); Serial.print(", "); Serial.print(mySensor.readMagY()/100); Serial.print(", "); Serial.print(mySensor.readMagZ()/100); Serial.print("G "); Serial.println(); }}
16
測定結果は? (置いたまま動かさないで)Time: 1569ms a: -0.03, 0.14, 9.77m/s2 gy: 0.06, -0.31, 0.00d/s mg: 0.13, 0.12, -0.40G Time: 1609ms a: -0.02, 0.15, 9.74m/s2 gy: 0.00, -0.06, 0.06d/s mg: 0.13, 0.12, -0.40G Time: 1649ms a: -0.03, 0.14, 9.77m/s2 gy: 0.06, 0.00, 0.00d/s mg: 0.13, 0.12, -0.40G Time: 1689ms a: -0.03, 0.17, 9.67m/s2 gy: 0.00, -0.06, 0.06d/s mg: 0.13, 0.12, -0.40G Time: 1729ms a: -0.02, 0.15, 9.81m/s2 gy: 0.00, 0.12, -0.06d/s mg: 0.13, 0.12, -0.40G Time: 1769ms a: -0.03, 0.16, 9.81m/s2 gy: 0.12, -0.06, 0.00d/s mg: 0.14, 0.12, -0.40G Time: 1809ms a: -0.03, 0.14, 9.74m/s2 gy: 0.00, -0.06, 0.12d/s mg: 0.14, 0.12, -0.40G Time: 1849ms a: -0.03, 0.16, 9.80m/s2 gy: -0.06, -0.19, -0.12d/s mg: 0.14, 0.12, -0.40G Time: 1889ms a: -0.02, 0.16, 9.72m/s2 gy: 0.00, 0.00, -0.06d/s mg: 0.14, 0.12, -0.40GTime: 1929ms a: -0.02, 0.15, 9.78m/s2 gy: 0.00, -0.12, 0.00d/s mg: 0.14, 0.12, -0.40G Time: 1969ms a: -0.04, 0.20, 9.80m/s2 gy: 0.00, 0.00, -0.19d/s mg: 0.12, 0.11, -0.39G
17
ま、こんなもんか?
実装上の考察(1) 磁気は室内環境に左右される。 今回は絶対的な方位は関係ないので、スリッパを最初に履く時の方向を基準に測定する。地磁気センサーは使用しない 平屋の住まいを前提にすれば、上下移動は考慮する必要はない。 ただし、スリッパが常に水平に保たれるわけではない。スリッパが傾くと x軸・ y軸方向に重力加速度成分が加わってしまう。
18
実装上の考察(2) センサーが前に 20°傾いている場合
-9.8m/s2
x
1. 角速度を積分して傾き 20° を知る2. x軸方向の加速度から 3.35 を差し引く3. さらに cos20°=0.94 を掛ける
y
z
9.8✕sin20°≒3.35m/s2
20°
19
実装上の考察(3) そもそもずっと同じ方向を向いて歩いているわけがない!
x
y
xy
1. α = z軸方向の角速度を積分2. 現在の座標を α°回転した座標に変換
α
うわぁ、けっこう色々面倒じゃん!
20
初期の x軸
大丈夫! BNO005 がやってくれます21
BNO055 データシート 「 Data sheet BNO055 」でグーグル検索してください。 105ページある英語の文書です。 BNO055 の使い方がすべて書いてあります。
22
用語解説 Sensor Fusion
ある現象に対して、それを測定する複数のセンサーーの出力から、データ同士の処理を行い、 1 つの知覚を得ること (wikipedia より ) Absolute Orientation角速度を積分して、絶対方位に対して回転角度(傾き)を求める
Relative Orientation角速度を積分して、初期状態の向きに対して回転角度を求める
Linear Acceleration重力加速度成分を除き、動きによる加速度のみ出力する
23
ということは… IMU モード(地磁気センサーを切る)にして 最初にスリッパを水平にまっすぐ置き Linear Acceleration (ax, ay, az) と Relative Orientation (α 、 β 、 γ) を読んで 座標変換 (ax’, ay’, az’) し ax’ と ay’ を2回積分すればいい まずは、センサーを回転させないように測ってみよう
24
う、それでもそこそこ面倒
プログラムvoid setup() { Serial.begin(115200); I2C.begin(); mySensor.initSensor(); mySensor.setOperationMode(OPERATION_MODE_IMUPLUS); mySensor.updateAccelConfig(); void loop() { if ((millis() - lastStreamTime) >= streamPeriod) { lastStreamTime = millis(); Serial.print("Time: "); Serial.print(lastStreamTime); Serial.print("ms "); Serial.print(" a: "); Serial.print(mySensor.readLinearAccelX()); Serial.print(", "); Serial.print(mySensor.readLinearAccelY()); Serial.print(", "); Serial.print(mySensor.readLinearAccelZ()); Serial.print("m/s2 ");Serial.println(); }}
25
では、早速やってみましょう!26
1. 加速度センサーを静止状態で安定させる
2. 実際に歩いて加速度を測定する
3. 加速度を 2回積分して移動距離を求める
測定の概要 約 4m の範囲で、歩いた軌跡を測定しました。
27
約 4m約 4m
センサーの持ち方
X 方向Y 方向
①
②
③
④
向きを変えないように注意して
1. 加速度センサーを静止状態で安定させる 静止状態でのセンサー値を測定Time: 4591ms a: 0.00,0.03,0.10m/s2Time: 4606ms a: -0.01,0.02,0.08m/s2Time: 4625ms a: 0.00,0.03,0.08m/s2Time: 4641ms a: 0.02,0.03,0.08m/s2Time: 4657ms a: 0.00,0.03,0.08m/s2Time: 4674ms a: -0.01,0.00,0.09m/s2Time: 4690ms a: 0.01,0.01,0.08m/s2Time: 4707ms a: 0.00,0.03,0.07m/s2Time: 4724ms a: -0.02,0.01,0.08m/s2Time: 4741ms a: 0.00,0.01,0.10m/s2Time: 4757ms a: 0.00,0.01,0.08m/s2Time: 4774ms a: 0.00,0.01,0.09m/s2
28
む~ん、 0.00 にならない少し振動してる…けど許容できる誤差でしょう
2. 実際に歩いて加速度を測定する 概ね①~④の動きに合っている。
29
1 21 41 61 81 101 121 141 161 181 201 221 241 261 281 301 321 341 361 381 401 421 441 461 481 501 521 541
-6
-4
-2
0
2
4
6
8
X方向における移動時間と加速度の推移(時間(ミリ秒)/距離( m ))
lX(m/s2)
① ② ③ ④
3. 加速度を 2回積分して移動距離を求める 約 90m進んだようです。(あれ?・・・ 4mじゃ・・・ )
30
1 19 37 55 73 91 1091271451631811992172352532712893073253433613793974154334514694875055235410
10
20
30
40
50
60
70
80
90
100
X方向における移動時間と距離の推移(時間(ミリ秒)/距離( m ))
X
①
② ③
④
ここ!
まとめ 加速度を扱うのは高度な専門技術が必要
2回積分すると少しの誤差でも大幅なずれになる。 数値を取得できても、有効な値を抽出するのは困難。 キャリブレーション、ローパスフィルター、座標変換など勉強が必要。 プロが提供するフュージョン機能を使ってさえ充分な精度は得られない。 センサーの安定までに時間がかかる。
加速度センサーでメガネを探すのはなかなか難しい 平屋の前提でこの難易度高い。 2階建てなら更に UP 。 考慮できていないことも多い。(向き、連続利用など)
31