toppan_sawatome が 2025年01月29日19時49分39秒 に編集
コメント無し
本文の変更
# はじめに  「われ、よからぬことをたくらむ者なり」 この紙はただの紙じゃない。忍びの地図というものなんだ。 魔法をかけた相手の場所が文字通り手にとるようにわかる魔法の道具さ。 実際の使い方が知りたいって?下の画面を見てくれ! [動作の動画] # 1.構成 ## 全体構成 IMUセンサにより取得した計測開始位置からの移動量をPCに送信します。 UI上で初期位置を指定することで、初期位置からの移動量を1歩ずつ表示することを可能にしています。  ## ハードウェア設計図 ### 準備物 | 部品名 | 数量 | 金額(円) | 役割 | | ------------------------------------ | -- | -------- | ---------------- | | SPRESENSEメインボード[CXD5602PWBMAIN1] | 1 | 6,050 | 制御ボード | | BLE for Spresense【BLE1507】 | 1 | 3,850 | PCとの通信用 | | BMX055使用9軸センサーモジュール | 1 | 2,180 | 歩幅、角度などの算出用 | | リチウムポリマー電池3.7V300mAh | 1 | 900 | バッテリー | | インソール(厚さ3cm) | 1 | 999 | 筐体埋め込み用 | |SPRESENSE用Qwiic接続基板 | 1 | 770 | IMUセンサへの電力供給用| ### IMUユニット構成図 リチウムポリマー電池を電源として用いることで、対象者が自由に歩き回れるように測定デバイスをモジュール化しています。  ### ハウス作成 ハウス作成時の様子 配線しやすいように所々溝を切り、外れないように爪を作成しました。 上から体重がかかることを考え蓋部分はできる限り肉厚にし、Spresense本体とバッテリーを同一平面上に配置することで、モジュール全体の高さを抑えています。  ### 組み立て 1.筐体に各部材を配置 各格納位置にセンサを配置した様子。 ほぼ隙間なく各センサ類が収まりました。  2.ふたをしめてモジュール化 幅:55mm,奥行:65mm,高さ:25mmの直方体にすべてが収まります。  3.インソールとIMUモジュールを靴の中に挿入 直接踏むと足が痛い&モジュールに体重がかかってしまうため、インソールをいれることでかかととセンサ間にかかる力を軽減しています。  # 2.技術要素 ## 歩行者自律航法(PDR:Pedestrian Dead Reckoning) ### IMUのドリフト対策 MEMS式のIMUはゼロ点バイアスにより、ドリフトが起こることが知られています。 真値との誤差を補正する手法、特に環境に参照点を作らずにヒトに貼付したセンサのみで自己位置を推定する手法を歩行者自律航法(PDR)と呼び、過去に様々手法が提案されています。 今回は歩行が周期的な運動であることに着目し、足が静止している間の加速度・角速度の期間の積分を速度・角度・位置の算出から除外することで位置の推定精度を高めています。 具体的には下図に記載の通り下記の処理により歩行中の足の層を判定し、位置の算出を行っています。
1.足の接地の検出
**1.足の接地の検出**
足が接地する際には運動が床と接触して止まることにより加速度が大きく変化することが知られています。 今回は加速度の変化(微分値)をとらえることで、接地の瞬間を計測しています。 加速度の微分値は躍度(加加速度)と呼ばれる値であり、エレベーターの動きだしにガクンと体が下がる感覚を生み出すものとされています。 下図の「Initial Contact」を躍度を用いて検出することで、足の接地を検出しています。
**2.足の静止の検出** 足が接地した直後から体重が接地したほうの足に移ります。 かかとを中心に足部は急激に回転し、足全体が床につきます。(下図中で「Toe On」と記されている時点) 歩行者の体重は急速に接地した足に移され、反対側の足が地面を離れても転ばないようになります。(下図の「Loading Response」) ここからしばらく接地した足は体重を支えるため、静止します。 今回の手法では「Toe On」を加速度と角速度の大きさが一定未満になったときとして検出し、足の静止判定を行います。 次に足が動き始めるまでの間に計測した加速度・角速度を誤差により発生したものをみなし、位置算出のための積分値から除外します。
**3.足の動き出しの検知** 足が接地してから反対の足が接地する少し前まで、足の静止状態(下図の「Foot Rest」)は続きます。 加速度と角速度の大きさのどちらかもしくは両方が一定以上になったときに足が動き出したと判定し(下図の「Heel Off」)、再度、加速度・角度を位置算出のための積分値に含めるようにします。 この時の加速度・角速度の閾値は足の静止検出に用いた値と同値です。 **4.足の離地の検出** 加速度を積分し始め、足部の速度が一定以上になったところを「Toe Off」として検知し、それ以降、足が地面を離れた(下図の「Swing」)としています。 地面から離れている足が再度着地する際に「**1.足の接地の検出**」に出てきた躍度の大きくなる瞬間があるので、そこで1歩が完成します。上記の1から4までのイベントを経て、再度1の足の接地を検出した瞬間までの積分値を位置としてアプリに送信します。
 # 3.ソースコード ## Spresense側 ```arduino:歩幅推定 #define LED_PIN 13 void setup() { pinMode(LED_PIN, OUTPUT); } void loop() { digitalWrite(LED_PIN, HIGH); delay(1000); digitalWrite(LED_PIN, LOW); delay(1000); } ``` ## UI側 ```arduino:UIのコード(大きくなるかも) #define LED_PIN 13 void setup() { pinMode(LED_PIN, OUTPUT); } void loop() { digitalWrite(LED_PIN, HIGH); delay(1000); digitalWrite(LED_PIN, LOW); delay(1000); } ``` # 4.ライセンス 本アプリはPysideを用いているため、ライセンスはLGPL2.1です。 # 5.改善点 ## ジャイロのドリフト誤差について 今回実際に計測を行った結果、位置よりも角度の方がドリフト誤差が大きく乗るような印象を受けました。 今回は実際の進行方向との角度差分が大きくなってしまったため、やむなく進行方向を限定することとなってしまったが、 まもなく発売されるSpresense用のIMU add onボードでリベンジしたいと考えている。 https://www.switch-science.com/products/10181?srsltid=AfmBOopYV03zSuhVSbN7J9IQwqx6kJ3xyr8SIO8syQQH8-zlL6qof_yV IMUセンサを用いることによって限定的ではあるが忍びの地図の機能を再現することができた。 ジャイロのドリフトの補正がしきれずに、進行方向を限定する結果とはなったが、足の接地するタイミングを精度よく計測できたため、実際にヒトが歩いている臨場感のある製品にできた。 将来的にはAHRSなどの回転方向に強いIMUを用いることでより自由な移動経路の算出や異なる補正の仕方を用いてより頑健な位置推定を行っていきたいと思っている。 # おわりに  どうだった? これがあれば、オフィスで迷子になる心配も、誰かを探し回るムダな時間も、全部なくなっちゃう!これで、仕事もスムーズに進むし、最高だろ? おっと、使ってることはばれないほうがいいからな他言は無用だぜ、使い終わりの呪文はこうだ 「いたずら完了!」