• 沒有找到結果。

I-Shou University Institutional Repository:Item 987654321/21409

N/A
N/A
Protected

Academic year: 2021

Share "I-Shou University Institutional Repository:Item 987654321/21409"

Copied!
77
0
0

加載中.... (立即查看全文)

全文

(1)義守大學 機械與自動化工程學系 碩士論文. 遠端體感控制機械手 Leap Motion Remote Controlled Robotic Hand. 研 究 生:温九力 指導教授:吳士傑 博士 共同指導:高典良 博士 中華民國. 106. 年. 6. 月.

(2)

(3) 遠端體感控制機械手 Leap Motion Remote Controlled Robotic Hand 摘要 本研究主要目標是使用 Leap Motion 來模擬真人手指上的動作來 操控 Arduino Mega 2560 微控制器上的機械手,套用 MQTT(Message Queuing Telemetry Transport)來遠端傳輸 Leap Motion 上的指令給 Arduino 機械手,進而達成遠端控制機械手。. 本研究軟體方面詳細介紹 Leap Motion 與 Arduino 間的系統運行 及系統整合,包括網路 Arduino 網路連線確認步驟、程式碼解析及 MQTT 監控方式;而硬體方面介紹 InMoov 機械手的組裝、伺服馬達調整和電 路圖接線分析,最後更將完成後的機械手進行抓物取物的實驗,並經由 實驗數據進行統計分析及統整結論和提出改良方向及想法。. 關鍵字:Leap Motion、體感裝置、機械手、遠端通訊. I.

(4) Leap Motion Remote Controlled Robotic Hand Abstract This paper uses Leap Motion to simulate real persons finger action to control Arduino Mega 2560 microcontrollers manipulator, applying the MQTT(Message Queuing Telemetry Transport) to remotely transmit Leap Motions instruction to Arduino manipulator, in order to remotely control the manipulator.. This research in the software aspect has a fully introduction about systems running and integration between leap motion and arduino, including Arduino internet connection validation procedures, script analysis and the monitoring method of MQTT; in the hardware aspect introduces the InMoov manipulator's assemble and install, adjustments of sever motor and circuit diagram wiring analysis. Finally the experiment of manipulator grabbing and taking objects will be done, statistic analysis and reorganization conclusion to advance improve direction and ideas via experimental data.. Keywords: Leap Motion, Somatosensory Devices, Robotic Hand, Remote. Communication.. II.

(5) 誌. 謝. 首先誠摯的感謝指導教授吳士傑博士及共同指導高典良博 士,兩位教授悉心的教導使我得以一窺通訊及機電整合研究領 域的深奧,不時的討論並指點我正確的方向,有耐心的修正與 指導都使我在這些年中獲益匪淺。並承蒙口試委員們對於本論 文之審閱與斧正,僅此致上由衷的感謝。. 本論文的完成另外亦得感謝徐祥禎博士帶我參與圓創力的 研討會及網路上熱心的網友們及在網路通訊方面工作的表哥, 還有銘傳大學的葉正勝教授,因為有你們的點撥及幫忙,才使 得本論文能夠更完整而嚴謹。. 最後我要感謝的是這兩年不斷支持我與鼓勵我的家人,若 是 沒 有 家 人 的 鼓 勵,我 沒 辦 法 如 此 順 利 的 完 成 論 文 並 堅 持 到 底; 同樣地,我要感謝我的好同學們,雖然大部分的人所研究的方 向皆不同,期間大家不斷地彼此鼓勵,在遇到問題時的協助幫 忙,彼此一起度過生涯中重要的兩年。感謝我最愛的家人及所 有關心我的人,感謝你們在我人生的路上給予我幫助與關懷, 因為有你們才有現在的我,謝謝。. 温九力 義守大學. 機械與自動化工程學系. 中華民國. III. 謹誌於. 一零六年. 七. 月.

(6) 總目錄 摘 要 .......................................................... I Abstract ....................................................... II 誌. 謝 ........................................................ III. 總目錄 ......................................................... IV 圖目錄 ......................................................... VI 表目錄 ....................................................... VIII 第一章、 緒論 .................................................. 1 1.1 前言 ...................................................... 1 1.1.1 機械手................................................. 1 1.1.2 構造................................................... 5 1.2 研究動機與目的 ............................................ 9 1.3 論文架構 ................................................. 10 第二章、文獻回顧 ............................................... 12 2.1 機械手臂 ................................................. 12 第三章、硬體介紹 ............................................... 14 3.1 Arduino 的概念及應用 ..................................... 14 3.2 Leap Motion 的概念原理及應用 ............................. 15 3.3 InMoov 機器人介紹 ........................................ 17 第四章、軟體介紹 ............................................... 19 4.1 Processing ............................................... 19 4.2 Arduino IDE .............................................. 20. IV.

(7) 4.3 Message Queuing Telemetry Transport ...................... 21 第五章、實驗過程 ............................................... 22 5.1 系統運行 ................................................. 22 5.2 系統整合 ................................................. 23 5.3 機械手構造簡介 ........................................... 24 5.4 馬達調整 ................................................. 26 5.5 電路連接 ................................................. 28 5.6 確認 Arduino 連上網路 ..................................... 30 5.7 序列埠程式碼編輯 ......................................... 32 5.8 MQTT 程式碼編輯 .......................................... 34 第六章、結論 ................................................... 35 第七章、未來展望 ............................................... 42 7.1 機器手改良 ............................................... 42 7.2 未來展望 ................................................. 43 程式碼 ......................................................... 44 參考文獻 ....................................................... 62. V.

(8) 圖目錄 圖 1.1.1-1 SCARA 機械手臂 .................................... 2 圖 1.1.1-2 機械手套(RoboGlove) ............................... 3 圖 1.1.1-3 MSS 加拿大臂 2 (Canadarm 2) ........................ 4 圖 1.1.1-4 3D 列印機(3D Printer) .............................. 5 圖 1.1.1-4 PWM 訊號圖 ......................................... 6 圖 1.1.2-2 PMW 控制伺服馬達原理 .............................. 7 圖 1.1.2-3 感測器(Sensor) .................................... 8 圖 3.1-1 Arduino Mega-2560 .................................. 14 圖 3.1-2 Arduino Ethernet Shield ............................ 15 圖 3.2-1 Leap Motion 內部構造圖 ............................. 16 圖 3.2-2 Leap Motion 運作示意圖 .............................. 16 圖 3.2-3 Leap Motion 座標圖 ................................. 17 圖 3.3-1 InMoov 機器人 ...................................... 18 圖 4-1.1 Processing ......................................... 19 圖 4.2-1 Arduino IDE ........................................ 20 圖 4.3-1 publish/subscribe 運作的示意圖 ..................... 21 圖 5.1-1 系統運作示意圖 ...................................... 22 圖 5.2-1 呼吸燈系統整合 ..................................... 23 圖 5.3-1 機械手零件 ......................................... 24 圖 5.3-2 小姆指及無名指中的滑軸 .............................. 25 圖 5.3-4 三個活動關節 ....................................... 25 圖 5.4-1 伺服馬達安裝圖 ..................................... 26 VI.

(9) 圖 5.4-2 伺服馬達綁線圖 ..................................... 27 圖 5.4-3 成品圖 ............................................. 28 圖 5.5-1 電路圖 ............................................. 29 圖 5.5-2 概要圖 ............................................. 29 圖 5.6-1 網路連線 ........................................... 30 圖 5.6-2 Arduino 收訊確認 .................................... 31 圖 5.6-3 Processing 發訊息確認 .............................. 31 圖 5.6-4 連線整合確認 ....................................... 32 圖 6-1 Processing 感測手繪圖 ................................ 35 圖 6-2 MQTT 通訊協定與物聯網 IOT 應用整合概念圖 ............... 36 圖 6-3 WireShark 解析通訊封包 ................................ 37 圖 6-4 ESP 8266 ............................................. 38 圖 6-5 機械手側面關節角度 ................................... 39 圖 6-6 機械手取物圖 ......................................... 40 圖 6-7 機械手彎曲後 ......................................... 41 圖 7.1-1 火星探測好奇號構造圖 ............................... 42. VII.

(10) 表目錄 表 6-1 取物伺服馬達轉動角度表 .............................. 40 表 6-2 彎曲後手指長度 ...................................... 411 表 5.2-1 呼吸燈 Processing ................................... 44 表 5.2-2 呼吸燈 Arduino ...................................... 45 表 5.4-1 測試綁線鬆緊度程式碼 ............................... 46 表 5.7-1 序列埠程式碼 Arduino IDE ............................ 47 表 5.7-2 序列埠程式碼 Processing ............................. 50 表 5.8-1 MQTT 程式碼 Arduino ................................. 54 表 5.8-2 MQTT 程式碼 Processing .............................. 58. VIII.

(11) 第一章、 緒論 1.1 前言. 1.1.1 機械手. Robot 意思為強制性勞役,它是由捷克語 robotnik 而來,意思為奴隸、 僕人、農奴(王培垣,2000,頁 3;朱啟民、李祖昌、黃松榮,1985,頁 1)。. 說到機器人就必須追朔到 1921 年捷克科幻作家卡雷爾·恰佩克的《羅素 姆的萬能機器人》[1]這本書中提到的機械人,這是「機器人」這個詞第一 次出現在世人的眼中,而第一台專門應用於產業工業生產所使用的機械手臂 是具有「機械手臂之父」之稱的約瑟夫·恩格伯格[2]所發明的。. 在 20 世紀以前,人們以模擬仿人的動作及思考將機器人應用在生活或 是娛樂當中,工業中棧板專用的機械手臂成為減輕人力需求及負擔的搬運工 具。直到現今像是生活中最常見的掃地機器人、博弈發牌的機械手臂及目前 市面上有出現一些電子義肢,裡面裝有電腦及小型驅動器,能協助機械關節 作出更恰當的細微動作,在將來醫學及工業界更加成熟時,截肢者有望可以 透過這些新科技,能夠取代與恢復肢體的功能,如今諸如此類的機械手已經 深入生活中。. 而機械手臂常見的型式有線性手臂[3]、SCARA 手臂[4]、關節多軸機械 手臂[5]等,而 SCARA 是由 1978 年,日本山梨大學牧野洋[6]所發明的,此 1.

(12) 機器人擁有四個軸及四個可動自由度[7],SCARA 的特色是其串接的兩桿結 構,Z 軸能夠上下移動且有良好的剛性,所以被大量用來使用裝配印刷電路 板及電子零件或是搬物取件等等,而機械手臂作動原理是以座標來控制,其 中可分為直角座標型[15]、圓柱座標型[16]、極座標型[17]、關節型座標 [18]。. 圖 1.1.1-1 SCARA 機械手臂 (摘錄於 baike.baidu,SCARA). 在近幾年有著機械手套(RoboGlove)[8]的出現,機械手套最初是科學家 用來控制 Robonaut2 人形機器人[9]的,但現在結合了醫療技術增添了「力 量增強」的技術,由五個感測器、ㄧ個支撐架和ㄧ套電池組合而成,提供手 套所需要的動力以及傳感。. 2.

(13) 圖 1.1.1-2 機械手套(RoboGlove) (摘錄於 kknews,RoboGlove). 值得一提的是應用在國際太空站的移動維修系統(Mobile Servicing System,簡稱 MSS)[10]以及探測火星的好奇號(Curiosity)[11],移動維修 系統他的主要部件「加拿大臂 2」[12],是在國際太空站的一個機器人系 統,在太空站的周圍進行設備的搬運以及補給,探測火星的好奇號,是以機 械車與機械手臂加上相機合成一台移動探測儀器,這兩種設計的理念與我的 論文概念不謀而合,有些人類所不能靠近的地方,能夠使用機械手臂代替人 類完成工作,就能既安全又有效率的完成工作。. 3.

(14) 圖 1.1.1-3 MSS 加拿大臂 2 (Canadarm 2) (摘錄於 微基百科,機械手臂). 3D 列印(3D printing)[13],又稱加法製造、積層製造模型可使用電腦 輔助軟體包或是三維掃描器[14]生成,「3D 列印」這個詞的原意是指順序地 將材料沉積到粉末層噴墨列印頭的過程。最近此詞的含義已經擴大到廣泛包 括的各種技術,如擠壓和燒結過程。技術標準一般使用「增量製造」這個術 語來表達這個廣泛含義。而本論文所研究的仿生機械手能夠模擬手指動作, 通過控制馬達來控制手指屈伸。全套零件使用高精度的 3D 列印機列印,零 件精度高。. 4.

(15) 圖 1.1.1-4 3D 列印機(3D Printer) (摘錄於 微基百科,3D 列印). 1.1.2 構造 (一 )、 伺 服 馬 達 :. 伺服馬達(servomotor)[15],為多數小型機器人常用的馬達,它的體 積不會很大重量也輕,且能精確地控制旋轉角度,一個典型的伺服馬達主要 分成四個部分:控制電路晶片、直流馬達、減速齒輪組、可變電阻。. 伺服馬達是以一顆直流馬達來做驅動的,不過齒輪變速箱也一起裝在裡 面了,而一般馬達的力量其實都很小但速度卻很快,所以馬達通常都會再搭 配所需的齒輪組。. 5.

(16) 一般伺服馬達所使用的是 PWM 訊號(Pulse Width Modulation)[16],而 PWM 訊號是像方波一樣 high-low 的擺盪。. 伺服機構(servomechanism)[17],指經由閉迴路控制方式,如同大腦一 般能夠發號指令,達到一個機械系統位置、速度、或加速度控制的系統。. 圖 1.1.1-4 PWM 訊號圖 (摘錄於 IIT Kharagpur,Servo). 當 18 毫秒為週期的 PWM 訊號中有 1 毫秒是 high 的狀態時,伺服馬達 轉向 9 點鐘方向的位子有 1.5 毫秒是 high 的時候轉到 12 點鐘的位子,2 毫 秒是 high 時轉到 3 點鐘的位子,換句話說伺服馬達的轉向則是由 PWM 訊號 的一個週期裡 high 所佔的比例來控制的,如下(圖 1.1.2-2)。. 6.

(17) 圖 1.1.2-2 PMW 控制伺服馬達原理 (摘錄於 e101,RC SERVO 之 PWM 控制範例). 而將接收這樣的訊號,並將之轉換給伺服機內的直流馬達,就是控制電 路晶片在做的工作,而且當馬達轉動到不同的角度時,也會跟著帶動伺服機 內的一個可變電阻,而可變電阻就會因為馬達的角度不同,而產生不同的電 阻值傳給控制電路晶片,就能夠知道馬達現在的角度位置。. (二 )、 感 測 器 : 設計機械手臂時,感測器(sensor)[18],就是機器人的五官,將其賦予 「生命」極為重要。分為外部 sensor 及內部 sensor:. 一、視覺 機械的視覺是由影像輸入、影像處理、影像分析等所構成。. 二、觸覺 觸覺的機構多是利用 ON、OFF 開關的原理。 7.

(18) 三、力覺 即感應自外部所施加的壓力。若是安裝在回轉軸的情形時,又可稱為扭力感 應器。. 四、感覺融合 即利用視覺、距離覺、觸覺等不同的感應器所獲得的情報,對情景或狀況作 總合判斷的技術。. 圖 1.1.2-3 感測器(Sensor) (摘錄於 網昱多媒體,LEGO MINDSTORMS). 8.

(19) 1.2 研究動機與目的. 隨著工業 4.0[19]及物聯網 IOT(Internet of Things)[20] 的時代來臨, 現在非常多工業商品的設計已漸漸朝向自動化之趨勢,舉凡產業界的工廠皆 以自動化為導向趨勢,以達到自動化生產的目的。. 然而有些危險的地方或是人類無法觸及的地方也是能讓機器手代替人類 去完成的,雖然機械手的動作較人手會有些延遲,但整個操作過程十分流暢 並且精準度較高。用戶可以通過電腦即時查看機械手的工作狀況,直觀並且 操作十分簡單。. 可用來做為未爆彈拆彈方面的應用,讓人不必身處危險的現場又能精準 有效率的完成動作。而醫療方面能以近年來的達文西手術[21]為目標前進, 透過機械手不僅止血、縫合上更精準,就連出血量及恢復時間相對少短。. 而本論文使用 Leap Motion[22]來模擬真人手指上的動作來操控 Arduino Mega 2560 微控制器[23]上的機械手,套用 MQTT(Message Queuing Telemetry Transport)[24]來遠端傳輸 Leap Motion 上的指令給 Arduino 機械手。. 9.

(20) 1.3 論文架構. 本論文使用 Leap Motion 應用在機械手中,並結合了 MQTT (Message Queuing Telemetry Transport) 來串聯機械手與 Leap Motion 進而達到遠 端體感控制,而使 3D 列印機製作出的仿生機械手裝上 Arduino 以及 Arduino Ethernet Shield[25]能夠有效接收由 MQTT 中 publish/subscribe 傳輸至 topic 的控制指令,在論文中將會描述如何由 MQTT 串聯 Leap Moiton、機械 手與 Arduino 以及需要的相關軟硬體設備、程式語言技術,主要分為以下七 個章節詳細說明,章節如下:. (一)、緒論: 本章節說明本論文的背景、研究動機與目的。. (二)、文獻回顧: 本章節針對機器人的開發的文獻進行探討,並了解有觀製程及馬達的重 要概念。. (三)、硬體介紹: 介紹 Arduino 的單晶片微控制器、Leap Motion、InMoov 機械人。. (四)、軟體介紹: 介紹 Processing 以及 Arduino 的應用軟體。. 10.

(21) (五)、實驗過程: 介紹機械手組裝的相關硬體規格並呈現組裝串聯完成後機械手的樣貌及 簡易的操控,說明系統整合運作及 MQTT 的概念及應用、實驗串聯以及試探 過程。. (六)、結論: 總結本論文,並檢討提出能改善的相關方向及方式。. (七)、未來展望: 最後針對本研究提出觀點與未來發展與展望。. 附錄、程式碼: Arduino、Processing 程式碼。. 11.

(22) 第二章、文獻回顧 2.1 機械手臂. 在機械手裡,機構設計以及感應器(sensor)是很重要的一環,這幾年來 有很多論文是應用不同的感應器裝在機械手上,能夠應用在不同的領域中。. 1996 年 R. Kelly[26],我們解決了固定攝像機配置下平面機器人操縱器 的視覺伺服。控制目標是通過使用配備有固定攝像機的視覺系統來“查看” 機器人末端執行器和目標,將機器人末端執行器放置在所需的靜態目標上。. 2001 年 U. Frese 等人[27],使用機器人手臂捕捉飛球的系統,使用現成 的組件(基於 PC 的系統)進行視覺跟踪。通過大型基線立體相機觀察球,將 每個圖像與緩慢適應的參考圖像進行比較。. 2006 年 A. Nakashima 等人[28],提出了一種通過使用兩個視覺攝像頭傳 感器連接到機器人操縱器的球拍來實現藉由玩球的娛樂方法。. 2007 年 Y. Yamakawa 等人[29],確定打結所需的技術,分析由人手所執 行的動作,使用機械手分成四種處理技巧實現各種結合的技能綜合。. 2008 年,葉峻弘[30],透過結合 ADAMS/Control 和 MATLAB/Simulink 的 動態模擬器,在機器手臂實現運動規劃和系統模擬。並且利用逆向動力學模 型,來分析系統運動模型和驗證控制器性能。. 12.

(23) 2010 年 C.Y. Lin 等人[31],介紹智能機器人 DOC-2,智能機器人第二代 升級版 DOC-h DOC-2 是一種可以教和娛樂的自主多功能機器人。DOC-2 在看 到單詞圖像卡時可以說英文單詞。它也可以解決在白板上呈現的簡單的代數 問題。. 2011 年,李欣霖[32],提出一套藉由 Kinect 遠端控制機械手臂與自走 車,目的是可以應用在危險的環境中執行任務,此自走車上另有安裝鏡頭,讓 使用者可利用攝影鏡頭即時遠距離操控。. 2016 年,鐘瑋[33],研究自行開發更為輕巧機械手臂,維修容易並且具 有可撓性之簧片機械手臂。簧片機械手臂是針對機器人比賽所自製的比賽用 手臂,手臂分為主體與簧片伸縮臂兩部分,運用 6 伏特的電池驅動馬達來帶 動皮帶齒控制伸縮臂的伸縮。. 13.

(24) 第三章、硬體介紹 3.1 Arduino 的概念及應用. Arduino 是由義大利一家高科技設計學校的老師們所開發出來的,因為他 們的學生經常抱怨找不到便宜又好用的控制器,經過分工合作,做出了一塊 電路版被取名為「Arduino」,他們將產品放置於網路中,並保持著開放原始 碼的理念。. Arduino 是一個開放原始碼的單晶片微控制器,它使用了 Atmel AVR 單 片機,採用了開放原始碼的軟硬體平台,建構於簡易輸出/輸入(simple I/O) 介面板,並且具有使用類似 Java、C 語言的 Processing/Wiring 開發環境, 本論文使用 Arduino 控制器 MEGA-2560 外接 Arduino Ethernet Shield 來連 結網路線連結網路。. 圖 3.1-1 Arduino Mega-2560 (摘錄於 ElectroSchematics). 14.

(25) 圖 3.1-2 Arduino Ethernet Shield (摘錄於 Arduino.cc). 3.2 Leap Motion 的概念原理及應用. 簡單來說,Leap Motion 是基於雙眼視覺的手勢判定設備,類似於滑鼠, 其裝置支援利用手掌和手指動作來進行輸入,但無需手部接觸或者輕觸。像 是微軟的 Xbox Kinect[34],不一樣的是 Kinect 有三個鏡頭,中間的鏡頭是 RGB 彩色攝影機[35],左右兩邊鏡頭則分別為紅外線發射器和紅外線 CMOS 攝影機[36]所構成的 3D 結構光深度感應器[37],使用景深的方式讓玩家不需 要手持控制器,而是使用語音指令以及手勢來操作 Xbox 的介面,而 Leap Motion 是使用紅外線感測雙眼視覺換句話來說就是有兩個攝影頭,利用雙眼 立體視覺成像原理[38],把兩部相機安裝在某物體的不同角度來提取包括三 維位置在內的訊息,使用校準技術來調準兩部相機之間的畫素資訊,並且擷 取深度資訊。而後建立起手部的立體模型。這種方法對於使用者手勢的輸入 限制較小,可以做到更加自然的人機交互,但由於檢測的範圍大體在傳感器 上方 25 毫米到 600 毫米之間,檢測的空間大體是一個倒四棱錐體,所以感 測的距離不比 Kinect 遠,但卻更加精準。 15.

(26) 圖 3.2-1 Leap Motion 內部構造圖 (摘錄於 Csdn 博客) 大致上,Leap 傳感器根據內置的兩個攝影頭從不同角度捕捉的畫面,重 建出手掌在真實世界三維空間的運動訊息,要做到雙眼手勢識別首先需要對 雙眼攝影頭做坐標定位,即是計算空間中左右兩台攝影頭位置的幾何關係。. 圖 3.2-2 Leap Motion 運作示意圖 (摘 錄 於. wechat 中 文 網 ). Leap Motion 感測器會建立一個直角座標系統,而所謂直角座標系統就 是應用我們熟知的 X、Y、Z 軸等座標來進行計算,座標的原點是傳輸感測器. 16.

(27) 的中心,座標的 X 軸平行於傳輸感測器,指向螢幕右方。Y 軸指向上方。Z 軸指向背離螢幕的方向,單位爲真實世界的毫米。. 圖 3.2-3 Leap Motion 座標圖 (摘 錄 於. CodeProject). 3.3 InMoov 機器人介紹. InMoov 機器人[39]是全球第一個開放原始碼 3D 列印真人大小的機器人, 2012 年 1 月開始設計,歷經約 1 至 2 年完成現在的階段。2013 年 1 月,法國 一位名叫蓋爾·朗葛文(Gael Langevin)[40]的雕塑家僅花了 800 美元由就自 創了一台真人大小的機器人,所需材料僅包括一台 3D 列印機、一些電機以及 電路板等。 InMoov 機器人的組裝過程,必須掌握基本 3D 列印技術、程式控制運作、 克服組裝困難與問題解決能力。程式方面 Myrobotlab[41]則提供 InMoov 機 器人運行的技術和控制,Myrobotlab 也是一個開源的 Java 程式控制機器人 17.

(28) 系統。而網路有許多是從參與全球性的專案,不但可以提升實作與研發能力, 更可以啟發創新提高全球競爭力。. 圖 3.3-1 InMoov 機器人 (摘 錄 於. Wikipedia, InMoov). 18.

(29) 第四章、軟體介紹 4.1 Processing Processing[35] 是一個開放原始碼的程式語言及開發環境,並提供給那 些想要對影像、動畫、聲音進行程式編輯的工作者。此外,因 Processing 裡 有 Leap Motion 及 MQTT 的相關 Library 供線上免費下載,故擇其做來開發及 研究。. 圖 4-1.1 Processing. 19.

(30) 4.2 Arduino IDE Arduino 開發環境使用的語法與 C/C++相似,非常容易使用。而 Arduino 可以在不同的作業平台上都可以開發,不管是 Windows、蘋果電腦、還是 Linux 都可以使用與開發 Arduino。許多自動控制的產業都有使用 Arduino 而它的 簡便性與開發自由性使著網路上有著的龐大的資源,更值得一提的是 Arduino Software IDE[36]源自於 Processing 程式語言以及 Wiring 計劃的整合開發 環境。下方圖中 Arduino 開發環境的主介面,如下圖所示中間的白色區域就 是程式編輯區,下方的黑色區域為資訊提示區。. 圖 4.2-1 Arduino IDE. 20.

(31) 4.3 Message Queuing Telemetry Transport 簡單來說,它是為了物聯網而設計的 protocol(協議),並且它是透過 publish/subscribe 的方式來做訊息傳送。由於是為了物聯網而設計的協定, 因此它所需要的網路頻寬是很低的,而所需要的硬體資源也是低的,剛好適 合本研究。 MQTT 的用法相當廣泛,例如控管農場花圃來說,能夠設定感測器,如果 花圃濕度低於多少就向 MQTT 的某個 Topic 傳出訊息,經由手機 APP 收到由花圃感測器發出的訊息就能夠即時開啟灑水系統,Publish/Subscribe 的訊息傳送模式,提供一對多的訊息分配能夠達成有效的控管。 MQTT 的特性還分成三種 Qos (Quality of Service)[42],第一種「At most once」,最多ㄧ次,優點是不在意資料是否遺失,因為下ㄧ次的資料很 快就會被 published 出來,缺點有可能是訊息遺失與重複發送,適合環境感 測。第二種「At least once」,至少ㄧ次,保證訊息會送達,但可能會有重 複發送訊息的狀況。第三種「Exactly once」確定ㄧ次,確認訊息只會送達ㄧ 次,系統如收到重複資料、資料遺失,會造成系統錯誤,這種 Qos 適合用在 計費。. 圖 4.3-1 publish/subscribe 運作的示意圖 (摘錄於 maxkit). 21.

(32) 第五章、實驗過程 5.1 系統運行. 首先由 Arduino IDE 編譯的程式語言燒入至機械手中的 Arduino Mega 2560 單晶片微控制器,經由 PC 系統整合讓 Leap Motion 偵測到的手勢能夠 從 Processing 中編譯好的程式語言由 MQTT 傳送訊息至 Topic 中,再讓 Arduino Mega 2560 外接 Arduino Ethernet Shield 連線至網路並且給予訂 閱相同 Topic 的指令,最後 Arduino Mega 2560 收到的訊息就能夠命令伺服 馬達轉動不同的角度,進而達到遠端控制機械手。. 圖 5.1-1 系統運作示意圖. 22.

(33) 5.2 系統整合. 將 Processing 與 Arduino 整合起來能夠通訊是最關鍵的地方,初步整合 我試用了 Leap Motion 手勢控制呼吸燈來做,漸漸張開手掌燈泡會漸漸亮起 來,反之,手掌慢慢合起來燈泡會漸漸暗掉,程式碼為附錄中(表 5.2-1)與(表 5.2-2)。. 圖 5.2-1 呼吸燈系統整合. 23.

(34) 5.3 機械手構造簡介. InMoov 機械手的材料組件是由網路上提供的 3D 列印 Open Source 所印 出來的,其中小姆指、無名指及大拇指各有一根能滾動的軸固定住,能讓手掌 做些微的彎曲,而手指上有三個關節分別以三個螺絲鎖上讓關節能夠彎曲。. 圖 5.3-1 機械手零件. 24.

(35) 圖 5.3-2 小姆指及無名指中的滑軸. 圖 5.3-3 大拇指構造. (摘錄於 InMoov.fr). (摘錄於 InMoov.fr). 圖 5.3-4 三個活動關節. 圖 5.3-5 機械手掌. (摘錄於 InMoov.fr). (摘錄於 InMoov.fr). 25.

(36) 5.4 馬達調整. 機械手主要的動力來源是裝置於手臂上的伺服馬達,伺服馬達接線至 Arduino 及麵包板給與電壓,且伺服馬達與每根手指各有兩條線來做手指上動 作的拉伸,共有五個伺服馬達,一個控制一根手指,藍色物件為控制手腕的伺 服馬達不過本論文並無安裝。. 圖 5.4-1 伺服馬達安裝圖 (摘錄於 InMoov.fr). 26.

(37) MG995 伺服馬達,棕色腳位 1 是 GND 接地線,紅色腳位 2: 4.8V~6V,橙 色腳位 3: PWM 輸入訊號。伺服馬達為機器人應用所常見的電子馬達,其基 本控制原理是利用控制迴圈、結合必要的馬達反饋,從而協助馬達進入所需 的狀態,如位置與速度。由於伺服馬達必須透過控制迴圈了解目前狀態,因此 其穩定性高於步進馬達[43]。. 實驗機械手每根手指皆由兩條尼龍線綁住馬達,一條拉緊會讓手指伸直, 另一條拉緊會讓手指彎曲,然而拉緊尼龍線所需要的就是轉動伺服馬達,但 每條綁定的尼龍線鬆緊程度不同,我自己的方式是寫個簡單的程式碼讓伺服 馬達從 5 度轉到 175 度再轉回來,測試每條線的鬆緊度是否能如預期的讓手 指伸直或是彎取,請參閱程式碼(表 5.4-1 Arduino 測試鬆緊度程式碼)。. 圖 5.4-2 伺服馬達綁線圖. 27.

(38) 圖 5.4-3 成品圖. 5.5 電路連接. 在機械手都安裝完成之後,要與 Arduino 單晶片微控制器連結就需要接 上 GND、電壓、輸入訊號腳位,我將大拇指至小拇指分別接上 4 到 8 的數位腳 位,電壓為 5V,電路圖黑、藍 = PWN 輸入訊號,紅、粉 = 5V,黃、白 = GND ,電路圖(圖 6.2-1)及概要圖(圖 6.2-2)如下,不過 Arduino 所提供的 電壓不足驅動五個伺服馬達同時運作,這裡使用外接電源的方式將兩個 18650 的電池用電池盒串聯得到 7.2V 來供給伺服馬達的電壓,並將網路線接 Arduino Ethernet Shield,最後在把 Leap Motion 連結至個人電腦中。. 28.

(39) 圖 5.5-1 電路圖. 圖 5.5-2 概要圖. 29.

(40) 5.6 確認 Arduino 連上網路 先利用家用網路分享器確認是否有連上網路,並確認 IP 位置及 Mac Address[44]的數據是否與自己設定的相同,在使用 ping[45]的方式確認能 收訊,從 ping 出來的 4 次就能知道訊息是否有遺失。. 圖 5.6-1 網路連線. 接著使用手機 APP 確認 Mqtt connect broker[46],這裡使用的是 MQTTool 由 iOS 系統裡面的 Apple Store 開放免費下載的 APP,連線至已架 設完成的 MQTT 後由手機發出訊息至/lm 這個 Topic 試探 Arduino 有無接收到 訊息。. 30.

(41) 圖 5.6-2 Arduino 收訊確認 再由 Processing 端用 Leap Motion 偵測手指的動作,並發出相對應的 訊息給 MQTT 中的/lm,發送後經由 MQTTool 來監控是否能夠順利的收到訊 號,下圖收到小寫的字母代表彎曲的手指,而大寫的字母代表伸直的手指。. 圖 5.6-3 Processing 發訊息確認. 31.

(42) 最後測試成功後,將上述的內容整合,由 Processing 端用 Leap Motion 偵測手指的動作,並發出相對應的訊息給 MQTT 中的/lm,在試探 Arduino 有 無接收到訊息。. 圖 5.6-4 連線整合確認. 5.7 序列埠程式碼編輯 Arduino 的部分首先將使用序列埠(Comport)[44]的方式經由 USB 連接至 Arduino MEGA-2560 先進行無網路通訊的編譯,完成後再加上 MQTT 通訊協定。. 在 void setup()之前先插入<Servo.h>,並設定變數 thumb、index、middle、 ring 及 pinky 等等的腳位,定義每個手指各一個 Servo 的名稱,void setup(). 32.

(43) 中,每個寫入每個定義好的 Servo 名稱並 attach()至相對應的手指,最後設 定 Serial.begin(9600)的傳輸速率。. 而 void loop() 的 迴 圈 中 , 將 定 義 好 的 finger 先 歸 0 , 並 將 if(Serial.available() > 0)當作確認有無數據傳入,迴圈內再將 finger = Serial.read ,目的是讓讀取存入 Serial.read 的數據傳入 finger 達到通訊 管理的效果,最後 switch(finger) 讓偵測到的數據能夠做出相對應的指令。. Processing 使用 processing.serial.*及 de.voidplus.leapmotion.*, 接著定義 Serial 的變數名稱以及 LeapMotion 的變數名稱,void setup()之 中定義視窗大小,背景顏色,設定字串 arduinoPort = Serial.list[1],可 利用 printArray(Serial.list())這個指令清楚的知道序列埠的編碼,在將定 義好的 LeapMotion 名稱設定為使用 Leap Motion 中的 Library,最後再將 Serial 定義好的名稱設定序列埠編碼以及傳輸速率。. 而最後的 void draw()先後將 for (Hand hand : leap.getHands ()) 、 hand.draw()、 for (Finger finger : hand.getOutstretchedFingers())依 序放入設定一個迴圈,並 switch(finger.getType()),讓伸出的手指受到 Leap Motion 的偵測並傳輸訊息,再設一個相同的迴圈,不過最後改為 for (Finger finger : hand.getOutstretchedFingersByAngel(0)) 且這裡必須再加上 if(finger.isExtended()==false)才能夠進行 switch(finger.getType()), 這樣以來就能夠偵測各個手指的伸直與彎曲,程式碼請參閱附件ㄧ(表 5.7-1 Arduino)與(表 5.7-2 Processing)。. 33.

(44) 5.8 MQTT 程式碼編輯 在 Processing 中 import Library 來建立 MQTT 與 Leap Motion 的物件, Leap Motion 使用 de.voidplus.leapmotion 來偵測手指的伸直與彎曲與否, 而 MQTT 利 用 客 戶 端 連 線 、 重 新 連 線 、 訂 閱 、 發 佈 等 指 令 使 用 client.connect("Server","ClientId")及 client.publish("/topic","message")的方式連 接至已架設好的伺服器中,且偵測到手指的動作後應發送的訊息至主題中, 而過程中可以使用手機 APP 連上同一個伺服器的主題,達到監控訊息傳遞的 效果。. 而 Arduino,插入 Servo 並建立五個 Servo 物件分別對應手指及訊號腳 位,在收到手指伸直時轉向 5 度,而彎曲時轉向 175 度來控制機械手與自身 的手同步動作, 網路方面插<Ethernet.h> 、<PubSubClient.h>且於 setup 中 寫 入 client.setServer(Server, Port) 、 client.setCallback(callback) 、 Ethernet.begin(mac, ip); 再 依 序 由 ethernet connect 、 Mqtt connect broker、Subscribe to topic、Serial.print message 確認 Arduino 已連上 伺服器,最後 void callback(char* topic, byte*payload, unsigned int length)中將 client.subscribe("/topic")所收到的訊息由 payload[0]的方 式判斷告知 Arudino 中對應的伺服馬達該轉動的度數,進而達到遠端控制機 械手,程式碼請參閱附件ㄧ(表 5.8-1 Arduino)與(表 5.8-2 Processing)。. 34.

(45) 第六章、結論 本論文成功地整合了各項發展之軟、硬體技術,雛型系統雖有部分網路 傳遞及機械系統所衍生的小瑕疵,但是就整體而言,本專題已完成論文製作 的目標。. 不同的開發機器人的研究者,使用著各式各樣的軟體,例如說像是 inMoov 機器人所配套的 myrobotlab 或者是 Unity 3D[47]等等都是開發者的寵兒, 其中雖然 Processing 這套軟體主要是開發給需要製作影像、動畫、聲音的用 戶使用,但因為界面簡單且有許多開放的 Library 可以下載,對於本論文來 說比起其他較為專業的軟體更適合研究開發。. 圖 6-1 Processing 感測手繪圖. 35.

(46) 序列埠所連結的機械手中有著 Serial.begin() - 開啟 Serial Port 並 設定通訊速率 (baud rate)、Serial.println() - 傳送資料到外部電腦、 Serial.read() - 接收來自外部電腦的資料。而 Serial.read()的指令能夠 暫存由 Processing 所發出的訊息並可以設置一個變數等於 Serial.read 就能 達到近乎無延遲的傳接收訊息。不過 MQTT 方面就不同了,使用雲端的方式發 送且接收資料都要經過 MQTT Broker,這會導致發送訊息及接送訊息速度不 及序列埠。. 圖 6-2 MQTT 通訊協定與物聯網 IOT 應用整合概念圖 (摘錄於 GT Wang). 36.

(47) 其中以序列埠的方法所通訊的機械手,延遲時間約莫在 1 秒以內,而由 MQTT 通訊,因為 Leap Motion 不斷的偵測手指的變化故 Processing 端不停 的發送訊息至/lm 這個 topic,導致依靠 Arduino 端雖然不斷收訊但訊息量龐 大時依然會有明顯的延遲,所以 MQTT 通訊方式的機械手的延遲比序列埠的方 法還長,而延遲時間約莫 1 至 2 秒。. 使用 Wireshark 來進行封包上傳送與接收的時間軸的解析,這裡針對監 控由 140.127.185.72 傳送至區域網路的每筆封包,由 Processing 傳送至 MQTT Broker 後,再由 MQTT Broker 傳至區域網路,這裡完成一次封包傳送約莫是 0.01 秒,而每十筆封包中約莫有一筆是間隔 0.02 秒完成,所以造成 MQTT 有 1 至 2 秒的延遲,有可能是因為 Arduino 的硬體無法瞬間負載的問題。. 圖 6-3 WireShark 解析通訊封包. 37.

(48) Arduino Ethernet Shield 必須接上網路線才能與伺服器連線,環境條 件受限,未來可能改用 ESP 8266[46] 以 Wi-Fi 的方式改良,能夠稍微改善 不是處處都有網路線的窘境,另外 Processing 繪圖所繪製的圖略為簡略,可 能以 Node.js[47]或是 Unity 3D 的方式去改善繪圖這方面的問題。. 圖 6-4 ESP 8266 (摘錄於 http://k12.camdemy.com/). 實驗機械手臂直立取物實驗中嘗試抓取不同形狀、重量及大小的物件, 而實驗過程中發現因為機械手本身構造上手指彎曲時關節的角度是固定的, 所以握力不大,取物的過程中只能拿取重量大約 200 至 500 公克的物件,且 因為關節角度固定,所以對拿取物品的形狀也有限制,像是小於機械手彎曲 38.

(49) 時的空間的物品就不易拿取,所以我試著加入材質為金鋼沙的止滑膠帶貼在 手指及手掌上,小幅度的提升拿取物件的重量,並成功將螺絲起子、小型鴨子 和人型的公仔、棒球、胡椒罐、眼鏡盒和棉花棒盒成功抓起。. 圖 6-5 機械手側面關節角度. 39.

(50) 表 6-1 大拇指. 取物伺服馬達轉動角度表 食指 中指 無名指. 小拇指. 螺絲起子. 175∘. 175∘. 175∘. 175∘. 175∘. 鴨子公仔. 170∘. 175∘. 170∘. 170∘. 175∘. 人型公仔. 155∘. 160∘. 165∘. 165∘. 165∘. 棒球. 155∘. 155∘. 150∘. 155∘. 175∘. 胡椒粉罐. 155∘. 160∘. 165∘. 165∘. 155∘. 眼鏡盒. 160∘. 160∘. 160∘. 160∘. 150∘. 棉花棒盒. 150∘. 155∘. 165∘. 155∘. 155∘. 圖 6-6 機械手取物圖. 40.

(51) 由表 6-1 中能夠知道,以圓形為例:當物件的直徑超過軟式棒球 H 號 (71.5mm ~ 72.5mm)時,伺服馬達所轉動的角度會有所降低;以長圓柱體為 例:,抓取螺絲起子並不會造成伺服馬達角度上的變化,而抓取胡椒粉罐則 有明顯的降低角度;以不規則體為例:鴨子、人型公仔和眼鏡盒會依照物體 的大小而改變轉動的角度。. 由此實驗可得知,InMoov 機械手的構造沒辦法控制機械手的握力,且手 指彎曲時中間的指節角度固定為 90∘,在指節角度固定為 90∘的情況下,手 指的長度導致某些體積較大的物件無法抓取。雖說物體的形狀不相同,但一 樣的是物件的體積越大伺服馬達轉動的角度就越小。. 長度. 表 6-2 彎 曲 後 手 指 長 度 大拇指 食指 中指 無名指. 小拇指. 3.0cm. 5.0cm. 5.7cm. 6.0cm. 圖 6-7 機械手彎曲後. 41. 5.6cm.

(52) 第七章、未來展望 7.1 機器手改良 因為大學專題有做過循跡自走車,將來有機會能夠幫機械手裝上攝影機 以及加上自走車的功能,讓機動性提升,通過視訊鏡頭能夠傳輸訊息至個人 電腦,並由鍵盤控制車子的移動,而 Leap Motion 控制機械手臂,類似探測 火星的好奇號這樣的架構,不過訊號傳輸量過為龐大可能是第一個會遇到的 難題。. 圖 7.1-1 火星探測好奇號構造圖 (摘錄於 Wikipedia). 42.

(53) 7.2 未來展望 《偉大的個性》 [48]開宗明義點出:「成功的秘密之一,就是能夠把我 們所有的精力集中在一件事上,把那些游移不定的注意力都彙集到一個關鍵 點上。」因此,一個人的個性是影響他一生成功或失敗的關鍵因素。. 機器人的功能都是人給的,不管是掃地機器人、發牌機械手還是聲控機 器人甚至俄羅斯人還研發出機器人打靶,其射擊精準度已達到專家的水準, 所以其想像空間其實是無限大的,我認為學無止盡只要多點創意,就能夠創 新出對人類更實用、更貼近人性的機器人。. 而研究人員在很多方面酷似拓荒者,研究人員探測知識的疆界需要具有 很多與拓荒者同樣的品格:事業心和進取心、隨時準備以自己的才智迎戰並 克服困難的精神狀態、冒險精神、對現有知識和流行觀念的不滿足、以及急於 試驗自己判斷力的迫切心情。. 在未來我希望自己能在經濟人文素養上多加涉獵,使自己成為一個有遠 見的研究者,學習溝通及人際關係的拓展,以符合注重團體合作的企業精神, 讓自己有專精研究的本錢,作為繼續深造的基礎,並應用在工程實務上。將來 的職場的上我會更努力吸收學習以求未來在社會上有不凡的成果並能夠回饋 社會。. 43.

(54) 程式碼 表 5.2-1 呼 吸 燈 Processing 1. import processing.serial.*; 2. import de.voidplus.leapmotion.*; 3. 4. LeapMotion leap; 5. Serial myPort; 6. 7. void setup() { 8. leap = new LeapMotion(this); 9. println(Serial.list()); 10. myPort = new Serial(this, Serial.list()[1], 9600); 11. } 12. 13. void draw() { 14. background(0); 15. for (Hand hand : leap.getHands()) { 16. pushMatrix(); 17. float handSize = hand.getSphereRadius(); 18. int handSize2 = int(handSize); 19. myPort.write(handSize2); 20. println(handSize2); 21. popMatrix(); 22. } 23. }. 44.

(55) 表 5.2-2 呼 吸 燈 Arduino 1. int val; 2. // LED 所連接的腳位 3. int led = 3; 4. // LED 的亮度 5. int brightness = 0; 6. // 幾點使 LED 褪色 7. int fadeAmount = 5; 8. // 當您按 reset 時,設置程序運行一次: 9. void setup() { 10. //每秒鐘多少位元 bits per second (bit/s) 11. Serial.begin(9600); 12. pinMode(led, OUTPUT); 13. } 14. // 循環程序永遠地重複運行: 15. void loop() { 16. // 檢查是否有新訊息 17. if (Serial.available() == '\n') { 18. val= Serial.read(); 19. // 1st fragment 20. if (val<60) { 21. digitalWrite(led,LOW); 22. } 23. if (val>60) { 24. digitalWrite(led,HIGH); 25. } 26. } 27. } 28. // 2nd fragment 29. // map(值, 從低, 從高, 到低, 到高) 30. val = map(val, 30, 165, 0, 255); 31. //因為使 用 analogWrite 時,其值得落在 0 ~ 255 之間 32. //analogWrite(led, val); 33. //} 34. //}. 45.

(56) 表 5.4-1 測 試 綁 線 鬆 緊 度 程 式 碼 1. #include <Servo.h> 2. int finger; 3. // create servo object to control a servo 4. // a maximum of eight servo objects can be created 5. Servo myservoThumb; 6. Servo myservoIndex; 7. Servo myservoMiddle; 8. Servo myservoRing; 9. Servo myservoPinky; 10. 11. void setup() 12. { 13. // attaches the servo on pin to the servo object 14. myservo.attach(4); 15. myservo.attach(5); 16. myservo.attach(6); 17. myservo.attach(7); 18. myservo.attach(8); 19. } 20. 21. void loop() 22. { 23. myservo.attach(4);// 將伺服馬達連接到引腳 4 24. myservo.write(5); // 告訴伺服馬達在轉動角度 25. delay(20); 26. myservo.detach(); 27. } 28. { 29. myservo.attach(4); 30. myservo.write(175); 31. delay(20); 32. myservo.detach(); 33. }. 46.

(57) 表 5.7-1 序 列 埠 程 式 碼 Arduino IDE 1. #include <Servo.h> 2. 3. const int thumb = 4; // the pin numbers for the Servos 4. const int index = 5; 5. const int middle = 6; 6. const int ring = 7; 7. const int pinky = 8; 8. int finger; 9. 10. 11. Servo myservoThumb; // create Servo objects to control th e servo motors 12. Servo myservoIndex; 13. Servo myservoMiddle; 14. Servo myservoRing; 15. Servo myservoPinky; 16. 17. void setup() { 18. myservoThumb.attach(thumb); 19. myservoIndex.attach(index); 20. myservoMiddle.attach(middle); 21. myservoRing.attach(ring); 22. myservoPinky.attach(pinky); 23. 24. Serial.begin(9600); 25. delay(500); 26. } 27. 28. void loop() { 29. 30. 31. finger = 0; 32. if (Serial.available() > 0)//check 33. { 34. finger = Serial.read(); //load and Save the variable 35. 47.

(58) 36. switch (finger) { 37. case 84: 38. //ASCII code 84('T')Thumb 39. //Serial.println("Thumb"); 40. myservoThumb.write(5); o motor to rotate the position 41. 42. break; 43. case 116: // close_Thumb 44. //ASCII code 116('t') 45. myservoThumb.write(155); 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71.. break; case 73: //ASCII code 73('I')Index myservoIndex.write(5);. break; case 105: // close_Index //ASCII code 105('i') myservoIndex.write(175); break; case 77: //ASCII code 77('M')Middle myservoMiddle.write(5); break; case 109: // close_Middle //ASCII code 109('m') myservoMiddle.write(155); break; case 82: 48. // Tell the serv.

(59) 72. 73.. //ASCII code 82('R')Ring myservoRing.write(5);. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95.. break; case 114: // close_Ring //ASCII code 114('r') myservoRing.write(155); break; case 80: //ASCII code 80('P')Pinky myservoPinky.write(5);. break; case 112: // close_Pinky //ASCII code 112('p') myservoPinky.write(155); break; } } }. 49.

(60) 表 5.7-2 序 列 埠 程 式 碼 Processing 1. import processing.serial.*; 2. import de.voidplus.leapmotion.*; 3. 4. LeapMotion leap; 5. Serial myPort; 6. //import processing.serial.*; CHECK COMPORT 7. //printArray(Serial.list()); 8. 9. 10. 11. void setup() { 12. size(800,800,P3D); 13. background(255); 14. String arduinoPort = Serial.list()[1]; 15. leap = new LeapMotion(this); 16. println(Serial.list()); 17. myPort = new Serial(this, arduinoPort, 9600); 18. } 19. 20. void draw() { 21. background(255); 22. 23. for (Hand hand : leap.getHands ()) { 24. //Basic 25. PVector handPosition = hand.getPosition(); 26. PVector handStabilized = hand.getStabilizedPosition (); 27. PVector handDirection = hand.getDirection(); 28. PVector handDynamics = hand.getDynamics(); 29. float handRoll = hand.getRoll(); 30. float handPitch = hand.getPitch(); 31. float handYaw = hand.getYaw(); 32. boolean handIsLeft = hand.isLeft(); 33. boolean handIsRight = hand.isRight(); 34. float handGrab = hand.getGrabStrength(); 35. float handPinch = hand.getPinchStrength(); 36. float handTime = hand.getTimeVisible(); 50.

(61) 37.. PVector spherePosition. = hand.getSpherePosition();. 38. 39. 40. 41. 42. 43. 44.. float. = hand.getSphereRadius();. Finger fingerThumb Finger fingerIndex Finger fingerMiddle. = hand.getThumb(); = hand.getIndexFinger(); = hand.getMiddleFinger();. 45. 46. 47. 48. 49.. Finger fingerRing Finger fingerPinky. = hand.getRingFinger(); = hand.getPinkyFinger();. hand.draw();. 50. 51. 52. 53. tion(); 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70.. sphereRadius. for (Finger finger : hand.getOutstretchedFingers()) { // Basic int fingerId = finger.getId(); PVector fingerPosition = finger.getPosition(); PVector fingerStabilized = finger.getStabilizedPosi PVector fingerVelocity = finger.getVelocity(); PVector fingerDirection = finger.getDirection(); float fingerTime = finger.getTimeVisible();. finger.draw(); // println("X:", fingerPosition.x); // println("Y:", fingerPosition.y); // println("Z:", fingerPosition.z);. switch(finger.getType()) { case 0: // 0-4 = Thumb -> Pinky System.out.println("thumb"); myPort.write("T");. 51.

(62) 71. break; 72. case 1: 73. System.out.println("index"); 74. myPort.write("I"); 75. 76. break; 77. case 2: 78. System.out.println("middle"); 79. myPort.write("M"); 80. 81. break; 82. case 3: 83. System.out.println("ring"); 84. myPort.write("R"); 85. 86. break; 87. case 4: 88. System.out.println("pinky"); 89. myPort.write("P"); 90. 91. break; 92. } 93. } 94. } 95. 96. for (Hand hand : leap.getHands ()) { 97. 98. for (Finger finger : hand.getOutstretchedFingersByAn gel(0)) { 99. if(finger.isExtended()==false){ 100. switch(finger.getType()) { 101. 102. case 0: // 0-4 = Thumb -> Pinky 103. System.out.println("t"); 104. myPort.write("t"); 105. break; 106. case 1: 107. System.out.println("i"); 108. myPort.write("i"); 52.

(63) 109. break; 110. case 2: 111. System.out.println("m"); 112. myPort.write("m");; 113. break; 114. case 3: 115. System.out.println("r"); 116. myPort.write("r"); 117. break; 118. case 4: 119. System.out.println("p"); 120. myPort.write("p"); 121. break; 122. //} 123. } 124. } 125. } 126. } 127. }. 53.

(64) 表 5.8-1 MQTT 程 式 碼 Arduino 1. 2. 3. 4. 5. 6. 7.. #include #include #include #include. <SPI.h> <Ethernet.h> <PubSubClient.h> <Servo.h>. Servo myservoThumb; // create Servo objects to control the servo motors 8. Servo myservoIndex; 9. Servo myservoMiddle; 10. Servo myservoRing; 11. Servo myservoPinky; 12. 13. const int thumb = 4; // the pin numbers for the Servos 14. const int index = 5; 15. const int middle = 6; 16. const int ring = 7; 17. const int pinky = 8; 18. int val; 19. 20. byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 }; 21. IPAddress ip(192, 168, 0, 102); // <- change to match your network 22. IPAddress server(140, 127, 185, 71); 23. 24. 25. 26. void callback(char* topic, byte* payload, unsigned int leng th) { 27. val = 0; 28. Serial.print("Message arrived ["); 29. Serial.print(topic); 30. Serial.print("] "); 31. for (int i=0;i<length;i++) { 32. Serial.print((char)payload[i]); 33. } 54.

(65) 34. Serial.println(); 35. val = payload[0]; 36. switch (val) { 37. case 84: 38. //ASCII code 84('T')Thumb 39. //Serial.println("Thumb"); 40. myservoThumb.write(5); o motor to rotate the position 41. 42. break; 43. case 116: // close_Thumb 44. //ASCII code 116('t') 45. myservoThumb.write(175); 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69.. break; case 73: //ASCII code 73('I')Index myservoIndex.write(5);. break; case 105: // close_Index //ASCII code 105('i') myservoIndex.write(175); break; case 77: //ASCII code 77('M')Middle myservoMiddle.write(5); break; case 109: // close_Middle //ASCII code 109('m') myservoMiddle.write(175); break; 55. // Tell the serv.

(66) 70. 71. 72. 73.. case 82: //ASCII code 82('R')Ring myservoRing.write(5);. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106.. break; case 114: // close_Ring //ASCII code 114('r') myservoRing.write(175); break; case 80: //ASCII code 80('P')Pinky myservoPinky.write(5);. break; case 112: // close_Pinky //ASCII code 112('p') myservoPinky.write(175); break; } } EthernetClient ethClient; PubSubClient client(ethClient); void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Attempt to connect if (client.connect("arduinoClient")) { Serial.println("connected"); // Once connected, publish an announcement... client.publish("/lm","hello world"); 56.

(67) 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145.. // ... and resubscribe client.subscribe("/lm"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } }. void setup() { myservoThumb.attach(thumb); myservoIndex.attach(index); myservoMiddle.attach(middle); myservoRing.attach(ring); myservoPinky.attach(pinky); Serial.begin(57600); client.setServer(server, 7783); client.setCallback(callback); Ethernet.begin(mac, ip); // Allow the hardware to sort itself out delay(1500); } void loop() { { if (!client.connected()) { reconnect(); } client.loop(); } } 57.

(68) 表 5.8-2 MQTT 程 式 碼 Processing 1. import mqtt.*; 2. import processing.serial.*; 3. import de.voidplus.leapmotion.*; 4. 5. LeapMotion leap; 6. MQTTClient client; 7. 8. 9. void setup() { 10. size(800,800,P3D); 11. background(255); 12. leap = new LeapMotion(this); 13. client = new MQTTClient(this); 14. client.connect("mqtt://140.127.185.71:7783", "processing" ); 15. client.subscribe("/lm"); 16. // client.unsubscribe("/example"); 17. } 18. 19. void draw() { 20. background(255); 21. 22. for (Hand hand : leap.getHands ()) { 23. //Basic 24. PVector handPosition = hand.getPosition(); 25. PVector handStabilized = hand.getStabilizedPosition (); 26. PVector handDirection = hand.getDirection(); 27. PVector handDynamics = hand.getDynamics(); 28. float handRoll = hand.getRoll(); 29. float handPitch = hand.getPitch(); 30. float handYaw = hand.getYaw(); 31. boolean handIsLeft = hand.isLeft(); 32. boolean handIsRight = hand.isRight(); 33. float handGrab = hand.getGrabStrength(); 34. float handPinch = hand.getPinchStrength(); 35. float handTime = hand.getTimeVisible(); 58.

(69) 36.. PVector spherePosition. = hand.getSpherePosition();. 37. 38. 39. 40. 41. 42. 43.. float. = hand.getSphereRadius();. Finger fingerThumb Finger fingerIndex Finger fingerMiddle. = hand.getThumb(); = hand.getIndexFinger(); = hand.getMiddleFinger();. 44. 45. 46. 47. 48.. Finger fingerRing Finger fingerPinky. = hand.getRingFinger(); = hand.getPinkyFinger();. hand.draw();. 49. 50. 51. 52. tion(); 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69.. sphereRadius. for (Finger finger : hand.getOutstretchedFingers()) { // Basic int fingerId = finger.getId(); PVector fingerPosition = finger.getPosition(); PVector fingerStabilized = finger.getStabilizedPosi PVector fingerVelocity = finger.getVelocity(); PVector fingerDirection = finger.getDirection(); float fingerTime = finger.getTimeVisible();. finger.draw(); // println("X:", fingerPosition.x); // println("Y:", fingerPosition.y); // println("Z:", fingerPosition.z);. switch(finger.getType()) { case 0: // 0-4 = Thumb -> Pinky System.out.println("thumb"); client.publish("/lm","T");. 59.

(70) 70. break; 71. case 1: 72. System.out.println("index"); 73. client.publish("/lm","I"); 74. 75. break; 76. case 2: 77. System.out.println("middle"); 78. client.publish("/lm","M"); 79. 80. break; 81. case 3: 82. System.out.println("ring"); 83. client.publish("/lm","R"); 84. 85. break; 86. case 4: 87. System.out.println("pinky"); 88. client.publish("/lm","P"); 89. 90. break; 91. } 92. } 93. } 94. 95. for (Hand hand : leap.getHands ()) { 96. 97. for (Finger finger : hand.getOutstretchedFingersByAn gel(0)) { 98. if(finger.isExtended()==false){ 99. switch(finger.getType()) { 100. 101. case 0: // 0-4 = Thumb -> Pinky 102. System.out.println("t"); 103. client.publish("/lm","t"); 104. break; 105. case 1: 106. System.out.println("i"); 107. client.publish("/lm","i"); 60.

(71) 108. break; 109. case 2: 110. System.out.println("m"); 111. client.publish("/lm","m");; 112. break; 113. case 3: 114. System.out.println("r"); 115. client.publish("/lm","r"); 116. break; 117. case 4: 118. System.out.println("p"); 119. client.publish("/lm","p"); 120. break; 121. //} 122. } 123. } 124. } 125. } 126. }. 61.

(72) 參考文獻 [1]. 卡雷爾·恰佩克的《羅素姆的萬能機器人》 https://zh.wikipedia.org/wiki/%E5%8D%A1%E9%9B%B7%E5%B0%94%C2%B 7%E6%81%B0%E4%BD%A9%E5%85%8B [2]. 「機械手臂之父」之稱的約瑟夫·恩格伯格 http://www.techbang.com/posts/40158 [3]. 有線性手臂 https://www.stockfeel.com.tw/%E6%A9%9F%E6%A2%B0%E6%89%8B%E8%8 7%82/ [4]. SCARA 手臂 http://baike.baidu.com/item/SCARA [5]. 關節多軸機械手臂 https://zh.wikipedia.org/wiki/%E6%A9%9F%E6%A2%B0%E6%89%8B%E8%87 %82 [6]. 日本山梨大學牧野洋 https://ja.wikipedia.org/wiki/%E7%89%A7%E9%87%8E%E6%B4%8B [7]. 自由度 https://zh.wikibooks.org/zhtw/%E6%9C%BA%E6%A2%B0%E8%AE%BE%E8%AE%A1/%E5%B9%B3% E9%9D%A2%E8%87%AA%E7%94%B1%E5%BA%A6. 62.

(73) [8]. 機械手套 https://kknews.cc/zh-tw/tech/gabo38.html [9]. Robonaut2 人形機器人 http://www.twword.com/wiki/Robonaut-2 [10]. 移動維修系統(Mobile Servicing System,簡稱 MSS) https://zh.wikipedia.org/wiki/%E7%A7%BB%E5%8A%A8%E7%BB%B4%E4% BF%AE%E7%B3%BB%E7%BB%9F [11]. 好奇號(Curiosity) https://zh.wikipedia.org/wiki/%E5%A5%BD%E5%A5%87%E8%99%9F [12]. 加拿大臂 2 https://zh.wikipedia.org/wiki/%E5%8A%A0%E6%8B%BF%E5%A4%A7%E8%8 7%82 [13]. 3D 列印 https://zh.wikipedia.org/wiki/3D%E6%89%93%E5%8D%B0 [14]. 三維掃描器 https://zh.wikipedia.org/wiki/%E4%B8%89%E7%B6%AD%E6%8E%83%E6%8 F%8F%E5%84%80 [15]. 伺服馬達 https://zh.wikipedia.org/wiki/%E4%BC%BA%E6%9C%8D%E9%A6%AC%E9% 81%94 63.

(74) [16]. PWN 訊號 https://zh.wikipedia.org/wiki/%E8%84%88%E8%A1%9D%E5%AF%AC%E5%B A%A6%E8%AA%BF%E8%AE%8A [17]. 伺服機構 https://zh.wikipedia.org/wiki/%E4%BC%BA%E6%9C%8D%E6%A9%9F%E6% A7%8B [18]. 感測器 https://zh.wikipedia.org/wiki/%E4%BC%A0%E6%84%9F%E5%99%A8 [19]. 工業 4.0 https://zh.wikipedia.org/wiki/%E5%B7%A5%E6%A5%AD4.0 [20]. 物聯網 IOT https://zh.wikipedia.org/wiki/%E7%89%A9%E8%81%94%E7%BD%91 [21]. 達文西手術 http://www.chimei.org.tw/davinci/ [22]. Leap Motion https://zh.wikipedia.org/wiki/Leap_Motion [23]. Arduino Mega 2560 https://zh.wikipedia.org/wiki/Arduino. 64.

(75) [24]. MQTT(Message Queuing Telemetry Transport) https://en.wikipedia.org/wiki/MQTT [25]. Arduino Ethernet Shield https://www.arduino.cc/en/Main/ArduinoEthernetShield [26]. R. Kelly, “Robust Asymptotically Stable Visual Servoing of Planar Robots,” IEEE Transactions on Robotics Automation, Vol. 12, No. 5, October 1996. [27]. U. Frese, B. Bauml, S. Haidacher, G. Schreiber, I. Schaefer, M. Hahnle, G. Hirzinger, Off-the-shelf vision for a robotic ball catcher, IEEE International Conference on Intelligent Robots and Systems(2001) 1623-1629. [28]. A. Nakashima, Y. Sugiyama and Y. Hayakawa, Paddle Juggling of One ball by Robot Manipulator with Visual Servo, (2006). [29]. Y. Yamakawa, A. Namiki, M. Ishikawa, M. Shimojo, One-handed knotting of a flexible rope with a high-speed multifingered hand having tactile sensors, (2007) 703-708. [30]. 葉峻弘,“多軸機械手臂運動控制器之發展”,臺灣大學機械工程學系 碩士論文,台北,台灣,2008 年。 [31]. C. Y. Lin, P. C. Jo, C. K. Tseng “Multi-Functional Intelligent Robot DOC2,” IEEE-RAS Desktop Robot,” Journal of the Chinese Institute of Engineers, Vol. 33, pp. 531-539, 2010. [32]. 李欣霖,“藉由 Kinect 遠端控制機械手臂與自走車之研發”,元智大學 通訊工程學系碩士論文,桃園,台灣,2011 年。. 65.

(76) [33]. 鐘瑋,“藉由 Kinect 遠端控制機械手臂與自走車之研發”,中國文化大 學機械工程學系數位機電碩士論文,台北,台灣,2016 年。 [34]. Xbox Kinect https://zh.wikipedia.org/wiki/Kinect [35]. RGB 彩色攝影機 https://zh.wikipedia.org/wiki/%E4%B8%89%E5%8E%9F%E8%89%B2%E5%85 %89%E6%A8%A1%E5%BC%8F [36]. CMOS 攝影機 http://www.hanmin.com.tw/%E8%BB%8D%E6%96%B9%E7%9B%A3%E8%A6 %96%E7%B3%BB%E7%B5%B1%E6%95%B4%E5%90%88%E6%96%B9%E6 %A1%88-2/ [37]. 3D 結構光深度感測器 https://kknews.cc/zh-tw/tech/r94oq34.html [38]. 立體視覺成像原理 http://www.ni.com/white-paper/14103/zht/ [39]. InMoov 機器人 https://en.wikipedia.org/wiki/InMoov [40]. 蓋爾·朗葛文(Gael Langevin) http://inmoov.fr/. 66.

(77) [41]. Myrobotlab http://myrobotlab.org/ [42]. Qos (Quality of Service) https://zh.wikipedia.org/wiki/%E6%9C%8D%E5%8A%A1%E8%B4%A8%E9%8 7%8F [43]. 步進馬達 https://zh.wikipedia.org/wiki/%E6%AD%A5%E9%80%B2%E9%A6%AC%E9% 81%94 [44]. Mac Address https://zh.wikipedia.org/wiki/MAC%E5%9C%B0%E5%9D%80 [45]. Ping https://zh.wikipedia.org/wiki/Ping [46]. MQTT Broker https://blog.gtwang.org/iot/raspberry-pi/raspberry-pi-mosquitto-mqtt-broker-iotintegration/ [47]. Unity 3D https://zh.wikipedia.org/wiki/Unity_(%E6%B8%B8%E6%88%8F%E5%BC%95 %E6%93%8E). 67.

(78)

數據

圖 1.1.1-3 MSS 加拿大臂 2 (Canadarm 2)  (摘錄於 微基百科,機械手臂)      3D 列印(3D printing)[13],又稱加法製造、積層製造模型可使用電腦 輔助軟體包或是三維掃描器[14]生成,「3D 列印」這個詞的原意是指順序地 將材料沉積到粉末層噴墨列印頭的過程。最近此詞的含義已經擴大到廣泛包 括的各種技術,如擠壓和燒結過程。技術標準一般使用「增量製造」這個術 語來表達這個廣泛含義。而本論文所研究的仿生機械手能夠模擬手指動作, 通過控制馬達來控制手指屈伸。全套零件
圖 3.1-1 Arduino Mega-2560  (摘錄於 ElectroSchematics)
圖 3.1-2 Arduino Ethernet Shield  (摘錄於 Arduino.cc)
圖 3.2-1 Leap Motion 內部構造圖  (摘錄於 Csdn 博客)      大致上,Leap 傳感器根據內置的兩個攝影頭從不同角度捕捉的畫面,重 建出手掌在真實世界三維空間的運動訊息,要做到雙眼手勢識別首先需要對 雙眼攝影頭做坐標定位,即是計算空間中左右兩台攝影頭位置的幾何關係。  圖 3.2-2 Leap Motion 運作示意圖  ( 摘 錄 於   w e c h a t 中 文 網 )       Leap Motion 感測器會建立一個直角座標系統,而所謂直角座標系統就
+7

參考文獻

相關文件

 基准制的选用原则是:优先选用基孔制 ;只有在下列条件 下才使用基轴制 :①直接使用有一定公差等级而不再进行机

一、訓練目標:增進在職人員對自動化機械控制的原理、實務技術與相關專業知

一、訓練目標:增進在職人員對自動化機械控制的原理、實務技術與相關專業知

(一) 主計畫:共同集體創作一套事先公開且具創新功

• 請使用手機至play 商店或app store 下載Google

EtherCAT ® 為德國 Beckhoff Automation GmbH 取得許可證之專利技術,亦為註冊商標。. EtherNet/IP™為

�您�� BIOS 設定完成後,請選擇本項目以�認所有設定值存入 CMOS 記憶體內。按下 &lt;Enter&gt; 鍵後�出現一個詢問視窗,選擇 [Ok],�設定值存 Ok],�設定值存 ],�設定值存 入

微算機基本原理與應用 第15章