國立中山大學電機工程學系 碩士論文

Department of Electrical Engineering National Sun Yat-sen University Master Thesis

機械手臂控操圖形化介面 A Visual Programming Editor for Industrial Robots

研究生: 張文綺

Wen-Chi Chang 指導教授: 黃國勝 博士

Dr. Kao- Shing Hwang

中華民國 106 年 7 月 July 2017

論文審定書

i

摘要

圖形式程式設計語言與一般程式語言相比可以使得初學者在學習上的障礙

大幅減少,Blockly 是以積木為導向的程式語言,在編輯過程中是用拖拉積木方

塊的方式來完成程序編輯,完全不需要手寫程式,使對程式語法熟悉度不夠的使

用者在程序編輯上不會有很大的困難度,這樣的方式可以讓使用者輕易上手且較

快速地適應。Lua 是一個可嵌入的擴展式腳本語言,Lua 是所有腳本語言體積最

小且速度最快的,因此 Lua 最適合拿來嵌入在應用程序中。本論文透過

的 Blockly 圖形化介面、Lua、與業者所生產的機械手臂控制語言軟體相結合,

使用者可以通過提供的積木拖拽組合成程式碼,使用網路通訊將資料傳送給機械

手臂控制軟體,在機械手臂控制軟體中展示出該程序的運動效果。

關鍵字:Blockly、圖形化介面、積木導向、Lua、腳本語言

ii

Abstract

A graphical can significantly relax the effort in learning

programming languages for the beginners, compared with the normal programming language. Blockly is a building-block oriented programming language so as that learners drag the building blocks to complete programs in the editing process, instead of hand coding. It can reduce a lot of difficulties for users not familiar with program syntax and allow them to get started easily and quickly. Lua is an embeddable extended scripting language. It is the smallest and fastest one in all scripting languages, hence it is best for embedding in programs of the applications. In this

thesis, through the combination of Google's Blockly modules, Lua, and robot control

language software produced by ITRI , a user can drag and place building blocks to

complete programming codes in terms of graphic user interface. The interpreted codes

send commands and data to a robot controller to manipulate the robot/via the internet.

Experiments have been conducted to impose the proposed application on a six

degree-of-freedom industrial robot manufactured by a research institute.

Keywords: Blcokly, Graphical user interface, Block-oriented, Lua, Script language

iii

目錄

論文審定書 ...... i

摘要...... ii

Abstract ...... iii

目錄...... iv

圖次...... v

. 導論 ...... 1 動機 ...... 1 論文架構 ...... 2 . 背景介紹 ...... 3 2.1 MIT Scratch ...... 3 2.2 Google Blockly ...... 4 2.3 腳本語言 ...... 5 2.3.1 Lua 腳本語言 ...... 6 . 設計方法 ...... 8 3.1 Blockly 積木方塊設計 ...... 8 3.1.1 Blockly 積木方塊創建 ...... 8 3.1.2 導入 Blockly 圖形化介面 ...... 13 3.2 Lua 與 C++整合應用 ...... 14 3.2.1 Lua 嵌入應用程序 ...... 14 3.2.2 Lua 與 C++交互 ...... 15 實驗結果 ...... 20 4.1 Blockly 圖形化程式設計的實現 ...... 20 4.2 實作結果 ...... 23 結論與未來展望 ...... 32 5.1 結論 ...... 32 5.2 未來展望 ...... 32 參考文獻 ...... 33

iv

圖次

圖 2.1 Scratch 操作畫面...... 3

圖 2.2 Google Blockly 通過拖動積木方塊搭建程式 ...... 5

圖 2.3 把積木方塊搭建的程式轉譯成 Lua 程式碼 ...... 5

圖 3.2 Blockly 創建機械手臂控制語言類型的積木圖形程式碼 ...... 9

圖 3.3 積木方塊圖形為圖 3.1 的程式碼所生成的...... 10

圖 3.4 生成積木方塊 Lua 語言的程式碼 ...... 11

圖 3.6 透過 Block Facktory 網站創建積木方塊 ...... 12

圖 3.7 按下鏈結鍵後,會出現存取積木圖形網址的對話框...... 12

圖 3.8 添加新創建的積木方塊到左方列表中...... 14

圖 3.9 Lua 與 C++之間的通信方式 ...... 16

圖 3.10 C++函數被調用時的處理流程 ...... 17

圖 3.11 Lua 外部解釋器執行流程 ...... 18

圖 4.1 車子移動函式的積木方塊...... 21

圖 4.2 使用者可以選擇繁體中文語言...... 21

圖 4.3 車子運動的簡單程序示例...... 22

圖 4.4 車子運動的簡單程序中文示例...... 22

圖 4.5 車子運動程序的 Lua 程式碼 ...... 23

圖 4.6 機械手臂函式的積木方塊...... 24

圖 4.7 使用者可以把介面更改為繁體中文...... 2 5

圖 4.8 機械手臂運動程序示例...... 26

圖 4.9 機械手臂運動程序中文示例...... 27

圖 4.10 機械手臂運動程序的 Lua 程式碼 ...... 28

圖 4.11 使用者傳送指令流程 ...... 29

v

圖 4.12 Server 端與 Client 端未連線時的狀態 ...... 30

圖 4.13 Server 端與 Client 端連線後的狀態 ...... 30

圖 4.14 機械手臂移動過程...... 31

vi

. 導論

動機

對於完全沒有程式相關背景的使用者來說傳統程式語言的設計並沒有那麼

的親切,所以使用圖形化程式語言,由各式各樣的圖形組合來建構出一個運動程

序,可以使得初學者能夠快速上手、學習速度加快,也讓使用者在使用上操作方

便,藉由拖拽模組並連接起來以實現自己想要的動作。近年來很多軟體都為使用

者開放了指令碼介面,使得指令碼語言不只是用在開發上,同時還可以讓使用者

配置和定義個性化的應用和服務,而開發者也不需要再為每次增加新功能而重新

編譯。腳本語言相對於 C、C++、J AVA 等語言來說是一種簡便、敏捷且方便使

用的解釋型語言,目的是使得前端開發者能夠迅速地完成程序撰寫。腳本語言的

特點:程式碼的編寫比較簡單;容易學習;容易著手;不需要編譯,由解釋器解

釋運行,獨立於任何其他的應用程序執行。動態腳本語言目前在工商產業領域有

很多都得到廣泛應用,其中以 JavaScript、Python、Lua 的應用範圍最廣。本研究

是採用 Lua 腳本語言,Lua 是當前執行速度最快的嵌入式動態腳本語言,Lua 的

設計主旨是為了很容易嵌入到其他應用程序中。本研究使用 Google 研發的

Blockly 開源視覺化程式設計技術結合 Lua 嵌入式動態腳本語言以生產廠商所界

定機械手臂控制軟體函式庫為底層,通過 Blockly 圖形化程式設計介面產生 Lua

程式碼,並藉由 Socket 通訊傳送指令給機械手臂控制軟體函式,實現 Blockly 中 1

構建的運動效果。

論文架構

這篇論文共分為五個章節,第二章節為背景介紹,簡短的介紹 MIT 發布的

Scratch、Google 開發的Blockly和 Lua 腳本語言。第三章節為介紹本論文在 Blockly

圖形化介面上的積木方塊是如何設計及如何使 Lua 與 C++結合。第四章節為介紹

Blockly 的應用與實作結果。最後,第五章節為結論與未來展望。

2

. 背景介紹

2.1 MIT Scratch

Scratch [1] [2] 是由美國麻省理工學院於 2007 年公開的一套圖形化程式語言

設計軟體,可以直接在線上編寫程式,也可以免費下載到電腦上編寫,最新推出

的版本為 2.0 版。Scratch 是具教育性質的圖形化機器人程式語言編輯工具,它的

特點是將難理解的程式語言指令透過積木方塊堆疊的方式呈現。在程序設計的過

程中,完全不需要寫程式碼,只要利用滑鼠拖曳,將積木區塊中的積木方塊拖拉

到程式編輯區塊中堆疊起來,即可完成程式的撰寫工作,還可以從執行結果區塊

中觀看程式的執行狀況,如圖 2.1 所示。這樣簡單的操作介面能夠讓完全沒有程

式背景的初學者輕易上手,進而提高程式語言的學習動力。

執行結果區塊

程式編輯區塊 積木 角色區塊 區塊

圖 2.1 Scratch 操作畫面

3

Scratch 在積木區塊部分有 8 種不同類型的積木,使用者在操作過程中可以

進行邏輯思維、流程控制及事件驅動等訓練,提升程式設計的能力。Scratch 可

以讓使用者透過這些不同類型的積木來設計音樂、動畫、遊戲等。

本研究是使用類似於 Scratch 的 Google Blockly,Google Blockly 跟 Scratch

一樣都是用積木方塊拖拉的方式來搭建程序,Google Blockly 優於 Scratch 之處

主要有下列三個:

一、Google Blockly 可以把積木方塊搭建的程序轉換成多種程式語言,因此

可以把積木方塊搭建的程序與其它程式語言做對照,讓使用者可以拿來學習與使

用,而 Scratch 沒有這個功能,只能學習如何用積木方塊搭建程序。

二、Google Blockly 在開發環境上比 Scratch 來得有彈性,Google Blockly 可

以讓開發者針對需求自行創建個性化的積木。

三、Scratch 所儲存的檔案格式為.sb2,當要開啟此檔案時,只能藉由 Scratch

才能開啟儲存的檔案,而且 Google Blockly 可以將編輯好的程序以 XML 或 Lua

的檔案格式儲存到本機端,因此檔案不只可以在 Google Blockly 介面上開啟,也

可以在別處直接開啟,提升檔案儲存及修改的彈性。

2.2 Google Blockly

Google 開發的 Blockly [3] [4] 是以圖形化積木方塊為介面,類似美國麻省理

工學院發布的 Scratch,於 2012 年 5 月公開。Blockly 是由 HTML、CSS 和 Javascript

組合而成的,以可視化積木方塊拖拉的方式來進行程序編寫的工作,使學習者大 4

幅減低了入門學習的門檻。使用者可以在 Blockly 網頁上透過拖動積木方塊將圖

形物件拼貼起來創建出特定功能的運動程序,在編寫過程中不需要顧慮語法和結

構的嚴苛要求,讓使用者可以把精力專注在實現設計目標上。Blockly 可以將使

用者拖拉圖形元件拼貼起來搭建的程式轉換成 JavaScript、Python、Dart、PHP、

Lua 和 xml。本研究只將 Blockly 用圖形元件搭建的程式轉換成 Lua 腳本語言。

如圖 2.2 和圖 2.3 所示。

圖 2.2 Google Blockly 通過拖動積木方塊搭建程式

圖 2.3 把積木方塊搭建的程式轉譯成 Lua 程式碼

2.3 腳本語言

腳本語言的設計目的是縮短一般程式設計語言的編譯過程,使程序開發者能 5

迅速完成複雜的編寫工作,可以達到事半功倍的效果,提升工作效率和質量。腳

本語言通常不執行編譯而是直接解釋執行源碼,由解釋器執行快速轉換。用腳本

語言編寫的程序雖然在性能上不如編譯性程式語言(如 C/C++、Java),但腳本語

言具有代碼修改、項目部署、運行配置方便性等方面的優勢。因此在編譯性程式

語言中與腳本語言整合既可以利用編譯性程式語言的優勢,又可以達到程序開發

者在編寫程式碼時對於即改即用的要求。由於腳本語言的引入,使得編譯性程式

語言和腳本語言在性能上互補。目前許多腳本語言執行速度快,在語法與結構上

以精簡的表達方式使初學者易於學習。目前流行許多腳本語言,如 Python、

Javascript 和 Lua。本研究是使用 Lua 腳本語言。

2.3.1 Lua 腳本語言

Lua [5] [6] 是一個簡潔、輕巧、擴展性強、結構清晰的動態腳本語言,由

ANSI C 編寫而成,以文本方式儲存。在眾多的腳本語言中,Lua 是體積最小且

速度最快的腳本語言,因此適合嵌入在應用程序中,Lua腳本語言很少獨立存在,

創建的目的是為了簡便、直觀、清楚和準確地去完成某件事情,嵌入在應用程序

開發中,以落實靈巧的擴展性。目前多應用於網絡遊戲開發。Lua 腳本和 C/C++

語言緊密結合,Lua 可以調用 C/C++的函數,也可以被 C/C++程式碼調用,使得

Lua 可以廣泛地被應用在由 C/C++語言編寫的開發應用程序中。

Lua 的特點:

(1)簡單易讀:Lua 本身輕巧、語法簡單、結構清晰,讓使用者可以不用著重於語 6

法結構的學習上而是任務設計的目標上。

(2)運行速度快:Lua 執行的效率高且占用內存的空間少,因此在編寫程序時可以

不考慮內存的管理問題。

(3)良好的擴展性:Lua 常被用作擴展程序上的功能,可以結合 C/C++語言編寫,

運用在開發特定功能的應用程序上。

(4)可跨平台:Lua 可以在大部分的操作系統上運行,例如:Linux、Windows。

7

. 設計方法

本論文利用 Blockly 圖形化介面上的積木方塊來操控機械手臂,所以必須在

介面上加入機械手臂控制軟體函式的積木方塊,積木方塊的功能是透過 Lua 腳本

語言來實現,讓使用者能夠藉由拖拉積木方塊搭建的程序來控制機械手臂,如圖

3.1 所示。本章節會介紹如何創建自定義的積木方塊以及 Lua 與 C++是如何交互

的。

轉譯 呼叫 機器人專用 積木方塊 程式碼 Lua 程式語言

圖 3.1 Blockly 圖形化介面操控機械手臂的方塊圖

3.1 Blockly 積木方塊設計

Blockly 的圖形化介面是通過拖拉一塊一塊設計好的積木方塊進行拼貼組合,

建構出一個完整的程式,因此想要在 Blockly 圖形化介面上實現自己的程式設計

任務,首要工作是先創建自己的 Blockly 積木方塊 [7]。

3.1.1 Blockly 積木方塊創建

Blockly 積木方塊的創建主要利用兩個目錄來達成,一個是名為 blocks 的目

錄,另一個是名為 generators 的目錄。blocks 目錄和 generators 目錄裡面包含不

8

同類型積木的 JavaScript 檔案,blocks 目錄裡面的 JavaScript 檔案是用來定義積

木方塊的圖形,generators 目錄裡面 JavaScript 檔案是用來將 Blockly 的積木方塊

轉譯成其他腳本語言程式碼,例如:JavaScript、Python 與 Lua 等。本研究只有

將 Blockly 的積木方塊轉譯成 Lua 腳本語言程式碼。

第一步,創建積木方塊圖形:

在 Google 官方文件的 blockly 根目錄下的 blocks 目錄下創建一個自己定義的

JavaScript 檔案, JavaScript 檔案中是定義積木方塊圖形的代碼。例如:在 blocks

目錄下創建一個機械手臂控制軟體函式的 JavaScript 檔案,名稱定為 RAS.js,該

JavaScript 檔案的積木類型的主要用途是對機械手臂做控制。圖 3.3 所示為在

blocks 目錄下的 RAS.js 的其中一個積木方塊對應到的代碼,該代碼生成的積木

方塊圖形如圖 3.4 所示。

圖 3.2 Blockly 創建機械手臂控制語言類型的積木圖形程式碼

9

圖 3.3 積木方塊圖形為圖 3.1 的程式碼所生成的

第二步,編寫積木方塊轉譯成腳本語言的程式碼:

積木方塊圖形創建單純只是圖形的呈現,還要為積木方塊編寫功能實現的程

式碼,積木方塊功能的實現需要通過編寫腳本語言的程式碼來達成。在生成積木

方塊圖形的程式碼部分是放在 Google 官方的文件中的 blocks 目錄下,而編寫積

木方塊轉譯成腳本語言的程式碼則位於 generators 目錄下,可以選擇腳本語言為

Python、JavaScript 和 Lua 等,如果想要在網頁上轉譯成多個腳本語言則要分別

編寫。本研究只轉譯成 Lua 腳本語言,每個類型在 blocks 目錄下的 JavaScript 檔

案名稱和在 generators 目錄下的 JavaScript 檔案名稱必須一致,所以在 generators

目錄下機械手臂控制軟體函式的 JavaScript 檔案的名稱就要和在 blocks 目錄下

JavaScript 檔案的名稱一樣,檔案名稱為 RAS.js。圖 3.6 為生成該積木方塊 Lua

腳本語言的程式碼,圖 3.5 為圖 3.6 程式碼所生成的 Lua 腳本語言。

10

圖 3.4 生成積木方塊 Lua 語言的程式碼

圖 3.5 生成 Lua 程式碼

積木方塊的創建除了選擇手動編寫外,還可以透過 Block Facktory [8] [9] 網

站創建積木方塊,通過拖動 Block Facktory 網站上的積木方塊組成一個新的

Blockly 積木方塊,積木圖形會在右方自動生成,只需要把對應的程式碼複製到 blocks 目錄和 generators 目錄下的 JavaScript 檔中,然後把想要呈現在 Blockly 介

面上的 Lua 腳本語言程式碼添加上去,則 Blockly 積木方塊的創建即可完成,如

圖 3.8 所示。積木方塊創建完成後,按下右上方的鏈結鍵,它會給你一個網址,

如果之後想要修改積木方塊的圖形,可以直接開啟該網址加以修改,如圖 3.9 所

11

示。這是一種比較快捷的 blockly 積木創建的方法,想要修改時也比較方便,能

夠縮短時間創建出我們需要的積木方塊。

鏈結鍵

積木圖形

積木圖形代碼

建構積木圖形

生成腳本語言程式碼

圖 3.6 透過 Block Facktory 網站創建積木方塊

存取積木方塊的網址

圖 3.7 按下鏈結鍵後,會出現存取積木圖形網址的對話框

12

3.1.2 導入 Blockly 圖形化介面

積木方塊創建完成之後,接下來要把創建完成的積木方塊載入到 Blockly 圖

形化介面左方的列表,因此 blocks 目錄和 generators 目錄下新建立的名稱為

RAS.js 的 JavaScript 檔案需要在 Blockly 介面中導入,從而導入 JavaScript 檔案

裡面的積木。要使用新創建的積木方塊就要修改 demos 文件中 code 目錄下的 index.html,Blockly 圖形化介面左方的列表對應到 index.html 中的 toolbox 部分,

把新創建的積木方塊名稱添加到 index.html 中的 toolbox,編寫完之後還需要對

Google 官方的 blockly 根目錄下的 build.py 進行編譯才能發揮作用,在進行編譯

前,先到 Google blockly 官方網站下載 closure-library 文件,把 closure-library 和 blockly 放在同一個文件夾中,這樣在編譯時才能編譯成功。接下來打開 windows

命令列窗口,跳轉到 build.py 所在的目錄下,然後執行 build.py,使用命令為 python build.py。依照這些步驟 Blockly 圖形化介面左方的列表就會出現新創建的積木方

塊,並且可以使用它。如圖 3.10 所示:

13

將自定義積木方塊 導入 Blockly 介面

圖 3.8 添加新創建的積木方塊到左方列表中

3.2 Lua 與 C++整合應用

3.2.1 Lua 嵌入應用程序

由於 Lua 是一個嵌入式的動態腳本語言,需要嵌入到編譯性程式語言(如 Java、

C/C++)編寫的應用程序中,Lua 沒有主程序,應用程序要提供一個運行環境給

Lua,用來建立 Lua 解釋器、載入標準庫及執行 Lua 腳本文件。

Lua 腳本語言具有體積小、執行效率高的特性,而且 Lua 是採用 ANSI C 開

發而成,因此適合嵌入到以 C/C++語言為主的應用程序中並且與 C/C++語言結合

也比較方便。利用 Lua 腳本語言與 C/C++語言的結合,可以擴展出多種特定的功

能,而且在修改過程中只要針對實現那個功能的函數模塊修改即可,不用擔心在 14

修改過程中會對整個程序的性能產生很大的影響,使得在應用程序的編寫上複雜

度降低,提高工作效率。

3.2.2 Lua 與 C++交互

Lua 與 C++之間的不同之處主要有下列三個:

一、C++是編譯型語言,運行過程中先把 C++語言編寫完的程式碼需要經過

編譯產生二進制形式的機器碼,再執行,而 Lua 是解釋型語言,通常不需要經過

編譯,在執行時直接通過解釋器解釋程式碼即可運行。

二、C++是靜態類型的語言,需要嚴格定義每一個變數的類型,而 Lua 是動

態類型的語言,在 Lua 腳本語言中不需要定義變數的類型,由使用的實際情況而

定,每一個變數的值都帶有自身類型的資訊。

三、C++語言要求程式自己分配和釋放記憶體,應用程序需要注意記憶體的

管理問題,而 Lua 是使用垃圾回收的方式,會自動回收記憶體,所以不需要擔心

記憶體的分配和釋放問題。

由於 Lua 與 C++運行環境的不同,因而導致它們之間無法直接通信,所以要

把它們結合在一起就要建立一個接口,因此接口是把 Lua 與 C++整合的關鍵,接

口可以用來傳遞參數和獲取返回結果。這個接口就是 Lua 提供的一個堆疊,具有

先進後出的特性,把堆疊作為 Lua 與 C++之間通信的接口,如圖 3.11 所示。

15

C++運行環境

Lua 運行環境

C++程序 堆疊 Lua 腳本程序

圖 3.9 Lua 與 C++之間的通信方式

Lua 有提供使用 C 語言編寫的 API 函數 [10] [11] ,稱為 C API,C API 是

Lua 與 C++進行交互的函數集合,這個函數集合提供的函數有以下幾種:讀取

Lua 程序中的值、壓入數據到堆疊中、調用 Lua 函數以及註冊 C 函數到 Lua 中等。

大部分 C API 的函數都會對堆疊做操作,它們都有專屬於自己的堆疊,每個函數

之間的堆疊不會互相影響。通過 Lua 提供的堆疊和可對該堆疊操作的 C API,使

Lua 與 C++之間能夠方便地進行參數和返回結果的傳遞。

Lua 與 C++的交互有兩種方式,第一種方式是 Lua 腳本程序調用 C++函數,

在 Lua 中註冊由 C++實現其功能的函數,提供函數給 Lua 腳本程序調用。第二

種方式是 C++程序調用 Lua 腳本文件。本研究是使用第一種方式,利用 Lua 調

用 C++函數的方法可以添加一些對 Lua 而言沒辦法輕易實現的功能,使 Lua 腳

本程序可以使用這些功能,達到功能的擴展。

Lua 與 C++交互環境的建立,首先通過 Lua 提供的 C API 來創建 Lua 解釋器

並載入標準庫,把自定的 C++函數註冊到 Lua 解釋器中,然後把 Lua 腳本文件 16

載入到解釋器中,透過標準庫將腳本文件中的程式碼解釋執行。因此在本論文的

應用,先從 Blockly 網站中下載 Lua 腳本文件,把自定的 C++函數傳遞給 Lua 解

釋器並把下載的 Lua 腳本文件載入到解釋器中,運行腳本程式時 Lua 會根據程

式碼執行已註冊的 C++函數。圖 3.10 所示為已註冊的 C++函數被 Lua 調用的處

理流程。

搭建環境

取得參數個數

從堆疊中獲取參數

執行相關處理動作

把結果壓入堆疊 ,返回結果個數

結束

圖 3.10 C++函數被調用時的處理流程

Lua 的外部解釋器,通常會將輸入的每行指令當作一個完整的語句來執行,

執行時以行為單位,如果發現某一行指令不能構成一個完整的語句,解釋器會繼

續讀取輸入指令,直到構成完整的語句,如圖 3.11 所示。但是在 C++環境內的 17

Lua 解釋器在執行腳本文件時是調用 C API 把整個腳本文件中的程式碼一次性執

行。

創建 Lua 解釋器

讀取一 行代碼 失敗 成功

執行代碼 結束解釋器

圖 3.11 Lua 外部解釋器執行流程

C API 有幾個重要函數是用來實現 Lua 解釋器的基本功能,這些函數的介紹

如下[12]:

(1) lua_State *luaL_newstate (void);

用 luaL_newstate()函數來創建一個 Lua 環境,數據結構 lua_State 是管理棧和

了解函數對棧的使用狀況,指針變數指向 Lua 的記憶體空間。在 Lua 運行環境

中操作的 API 函數的參數幾乎都包含結構類型為 lua_state 的指針變數。

(2) void luaL_openlibs (lua_State *L);

剛創建好的 Lua 運行環境還沒有載入標準庫,使用 luaL_openlibs 函數在 Lua

運行環境中將標準庫全部加載進來,C++與 Lua 即可對堆疊進行操作,實現參數

18

的傳遞和獲取返回結果。

(3) void lua_register (lua_State *L, const char *name, lua_CFunction f);

將C++語言的函數名稱和Lua調用的函數名稱對應寫入lua_register函數中,

即可將 C++函數註冊給 Lua,註冊的目的是為了讓 Lua 腳本文件能夠調用來自

C++的函數。

(4) int luaL_dofile (lua_State *L, const char *filename);

載入並執行 Lua 腳本文件。

(5)void lua_close (lua_State *L);

由於 Lua 記憶體管理是採用垃圾回收機制,當 Lua 腳本程序需要占用記憶

體時會自動分配,不需要使用記憶體時也會自動釋放。因此,當 C++程序運行結

束後記憶體會自動被釋放,但是在 C++程序運行結束前如果想要提前結束 Lua

運行環境,就要調用 lua_close 函數,調用 lua_close 函數後,Lua 運行環境會被

結束掉並且自動釋放記憶體。

(6)typedef int (*lua_CFunction) (lua_State *L);

注冊到 Lua 中的 C++函数的原型定義必須遵守,否則 Lua 無法調用 C++函

數,利用參數的 lua_State 數據結構來跟 Lua 腳本程序進行數據交換。函数的返

回類型是整數,這裡的整數是指把值壓入棧中的個數,函数的參數必須是類型為 lua_State 的指針變數。

19

實驗結果

本論文的設計重點是以圖形化積木方塊為介面,讓程序編輯過程中不再透過

手寫方式,而是藉由積木方塊拖拽的方式組合成程式碼,將搭建好的程序轉譯成

Lua 腳本語言實現積木方塊的功能,讓使用者也可以在不熟悉程式語言的情況下

開發各種應用。

本文為了體現在實務上應用的效果,採用工研院所生產的六軸機械手臂來做

示範,先在 Blockly 圖形化程式設計介面上拖拽積木方塊搭建程序,結合 Lua 嵌

入式動態腳本語言以工研院所界定的機械手臂控制軟體函式庫為底層,使用網路

通訊傳送指令給機械手臂控制軟體,展示出該程序的運動效果。

4.1 Blockly 圖形化程式設計的實現

Blockly 圖形化介面上的積木方塊類型大致分為以下三大類:

一、自定義類型:根據使用者需要的功能,額外添加積木方塊實現其功能。

二、基本類型:涵蓋程式語言的基本語法,包含邏輯、迴圈、數學式、輸出、變

數、字串。

三、函式類型:可以根據個人需求自行定義和呼叫函式。

下面的範例為利用 Blockly 圖形化積木方塊搭建一個簡單的車子移動程序,

實現車子的運動狀態,設定前後移動、左右旋轉、等待時間、移動距離及速度等。

在搭建一個車子移動的程序前,要先創建車子移動函式的積木方塊,創建好後導

20

入左方列表中,如圖 4.1 所示。使用者可以在 Blockly 圖形化介面右上方的下拉

列表中選擇繁體中文,如圖 4.2 所示。接下來就可以直接使用車子移動函式,搭

配其他類型的積木方塊搭建出一個簡單的車子移動程序,如圖 4.3 所示,圖 4.4

為將該車子移動程序通過 Blockly 圖形化介面的下拉列表更改為繁體中文,圖 4.5

為該車子移動程序通過 Blockly 圖形化介面產生 Lua 程式碼。

圖 4.1 車子移動函式的積木方塊

繁體中文

圖 4.2 使用者可以選擇繁體中文語言

21

定義函式 主程式

呼叫函式

圖 4.3 車子運動的簡單程序示例

定義函式 主程式

呼叫函式

圖 4.4 車子運動的簡單程序中文示例

22

定義函式

呼叫函式 主程式

圖 4.5 車子運動程序的 Lua 程式碼

4.2 實作結果

本研究是利用工研院的六軸機器手臂來實現 Blockly 開源視覺化程式設計技

術在實務上的應用,由於考慮到未來修改上的便利性以及功能擴充的專注上,本

研究結合 Lua 腳本語言以工研院所界定的機械手臂控制軟體函式庫為底層,並藉

由 TCP/IP 通訊協定傳送指令給機械手臂控制軟體,實現 Blockly 中構建的運動

效果。

在介面設計方面,首先創建工研院所界定機械手臂控制語言的積木方塊,其

次編寫該積木方塊的 Lua 腳本語言程式碼,最後,導入 Blockly 圖形化程式設計

介面上的左方列表中,如圖 4.6 所示,就可以直接使用機械手臂控制語言的積木 23

方塊來建構出一個運動程序。使用者可以把介面更改為繁體中文,如圖 4.7 所示。

圖 4.8 為通過積木拖拽搭建出一個機械手臂運動程序,圖 4.9 為將該運動程序通

過 Blockly 圖形化介面的下拉列表更改為繁體中文,圖 4.10 為該運動程序通過

Blockly 圖形化介面產生 Lua 程式碼。

圖 4.6 機械手臂函式的積木方塊

24

圖 4.7 使用者可以把介面更改為繁體中文

25

定義函式 主程式

呼叫函式

圖 4.8 機械手臂運動程序示例

26

定義函式 主程式

呼叫函式

圖 4.9 機械手臂運動程序中文示例

27

定義函式

呼叫函式

主程式

圖 4.10 機械手臂運動程序的 Lua 程式碼

機械手臂運動程序建構與轉譯完成後,藉由 TCP/IP 通訊的連線方式將運動

控制指令傳送給機械手臂控制軟體,使機械手臂做出相對應的動作。在連線過程

中,先建立一個 Server 端,將機械手臂控制軟體視為 Client 端,Server 端會等待

28

Client 端的連線,當連線建立成功後,Server 端便會將運動控制指令傳送至 Client

端,讓所操控的機械手臂做出相對應的運動。圖 4.11 為使用者傳送運動控制指

令給機械手臂控制軟體的流程,圖 4.12 為未連線時的狀態,左邊的機械手臂控

制軟體為 Client 端,右邊為 Server 端,圖 4.13 為連線後的狀態。圖 4.14 為機械

手臂實際的運作情形。

開始

在 Blockly 介面 搭建積木程序

轉譯成 Lua 程式碼

藉由 TCP/IP 通訊傳送指令

成功

機械手臂控制 失敗 軟體獲得資料

機械手臂執行 相對應的動作

結束

圖 4.11 使用者傳送指令流程

29

Client 端 Server 端

圖 4.12 Server 端與 Client 端未連線時的狀態

Client 端 Server 端

圖 4.13 Server 端與 Client 端連線後的狀態

30

1 2 3

4 56

7 8 9

圖 4.14 機械手臂移動過程

31

結論與未來展望

5.1 結論

與一般程式語言相比,圖形式程式設計語言在程序編寫過程中能夠輕易上手,

不需要事先熟悉複雜的語法。本論文將 Google 研發的 Blockly 開源視覺化程式

設計技術與 Lua 嵌入式動態腳本語言相結合,就算沒有程式語言的基本知識,也

能利用圖形化積木方塊進行簡單的操作,將自己的想法呈現出來。從實作結果可

以得知,通過提供的積木方塊拖拽搭建的程序可以應用在實務上。

5.2 未來展望

在積木方塊的設計部分,雖然目前積木方塊的功能實現上還沒有很完整,呈

現出來的任務比較簡單,未來希望在積木方塊的設計上能夠充分滿足實務上的功

能需求,操作方便、使用流程簡潔明瞭、完善的人機互動介面、滿足客戶的需求,

達到實用性原則,使程序的編寫上更加方便,能夠被拿來運用在更多的實務上。

32

參考文獻

[1] “MIT Scratch,” Scratch.mit.edu, 2017. [Online]. Available: https://scratch.mit.edu.

[2] “Scratch: MIT Media Lab,” designenvy.aiga.org, 2017. [Online]. Available: http://

designenvy.aiga.org/scratch-mit-media-lab/.

[3] N. Fraser, “Ten Things We’ve Learned from Blockly,” IEEE Blocks and Beyond

Workshop, pp. 49-50, 2015

[4] “Google Blockly,” Developers.google.com, 2017. [Online]. Available: https://deve lopers.google.com/blockly/.

[5] R. Ierusalimschy, “Programming in Lua, First Edition,” pp. 1-3, 2003

[6] “Lua,” Lua Homepage, 2017. [Online]. http://www.lua.org/home.html.

[7] 覃飞龙, “基于 JavaScript 的图形化运动编程软件研究,” 学位论文, 成都信

息工程学院, 2014

[8] “Block Factory,” Blockly Demo: Blockly Developer Tools, 2017. [Online]. https:// blockly-demo.appspot.com/static/demos/blockfactory/index.html.

[9] “Blockly Developer Tools,” Blockly configuration process, 2017. [Online]. https:// developers.google.com/blockly/guides/create-custom-blocks/blockly-developer-tools.

[10] R. Ierusalimschy, “Programming in Lua,” First Edition, pp. 178-197, 2003

[11] K. Jung and A. Brown, “Beginning Lua Programming,” pp. 413-422, 2007

[12] “Lua 5.3 Reference Manual,” Lua Manual, 2017. [Online]. https: // www.lua.org/ manual/5.3/.

33