智能机器人手臂–第2部分:编程 您所在的位置:网站首页 机械臂工程图技术要求 智能机器人手臂–第2部分:编程

智能机器人手臂–第2部分:编程

2024-06-27 06:24| 来源: 网络整理| 查看: 265

这篇文章来源于DevicePlus.com英语网站的翻译稿。点击此处阅读本文的第1部分>

 

robotic arm

在智能机器人手臂–第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工程:

robotic arm

图1: 如何下载EmguCV

2. 添加文件 由于您需要使用添加库,因此应将它们包含在Visual Studio中。OpenCV基于C/C++语言开发,如果您想在C#中使用,那么需要添加DLL(动态链接库)文件——处理视频时必须包含DLL文件。参考文件位于Visual Studio菜单的Solution Explorer处.

robotic arm

图2: 参考文件位置

如果您想添加更多文件,请点击References -> Add references,然后从下载的文件中选择以下内容:

robotic arm

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

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

 

 

3. 示例

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

robotic arm

图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 = 0) if(angle = 0) if(angle = 0) if(angle = 4) { posElbow = posElbow - 4; } else posElbow = 0; control(3, posElbow); } void upElbow() { if(posElbow = 4) { posBase = posBase - 4; } else posBase = 0; control(2, posBase); } void upBase() { if(posBase


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有