提醒: 这儿是 CoCube 的第一篇论文
上篇文章提到:
@梁博士 制作了一个桌面级模块化群控机器人系统, 取名"CoCube" (Collaborative-Cube), CoCube 将 MicroBlocks 用作其编程环境. CoCube 与 toio 有许多相似的特性, 也有一些 toio 不具备的能力, 如可扩展的硬件接口, 以及与 MicroBlocks 更紧密的结合.
最近我为 CoCube(由 MicroBlocks 驱动) 设计了一个 Snap! 驱动库:

CoCube 已经可以在 MicroBlocks 中编程了(感谢 @梁博士 的出色工作!). 为 CoCube 制作 Snap! 驱动库有以下两个动机:
构建优秀且可扩展的系统的关键更多的是设计模块之间如何通信,而不仅仅是设计其内部属性和行为 – Alan Kay
由于 Snap! 和 MicroBlocks 都是个人计算精神的产物, 都拥有极为出色的动态性, 我确信可以通过消息传递来实现目标: 在 Snap! 中对 CoCube 进行编程.
我喜欢采用 消息传递 来设计系统之间的互操作机制, 这样做能够最大限度地降低了系统之间的耦合度.
Snap! 中已经存在了用于在 Snap! 和 MicroBlocks 直接传递消息的库:

这个库提供了传递消息的基础功能, 我打算以这个库为基础, 制作 CoCube 库, 力求做到:
关于第 1 点: 获取另一个系统的状态信息, 通常有两种方式:
MicroBlocks messaging(BLE) 库提供了 PubSub 风格的消息流, 我打算基于它构建出 dynatalk-over-ble, 然后基于 dynatalk-over-ble(类似dynatalk-over-postmessage) 实现 pull 风格的 CoCube 库.
在我们的用例中, 只需要实现单向的 C/S 架构(Snap! 为 client, MicroBlocks 为 server). 所以 dynatalk-over-ble 的复杂性只有常规 dynatalk 的一半, 令人开心的是, 正好计算能力偏弱的 MicroBlocks 那一半极为简单.
前头提到, 我们力求做到:
用户只需要在 Snap! 中编程即可, 无需在 Snap! 和 MicroBlocks 中来回切换.
因此我希望 MicroBlocks 一侧中的代码是完全通用的, 用户只需要刷入这个通用程序, 就不再需要打开 MicroBlocks 平台, 完全在 Snap! 中对设备进行编程
为了做到这点, 我们在 MicroBlocks 中运行这个通用程序:

这段程序负责以下工作:
call 积木实现的, 它类似其他编程语言中的 eval , 可以动态运行自定义积木和 vm primitive.
handle_message 积木用于处理非阻塞式的消息handle_blocking_message 积木用于处理阻塞式的消息你可以将这个程序视为运行在硬件中的 server, Snap! 则是它的 client. 我们使用了 C/S 架构.
前边提到:
- 用户可以在 Snap! 中获取 MicroBlocks 设备的状态信息(reporter 积木)
- 用户可以在 Snap! 中给 MicroBlocks 设备发送指令(command 积木)
我们分别展示它们是如何做到的:
对于第 1 点, 获取状态信息(reporter 积木):

对于第 2 点, 发送指令(command 积木):

消息采用纯字符串形式, 携带方法名(自定义积木名字或者 vm primitive)和 参数, 以 , 分隔 , 以下是一个例子: call, <msg-id>, Move Forward, 50
要使用 CoCube 库, 只需打开 Snap! 平台即可.
加载 CoCube 库,

点击 open MicroBlocks project 积木, 将打开 MicroBlocks 窗口, 连接设备将程序刷入后, 即可断开并关闭 MicroBlocks 窗口.

然后在 Snap! 中开始编程.
你甚至调用任意的 vm primitive:

下载 https://snap.codelab.club/libraries/CoCube2.xml. (在浏览器打开, 另存为本地文件)
执行以下操作
CoCube2.xml 改名为 CoCube3.xmlCoCube3.xml 文件:
🚙 全部为新的 emoji, 如 🚕. (vscode有批量替换功能)🚕 CoCube2 全部替换为 🚕 CoCube3_CoCube2_ 全部替换为 _CoCube3_以此类推, 你可以添加任意多个 CoCube!
当有多个 MicroBlocks 设备时, Snap! 非常适合作为 “演示控制台”, 我在这个视频里做了分享

是的, 你可以同时调试软件和硬件侧的代码! 一切都是活性(liveness)的!
你可以在 Snap! MicroBlocks 中同时连接同一个设备, 然后观察消息在它们之间的流动:

无法使用菜单中的 Save 按钮打开本地文件, 点击 Copy project url to clipboard, 然后粘贴到浏览器地址栏里, 之后再保存
无法使用菜单中的 Open 按钮打开本地文件, 需要将本地文件直接拖拽到 MicroBlocks 窗口
可以在 ubl 库文件中找到这些 primitive, 它的形式是[a:b], 如 [display:mbPlot]

Peter 在 Discord 上分享了一些例子:

MicroBlocks 部分:

这段程序负责以下工作:
when started 积木), 这些状态可以自行扩展. 目前的更新速率是 20 次/秒(可自定义)handle_message 积木), 将消息的语义"接地"到硬件设备的具体功能上. “接地” 工作是使用 call 积木实现的, 它类似其他编程语言中的 eval , 可以动态运行自定义积木和 vm primitive.值得注意的是, push 的速度要比 pull 快很多, 如有需要, 可以把它们二者结合.
本文的设计很容易迁移到 Python 中, 使用我之前为 Python 制作的 microblocks_messaging_library 和 dynatalk-py 库, 可以很容易地实现跟 MicroBlocks Client 库相同的功能.
|
|
记得先往设备里刷入这个程序(和 Snap! 相同)
更多 API 例子参考: notebooks
CoCube 库的源代码
|
|
|
|
可模仿已有积木进行扩展
先往设备里刷入这个程序(和 Snap! 相同)
参考 module.ipynb
相关源代码: CoCube module
提醒: 这儿是 CoCube 的第一篇论文
上篇文章提到:
@梁博士 制作了一个桌面级模块化群控机器人系统, 取名"CoCube" (Collaborative-Cube), CoCube 将 MicroBlocks 用作其编程环境. CoCube 与 toio 有许多相似的特性, 也有一些 toio 不具备的能力, 如可扩展的硬件接口, 以及与 MicroBlocks 更紧密的结合.
最近我为 CoCube(由 MicroBlocks 驱动) 设计了一个 Snap! 驱动库:

CoCube 已经可以在 MicroBlocks 中编程了(感谢 @梁博士 的出色工作!). 为 CoCube 制作 Snap! 驱动库有以下两个动机:
构建优秀且可扩展的系统的关键更多的是设计模块之间如何通信,而不仅仅是设计其内部属性和行为 – Alan Kay
由于 Snap! 和 MicroBlocks 都是个人计算精神的产物, 都拥有极为出色的动态性, 我确信可以通过消息传递来实现目标: 在 Snap! 中对 CoCube 进行编程.
我喜欢采用 消息传递 来设计系统之间的互操作机制, 这样做能够最大限度地降低了系统之间的耦合度.
Snap! 中已经存在了用于在 Snap! 和 MicroBlocks 直接传递消息的库:

这个库提供了传递消息的基础功能, 我打算以这个库为基础, 制作 CoCube 库, 力求做到:
关于第 1 点: 获取另一个系统的状态信息, 通常有两种方式:
MicroBlocks messaging(BLE) 库提供了 PubSub 风格的消息流, 我打算基于它构建出 dynatalk-over-ble, 然后基于 dynatalk-over-ble(类似dynatalk-over-postmessage) 实现 pull 风格的 CoCube 库.
在我们的用例中, 只需要实现单向的 C/S 架构(Snap! 为 client, MicroBlocks 为 server). 所以 dynatalk-over-ble 的复杂性只有常规 dynatalk 的一半, 令人开心的是, 正好计算能力偏弱的 MicroBlocks 那一半极为简单.
前头提到, 我们力求做到:
用户只需要在 Snap! 中编程即可, 无需在 Snap! 和 MicroBlocks 中来回切换.
因此我希望 MicroBlocks 一侧中的代码是完全通用的, 用户只需要刷入这个通用程序, 就不再需要打开 MicroBlocks 平台, 完全在 Snap! 中对设备进行编程
为了做到这点, 我们在 MicroBlocks 中运行这个通用程序:

这段程序负责以下工作:
call 积木实现的, 它类似其他编程语言中的 eval , 可以动态运行自定义积木和 vm primitive.
handle_message 积木用于处理非阻塞式的消息handle_blocking_message 积木用于处理阻塞式的消息你可以将这个程序视为运行在硬件中的 server, Snap! 则是它的 client. 我们使用了 C/S 架构.
前边提到:
- 用户可以在 Snap! 中获取 MicroBlocks 设备的状态信息(reporter 积木)
- 用户可以在 Snap! 中给 MicroBlocks 设备发送指令(command 积木)
我们分别展示它们是如何做到的:
对于第 1 点, 获取状态信息(reporter 积木):

对于第 2 点, 发送指令(command 积木):

消息采用纯字符串形式, 携带方法名(自定义积木名字或者 vm primitive)和 参数, 以 , 分隔 , 以下是一个例子: call, <msg-id>, Move Forward, 50
要使用 CoCube 库, 只需打开 Snap! 平台即可.
加载 CoCube 库,

点击 open MicroBlocks project 积木, 将打开 MicroBlocks 窗口, 连接设备将程序刷入后, 即可断开并关闭 MicroBlocks 窗口.

然后在 Snap! 中开始编程.
你甚至调用任意的 vm primitive:

下载 https://snap.codelab.club/libraries/CoCube2.xml. (在浏览器打开, 另存为本地文件)
执行以下操作
CoCube2.xml 改名为 CoCube3.xmlCoCube3.xml 文件:
🚙 全部为新的 emoji, 如 🚕. (vscode有批量替换功能)🚕 CoCube2 全部替换为 🚕 CoCube3_CoCube2_ 全部替换为 _CoCube3_以此类推, 你可以添加任意多个 CoCube!
当有多个 MicroBlocks 设备时, Snap! 非常适合作为 “演示控制台”, 我在这个视频里做了分享

是的, 你可以同时调试软件和硬件侧的代码! 一切都是活性(liveness)的!
你可以在 Snap! MicroBlocks 中同时连接同一个设备, 然后观察消息在它们之间的流动:

无法使用菜单中的 Save 按钮打开本地文件, 点击 Copy project url to clipboard, 然后粘贴到浏览器地址栏里, 之后再保存
无法使用菜单中的 Open 按钮打开本地文件, 需要将本地文件直接拖拽到 MicroBlocks 窗口
可以在 ubl 库文件中找到这些 primitive, 它的形式是[a:b], 如 [display:mbPlot]

Peter 在 Discord 上分享了一些例子:

MicroBlocks 部分:

这段程序负责以下工作:
when started 积木), 这些状态可以自行扩展. 目前的更新速率是 20 次/秒(可自定义)handle_message 积木), 将消息的语义"接地"到硬件设备的具体功能上. “接地” 工作是使用 call 积木实现的, 它类似其他编程语言中的 eval , 可以动态运行自定义积木和 vm primitive.值得注意的是, push 的速度要比 pull 快很多, 如有需要, 可以把它们二者结合.
本文的设计很容易迁移到 Python 中, 使用我之前为 Python 制作的 microblocks_messaging_library 和 dynatalk-py 库, 可以很容易地实现跟 MicroBlocks Client 库相同的功能.
|
|
记得先往设备里刷入这个程序(和 Snap! 相同)
更多 API 例子参考: notebooks
CoCube 库的源代码
|
|
|
|
可模仿已有积木进行扩展
先往设备里刷入这个程序(和 Snap! 相同)
参考 module.ipynb
相关源代码: CoCube module