scratchpython插件_Scratch3.0设计的插件系统(上篇)
我们每个⼈在内⼼深处都怀有⼀个梦想: 希望创造出⼀个鲜活的世界,⼀个宇宙。处在我们⽣活的中间、被训练为架构师的那些⼈,拥有这样的渴望: 在某⼀天,在某⼀个地⽅,因为某种原因,创造出了⼀个不可思议的、美丽的、摄⼈⼼魄的场所,在那⾥⼈们可以漫步,可以梦想,历经很多世纪绵延不绝. --Christopher Alexander
Scratch是⼀个游乐场
在我⼼⽬中,Scratch便是这样的⼀个美丽的场所,孩⼦们和保持着童真的成年孩⼦们在其中漫步、游戏以及梦想。Ta们在Scratch这个游乐场中创造并分享着乐趣
如果你对Scratch的前世今⽣感兴趣,可以翻翻我之前的这篇⽂章:Scratch的前世今⽣, 当时刚读完《爆裂》,借助《爆裂》⼀书提供的线索和借助互联⽹,我沿着理念传承这条线,从雷斯尼克的Scratch追溯到派珀特的Logo语⾔,之后抵达⽪亚杰的认知论(再往前甚⾄将追溯到洛克的经验论)
将于今年8⽉发布的Scratch3.0⽆疑将延续这个传统,继续做出振奋⼈⼼的东西。
Scratch是个游乐场,⽽且是⼀个设施完善的游乐场,你可以在其中发挥天马⾏空的想象⼒,创造出属于你的世界。
scratch编程appScratch是个像素世界
唯⼀的遗憾是,这个世界以像素的形式出现。当然你可能觉得这哪是什么遗憾,像素世界⽐⾝边这个原⼦世界⼴阔多了。去过四维空间的⼈,回到三维空间,即便漂浮于太空,外⾯是浩瀚的星空,仍会觉得逼仄得很,⼀些⼈的星⾠⼤海只不过是囚禁另⼀些⼈的牢笼。这是⼀种患有幽闭恐惧症的感受。同样,如果你在虚拟世界浪荡久了,回到现实中来,可能也会觉得匮乏,饭居然是要⼀⼝⼀⼝吃的!我明明都已经完整吃了⼀⼝了,这个世界甚⾄都不提供⼀个for循环积⽊块!
但现在是三⽉,江南的三⽉,鸡鸣寺樱花盛开的三⽉,站在鸡鸣寺下、⽞武湖前的樱花树下,⽆论阴⾬还是春风,你都很难不被这个由原⼦⽽⾮像素构成的世界所打动。
虽然这个原⼦世界的确可能就是像素构成的...anyway,先抛开你的怀疑论,让我们进⼊正题。
我们说了这个多科幻的内容,正题并不是你期待的《三体》,这篇⽂章准备讨论的是如何为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-audio和scratch-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的影响
我们下篇⾥见
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论