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的影響

咱們下篇裏見

相關文章
相關標籤/搜索