前言

@梁博士 制作了一个桌面级模块化群控机器人系统, 取名"CoCube" (Collaborative-Cube), CoCube 将 MicroBlocks 用作其编程环境. CoCube 与 toio 有许多相似的特性, 也有一些 toio 不具备的能力, 如可扩展的硬件接口, 以及与 MicroBlocks 更紧密的结合. 近期 @梁博士 打算使用这款机器人参加中美青年创客大赛, 邀请 MicroBlocks 团队成员参与其中, John Maloney 让我代表团队参与.

为了将 GPT-4o 的能力带给 CoCube, 我打算将 Snap! 用作 CoCube 的上位机, 这样我就可以将之前在这方面的工作迁移到 CoCube 身上. 在解析 CoCube 顶部二维码的过程中, 我发现它基于 ArUco, 与 Dynamic Table 使用的是同一套 marker 系统!

因此只需要实现在 Snap! 中实现 Dynamic Table 库, 就可以将其用于解析 CoCube 的空间位置.

Dynamic Table

当心灵和手不默契,艺术将不存在 – 达·芬奇

在设计这样一个系统时,我们使用的一个隐喻是乐器,比如长笛,它是用户拥有的,并对用户的愿望作出即时和一致的响应。想象一下,在吹出一个音符和听到它之间的一秒钟的延迟是多么荒谬! – Alan Kay & Adele Goldberg 《Personal Dynamic Media》

Dynamic Table 围绕在一张桌子上对实物进行编程的想法构建. 这篇文章 对其做了详细介绍.

来看一些演示视频:

技术层面, 使用了 ArUco 来标识这些自制卡片, 演示视频使用的编程环境是 Scratch + CodeLab Adapter

由于我们已经有了运行在 Snap! 中的 Python 解释器, 我打算让 Snap! 中的 Dynamic Table 库运行在纯浏览器环境中, 如此一来, 不仅提高了开箱可用性, 而且可以运行在移动设备上!

Snap! 中的 Dynamic Table 库

示例项目(点击运行)

FAQ

如何打印 ArUco marker ?

这里提供了一份 30 张的版本:

你可以从 arucogen 里打印(建议从编号1开始)

提升性能

我在 CodeLab 分享了这个工作, 最初的性能比较弱, fps 只有 8 左右.

@禾牧 提醒说:

之前我测了下在 Snap! 里用 Python 拓展处理图片,瓶颈主要在图片转 base64 以及 base64 转图片,计算过程很快

根据 @禾牧 的提示, 我进行了相关部分的优化, 将 DynamicTable 的性能提升了 3 倍左右, fps 达到了 30:

如何将其转化为标准的 Snap! 库?

目前 Dynamic Table 库 已成为了 Snap! 中文版 内置库.

更多细节参考 如何将其转化为标准的 Snap! 库?

参考