這篇文章來源于DevicePlus.com英語網(wǎng)站的翻譯稿。點擊此處閱讀本文的第1部分>
在智能機器人手臂–第1部分:機械結(jié)構(gòu)和接線中,我們已經(jīng)將機械手臂的本體組裝在一起。機械手臂搭載了一個網(wǎng)絡(luò)攝像頭和一個麥克風(fēng),以進(jìn)行人臉和物體識別以及語音識別。這款在短短15小時內(nèi)開發(fā)出來的機器人手臂在MakeMIT硬件馬拉松項目中排名前10。
該機器人手臂的主要功能是結(jié)合語音命令檢測彩色物體(例如紅球或藍(lán)球)、拾取物體、進(jìn)行人臉識別,并將物體移交給指定的人物/用戶。為了成功實現(xiàn)這些功能,我們集成了多個平臺,比如OpenCV、Microsoft Cognitive Services Speech、Speaker Recognition API以及Open Weather API。
硬件
根據(jù)第1部分:
Arduino Uno
麥克風(fēng)
網(wǎng)絡(luò)攝像頭
軟件
Arduino IDE
Visual Studio
JARVIS [https://github.com/isacandrei/Jarvis-Rocket]
第1步:制作App
我們已經(jīng)設(shè)法打造了一個能夠處理語音命令的機器人手臂。人們說出要求后,該手臂會找到目標(biāo)物體并將其交給指定人物(機器人可以區(qū)分不同的人)。此外,它還可以播放在線音樂或告訴您當(dāng)前的天氣情況。
該應(yīng)用程序的軟件部分用Visual Studio 2015完成。Visual Studio簡單易用,并且提供了很多功能。其中一個功能就是Emgu CV——一個用于調(diào)用OpenCv函數(shù)的包裹函數(shù)庫。此功能通過Visual Studio Windows Forms實現(xiàn),在處理圖像時非常重要。
如果想啟動項目,您只需在電腦上安裝Emgu CV即可。具體步驟如下:
1. 下載EmguCV
您可以點擊本頁 “構(gòu)建示例”下方的超鏈接下載Emgu CV工程:
圖1: 如何下載EmguCV
2. 添加文件
由于您需要使用添加庫,因此應(yīng)將它們包含在Visual Studio中。OpenCV基于C/C++語言開發(fā),如果您想在C#中使用,那么需要添加DLL(動態(tài)鏈接庫)文件——處理視頻時必須包含DLL文件。參考文件位于Visual Studio菜單的Solution Explorer處.
圖2: 參考文件位置
如果您想添加更多文件,請點擊References -> Add references,然后從下載的文件中選擇以下內(nèi)容:
圖3: 參考管理器(Reference Manager)
更多信息可以參考以下鏈接:https://www.emgu.com/wiki/index.php/Setting_up_EMGU_C_Sharp
3. 示例
在下載的庫中,您可以找到更多使用視頻處理(運動檢測、人臉檢測和攝像頭捕捉)的程序代碼示例.
圖4: OpenCV應(yīng)用示例
4. Arduino程序
Arduino代碼具有4個命令:up/down負(fù)責(zé)控制伺服電機;reset是指在出現(xiàn)問題時重置機器人手臂位置;某個部件沒有動作時則使用do nothing。程序具有四個自由度:
circle – 手臂可以旋轉(zhuǎn);
base – 調(diào)整網(wǎng)絡(luò)攝像頭的傾斜度;
elbow– 旨在獲取手臂的最佳位置;
wrist – 調(diào)整抓握力.
每個伺服電機都有一個給定命令,并且使用不同引腳進(jìn)行控制:Elbow使用引腳7;Base使用引腳8;Circle使用引腳9;Wrist使用引腳10。對于伺服電機控制,C#應(yīng)用程序通過串行傳輸發(fā)送4個字母,每個狀態(tài)對應(yīng)于一個具體的電機控制指令:
if(cmd == ‘A’) state = 1; → control(1, posCircle);
if(cmd == ‘B’) state = 2; →control(2, posBase);
if(cmd == ‘C’) state = 3; → control(3, posElbow);
if(cmd == ‘D’) state = 4; →control(4, posGH);
根據(jù)伺服電機的運動角度,代碼分為控制和命令指令。
在Case 1中,Circle(旋轉(zhuǎn))運動的命令為left/right(左/右)。
Case 1:
switch (cmd) { case '0': Left(); Break; case '1': //do nothing break; case '2': Right(); break; case '3': posCircle = 0; break; } state = 0; break;
在Case 2和Case 3中,我們考慮基座和肘部的伺服電機,這意味著他們可以上/下(up/down)引導(dǎo)手臂;遇到錯誤時,機器人手臂會把自己設(shè)置為posBase = 50;或posElbow = 50;
Case 2:
switch (cmd) { case '0': downBase(); break; case '1': //do nothing break; case '2': upBase(); break; case '3': posBase = 50; break; } state = 0; break;
Case 3:
switch (cmd) { case '0': downElbow(); break; case '1': //do nothing break; case '2': upElbow(); break; case '3': posElbow = 50; break; case '4': posElbow = 10; break; } state = 0; break;
在Case 4中,我們需要控制爪鉗,這個非常簡單——將其初始位置設(shè)置為posGH = 50;
請將以下代碼添加到Arduino UNO中,以進(jìn)行機器人手臂控制:
// States for the RoboticArm: //0 Down on the left //1 Pause //2 Top on the right //3 Reset #include Servo Circle; //1 Servo Base; //2 Servo Elbow; //3 Servo Wrist; //4 int posCircle = 0; int posBase = 50; int posElbow = 50; int posGH = 50; int state = 0; void setup() { Serial.begin(9600); Elbow.attach(7); Base.attach(8); Circle.attach(9); Wrist.attach(10); delay(1000); control(1, posCircle); control(2, posBase); control(3, posElbow); control(4, posGH); } void loop() { if(Serial.available() > 0) { char cmd = Serial.read(); switch (state) { case 0: if(cmd == 'A') state = 1; if(cmd == 'B') state = 2; if(cmd == 'C') state = 3; if(cmd == 'D') state = 4; break; case 1: switch (cmd) { case '0': Left(); break; case '1': //do nothing break; case '2': Right(); break; case '3': posCircle = 0; break; } state = 0; break; case 2: switch (cmd) { case '0': downBase(); break; case '1': //do nothing break; case '2': upBase(); break; case '3': posBase = 50; break; } state = 0; break; case 3: switch (cmd) { case '0': downElbow(); break; case '1': //do nothing break; case '2': upElbow(); break; case '3': posElbow = 50; break; case '4': posElbow = 10; break; } state = 0; break; case 4: switch (cmd) { case '0': break; case '1': break; case '2': break; case '3': posGH = 50; break; } state = 0; break; } } } void control(int motor, int angle) { switch (motor) { case 1: if(angle >= 0) if(angle <= 140) Circle.write(angle + 10); break; case 2: if(angle >= 0) if(angle <= 60) Base.write(140 - angle); break; case 3: if(angle >= 0) if(angle <= 70) Elbow.write(80 - angle); break; case 4: if(angle >= 0) if(angle <= 65) Wrist.write(75 - angle); break; } } void Left() { if(posCircle <= 136) { posCircle = posCircle + 4; } else posCircle = 140; control(1, posCircle); } void Right() { if(posCircle >= 4) { posCircle = posCircle - 4; } else posCircle = 0; control(1, posCircle); } /////////////////////////////////// void downElbow() { if(posElbow >= 4) { posElbow = posElbow - 4; } else posElbow = 0; control(3, posElbow); } void upElbow() { if(posElbow <= 66) { posElbow = posElbow + 4; } else posElbow = 70; control(3, posElbow); } ////////////////////////////////////// void downBase() { if(posBase >= 4) { posBase = posBase - 4; } else posBase = 0; control(2, posBase); } void upBase() { if(posBase <= 56) { posBase = posBase + 4; } else posBase = 60; control(2, posBase); }
第2步:如何制作演示App
為了制作一個類似的應(yīng)用程序,我們需要知道如何使用C#編寫應(yīng)用程序。由于Windows Forms App很簡單,并且擁有在線文檔,需要時可以隨時獲取,因此我們采用了該App。對于這個項目,我們需要Visual Studio和.NET framework(您可以在這里下載這兩個程序)。下載并安裝文件后,我們就可以開始制作應(yīng)用程序。
首先,我們需要創(chuàng)建一個新工程。創(chuàng)建新工程的步驟如下:點擊File→New→Project和Windows Forms App(.NET Framework)。
圖5: 如何在Visual Studio中制作App
此時系統(tǒng)會顯示一個帶有窗體的窗口——這是應(yīng)用程序自動生成的格式。右側(cè)(Properties)是表格屬性,您可以根據(jù)自己的偏好進(jìn)行調(diào)整。左側(cè)(Toolbox)提供應(yīng)用程序使用的功能,比如按鈕、復(fù)選框、串口等。
圖6: Visual Studio中的App屬性
對于測試演示,我們可以制作這樣一個應(yīng)用程序:點擊按鈕,系統(tǒng)顯示一條文本信息。
雙擊Toolbox(工具箱)中的按鈕,程序會在左上角自動添加一個按鈕。該按鈕會被命名為“button1”,因為.NET Framework會對按鈕類實例進(jìn)行自動編號。在button1屬性中,我們可以將Text從button1改為Click here!現(xiàn)在,我們需要編寫代碼,以便讓按鈕起作用(雙擊圖形界面上的按鈕):
namespace WindowsFormsApp3 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { MessageBox.Show("App made for DevicePlus"); } } }
當(dāng)用戶點擊該按鈕時,上述代碼會顯示一個文本。具體結(jié)果如圖7所示。
圖7: 演示App
第3步:App屬性
憑借.NET、OpenCV和Microsoft API的功能,我們能夠制作出完整的應(yīng)用程序。對于該應(yīng)用程序,我們需要按鈕、串口和文本框。
黑色窗口會顯示來自攝像頭的圖像,窗口中還會添加一個鏡頭框,框內(nèi)顯示人物名稱。
左側(cè)的白色窗口可以添加TTS API(文本轉(zhuǎn)語音)的文本,提供反饋以檢查工作,并檢查說出的話語是否與顯示的字詞相符。
圖8: 機器人手臂應(yīng)用程序
第4步:人臉識別
為了獲得更好的程序結(jié)果,您需要在訓(xùn)練模式下添加多個臉部記錄。訓(xùn)練是指通過拍攝多個臉部位置以獲得最佳識別(不同拍攝角度、光線條件等)。您需要按下Record 10 Faces按鈕,通過應(yīng)用程序記錄臉部畫面。
在代碼中,實現(xiàn)這個功能的語句為Face = Parent.faceClassifier;這通過EmguCV平臺完成。人臉檢測通過基于主成分分析(PCA)的復(fù)雜算法實現(xiàn),系統(tǒng)會將檢測到的臉部與訓(xùn)練后存儲的圖像進(jìn)行多次比較。
圖9: 人臉檢測
藍(lán)色矩形中的圖像是需要存儲的圖像,因為它包含面部的獨特特征。
我們需要在不同的位置和不同的光線下獲取更多的面部特征:
圖10: 添加更多人臉進(jìn)行訓(xùn)練
經(jīng)過一系列面部檢測拍攝,如果您認(rèn)為之前記錄的臉部圖像不利于算法計算,那么可以點擊Restart 1 Face按鈕刪除已經(jīng)保存的文件,系統(tǒng)將不再檢測該臉部信息。
如果要記錄多個人、讓機器人手臂可以區(qū)分許多個人,那么可以使用Delete Data按鈕刪除照片。
圖11:重啟訓(xùn)練模式
錄制更多圖像后,該算法應(yīng)該能夠檢測人臉,并在藍(lán)框上方顯示名稱。機器人可以精確檢測像眼鏡這樣的特征,因為這些特征屬于區(qū)別性特征.
圖12: 訓(xùn)練之后的結(jié)果
第5步:天氣API
通過天氣API,我們可以根據(jù)以下方式收集城市數(shù)據(jù):城市名稱、城市ID、地理坐標(biāo)甚至郵政編碼。該API的優(yōu)點是免費且易于使用。但是該API有一個限制:使用次數(shù)或者流量不能超過60次/分鐘或50k/天,如果違反該規(guī)定,您的帳戶將被封鎖。
在本教程中,我們選擇根據(jù)城市ID調(diào)用API。每個城市都有一個ID,詳細(xì)信息請參見https://bulk.openweathermap.org/sample/city.list.json.gz。擴展名.json用于在瀏覽器和服務(wù)器之間進(jìn)行交換數(shù)據(jù)。只有當(dāng)數(shù)據(jù)是文本格式時才能實現(xiàn)通信。
我們已經(jīng)將數(shù)據(jù)用作WebClient類——這使得文件下載更加輕松。在我們的例子中,構(gòu)造函數(shù)WebClient用于初始化一個新的實例:
WebClient client = new WebClient();
我們需要將數(shù)據(jù)編碼為UTF8格式,這意味著系統(tǒng)用8位塊來表示字符,具體指令如下:client.Encoding = System.Text.Encoding.UTF8
如果互聯(lián)網(wǎng)連接出現(xiàn)問題,無法建立連接時,程序會自動顯示消息“Internet Connection failed–throw new WeatherDataServiceException”。通過throw我們可以創(chuàng)建一個異常。
在C#中,我們可以使用try和catch來解決部分代碼無法成功的情況。
結(jié)合文本轉(zhuǎn)語音API,如果用戶詢問天氣情況,系統(tǒng)會發(fā)出以下聲音:“The weather in Boston is(波士頓的天氣是)…”。
第6步:語音合成
當(dāng)您使用文本轉(zhuǎn)語音API時,您需要一個可以快速處理的文件——這就是我們需要使用服務(wù)器的原因。對于BING API,我們需要授權(quán)令牌,具體信息請參閱https://api.cognitive.microsoft.com/sts/v1.0/issueToken。
該API的有效期為10分鐘。這是一個非常棒的計時器,可以計數(shù)到9,同時每9分鐘更新一次連接。
如下圖所示,您可以看到語音合成的最終結(jié)果是“Testing the app for Device Plus”。
圖13: 測試API
總體來說,這是一個有趣的項目。該項目讓我懂得硬件和軟件之間的良好同步對于實現(xiàn)最佳性能至關(guān)重要。使用Visual Studio的很多庫使項目有點復(fù)雜,但最終結(jié)果令人滿意。
我認(rèn)為這種項目可以通過多種方式進(jìn)行開發(fā)和改進(jìn),以滿足每個用戶的需求。
Tiberia Todeila
Tiberia目前是布加勒斯特理工大學(xué)電氣工程學(xué)院的大四學(xué)生。她非常熱衷于智能家居設(shè)備的設(shè)計和開發(fā),旨在讓我們的日常生活更加輕松。
審核編輯黃宇
-
編程
+關(guān)注
關(guān)注
88文章
3640瀏覽量
94034 -
智能機器人
+關(guān)注
關(guān)注
17文章
872瀏覽量
82578
發(fā)布評論請先 登錄
相關(guān)推薦
機器人手臂5種不同的運動組合
![<b class='flag-5'>機器人手臂</b>5種不同的運動組合](https://file.elecfans.com/web1/M00/4F/3E/o4YBAFrWpW6AQSpIAAAUUklN1O0362.jpg)
怎樣使用Android手機的藍(lán)牙控制機器人手臂
在未來機器人手臂將可以替代人類的雙手
Hibot機器人手臂Float Arm可用于哪些應(yīng)用環(huán)境
中國科大展示軟體機器人手臂在日常生活中的巨大應(yīng)用潛力
機器人手臂使用哪種型號的泰和承比較合適
構(gòu)建可幫助人們做早餐的桌面智能機器人手臂
![構(gòu)建可幫助人們做早餐的桌面<b class='flag-5'>智能</b><b class='flag-5'>機器人手臂</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Arduino機器人手臂
利用Parallax激光傳感器制作Arduino激光機器人—第2部分
![利用Parallax激光傳感器制作Arduino激光<b class='flag-5'>機器人</b>—<b class='flag-5'>第</b><b class='flag-5'>2</b><b class='flag-5'>部分</b>](https://file.elecfans.com/web2/M00/92/7A/poYBAGPzFVmAItwMAAD9MWz5I-Y485.jpg)
用于Arduino Due的DIY Braccio機器人手臂護(hù)罩
![用于Arduino Due的DIY Braccio<b class='flag-5'>機器人手臂</b>護(hù)罩](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論