GeoLupe -紙の地図を探検できる虫眼鏡-

ESP32

GeoLupe(ジオルーペ)というデバイスを作りました。M5Stack Global Innovation Contest 2026 応募作品。英語版の記事はHacksterで公開しています。

概要

GeoLupeは、紙の地図を使ってリアルな風景が見える「魔法の虫眼鏡」です。アームを動かして地図上の好きな場所にピンを置くと、その地点に対応した衛星写真が瞬時に表示されます。さらにダイアルを回せば、顕微鏡のように自由に拡大・縮小でき、街全体から建物一つひとつまで細かく観察できます。

GeoLupeは、紙の地図を手でたどる楽しさをそのまま残しながら、デジタルの衛星写真と融合させることで、普通の地図を「現実世界への窓」に変えます。

複数の都市データをSDカードに保存しており、起動時に見たい都市を選択するだけで、その都市の紙地図を使って自由に探索できます。また、画面をタッチするだけで衛星写真と通常の地図表示を切り替えることもできます。

よく知っている自分の町を空から眺めたり、飛行機の窓から街を見下ろすような気分で景色を楽しんだり、目的もなく地図の上を散歩するように世界を巡ったり――GeoLupeは、ひみつ道具に登場するような、新しい地図体験を提供します。

特徴

  • 紙の地図を使って、その地図を空から覗く体験ができる
  • 指した場所の衛星写真をリアルタイム表示
  • ダイヤルで顕微鏡のように拡大・縮小
  • タッチ操作で地図と衛星写真を切り替え
  • SDカードに保存した複数都市に対応
  • インターネット接続なしで動作
  • 2リンク機構と磁気エンコーダーによる座標推定
  • Google Maps Static APIから地図と衛星画像をPythonによって取得しSDカードに保存

動作イメージ

ダイヤルの拡大縮小
タッチ操作で衛星画像⇔地図画像を切り替え
京都の地図を覗く
パリの地図を覗く

仕組み・構造

GeoLupeで最も苦労した点は、「紙の地図上でポインターがどこを指しているのか」を高い精度で検出することでした。このデバイスは2リンクアーム機構を採用し、2つの関節角度を測定することで紙の地図上のポインター位置(XY座標)を算出できます。しかし、この仕組みは角度とXY座標との関係が非線形であり、わずかな角度の変化でも大きくポインター位置が動く可能性があります。

また、ポインターの動きとディスプレイ表示をリアルタイムに連動させるために、衛星画像の表示の更新頻度をいかに上げるかということも苦労した点です。ESP32であればWi-Fi経由でGoogle Mapから直接画像を取得することも可能ですが、座標計算→画像取得→画面更新の流れをなるべく早く行うため、今回はSDカードに保存した画像を読み込むようにしています。

ハードウェア

概要

メインのマイコンにはM5Stack CoreS3 SEを使用し、画面表示、画面タッチによる地図/衛星写真の切り替え、SDカードからの画像データ読み込み、各種センサ値の読み取りを行っています。

リンクの先端にはクリック式のロータリーエンコーダー(ダイヤル)を設置し、ダイヤルの回転によって拡大・縮小操作、初回起動時の地図選択操作を実現しています。

アナログポテンショメータからデジタル磁気エンコーダへ

最初の試作機では、各関節の角度をアナログポテンショメータ(可変抵抗)で測定していました。安価で扱いやすい反面、ADC(アナログ-デジタル変換わ)値のわずかな揺らぎによって表示位置が細かくぶれてしまいました。ADC値を数百回平均したりローパスフィルタ回路を入れノイズの低減を狙う、地図上の多数の点でのADC値を測り補正を掛けるということを行いましたが、ポイントした地図の位置とそこに対応する衛星画像の位置ずれが満足できるほど解消できず、別のアプローチを試すことにしました。

次のアプローチは2つのMT6701 磁気ロータリーエンコーダを使うことです。これは14bitの角度解像度があるI²C接続のデジタルエンコーダです(14bit = 16,384諧調、0.022°)。MT6701に変更したことで精度が格段に上がり、位置の再現性も大きく向上しました。その結果、紙の地図上をなぞるだけで衛星写真が自然に追従する操作感を実現できました。

位置推定

位置推定には2つのリンク角度から順運動学によって、リンクの先端位置(地図のポイント位置)を算出しています。しかし、ロータリーエンコーダーの初期角度がわからないため、このままでは計算できません。また、リンク長の誤差や組み立て誤差により、計算だけでは位置ずれが残る可能性もあります。

そこで複数(63か所)の基準点について実際の角度を測定し、その測定データから最小誤差二乗法を用いて初期角度、リンク長誤差、リンクの根本位置誤差を推定しています。このキャリブレーションによって、平均2mm以内の位置精度を実現しています。


ソフトウェア

SDカード内ファイル

GeoLupeでは、あらかじめGoogle Mapsから取得した地図画像と衛星写真をSDカードへ保存しています。データは次のような階層構造になっています。zはGoogle Mapsのズームレベルを表しており、zの数字が大きいほど高ズームになります。

ズームレベルが一つ上がるごとに画像枚数は4倍になるため、最大ズームの時の画像数は膨大になり、SDカードのファイル検出時間が長くなってしまいます。そのため画像をX座標ごとのフォルダに分割して保存することで、1つのフォルダに大量の画像ファイルが集中することを避けています。これによりSDカードのファイル検索時間を短縮でき、表示速度の向上につながっています。

起動時にはSDカード直下のフォルダを自動で探索し、保存されている都市名を一覧表示します。ユーザーはタッチ操作でその中から見たい都市を選択することができます。都市選択時に読み込まれるconfig.txtには初期/最大/最小のズームレベルが記載されており、都市全体が表示された地図や町単位の地図の両方を使うことができ、そこからどれだけズームできるかも任意に設定することができます。そのため、新しい都市を追加する場合もフォルダをコピーするだけで対応でき、都市ごとにプログラムを書き換える必要はありません。

config.txt

地図表示では、現在位置とズーム倍率から表示すべきタイル画像をリアルタイムで計算し、必要な画像だけをSDカードから読み込んで表示しています。毎回すべての画像を読み込むのではなく、画面に必要な範囲だけを取得することで、高速なスクロールとスムーズな表示を実現しています。

ダイヤルを回すとズーム倍率が変化し、それに応じて異なるズームレベルの画像へ切り替わります。また、画面をタッチすることで通常地図(mapフォルダ)と衛星写真(satフォルダ)を瞬時に切り替えることができます。

紙の地図というアナログな操作感を残しながら、デジタルならではの情報量や拡大表示を組み合わせることで、「地図を虫眼鏡でのぞく」という体験を実現しています。

Pythonプログラム概要(Google Maps Static api からの画像取得)

  • 都市ごとの設定(中心座標・ズーム範囲など)を読み込む
  • Google Maps Static APIから地図・衛星画像を取得
  • 緯度・経度を移動して、地図の範囲分の画像を取得
  • 画像を640×640→600×600ピクセルにトリミング(GoogleMapロゴの削除)
  • 画像をM5Stackで扱いやすいサイズに5×5分割(120×120ピクセル)
  • 都市名 / map・sat / Zoom / X / Y の階層構造で画像を保存
  • config.txtを作成し保存

Arduinoプログラム概要(CoreS3 SE)

  • 起動時にSDカード内の都市フォルダを検索し、表示する都市を選択
  • 選択した都市の設定ファイル(config.txt)を読み込み、初期ズーム、ズーム範囲を設定値に代入
  • ↓以下Loop
  • 2つの磁気エンコーダ(MT6701)からリンクの角度を取得
  • 順運動学を用いて、ピン先端の地図上の座標を算出
  • 現在の座標とズーム倍率から、表示すべき地図タイルを計算
  • 必要なタイル画像のみをSDカードから読み込み、スプライトに描画
  • UI(ズーム倍率、スケールバー)をスプライトに描画
  • 合成したスプライト画像を画面に表示
  • ロータリーエンコーダで衛星・地図画像を拡大・縮小
  • 画面タッチで衛星写真と通常地図を切り替え

開発経緯 (Development Story)

GeoLupeは、ドラえもんのひみつ道具「ポラマップスコープとポラマップ地図」に影響を受けて製作しました。紙の地図を覗くと、その場所の実際の景色が見えるというアイデアに魅力を感じ、現在の技術で再現できないだろうかと考えたことが開発のきっかけです。

現在ではスマートフォンで簡単に地図や衛星写真を見ることができますが、紙の地図を広げて目的地を探したり、知らない場所を眺めたりする体験には、デジタルにはない楽しさがあります。GeoLupeでは、そのアナログな体験を活かしながら、紙の地図とデジタル情報を組み合わせることで、新しい地図の楽しみ方を提案しました。

地図上を自由に移動し、拡大・縮小しながら景色を眺めることで、その場所に何があるかを想像しながら街を探索できます。GeoLupeが、地図を見る楽しさや、知っている町の知らない一面を見つけたり、まだ知らない外国に思いを馳せるきっかけになれば幸いです。

コメント

タイトルとURLをコピーしました