色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

智能機器人手臂–第2部分:編程

張霞 ? 來源:DevicePlus ? 作者:DevicePlus ? 2023-02-24 14:30 ? 次閱讀

這篇文章來源于DevicePlus.com英語網站的翻譯稿。點擊此處閱讀本文的第1部分>

poYBAGPzGIOAMw0hAAOrhHk78es321.jpg

智能機器人手臂–第1部分:機械結構和接線中,我們已經將機械手臂的本體組裝在一起。機械手臂搭載了一個網絡攝像頭和一個麥克風,以進行人臉和物體識別以及語音識別。這款在短短15小時內開發出來的機器人手臂在MakeMIT硬件馬拉松項目中排名前10。

該機器人手臂的主要功能是結合語音命令檢測彩色物體(例如紅球或藍球)、拾取物體、進行人臉識別,并將物體移交給指定的人物/用戶。為了成功實現這些功能,我們集成了多個平臺,比如OpenCV、Microsoft Cognitive Services Speech、Speaker Recognition API以及Open Weather API。

硬件

根據第1部分:

Arduino Uno

麥克風

網絡攝像頭

伺服電機

軟件

Arduino IDE

Visual Studio

JARVIS [https://github.com/isacandrei/Jarvis-Rocket]

第1步:制作App

我們已經設法打造了一個能夠處理語音命令的機器人手臂。人們說出要求后,該手臂會找到目標物體并將其交給指定人物(機器人可以區分不同的人)。此外,它還可以播放在線音樂或告訴您當前的天氣情況。

該應用程序的軟件部分用Visual Studio 2015完成。Visual Studio簡單易用,并且提供了很多功能。其中一個功能就是Emgu CV——一個用于調用OpenCv函數的包裹函數庫。此功能通過Visual Studio Windows Forms實現,在處理圖像時非常重要。

如果想啟動項目,您只需在電腦上安裝Emgu CV即可。具體步驟如下:

1. 下載EmguCV
您可以點擊本頁 “構建示例”下方的超鏈接下載Emgu CV工程:

pYYBAGPzGIWAMKvtAADX7Y1ztLY889.jpg

圖1: 如何下載EmguCV

2. 添加文件
由于您需要使用添加庫,因此應將它們包含在Visual Studio中。OpenCV基于C/C++語言開發,如果您想在C#中使用,那么需要添加DLL(動態鏈接庫)文件——處理視頻時必須包含DLL文件。參考文件位于Visual Studio菜單的Solution Explorer處.

poYBAGPzGIeACqPDAAGrLaVr2EM360.jpg

圖2: 參考文件位置

如果您想添加更多文件,請點擊References -> Add references,然后從下載的文件中選擇以下內容:

pYYBAGPzGImAahSYAAKbDP_IQPo229.jpg

圖3: 參考管理器(Reference Manager)

更多信息可以參考以下鏈接:https://www.emgu.com/wiki/index.php/Setting_up_EMGU_C_Sharp

3. 示例

在下載的庫中,您可以找到更多使用視頻處理(運動檢測、人臉檢測和攝像頭捕捉)的程序代碼示例.

poYBAGPzGIuAHAavAAHXUrykcCE732.jpg

圖4: OpenCV應用示例

4. Arduino程序

Arduino代碼具有4個命令:up/down負責控制伺服電機;reset是指在出現問題時重置機器人手臂位置;某個部件沒有動作時則使用do nothing。程序具有四個自由度:

circle – 手臂可以旋轉;

base – 調整網絡攝像頭的傾斜度;

elbow– 旨在獲取手臂的最佳位置;

wrist – 調整抓握力.

每個伺服電機都有一個給定命令,并且使用不同引腳進行控制:Elbow使用引腳7;Base使用引腳8;Circle使用引腳9;Wrist使用引腳10。對于伺服電機控制,C#應用程序通過串行傳輸發送4個字母,每個狀態對應于一個具體的電機控制指令:

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);

根據伺服電機的運動角度,代碼分為控制和命令指令。

Case 1中,Circle(旋轉)運動的命令為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)引導手臂;遇到錯誤時,機器人手臂會把自己設置為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中,我們需要控制爪鉗,這個非常簡單——將其初始位置設置為posGH = 50;

請將以下代碼添加到Arduino UNO中,以進行機器人手臂控制:

// 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

為了制作一個類似的應用程序,我們需要知道如何使用C#編寫應用程序。由于Windows Forms App很簡單,并且擁有在線文檔,需要時可以隨時獲取,因此我們采用了該App。對于這個項目,我們需要Visual Studio和.NET framework(您可以在這里下載這兩個程序)。下載并安裝文件后,我們就可以開始制作應用程序。

首先,我們需要創建一個新工程。創建新工程的步驟如下:點擊FileNewProjectWindows Forms App(.NET Framework)。

poYBAGPzGI-AGm4eAAJ3rqKE-AU880.jpg

圖5: 如何在Visual Studio中制作App

此時系統會顯示一個帶有窗體的窗口——這是應用程序自動生成的格式。右側(Properties)是表格屬性,您可以根據自己的偏好進行調整。左側(Toolbox)提供應用程序使用的功能,比如按鈕、復選框、串口等。

pYYBAGPzGJGAf5qNAAG5D9FAxXE351.jpg

圖6: Visual Studio中的App屬性

對于測試演示,我們可以制作這樣一個應用程序:點擊按鈕,系統顯示一條文本信息。

雙擊Toolbox(工具箱)中的按鈕,程序會在左上角自動添加一個按鈕。該按鈕會被命名為“button1”,因為.NET Framework會對按鈕類實例進行自動編號。在button1屬性中,我們可以將Text從button1改為Click here!現在,我們需要編寫代碼,以便讓按鈕起作用(雙擊圖形界面上的按鈕):

namespace WindowsFormsApp3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("App made for DevicePlus");
        }
    }
}

當用戶點擊該按鈕時,上述代碼會顯示一個文本。具體結果如圖7所示。

poYBAGPzGJOAAT7zAAHHb9DJOC8121.jpg

圖7: 演示App

第3步:App屬性

憑借.NET、OpenCV和Microsoft API的功能,我們能夠制作出完整的應用程序。對于該應用程序,我們需要按鈕、串口和文本框。

黑色窗口會顯示來自攝像頭的圖像,窗口中還會添加一個鏡頭框,框內顯示人物名稱。

左側的白色窗口可以添加TTS API(文本轉語音)的文本,提供反饋以檢查工作,并檢查說出的話語是否與顯示的字詞相符。

pYYBAGPzGJSALETeAADVya0e_9w762.jpg

圖8: 機器人手臂應用程序

第4步:人臉識別

為了獲得更好的程序結果,您需要在訓練模式下添加多個臉部記錄。訓練是指通過拍攝多個臉部位置以獲得最佳識別(不同拍攝角度、光線條件等)。您需要按下Record 10 Faces按鈕,通過應用程序記錄臉部畫面。

在代碼中,實現這個功能的語句為Face = Parent.faceClassifier;這通過EmguCV平臺完成。人臉檢測通過基于主成分分析(PCA)的復雜算法實現,系統會將檢測到的臉部與訓練后存儲的圖像進行多次比較。

pYYBAGPzGJaAS684AAIyg1gDxuQ495.jpg

圖9: 人臉檢測

藍色矩形中的圖像是需要存儲的圖像,因為它包含面部的獨特特征。

我們需要在不同的位置和不同的光線下獲取更多的面部特征:

poYBAGPzGJiAHoh_AAKqlp74jh8767.jpg

圖10: 添加更多人臉進行訓練

經過一系列面部檢測拍攝,如果您認為之前記錄的臉部圖像不利于算法計算,那么可以點擊Restart 1 Face按鈕刪除已經保存的文件,系統將不再檢測該臉部信息。

如果要記錄多個人、讓機器人手臂可以區分許多個人,那么可以使用Delete Data按鈕刪除照片。

pYYBAGPzGJuAIMOBAAHaBH0M8FY129.jpg

圖11:重啟訓練模式

錄制更多圖像后,該算法應該能夠檢測人臉,并在藍框上方顯示名稱。機器人可以精確檢測像眼鏡這樣的特征,因為這些特征屬于區別性特征.

poYBAGPzGJ2AE3npAAG99720y8M314.jpg

圖12: 訓練之后的結果

第5步:天氣API

通過天氣API,我們可以根據以下方式收集城市數據:城市名稱、城市ID、地理坐標甚至郵政編碼。該API的優點是免費且易于使用。但是該API有一個限制:使用次數或者流量不能超過60次/分鐘或50k/天,如果違反該規定,您的帳戶將被封鎖。

在本教程中,我們選擇根據城市ID調用API。每個城市都有一個ID,詳細信息請參見https://bulk.openweathermap.org/sample/city.list.json.gz。擴展名.json用于在瀏覽器和服務器之間進行交換數據。只有當數據是文本格式時才能實現通信

我們已經將數據用作WebClient類——這使得文件下載更加輕松。在我們的例子中,構造函數WebClient用于初始化一個新的實例:

WebClient client = new WebClient();

我們需要將數據編碼為UTF8格式,這意味著系統用8位塊來表示字符,具體指令如下:client.Encoding = System.Text.Encoding.UTF8

如果互聯網連接出現問題,無法建立連接時,程序會自動顯示消息“Internet Connection failedthrow new WeatherDataServiceException”。通過throw我們可以創建一個異常。

在C#中,我們可以使用trycatch來解決部分代碼無法成功的情況。

結合文本轉語音API,如果用戶詢問天氣情況,系統會發出以下聲音:“The weather in Boston is(波士頓的天氣是)…”。

第6步:語音合成

當您使用文本轉語音API時,您需要一個可以快速處理的文件——這就是我們需要使用服務器的原因。對于BING API,我們需要授權令牌,具體信息請參閱https://api.cognitive.microsoft.com/sts/v1.0/issueToken

該API的有效期為10分鐘。這是一個非常棒的計時器,可以計數到9,同時每9分鐘更新一次連接。

如下圖所示,您可以看到語音合成的最終結果是“Testing the app for Device Plus”。

pYYBAGPzGKKAD5RLAAIjRe6d1uA463.jpg

圖13: 測試API

總體來說,這是一個有趣的項目。該項目讓我懂得硬件和軟件之間的良好同步對于實現最佳性能至關重要。使用Visual Studio的很多庫使項目有點復雜,但最終結果令人滿意。

我認為這種項目可以通過多種方式進行開發和改進,以滿足每個用戶的需求。

pYYBAGPzDmSAfn_UAAAF-_P5AGo881.jpg

Tiberia Todeila

Tiberia目前是布加勒斯特理工大學電氣工程學院的大四學生。她非常熱衷于智能家居設備的設計和開發,旨在讓我們的日常生活更加輕松。

審核編輯黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編程
    +關注

    關注

    88

    文章

    3637

    瀏覽量

    93912
  • 智能機器人
    +關注

    關注

    17

    文章

    872

    瀏覽量

    82468
收藏 人收藏

    評論

    相關推薦

    機器人手臂5種不同的運動組合

    一般機器人手臂有3個自由度,即手臂的伸縮、左右回轉和升降 (或俯仰)運動。手臂回轉和升降運動是通過機座的立柱實現的,立柱的橫向移動即為手臂的橫移。
    的頭像 發表于 04-18 09:48 ?1.8w次閱讀
    <b class='flag-5'>機器人手臂</b>5種不同的運動組合

    關于藍牙控制Atmel制造的機器人手臂的介紹

    藍牙控制并且指導機器人手臂動作
    的頭像 發表于 07-09 03:22 ?3516次閱讀

    機器人手臂的典型機構有哪些

    機器人手臂的伸縮、橫向移動均屬于直線運動。
    發表于 07-08 11:42 ?6.9w次閱讀
    <b class='flag-5'>機器人手臂</b>的典型機構有哪些

    怎樣使用Android手機的藍牙控制機器人手臂

    在這個項目中,我將向您展示如何構建Arduino&amp; amp;使用Android手機的藍牙控制機器人手臂。該機器人手臂可以在手動模式下操作,也可以在全自動模式下進行編程
    的頭像 發表于 07-29 09:11 ?8567次閱讀

    在未來機器人手臂將可以替代人類的雙手

    隨著5G技術的普及,即將迎來AI人工智能時代,很多場景將是無人自動化的控制生產運作,這樣我們需要更多的機器人手臂機器人手臂可以將執行工作的手臂與思考工作的頭腦分離。
    發表于 09-17 09:41 ?2039次閱讀

    Hibot機器人手臂Float Arm可用于哪些應用環境

    能代替“臟亂、危險、嚴重”的工作的機器人手臂“Float Arm”
    的頭像 發表于 04-20 16:06 ?5520次閱讀

    中國科大展示軟體機器人手臂在日常生活中的巨大應用潛力

    軟體機器人手臂由于具有本質柔順性和連續變形特性,在智能制造、醫療康復,家庭服務等領域有巨大的研究價值和廣泛的應用前景。最新一期的機器人頂刊《The International Journal
    的頭像 發表于 04-13 11:49 ?3208次閱讀

    機器人手臂使用哪種型號的泰和承比較合適

    機器人手臂的伸縮、橫向移動均屬于直線運動。實現手臂往復直線運動的機構形式比較多,常用的有活塞油(氣)缸、齒輪齒條機構、絲杠螺母機構以及連桿機構等。由于活塞油(氣)缸的體積小、重量輕,因而在機器人
    發表于 03-17 17:16 ?637次閱讀

    構建可幫助人們做早餐的桌面智能機器人手臂

    電子發燒友網站提供《構建可幫助人們做早餐的桌面智能機器人手臂.zip》資料免費下載
    發表于 12-28 10:36 ?3次下載
    構建可幫助人們做早餐的桌面<b class='flag-5'>智能</b><b class='flag-5'>機器人手臂</b>

    Arduino機器人手臂

    方案介紹MARK 1是可編程的Arduino機器人手臂。但是,還不止這些,該機械臂可以由手勢控制。硬件部件:Arduino UNO?? ?×?? ?1個?? ?伺服馬達MG996R×?? ?6?? ?5V電池組×?? ?1個?? ?PCA9685具有I
    發表于 12-30 14:42 ?3次下載

    利用Parallax激光傳感器制作Arduino激光機器人2部分

    2部分中,我們將添加機器人工作所需的其他系統部件,比如伺服器和激光測距儀(LRF),并編寫一個程序,讓機器人能夠自主移動。
    的頭像 發表于 02-24 09:43 ?1097次閱讀
    利用Parallax激光傳感器制作Arduino激光<b class='flag-5'>機器人</b>—<b class='flag-5'>第</b><b class='flag-5'>2</b><b class='flag-5'>部分</b>

    最酷的Kickstarter機器人 2部分 – 以往成果

    本文是最酷Kickstarter資助的機器人項目系列文章的2部分
    的頭像 發表于 02-28 15:20 ?975次閱讀
    最酷的Kickstarter<b class='flag-5'>機器人</b> <b class='flag-5'>第</b><b class='flag-5'>2</b><b class='flag-5'>部分</b> – 以往成果

    用于Arduino Due的DIY Braccio機器人手臂護罩

    電子發燒友網站提供《用于Arduino Due的DIY Braccio機器人手臂護罩.zip》資料免費下載
    發表于 06-14 15:07 ?0次下載
    用于Arduino Due的DIY Braccio<b class='flag-5'>機器人手臂</b>護罩

    如何創建FPGA控制的機器人手臂

    機器人技術處于工業 4.0、人工智能和邊緣革命的前沿。讓我們看看如何創建 FPGA 控制的機器人手臂
    的頭像 發表于 10-24 17:15 ?1170次閱讀
    如何創建FPGA控制的<b class='flag-5'>機器人手臂</b>

    如何創建FPGA控制的機器人手臂

    機器人技術處于工業 4.0、人工智能和邊緣革命的前沿。讓我們看看如何創建 FPGA 控制的機器人手臂
    的頭像 發表于 10-24 17:26 ?1369次閱讀
    如何創建FPGA控制的<b class='flag-5'>機器人手臂</b>?
    主站蜘蛛池模板: 精品国产乱码久久久久久夜深人妻 | 精品亚洲永久免费精品 | 色欲AV亚洲永久无码精品麻豆 | 国产在线精品亚洲视频在线 | 中文字幕人妻无码系列第三区 | 国产在线高清亚洲精品一区 | 天堂Av亚洲欧美日韩国产综合 | 99精品国产电影 | 伊人大香人妻在线播放 | 国产精品99re6热在线播放 | 精品亚洲国产熟女福利自在线 | 成人天堂资源WWW在线 | 十八禁肉动漫无修在线播放 | 色欲国产麻豆一精品一AV一免费 | 99香蕉视频 | 日日噜噜夜夜躁躁狠狠 | 国产精品久久久久久精品... | 日本高清免费一本视频在线观看 | 恋夜影院支持安卓视频美女 | 韩剧甜性涩爱 | 欧美精品做人一级爱免费 | 热巴两次用约老师屁股发底线球 | 欧美精品色婷婷五月综合 | 女子扒开腿让男生桶爽 | 偷拍自怕亚洲在线第7页 | 噜噜噜在线AV免费观看看 | 久久免费看视频 | 亚洲熟女丰满多毛XXXXX | av网站视频在线观看 | 熟妇内谢69XXXXXA片 | 飘雪在线观看免费高清完整版韩国 | 国产亚洲精品99一区二区 | 国产69精品久久久久人妻刘玥 | 色偷偷亚洲男人天堂 | 日本高清免费在线 | 暖暖免费 高清 日本社区中文 | 色婷婷亚洲精品天天综合影院 | 老少配xxxxx欧美 | 在线视频一区二区三区在线播放 | 床伴在线观看免费高清完整泰剧第四集 | 久久婷婷久久一区二区三区 |