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

我們下篇里見


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM