Scratch3.0设计的插件系统(上篇)

咱们每一个人在心里深处都怀有一个梦想: 但愿创造出一个鲜活的世界,一个宇宙。处在咱们生活的中间、被训练为架构师的那些人,拥有这样的渴望: 在某一天,在某一个地方,由于某种缘由,创造出了一个难以想象的、美丽的、摄人心魄的场所,在那里人们能够漫步,能够梦想,历经不少世纪绵延不绝. --Christopher Alexanderhtml

Scratch是一个游乐场

在我心目中,Scratch即是这样的一个美丽的场所,孩子们和保持着童真的成年孩子们在其中漫步、游戏以及梦想。Ta们在Scratch这个游乐场中创造并分享着乐趣html5

Scratch是一个伟大的项目,不管从它最初的愿景(在A Networked, Media-Rich Programming Environment to Enhance Technological Fluency at After-School Centers in Economically-Disadvantaged Communities这篇提案中有详述最初的构想和愿景),仍是它后来的实现,不管就它的软件设计,仍是项目影响力而言,都堪称杰做。python

若是你对Scratch的前世此生感兴趣,能够翻翻我以前的这篇文章:Scratch的前世此生, 当时刚读完《爆裂》,借助《爆裂》一书提供的线索和借助互联网,我沿着理念传承这条线,从雷斯尼克的Scratch追溯到派珀特的Logo语言,以后抵达皮亚杰的认知论(再往前甚至将追溯到洛克的经验论)git

将于今年8月发布的Scratch3.0无疑将延续这个传统,继续作出振奋人心的东西。github

Scratch是个游乐场,并且是一个设施完善的游乐场,你能够在其中发挥天马行空的想象力,创造出属于你的世界。web

Scratch是个像素世界

惟一的遗憾是,这个世界以像素的形式出现。固然你可能以为这哪是什么遗憾,像素世界比身边这个原子世界广阔多了。去过四维空间的人,回到三维空间,即使漂浮于太空,外面是浩瀚的星空,仍会以为逼仄得很,一些人的星辰大海只不过是囚禁另外一些人的牢笼。这是一种患有幽闭恐惧症的感觉。一样,若是你在虚拟世界浪荡久了,回到现实中来,可能也会以为匮乏,饭竟然是要一口一口吃的!我明明都已经完整吃了一口了,这个世界甚至都不提供一个for循环积木块!编程

但如今是三月,江南的三月,鸡鸣寺樱花怒放的三月,站在鸡鸣寺下、玄武湖前的樱花树下,不管阴雨仍是春风,你都很难不被这个由原子而非像素构成的世界所打动。json

虽然这个原子世界的确可能就是像素构成的...anyway,先抛开你的怀疑论,让咱们进入正题。websocket

咱们说了这个多科幻的内容,正题并非你期待的《三体》,这篇文章准备讨论的是如何为Scratch3.0构建一个通用的插件系统,让Scratch3.0能与来自物理世界的硬件打交道架构

咱们准备构建一个通道,链接原子和像素世界

来自物理世界的硬件

物理世界有许多参数,诸如温度、湿度、磁场、速度、光照强度...以及,你喜欢的姑娘身上特有的香味

这些参数能够被各类各样的传感器所捕获(你身上的绅士风度属于不可知论范畴,不能被物理参数描述),一旦你能捕捉到现实世界的各类参数,你就能作出许许多多好玩的东西,诸如,经过捕捉楼道的声音,你能够作到: 当楼道里有声响时,把楼道里的灯打开,这样一来你就作出了声控灯。但是你不想白天楼道里也亮着灯,怎么办呢? 你能够把光照的信息也捕捉了,这样一来你就能够在光线不足且有人通过的时候才开灯,这样一来就节约了电力。注意我说的是光线不足就开灯,而不是晚上,为何呢,由于咱们但愿光线昏暗的时候,都能为行人提供照明,而不仅是晚上,咱们经过获取光线而不是根据昼夜时间来决定是否亮灯。这样系统能够在大白天里黑云压城的时候,也能贴心地为行人亮起灯,这即是所谓的"科技以人为本"

Scratch是个教育项目,若是它能更多地和现实发生关联,一个孩子在Scratch中创做的做品,能对接到各类硬件,在Ta现实中被使用,这些做品帮助了Ta的父母和邻居解决生活问题,Ta的学习热情将将被噼里啪啦点燃。关于这方面的描述,PC之父Alan Curtis Kay和LOGO语言之父Papert都有过精彩论述

咱们结下来要作的,就是实现这样一种架构,在这个架构之下,各类硬件(小车、四轴飞行器、cozmo、microbit、Circuit Playground Express)都能与Scratch3.0交互,并且这个架构将基于消息,利用pub/sub的机制,下降构件的耦合,提升系统健壮性和可重用性

为Scratch3.0设计的插件系统

Make everything as simple as possible, but not simpler

Scratch3.0

Scratch3.0基于html5构建,能轻松支持多平台运行,十分可期,并且带来了多项有趣的改进。目前的开发版能够在这儿尝鲜. 对源码有兴趣的小伙伴,想围观或者参与,均可以戳这里

社区里很多公司已经用Scratch3.0做出了许多使人惊叹的东西,Cozmo是其中的佼佼者

Scratch3.0原计划在今年春季正式发布,春天来了,樱花如期怒放,Scratch3.0却跳票了,推迟到8月份发布

人面不知何处去,桃花依旧笑春风

Scratch3.0的插件机制

自由有时候是一种负担

咱们的目标是为Scratch3.0作一个插件系统,准确地说是作一个链接Scratch3.0与外围硬件的插件系统.

Scratch3.0已经有它本身的插件机制。Scratch3.0的插件机制比较简单,它容许你写一个本身的插件,这个插件在UI层面表现为自定义的积木块,你在积木块中定义好本身的原语(opcode),以后这个积木块和Scratch中默认的积木块同样,能够被用户拿来拼拼搭搭。用户拼搭的过程当中,积木块的组合形式也就是程序将语义以json的形式传到scratch-vm,它们在vm中被解释运行,至于你在页面上看到的小猫的运动和声音,则是scratch-vm中程序的output:output的具体实现是scratch-audioscratch-render的东西.这些属于实现细节,跟着官方的插件走一遍就行。

若是你熟悉scratch2和scratchx项目,你会发现,scratch3.0的插件机制和以前类似

从上边的描述中,咱们能够发现,Scratch3.0的插件机制对于你应该如何与外部硬件设备交互,啥都没说。

在官方的插件机制中,你有极大的自由,由于它无为而治。有时候自由是一种负担,自由意味着你本身得做出选择,并承担全部的风险。

官方的尝试

说官方对Scratch3.0如何与外部硬件设备交互只字未提,可能会遭到官方的反驳,毕竟他们为乐高的wedo2机器人写了一个Scratch3.0插件(目前源码已经基本完成了,只是官方没有启用这个插件),经过这个插件,咱们能够在Scratch3.0中操控wedo2机器人。这个插件的源码向你展现了Scratch3.0是如何与硬件交互的,但这个插件也仍是缄默多于言说,目前开发文档几乎保持空白,Scratch官方彷佛在有一种向维特根斯坦的恶意模仿

wedo2的源码很好读,写的也漂亮,虽然说乐高赞助了mit media lab一个教授席位,但wedo2的源码并无得到特殊待遇,而是用了标准的插件机制。如前所述,插件提供了wedo2的编程积木块,这些积木块的语义将传递到scratch-vm中执行,其中最关键的一步是经过socketio将语义传递给硬件。固然上边的说法过于笼统,我跟踪了这个过程,websocket管道的那端并非直接连着wedo2机器人,而是连着一个本地插件,这个本地插件接着经过蓝牙链接wedo2. 这个本地插件本质上是个代理。

我以前的的blockly4pi和wedo2的设计几乎同样,这个项目以后我应该会开源出来,以前在jupyter的架构分析的文章中提到过,若是你有兴趣能够翻阅我以前的文章

社区的尝试

在说个人设计以前,咱们来看看社区上已有的方案

目前把Scratch3.0玩得很溜的,国外有Cozmo,而国内有makeblock和kittenbot

我去年长途旅行通过深圳时,和makeblock和kittenbot在Maker Faire上碰过面,两个团队都很是优秀

Cozmo

先从Cozmo提及,Cozmo一骑绝尘,从产品、sdk源码到体验都惊艳之极。Cozmo的目前只公开了python SDK源码,从源码中咱们能够看出,Cozmo的server里藏有一个ROS(Robot Operating System),这个ROS应该在它的APP里,这也是它为什么如此依赖于APP的缘由以及APP如此臃肿的缘由。而它的Scratch3.0界面与它的ROS通讯,我接下来准备提出的插件架构,本质上是我对Cozmo架构的猜测,由于它的源码未开放,我暂时没办法验证,但咱们能够断言的是,cozmo的scratch是以消息的方式与硬件交互的(这是ROS系统的核心),这和wedo2很像,实际上在这一类项目目前只有两种架构风格。大分类下,wedo2和cozmo属于一类,下边咱们要说的makeblock和kittenbot是另外一类

我最近花了1.5个周末读完《ROS机器人编程实践》才理解了Cozmo的架构设计(至少在逻辑上),这里边的不少问题,并非Scratch图形化编程的问题,而是ROS的问题,因此至今Cozmo并没有对手。毫无疑问,Cozmo对Scratch3.0的应用上也是一骑绝尘的。这让人想起那句称赞约翰·麦卡锡的那句话

巨人随手丢下的鹅软石都是巨石

mblock

接下来咱们说说makeblock对Scratch3.0的应用,这里咱们只关心mblock操做程小奔(硬件机器人)相关的部分,AI和DL部分有空再说

插个题外话,mblock中有许多精彩的工做,其中我最喜欢的一个部分是,他们顺利作到让microbit支持多任务(甚至事件),这个microbit官方目前都还作不到(在python中),实现机制十分精巧,通过逆向分析,咱们能够看到具体的代码实现(实际是用正则作预处理),不过即使不经过逆向分析,咱们经过观察积木块生成的python代码,也能猜到预编译的机制,关于这块咱们以后有空再说

mblock对硬件的操做是经过将scratch3.0积木generate出python代码来作的,以后将代码灌入他们的硬件机器人(程小奔)中,也就是说在mblock中,Scratch3.0被看成blockly来使用(典型的blcokly app风格)。此外值得一提的是,mblock中有一个叫作通信变量的概念,这个概念颇有趣,它能把硬件和scratch连通。限于篇幅和我困了,也以后再说

程小奔使用micropython构建,多是目前最大的micropython项目之一,关于硬件这块,这里也没空多说,前头废话说了太多,对不起诸位。咱们以后找个时间来讲说mblock是如何使用esp32板子作出程小奔的,固然不少部分是个人实验加猜想,毕竟源码mblock尚未开放。

mblock和程小奔在工程上都是漂亮的做品,给工程团队打call!

kittenbot

小喵家的公众号我一直是关注的,小喵们作了许多geek且有趣的工做。团队人很少,但作出的东西却很赞!此处星星眼

kittenbot以前是open source,新的版本彷佛没开放,不过mblock和kittenbot对开源社区都很友好,以后会开放也未可知。

kittenblcok中以前对microbit的操做也是generate成python再灌入的,这点和mblock类似。最近我没怎么用kittenblcok,不知道最近是否是有调整,等我有空试完再补充。

个人设计

写到这里都半夜了,只好把这篇文章拆分为二了,有空再来补上个人本身的插件架构设计

在这个设计之上,咱们已经做出了一个具体的实现(scratch3.0和microbit的互操做),准备以软件包的形式发布(正在制做),可见咱们是吃本身的狗粮的

架构层面主要受ROS和jupyter的影响

咱们下篇里见

相关文章
相关标签/搜索