TPN-Dev が 2026年01月29日16時27分22秒 に編集
初版
タイトルの変更
【SPRESENSE】オトシルベ
タグの変更
SPRESENSE
IoT
バイノーラル
GNSS
IMU
3Dプリンター
AWS
メイン画像の変更
記事種類の変更
製作品
本文の変更
## 概要 本作品は「**その場所でしか聞くことができない音**」を録音し、探索し、再生させるための装置です。 好きな場所で自由に**音の標**(しるべ)を立て、さらに**音を導**(しるべ)として録音された場所を辿ることもできます。 SPRESENSEの高精度な測位機能を活用することで実現しました。 主な機能は以下になります。 ### 録音 - 音声データと録音場所の座標をクラウド(AWS)へアップロード - 人の耳のモデルを介した「バイノーラル録音」 ### 探索 - 探索開始地点から、最寄りの録音場所を探知 - GNSSとIMUを活用し、録音場所の方角と距離を算出 - ソナー音(バイノーラル)によって、録音場所まで案内 ### 再生 - 臨場感のある立体的な音像 - 近い録音場所の音声をまとめて再生 ※場所を起点に**対話**が可能 - 持ち手部分を回すことで音量を調整 ## 使用方法  ### 前提 - 野外で使用すること - 有線イヤホン必須 - 通信状況により待機時間が変動 ### 録音 1. 「電源ボタン」をON 1. 全ボタンの点滅が終わった後、点灯している「録音ボタン」を押下 1. 音声等を録音 1. 再度「録音ボタン」を押下することで録音が完了しデータが保存される ※「中断ボタン」押下で録音を中断(保存はされない) ※録音した音声は24時間探索・再生が不可 ### 探索/再生 1. 「電源ボタン」をON 1. 全ボタンの点滅が終わった後、点灯している「探索」ボタンを押下 1. ソナー音を頼りに録音場所へ移動 1. 録音場所へ到着するとソナー音が変化 1. 「再生ボタン」を押下で再生開始 ※「中断ボタン」押下で探索を中断 ※再生した音声は24時間探索・再生が不可 ≪動画≫ ### モード遷移フロー  #### 分岐毎の挙動 | 分岐 | 条件 | 操作 | 結果 | |---|---|---|---|---| | a | 「ニュートラル」モードであること | 「録音ボタン」押下 | 録音開始 | | a' | 「録音」モードであること | 「録音ボタン」押下 | 録音完了 | | b | 「ニュートラル」モードであること | 「探索ボタン」押下 | 探索開始 | | c | 「探索」モードであること、目的地に到着していること | 「再生ボタン」押下 | 再生開始 | | x | - | 「中断ボタン」押下 | 実行中のモードを中断し「ニュートラル」モードに移行 | #### モード毎の挙動 | モード | 効果音 | ボタン点灯パターン | |---|---|---| | ニュートラル | - | 録音ボタン:点灯 / 探索ボタン:点灯 | | 録音 | - | 録音ボタン:点滅 / 中断ボタン:点灯 | | 探索 | ソナー音 | 探索ボタン:点滅 / 中断ボタン:点灯 | | 探索(目的地到着) | 目的地到着 | 探索ボタン:点滅 / 再生ボタン:点灯 / 中断ボタン:点灯 | | 再生モード | 再生開始 | 再生ボタン:点滅 / 中断ボタン:点灯 | ※点灯:利用可能 / 点滅:実行中 ## 筐体設計 ### 3Dプリンターによる制作  #### 制作物 - 本体×1 - カバー×1 - 基盤取付板×1 - 耳取付ジョイント×2 - 持ち手ジョイント×1 - ボリュームつまみ×1 - 持ち手×1 #### 工夫点 - 音の録音に臨場感がでるよう**筐体幅を頭幅にそろえ、耳の形状を再現** - 持ち手を3部材に分割することで、**音量つまみの自由回転を実現** - 耳ジョイントを作成し、耳モデルの取り外しを容易に - 耳ジョイントががたつかないよう微小な「かえし」を作成 ## 電装・電気回路     - LTE拡張ボード[LM1]に、メインボード、マルチIMUアドオンボード、GNSSアドオンボードをスタック - LTE拡張ボードを駆動に十分な出力容量を持つ薄型モバイルバッテリーを使用 - 小型実装可能なデジタルMEMSマイクを使用(LTE拡張ボードに必要な接続変更を実施) - 操作系LED内蔵スイッチをGPIO、ボリュームをアナログ入力に接続 ## ソフトウェア githubパブリックリポジトリ https://github.com/HagTak/otoshirube ※まだ作成していない - SPRESENSE Arduinoライブラリを使用 - ソースコード冒頭部に、使用しているライブラリにかかわる表記を行う予定 - 工夫した点 - 大きな音声ファイルのアップロード、ダウンロードを行うため、**Read / Writeを分割して処理**するようにした - 探索モード時の探索音の再生方法 - 目的地方向を的確に知らせるため、**頭部伝達関数を畳み込んだ12方向分(30°毎)の探索音をSDカードに内蔵し、目的地方角に応じた音源を選択して再生** - 頭部伝達関数は、http://sound.media.mit.edu/resources/KEMAR/full.zip を使用    ## 位置検知 ### GNSSナビゲーションの実装技術 SPRESENSE単体で正確なナビゲーションを実現するために、ハードウェア選定とソフトウェア実装の両面で最適化を行っています。 本項では、GNSS Navigation APIの実装において、技術的に重要視した4つのポイントについて解説します。 ### 1. 高精度・高安定なセンサーハードウェアの選定 ナビゲーションの信頼性を確保するため、標準搭載の機能に加え、以下の産業用途向けアドオンボードを採用しました。 #### ・SPRESENSE GNSSアドオンボード (CXD5602PWBGNSS1W)  Spresense本体の内蔵GNSSに加え、**L1帯とL5帯の同時受信が可能なアドオンボード**を使用しています。 ビル街や樹木下など、マルチパス(電波の乱反射)が発生しやすい環境においても、L5帯の信号を併用することで測位精度を維持し、 **目的の座標を安定して特定**できるようにしています。 #### ・SPRESENSE マルチIMUアドオンボード (CXD5602PWBIMU1J)  方位推定の安定化には、**16個のMEMSセンサー(加速度・ジャイロ)を搭載したマルチIMUボード**を採用しました。 単一のセンサーでは避けられないノイズやドリフト誤差を、16個のセンサーデータを用いた合成処理(アベレージング)によって低減させています。 これにより、**移動中の微細な振動やふらつきの影響を抑えた、安定した挙動検知**が可能となりました。 ### 2. GNSS×IMUのセンサーフュージョンによる方位補正 地磁気センサー(電子コンパス)は、周囲の磁気環境(建物や電子機器)の影響を受けやすく、正しい方位を示さない場合があります。 これを解決するため、本システムでは 「**移動ベクトルによる方位補正ロジック**」を実装しています。 - **課題:** 地磁気センサー単体では、環境要因により「北」の方角に誤差が生じる - **解決策:** ユーザーの移動時、GNSSから得られる「実際の進行方向(移動ベクトル)」と、IMUが示す「機首方位」を比較。 その差分をオフセット値として算出し、リアルタイムで補正 これにより、**磁気干渉を受けやすい環境下でも、歩行し続けることで正しい方位へ収束するアルゴリズム**となっています。 ### 3. POSIXスレッドを用いた非同期処理設計 Spresense(NuttX)のマルチスレッド機能を活用し、各処理を独立したスレッドで並列動作させています。 - **GNSSスレッド:** 測位データの受信と解析をバックグラウンドで実行し、最新座標を保持 - **IMUスレッド:** 60Hzの周期でセンサー値を取得し、フィルタリングと方位計算を継続 - **メインスレッド:** アプリケーションからの要求に対し、待機時間なしで最新の計算結果(座標・距離・角度)を返却 GNSSのデータ受信待ち等によるメイン処理のブロッキングを防ぎ、**音声再生やUI操作のレスポンスを損なわない設計**としています。 ### 4. ナビゲーションに特化したAPI仕様 取得した緯度経度をそのまま返すのではなく、アプリケーション側で使いやすい形式に加工して出力するAPIを実装しました。 - **相対情報の算出:** 現在地と目的地の座標から、大円距離(Haversine法)による「残り距離(m)」と、現在の進行方向に対する「回転角度(Turn Degree)」を内部で計算して返す これにより、アプリ側での計算負荷を軽減 - **時系列ソート機能 (API-3):** 指定範囲内の音声データを検索する際、位置的な近さだけでなく「登録日時(Timestamp)」の昇順でソートして返却する機能を実装 これにより、「過去のデータから順に再生する」といった仕様を低コストで実現 ### まとめ オトシルベのナビゲーション機能は、「L1/L5デュアルバンドGNSSとマルチIMUという高精度」なハードウェアを基盤とし、 **移動ベクトル補正**や**マルチスレッド処理**といったソフトウェア技術を組み合わせることで構築されています。 これらの実装により、**屋外環境における外乱の影響を最小限に抑え、実用性の高い位置特定とナビゲーション**を実現しています。 ## AWS  API Gateway / Lambda / DynamoDB / S3 の4つのサービスを組み合わせて構築されており、役割分担としては下記の構成になっています。 - **API Gateway**:外部からの HTTP リクエスト受付 - **Lambda**:アプリケーションの処理本体 - **DynamoDB**:音声に紐づく位置情報などのメタデータ保存 - **S3**:音声ファイル(mp3)の実体保存 ### 1. クライアントからのアクセス クライアントは、**API Gateway**(REST API) に対して HTTPS でアクセスします。 API Gatewayは「入口」としての役割のみを担い、実際の処理はすべて**Lambda**が担います。 ※APIキー認証を利用 ### 2. API Gateway → Lambda(処理の中核) API Gatewayは **Lambda プロキシ統合**を使って、リクエスト内容を Lambda 関数(otoshirube-backend) に渡します。 このLambdaが、URL、HTTPメソッド(GET / POST)、パラメータを判別し、処理を振り分けています。 ### 3. メタデータの保存先(DynamoDB) DynamoDBに保存しているのは以下のような 軽量なメタデータのみです。 これにより、**近傍検索(指定地点から半径○m以内)を高速かつ低コストで実現**しています。 - 取得日時 - 音声ID - 緯度・経度 - レコード種別 ### 4. 音声ファイルの保存先(S3) 音声データ(mp3)は **Amazon S3** に保存されます。 保存構成は以下の通りです。 sound_items/ {item_id}/ sound.mp3 ### 5. 音声アップロードの仕組み 1. クライアントが POST /sound/items/{id}/body に mp3 を送信 1. API GatewayがリクエストをLambdaに転送 1. Lambdaが音声データを受け取り、S3に保存 1. 保存先(S3 URL)をレスポンスとして返却 ### 6. 音声ダウンロードの仕組み Lambdaが**Base64 形式**で音声データを返却し、API Gatewayがそれを自動的に**バイナリ(mp3)に復元**することで、 クライアントには通常のmp3ファイルとしてダウンロードされます。 ### 7. ログ・運用面 Lambda 実行ログ:CloudWatch Logsに出力 API Gateway アクセスログ:CloudWatch Logsに出力 ※障害発生時は、「API Gateway → Lambda → DynamoDB / S3」のどこで失敗しているかを追跡可能 ## 使用部品 | 部品名 | 単価 | 数量 | 小計 | 参考情報 | |---|---:|---:|---:|---| | SPRESENSE mainボード | 6050 | 1 | 6050 | | | SPRESENSE LTE拡張ボード[LM1] | 10240 | 1 | 10240 | | | SPRESENSE GNSSアドオンボード | 8470 | 1 | 8470 | | | SPRESENSE マルチIMU Add-onボード | 43780 | 1 | 43780 | | | SPH0641LU4H使用 超広帯域マイクモジュールキット | 400 | 2 | 800 | https://akizukidenshi.com/catalog/g/g115577/ | | フレキシブルGNSS U.FLアンテナ | 1507 | 1 | 1507 | | | LED照光式タクトスイッチ 青 キートップ付き | 50 | 4 | 200 | https://akizukidenshi.com/catalog/g/g113870/ | | トグルスイッチ | 999 | 1 | 999 | https://www.amazon.co.jp/dp/B0D4LMTWJR?ref=ppx_yo2ov_dt_b_fed_asin_title&th=1 | | 3.5mmステレオジャック MJ-073H | 450 | 1 | 450 | https://www.amazon.co.jp/dp/B011L1MLUI?ref=ppx_yo2ov_dt_b_fed_asin_title | | USB-Cソケット | 933 | 1 | 933 | https://www.amazon.co.jp/dp/B09VS9NL1N?ref=ppx_yo2ov_dt_b_fed_asin_title | | 薄型モバイルバッテリー | 1232 | 1 | 1232 | https://www.amazon.co.jp/dp/B07SMFDH8K?ref=ppx_yo2ov_dt_b_fed_asin_title&th=1 | | L型コネクタマイクロUSBケーブル | 699 | 1 | 699 | https://www.amazon.co.jp/dp/B0FK9ZL91C?ref=ppx_yo2ov_dt_b_fed_asin_title&th=1 | | 小型ボリューム 10kΩ | 60 | 1 | 60 | ソフトウェア処理可能なのでAカーブでもBカーブでもよい | | 抵抗 1.2kΩ | | 4 | | | | ピンヘッダ・ピンフレーム等 | | 適量 | | | | 配線材等 | | 適量 | | | | 耳モデル | 1380 | 1(1対) | 1380 | [https://www.amazon.co.jp/dp/B0CNNNMG64?ref=ppx_yo2ov_dt_b_fed_asin_title&th=1](https://www.amazon.co.jp/dp/B0CNNNMG64?ref=ppx_yo2ov_dt_b_fed_asin_title&th=1)| ## 最後に 子供の頃、街には市井の人のごく個人的なメッセージが溢れていたように思います。 駅の伝言板、喫茶店のお客様ノート、電話ボックスに貼られたメモ、あちこちに書かれたラクガキなど。 過去にその場にいた誰かがメッセージを残し、そこに自分が遭遇したという事実に、得も言われぬ高揚感を感じたものです。 ネットの普及によりそういったものは無くなりつつありますが、**当時のワクワクを現実世界に復活したい**と思い企画しました。 ソナー音を頼りに街や自然を歩き回り、誰かの声に辿り着いた時。 自分で録音した音声が、未来の同じ場所で再生され、返答が録音されていた時。 なんてことない言葉だったとしても、便利なSNSでは味わえない「**かけがえのなさ**」を感じられると思います。 今は世界に一台しか存在しませんが、もし様々な地域でたくさんの人々に利用されるようになれば、、 **日常や旅先の景色が、より特別なものに感じられる**はずです。 #### 使用例 - 生まれ育った街の思い入れがある場所で、子供時代のエピソードを話してみよう - 取り壊しが決まった建物の前で、そこでの思い出を振り返ってみよう - お祭りの日に、普段とは違う街の環境音を録音してみよう - 旅先で家族と一緒に、旅の感想を語り合ってみよう - 仕事帰りに公園に寄り道し、ベンチに座って愚痴を吐いてみよう - 「駅前のタバコ屋の横の路地を進んで突き当りを右に曲がり3つ目の電信柱の下で次の音声を再生しろ」という感じで謎解き感覚の道案内をしてみよう