Scratch3.0设计的插件系统(上篇)
我们每个人在内心深处都怀有一个梦想: 希望创造出一个鲜活的世界,一个宇宙。处在我们生活的中间、被训练为架构师的那些人,拥有这样的渴望: 在某一天,在某一个地方,因为某种原因,创造出了一个不可思议的、美丽的、摄人心魄的场所,在那里人们可以漫步,可以梦想,历经很多世纪绵延不绝. --Christopher Alexander
Scratch是一个游乐场
在我心目中,Scratch便是这样的一个美丽的场所,孩子们和保持着童真的成年孩子们在其中漫步、游戏以及梦想。Ta们在Scratch这个游乐场中创造并分享着乐趣
Scratch是一个伟大的项目,无论从它最初的愿景(在A Networked, Media-Rich Programming Environment to Enhance Technological Fluency at After-School Centers in Economically-Disadvantaged Communities这篇提案中有详述最初的构想和愿景),还是它后来的实现,无论就它的软件设计,还是项目影响力而言,都堪称杰作。
如果你对Scratch的前世今生感兴趣,可以翻翻我之前的这篇文章:Scratch的前世今生, 当时刚读完《爆裂》,借助《爆裂》一书提供的线索和借助互联网,我沿着理念传承这条线,从雷斯尼克的Scratch追溯到派珀特的Logo语言,之后抵达皮亚杰的认知论(再往前甚至将追溯到洛克的经验论)
将于今年8月发布的Scratch3.0无疑将延续这个传统,继续做出振奋人心的东西。
Scratch是个游乐场,而且是一个设施完善的游乐场,你可以在其中发挥天马行空的想象力,创造出属于你的世界。
Scratch是个像素世界
唯一的遗憾是,这个世界以像素的形式出现。当然你可能觉得这哪是什么遗憾,像素世界比身边这个原子世界广阔多了。去过四维空间的人,回到三维空间,即便漂浮于太空,外面是浩瀚的星空,仍会觉得逼仄得很,一些人的星辰大海只不过是囚禁另一些人的牢笼。这是一种患有幽闭恐惧症的感受。同样,如果你在虚拟世界浪荡久了,回到现实中来,可能也会觉得匮乏,饭居然是要一口一口吃的!我明明都已经完整吃了一口了,这个世界甚至都不提供一个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的影响
我们下篇里见
Scratch3.0设计的插件系统(上篇)的更多相关文章
- (3)MEF插件系统中通信机制的设计和实现
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 一般的WinForm中通过C#自带的Event机制便能很好的实 ...
- MEF插件系统中通信机制的设计和实现
MEF插件系统中通信机制的设计和实现 1.背景 一般的WinForm中通过C#自带的Event机制便能很好的实现事件的注册和分发,但是,在插件系统中却不能这么简单的直接用已有的类来完成.一个插件本不包 ...
- 从OLLVM4.0.0升级到LLVM8.0.1,并且给LLVM增加Pass 插件系统
版本太低了,用得我这个揪心. 上周日决定把手头的ollvm从4.0.0升级到LLVM8.0.1. 里面的Pass的话,决定移植到8.0.1里面. 我习惯从代码上来动手 1:下载LLVM https: ...
- CloudNotes之桌面客户端篇:插件系统的实现
[CloudNotes版本更新历史与各版本下载地址请点击此处] [CloudNotes中文系列文章汇总列表请点击此处] [查看CloudNotes源代码请点击此处] 有时候,同一个名词,针对不同的人群 ...
- 动态加载与插件系统的初步实现(四):解析JSON、扩展Fiddler
按文章结构,这部分应该给出WCFRest项目示例,我想WinForm示例足够详尽了,况且WCFRest还不需要使用插件AppDomain那一套,于是把最近写的Fiddler扩展搬上来吧. Fiddle ...
- 【大话QT之十六】使用ctkPluginFramework插件系统构建项目实战
"使用ctkPluginFramework插件系统构建项目实战",这篇文章是写博客以来最纠结的一篇文章. 倒不是由于技术都多么困难,而是想去描写叙述一个项目架构採用ctkPlugi ...
- 用SignalR 2.0开发客服系统[系列3:实现点对点通讯]
前言 交流群:195866844 目录: 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 用SignalR 2.0开发客服系统[系列2:实现聊天室] 真的很感谢大家的支持,今天发表系列3 ...
- 浅谈C#中一种类插件系统编写的简单方法(插件间、插件宿主间本身不需要通信)
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 三年多前还在上研时,用C#+反射机制写过插件系统,后来又用M ...
- Java核心知识点学习----线程中如何创建锁和使用锁 Lock,设计一个缓存系统
理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的. 1.如何创建锁? Lock lock = new ReentrantLock(); ...
随机推荐
- P1081 开车旅行
题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 ...
- Spring@PostConstruct注解和构造方法的调用顺序
先看下@PostConstruct的注解 * The PostConstruct annotation is used on a method that needs to be executed * ...
- DPI在SDN中的部署方式
目录 在sdn中的部署分类 将DPI部署到基础设施层 将DPI部署到控制层 将DPI部署到应用层 个人总结 参考文献 在sdn中的部署分类 DPI 可以分别部署到SDN的基础设施层.控制层和应用层. ...
- 解密蓝牙mesh系列
解密蓝牙mesh系列 https://mp.weixin.qq.com/s/KdVhkgcmHIboA0xPFqFCgQ 1.NRF52832 & NRF52840 BLE mesh 协议栈 ...
- SharePoint2013代码操作权限组的几个Demo
1,清明节闲来无聊,敲代码吧,不知道敲什么,不敲吧,又好像比较颓废,不思进取.遂把以前项目中别的同事负责的权限模块的代码看一看,做俩个Demo. (1)代码创建组 protected void Cre ...
- 搭建springboot项目
1.搭建环境windows10+jdk1.8+eclipse4.8+maven 2.为了学习微服务架构学习搭建基础项目 3.分为两种搭建方式为maven项目和单独建立springboot项目(ecli ...
- Angular7教程-04-Angular常用操作(下)
6. 数据双向绑定 视图和数据,只要一方发生变化,另一方跟着变化. 好处是不需要在代码中手动更新视图,简化开发,增加代码内聚性,代码可读性更强. 缺点是当绑定的数据层次深.数据量大时,会影响性能. 双 ...
- JS如何截取-后面的字符串
str为要截取的字符串 通过获取字符串中“-”的坐标index,其他特殊字符以此类推 var index=str.lastIndexOf("\-"); str=str.subst ...
- SQLSERVER 使用 ROLLUP 汇总数据,实现分组统计,总计(合计),小计
版权声明:本文为博主原创文章,未经博主允许不得转载.本人观点或有不当之处,请在评论中及时指正,我会在第一时间内修改. https://blog.csdn.net/aiming66/article/de ...
- (解释文)My SQL中主键为0和主键自排约束的关系
上一篇我们说了关于自排如果主键是0的问题,在这里我搞清楚了原因,导致这种情况是因为在SQL中对自排设置了初始值: 从这里可以看到这两个变量一个是自增的初始值,一个是增量,这里都是1,所以在设置自增的时 ...