我的网站

DIY:智能机器人手臂教程

2021-11-25 15:58分类:济大医美 阅读:

转自:rohm,作者:Tiberia Todeilahttps://techclass.rohm.com.cn/knowledge/deviceplus/how-tos/arduino/smart-robotic-arm-part-2-programming这篇文章来源于DevicePlus.com英语网站的翻译稿。

图片

您有异国想过拥有一款能够帮您已足平时需求的设备?而且该设备能够区分您(主人)和其他非授权用户,这并非浅易的清淡工具。在本教程中,吾们将向您介绍一款能够识别并理解您语音命令的智能机器人手臂。此机器手臂议定OpenCV柔件实现了人脸识别编制。(为了测试现在标,吾们开发了算法来检测小球颜色。)

行为MakeMIT硬件马拉松项现在标一局部,吾与同事Isac Andrei和VladNiculescu相符作研发了该智能机器人手臂。由于其创新水祥和创造性,该项现在在硬件马拉松中排名前10。

硬件

Arduino UNO

麦克风

网络摄像头

伺服电机

 柔件

Arduino IDE

GitHub (https://github.com/DevicePlus/SmartRoboticArm)

 工具

胶枪

丙烯酸树脂

螺丝

胶带

电锯

第一步:组织与力学

处理机器手臂的手段时,必须专门仔细。倘若不考虑伺服电机角度就最先拼装手段部件,那么能够会导致手臂发生故障——机器人手臂能够发生您无法控制的隐约走为。在步骤1中,您必要做的就是将5台伺服电机连接到Arduino开发板上,并找到每个伺服机构的精确位置。精确的挨次是自下而上进走校准。

I.底座

底座设计为可向左移动90度,也可向右移动90度。将它安放在金属升降机上进而使基座能够旋转。这是一个关键局部,由于当发出语音命令的人移动时,手臂必须陪同并追踪人物。而且这栽陪同必须实在,以便摄像头总能发现人脸。

图片

图1:底座顶视图

底座随动编制装配在一个40 x 30厘米的大亚克力板上,以保持安详。您也能够用更兴旺的原料替代亚克力板,从而撑持能够拾首重物的大机器人手臂。

伺服电机装配在一块12 x 12厘米的较小亚克力板上。吾们在小板中心钻取了一个与伺服电机尺寸相通的孔。然后,将伺服电机用螺丝拧到孔上(图2)。

图片

图2:底座(前视图)

II.肩部

肩部由两台伺服电机构成,它们相互互助以拾取物体并安放在精确的位置。该项现在最主要的校准就在肩部。这两个伺服编制必须完善结相符,从Arduino开发板上获得十足相通的命令,并且必须逆相通步。为了获得良益的同步性,将两台电机安放在机器人手臂上之前,必须将其面迎面安放并议定编程摆动到联相符侧。

图片

图3:伺服电机同步性

倘若它们的走为纷歧致,那么处于上游位置的伺服电机会强制第二个电机移动,从而产生短路,最后导致第二个伺服电机烧失踪。

倘若伺服编制的分辨率纷歧样,您将无法使它们同步。在这栽情况下,最益的手段则是仅行使一栽伺服电机。倘若它们质量很益,那么实际扭矩会与数据外相通,并且具有升迁重物的能力。

另外,为了坦然首见,在肩部的基座上装一个旋钮专门益。您也能够行使金属支架,将其安放到所需角度,以防止死板臂坠落。

图片

图4:肩部组件

图4表现了吾们之前构建的装配在底座上的肩部。伺服机构固定的部位采用旋转组织。肩部必须牢固地固定在基座上,但也必须能够解放旋转。均衡旋转局部的每一面也很主要,由于吾们的装配含有一些较重的撑持金属部件。中心重量必须相通,云云机器手臂旋转时才不会失踪落。对于这一局部,吾们还安放了一个金属筋(即金属曲头),以便伺服机构异国插时兴维持机器臂重量。

III.肘部

现在,吾们来望一下肘部。肘部伺服局部议定手臂高度控制。由于手臂必须返回到正本位置,以是肘部延迟局部与肩部之间的最大角度不得超过100度。吾们对该机器人手臂原型的肘部伺服编制进走编程,让手臂捡首一个球——编制会妥洽捕捉器和肩膀,两者相互互助,最后将球拾首。

肘部的做事原理如下:

当肘部延迟局部与肩部之间的角度较小时,肩部的角度将增大;

当肘部和肩部之间的角度较大时,肩部的角度将会减小。

图片

图5:肘部

肘部行使SketchUp STL设计,并用3D打印机打印。(STL扩展能够将图形转换为能够打印的3D模型)。按照设计,肘部在批准曲曲的角度连接2个延迟局部。

图片

图6:肘部的3D模型

自然,肘部的延迟部件必要能够很容易地仰首,以是除了肘部,延迟局部不该连接其他任何东西。每个丙烯酸树脂延迟部件尺寸为20 x 7厘米。延迟局部的另一端用小丙烯酸片粘相符首来,以便将两局部固定在一首。您能够转折尺寸,但是由于伺服机构的控制,死板臂的尺寸不该太大

倘若您决定更改尺寸(比如制作一个较小的手臂),那么请确保计算出零件的精确尺寸。否则,手臂将发生故障,无法拾首重物。网络摄像机装配在延迟部件上。

图片

图7:装配在机器人手臂上的网络摄像头

VI.手段

手段由能够抓取某些小物体的爪钳/捕捉器构成。在本文中,吾们以抓取小球为例。自然,手臂还能够抓取并挑首正当爪钳的其他物体。您还能够按照您的详细偏益进走设计——必要时请行使SG90 SketchUp文件进走必要修改。您必要做的就按照所抓物体的形状来转折爪钳形状。

图片

图8:手段

手段局部也行使SketchUp中的3D模型构建。倘若吾们想要挑首较重的物体,能够用爪钳抓住它们。但是,爪钳抓取物体时比较有力,能够会对其造成损坏。

图片

图9:手段的3D模型

步骤2:连接伺服电机

底座

图片

图10:底座伺服编制的接线图

底座伺服(图2)被竖立为从0度最先,这意味着它将从左侧最先搜索用户。其旋转角度为140度——机器人手臂可追踪人员递送物体的周围。吾们在0度进走校准——这是伺服的中心,叶单倾向上方垂直安放。

在控制功能中,基座的分辨率为4度。这是由于在这栽情况下,精度不必要太完善。较高的精度逆而会导致处理变得缓慢。

每次吾们都都必要检查伺服电机的位置,由于相互作用实时进走。为此,吾们开发了两个功能:左方和右方。这两个功能能够从35个差别位置追踪人员。

肩部和肘部

肩部与肘部一首能够完善一项主要功能。他们必须曲曲机器人手臂。吾们答当指出以下控制,这很主要:

由于前臂的长度,肩部的操作角度不克小于45度,吾们有2个例子:

当肩部处于最矮位置时,机器人手臂能够拾首很远的物体;

当肩部处于最高位置时,机器人手臂能够拾首比来的物体;

吾们选定的角度对于肩部来说已经有余,由于它足以让手臂拾首物体并将其交给精确的人员。

图片

图11:肩部周围

肘部的最大位置不克超过140度,由于该项现在标现在标是在平面上构建机器人手臂,并且将摄像头与用户处保持在联相符高度。吾们认为只用70度即可,由于这足以曲曲机器人手臂。

肩部角度和肘部角度之间的组相符使手臂具有很大的变通性,从而形成完善的机器手臂,最后实现拾取物体的功能。

图片

图12:肘部周围

图片

图13:肩部伺服接线图

图片

图14:肘部伺服接线图

本智能机器人手臂教程的第1局部描述了手臂的清淡死板组织,以及伺服电机如何与手臂差别连接处进走连接的手段。

第2局部:编程

吾们已经将死板手臂的本体拼装在一首。死板手臂搭载了一个网络摄像头和一个麦克风,以进走人脸和物体识别以及语音识别。这款在短短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

您能够点击(https://www.emgu.com/wiki/index.php/Download_And_Installation)“构建示例”下方的超链接下载Emgu CV工程:

图片

图1: 如何下载EmguCV

2. 增补文件

由于您必要行使增补库,因此答将它们包含在Visual Studio中。OpenCV基于C/C++说话开发,倘若您想在C#中行使,那么必要增补DLL(动态链接库)文件——处理视频时必须包含DLL文件。参考文件位于Visual Studio菜单的Solution Explorer处.

图片

图2: 参考文件位置

倘若您想增补更众文件,请点击References -> Add references,然后从下载的文件中选择以下内容:

图片

图3: 参考管理器(Reference Manager)

更众新闻能够参考以下链接:https://www.emgu.com/wiki/index.php/Setting_up_EMGU_C_Sharp

3. 示例

在下载的库中,您能够找到更众行使视频处理(行动检测、人脸检测和摄像头捕捉)的程序代码示例.

图片

图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.h>Servo Circle; //1Servo Base; //2Servo Elbow; //3Servo Wrist; //4int 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。下载并装配文件后,吾们就能够最先制作行使程序。

最先,吾们必要创建一个新工程。创建新工程的步骤如下:点击File→New→Project和Windows Forms App(.NET Framework)。

图片

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

此时编制会表现一个带有窗体的窗口——这是行使程序自动生成的格式。右侧(Properties)是外格属性,您能够按照本身的偏益进走调整。左侧(Toolbox)挑供行使程序行使的功能,比如按钮、复选框、串口等。

图片

图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所示。

图片

图7: 演示App

第3步:App属性

倚赖.NET、OpenCV和Microsoft API的功能,吾们能够制作出完善的行使程序。对于该行使程序,吾们必要按钮、串口和文本框。

暗色窗口会表现来自摄像头的图像,窗口中还会增补一个镜头框,框内表现人物名称。

左侧的白色窗口能够增补TTS API(文本转语音)的文本,挑供逆馈以检查做事,并检查说出的话语是否与表现的字词相符。

图片

图8: 机器人手臂行使程序

第4步:人脸识别

为了获得更益的程序效果,您必要在训练模式下增补众个脸部记录。训练是指议定拍摄众个脸部位置以获得最佳识别(差别拍摄角度、光线条件等)。您必要按下Record 10 Faces按钮,议定行使程序记录脸部画面。

在代码中,实现这个功能的语句为Face = Parent.faceClassifier;这议定EmguCV平台完善。人脸检测议定基于主成分分析(PCA)的复杂算法实现,编制会将检测到的脸部与训练后存储的图像进走众次比较。

图片

图9: 人脸检测

蓝色矩形中的图像是必要存储的图像,由于它包含面部的稀奇特征。

吾们必要在差别的位置和差别的光线下获取更众的面部特征:

图片

图10: 增补更众人脸进走训练

经过一系列面部检测拍摄,倘若您认为之前记录的脸部图像不幸于算法计算,那么能够点击Restart 1 Face按钮删除已经保存的文件,编制将不再检测该脸部新闻。

倘若要记录众小我、让机器人手臂能够区分很众小我,那么能够行使Delete Data按钮删除照片。

图片

图11:重启训练模式

录制更众图像后,该算法答该能够检测人脸,并在蓝框上方表现名称。机器人能够精确检测像眼镜云云的特征,由于这些特征属于区别性特征.

图片

图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 failed–throw new WeatherDataServiceException”。议定throw吾们能够创建一个变态。

在C#中,吾们能够行使try和catch来解决局部代码无法成功的情况。

结相符文本转语音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”。

图片

图13: 测试API

总体来说,这是一个兴趣的项现在。该项现在让吾清新硬件和柔件之间的良益同步对于实现最佳性能至关主要。行使Visual Studio的很众库使项现在有点复杂,但最后效果令人舒坦。

吾认为这栽项现在能够议定众栽手段进走开发和改进,以已足每个用户的需求。

来源:机器人网

郑重声明:文章来源于网络,仅作为参考,如果网站中图片和文字侵犯了您的版权,请联系我们处理!

上一篇:与公司相关的纠纷之一:如何经由过程诉讼屏舍法定代外人的“包袱”?

下一篇:谁是“法人”

相关推荐

返回顶部