设计一个可以探索纸质地图的神奇放大镜
概述
GeoLupe 是一款神奇的放大镜,通过纸质地图展现真实世界。只需移动手臂,将指针指向地图上的任意位置,即可即时显示对应地点的卫星图像。旋转旋钮可平滑地缩放图像,让你像使用显微镜一样,从整座城市到单栋建筑都能轻松探索。
GeoLupe 将熟悉的纸质地图描画体验与丰富的数字卫星影像相结合,将普通的地图变成通往现实世界的窗口。
多个城市的地图存储在SD卡中。启动时只需选择一个城市,将对应的纸质地图放在底座上,便可开始探索。轻轻一点屏幕,你还能立即在卫星图像和标准地图视图之间切换。
无论你是从空中俯瞰家乡,感受飞机舷窗外的开阔视野,还是漫游世界、无目的地漫步,GeoLupe 都为你带来一种全新的地图体验——就像一件被赋予生命的神秘小工具。
特征
•感受从天空俯视纸质地图的奇妙体验。
•可即时显示地图上任意触碰位置的卫星图像。
•通过旋转拨盘平滑地放大或缩小,就像使用显微镜一样。
•只需轻触即可在地图与卫星视图之间切换。
•支持存储在SD卡上的多个城市信息。
•完全离线运行,无需网络连接。
•利用双连杆机构和磁编码器精确估算指针位置。
•地图与卫星图像通过Python从Google Maps静态API下载,并存储在SD卡中。
示例
工作原理/结构
开发GeoLupe过程中最大的挑战之一,是如何准确确定指针在纸质地图上的位置。GeoLupe采用双连杆臂结构,通过测量两个关节的角度,计算出指针在地图上的XY坐标。然而,关节角度与指针位置之间的关系具有高度非线性特征,即使极小的角误差也可能导致明显的定位偏差,因此实现精准坐标估算变得异常困难。
另一个主要挑战是实现指针移动时的平滑实时响应。虽然ESP32可以通过Wi-Fi直接从谷歌地图下载地图图像,但网络访问会引入延迟,从而降低设备的响应速度。为了提供更加流畅的体验,GeoLupe会预先将所有地图和卫星图像存储在SD卡中。这使得系统能够几乎瞬间完成整个流程——坐标计算、图像加载和屏幕更新,使显示效果与手臂运动紧密同步。
结构 > 硬件
主控制器为M5Stack CoreS3 SE,负责显示屏渲染、触控输入以切换地图和卫星视图、从SD卡加载图像瓦片以及读取各类传感器的数据。
手臂末端安装了一个可点击的旋转编码器。通过平稳旋转旋钮,可以放大或缩小地图,同时还能在启动菜单中选择城市。
在第一个原型中,关节角度是通过模拟电位器测量的。这种电位器价格低廉、使用方便,但即使ADC(模数转换器)读数存在微小波动,也会导致显示位置出现抖动。
为了提高精度,我将数百个ADC采样值取平均,加入低通滤波器以减少电气噪声,并在地图上的多个点测量ADC数值,从而建立校准表。尽管这些方法提高了稳定性,但我仍无法达到所需的定位精度。显示的卫星图像经常与纸质地图上标注的位置不完全对齐,因此我决定尝试另一种方案。
下一个解决方案是用两个MT6701磁性旋转编码器取代原有的电位器。MT6701是一种数字I²C编码器,具有14位角分辨率(每转16,384步,每步约0.022°)。切换至数字磁编码器显著提高了测量精度和重复性。
GeoLupe 通过基于双连杆机构角度的正向运动学来确定指针的位置。系统通过计算两个测得的关节角度,推算出末端位置,从而识别出纸质地图上对应的点。
然而,仅依靠运动学无法实现精确的位置估计。在启动时,磁编码器的绝对零点位置未知,且连杆长度、编码器安装以及机械装配中的微小误差都会导致定位偏差。
为补偿这些因素,我在地图上的63个参考点处测量了编码器的实际角度。利用这些测量数据,我采用最小二乘法优化,估算出编码器的零点偏移、连杆长度误差以及机构底座位置偏移。
所得校准参数随后用于正向运动学计算,使 GeoLupe 在整个工作区域内平均实现2毫米以内的定位精度。
结构 > 软件
GeoLupe 会预先将从 Google 地图下载的地图瓦片和卫星图像保存到 SD 卡中,使设备能够完全离线运行。这些文件按以下目录结构组织:z 目录代表 Google 地图的缩放级别,缩放级别越高,图像放大倍数越大,图像细节越丰富。
每增加一级缩放,图像瓦片的数量就会翻四倍。在最高缩放级别下,会产生大量图像文件,这可能会显著降低 SD 卡上文件搜索的速度。为避免这种情况,图像瓦片会根据其 X 坐标进一步划分为多个文件夹,防止单个文件夹包含过多文件。这种结构大幅缩短了文件查找时间,并提高了图像加载和显示的速度。
当 GeoLupe 启动时,它会自动扫描 SD 卡根目录中的文件夹,并显示可用城市的列表。用户只需轻触屏幕即可选择一个城市。每个城市文件夹中还包含一个 config.txt 文件,用于定义该城市的默认、最小和最大缩放级别。这使得不同城市可以使用不同的地图比例尺——例如显示整个大都市区,或聚焦于较小的城镇——同时还能设定用户可缩放的范围。由于所有城市特定的设置和图像数据都存储在每个文件夹内,添加新城市的支持只需将一个新文件夹复制到SD卡上即可,无需修改Arduino程序。
GeoLupe会根据当前指针位置和缩放级别实时计算应显示哪些地图瓦片。它不会加载全部图像瓦片,而仅从SD卡中读取屏幕上当前可见的瓦片。这种选择性加载实现了平滑的平移操作和快速的图像更新,即使处理大型地图数据集也能保持流畅。
旋转旋钮可改变缩放级别,并自动切换至相应的地图瓦片组合。在显示屏上轻触一下,即可立即在标准地图(地图文件夹)和卫星影像(卫星文件夹)之间切换。
GeoLupe将探索实体纸质地图的触觉体验与数字图像的灵活性和细节相结合,让人仿佛透过神奇的放大镜,看到地图背后的真实世界。
本文编译自hackster.io





