我们与合作机器人Dobot M1合作

一年前,在哈布雷(Habré)上,对台式机器人Dobot Magician进行了评论。 在本文中,我建议对他的哥哥Dobot M1进行评估。 我还将尝试解释为什么我为我的项目选择此特定模型,我将描述Qt / c ++中的演示的开发过程,以及在开发过程中遇到的一些不愉快的时刻。

引言


今年,我在最普通的研究机构之一工作。 起初,一切都相当休闲,这一年并没有带来任何有趣的结果,直到有一天在一次集会上,人们开始讨论如何制作太阳能电池板(瓦)。 他们说 ,这种方法并不新鲜,这是组装太空卫星面板的第一种方法。

我不知道这是多么真实,因为我还没有看过文章或专利。 但是,公众对此决定的兴趣有所升温,部分原因是几年前SunPower推出了其新面板,即P系列 。 正是在光伏领域发生了这样的事情,既然Sanpower正在做某事,那么每个人也必须做这件事。 我们到了。 一切都很简单:我们准备基板,将它们切成条并组装。 那时,我注意到我个人绝对不会手动收集任何东西,因为我的双手在均匀度上没有什么不同。 否则,结果可能类似于YouTube上的一部视频 。 毕竟,我们是一个整体机构,如果我们真的做某事,那就不是集体农场。 我提出要购买机器人并按照所需的过程对其进行配置,他们给了我更大的希望。

应当指出,我们决定开始简化和组装迷你面板。 迷你面板是指任何比标准尺寸小的太阳能面板。 我们这样做是为了制定技术流程。 首先,我由一个尺寸为1个标准太阳能电池的面板(缩放比例为2 x 2)引导。一个太阳能电池侧面的尺寸为16厘米,因此,需要机器人的访问区域为32 x 32厘米。我想要更准确的精度,并且价格更便宜。 因此,带着搜索栏,我开始研究这些句子。 我决定该项目不需要6根轴,而4根就足够了,因此选择范围缩小了,就像伤疤一样。 我发现购买工业机器人会带来额外的费用,例如设计一个安全的工作空间并将应用工程师留在安装现场,以便为您的任务对机器人进行编程。 好的工业机器人原则上很昂贵,工程师的服务将进一步增加价格,此外,自己实施该项目很有趣。 因此,选择范围仅限于协作机器人,协作机器人,它们具有较低的安全性要求,并且对自原型设计更友好。 因此,我很快找到了Dobot公司。 由于尺寸和精度(100微米),我立即放弃了Dobot Magician。 我写了一个要求给他们规格的请求,并告诉他们在哪里购买。 我发现有了API,就可以使用C ++来编程API。 它适合我,但我不能直接购买。 幸运的是,我在荷兰找到了一个供应商,向我出售了两件从中国交付的含增值税的产品,价格为8700欧元,同时我接管了所有清关手续。

特色善良




Dobot M1被定位为负担得起的专业4轴协作机器人。 它可以承受1.5公斤的负载(未经测试),最大范围为400毫米(并非到处都是),精度高达20微米(已选中)。 下图显示了善良的工作空间。 不难看出,由于设计特点,前面有一个半径略小于15厘米的盲区。 此外,该空间图未考虑手的方向。 Dobot可以是惯用右手的也可以是惯用左手的,我还没有弄清楚如何在不进行额外校准的情况下随时进行切换。 默认情况下,Dobot是惯用右手的,这意味着当第一个关节指向右侧时,右侧区域受到第二关节的访问区域的限制。 因此,工作空间的实际面积约为官方图纸中显示面积的2/3。



天哪有I / O端口:24 V电平的数字输入和输出(默认电平为高),以及模拟输入。 我不知道有什么样的ADC。 支架后面板以及手本身都有端口,可使用喷嘴工作。 我忘了拍手臂上的连接器了,但这是CAA的一种。 还有一个扩展接口,您可以为此购买额外费用。 Dobot通过RS-232或网络连接到PC。



外壳材料:显然是聚碳酸酯,再加上一个涂成黑色的金属支架。 这种设计不会引起高级感,但也会引起手工艺感。 我买了一辆满载的,另一辆在基地。 我没有测试激光喷嘴和3D打印。

为了测试友善性,我使用了Windows的M1Studio程序,该程序可从公司的网站下载。 但这就是全部。 此外,我配备了api,Qt和带有基本黄蜂的工作站,我坐下来编写了一个演示程序,以应对各种起伏。

我们正在编写一个演示


实际上,该演示已在github上提供 。 可以从制造商的网站下载API和通信协议的文档。

首先,我们使用了api中的SearchDobot()方法,该方法在Linux下不显示任何内容,并且仅在dobot通过RS-232连接时才在Windows中工作。 很奇怪,因为M1Studiya完美地定义了网络上的dobotov。 使用已知的IP地址,ConnectDobot()方法可以正常工作。 没关系,我想,我将设置路由器并将IP地址附加到罂粟上。 第二天,我对仁慈没有反应感到惊讶。 事实证明,打开后,Dobot具有一个随机的罂粟地址。 这是固件的一项功能,该功能已在5月的新版本中修复,但我不敢安装。

配备了用于分析网络数据包的程序后,我发现Dobot使用文本“ WhoisDobotM1” UDP响应和包含模型Dobot编号的文本来响应对端口6000的UDP请求。 基于此,编写了一个自定义方法,该方法可在整个子网中发送请求,并在响应的情况下初始化好意。

void MainWindow::on_buttonSearch_clicked() { QHostAddress host; QList<QHostAddress> list = QNetworkInterface::allAddresses(); for (int i=0; i<list.count(); i++) { if ((!list.at(i).isLoopback()) && (list.at(i).protocol() == QAbstractSocket::IPv4Protocol)) host = list.at(i); } QString subnet = host.toString().section('.',0,2) + "."; QByteArray data = "WhoisDobotM1"; QUdpSocket udpSocketSend; udpSocketSend.writeDatagram(data);//need tocall it otherwise in Win get socket doesn't open udpSocketSend.bind(host, 54321, QAbstractSocket::ShareAddress); udpSocketGet.bind(host, udpSocketSend.localPort(), QAbstractSocket::ShareAddress); connect(&udpSocketGet, &QUdpSocket::readyRead, this, &MainWindow::readUdpData); for (int i=1; i<255; i++) udpSocketSend.writeDatagram(data, 32, QHostAddress(subnet + QString::number(i)), 6000); } 

 void MainWindow::readUdpData() { while (udpSocketGet.hasPendingDatagrams()) { QNetworkDatagram data = udpSocketGet.receiveDatagram(); QByteArray ip = data.senderAddress().toString().toUtf8(); QString name = QString(data.data()).section('_',0,0); // cuts "dobotM1" from "dobotM1_Dobot M1_0033\x00" if (name == "dobotM1") { MyDobot* a = new MyDobot(); dobot->push_back(a); dobot->last()->initDobot(ip); ui->listDobots->addItem(ip); on_listDobots_activated(ui->listDobots->currentIndex()); } } } 

演示界面非常简单,如下图所示。



为了初始化和控制友善,我写了一个类,实现了所需的功能:轴控制,直线和曲线上的点到点运动,返回初始位置,控制气泵以及监视位置和错误。 让我们轮流。 初始化该类时,将善意的ip地址存储在变量中,与该变量的第一个连接会发生,即使队列为空,也会清理整个命令队列,并设置了电动机的加速和速度参数。

 class MyDobot : public QObject { Q_OBJECT public: explicit MyDobot(QObject *parent = nullptr); ~MyDobot(); void initDobot(QByteArray IPaddress); Pose getCurrentPosition(); void goHomeSafe(); void goHome(); void goSafe(); void goPosition(float x, float y, float z, float r); void goPositionStraight(float x, float y, float z, float r); void goJog(int index); void setAirPump(int status, int direction); //status 1 off 0 on; direction 0 suck 1 push void setOutput(uint8_t address, uint8_t level); void setMotor(int velocity, int acceleration); alarmState getAlarms(); void clearAlarms(); void clearQueue(); QString getName(); public slots: private: char deviceSN[64]; char deviceName[64]; QByteArray thisDobotIP; Pose currentPosition, futurePosition; }; 

我决定在类数大于1的情况下使用带有类元素的向量来控制dobot,向量的每个元素都有一个变量,用于存储dobot的ip地址。 因为 该库是一个,并且有多个dobotov,然后在该类的每个方法中,您必须首先调用连接到特定dobot的方法。 它可能看起来有些歪斜,但是全都隐藏了,然后使用此类非常方便。

 void MyDobot::setAirPump(int status, int direction) { ConnectDobot(thisDobotIP, 115200, nullptr, nullptr); ... 

API Goodness中从点到点的移动是通过几种方法实现的:直线,曲线和其他我不记得的方式。 在下图中,可以看到两个点之间的两个运动轨迹。 一个是一条直线,通过正确校准该设备,它在来回移动时不会分叉。 第二条轨迹是您获得的曲线,因为友善固件会顺序调整电机以达到所需的坐标。 应该注意的是,并非总是可以沿直线运动,关节的某些位置不允许沿直线从A点到达B点。



Dobot位置监视是使用Qtimer类实现的,该类的Qtimer :: timeout信号绑定到我的MainWindow :: on_getPoseTimer方法。 我必须承认,这是一个一般的解决方案,因为只有将超时设置为1000毫秒,应用程序才能使用ups进行响应操作。 随着时间的缩短,在管理起搏时开始会感觉到抽搐。 我注意到,有时dobot在收到命令时可能会出现一段时间的愚蠢,如果您经常发送命令,那么陷入愚蠢的可能性就会增加。 也许这是由于对ConnectDobot的不断调用,在此演示中这似乎是不必要的,但是该演示是与主项目并行编写的,并且在主项目中我确实需要这样的实现。 但是,并不是每次都调用监视连接的方法,但是挂起问题仍然存在。 不幸的是,超时时间为1 s不能提供这样一种对空间的友好位置的平滑测量,例如在M1 Studio中实现,但是另一方面,这并不重要。

在相同的方法中,发生错误请求。 在api方面,错误代码的传输是通过AlarmState结构实现的。

 struct alarmState { uint8_t value[32]; }; 

此结构是一个8位元素的数组,并且错误代码以该数组的几个元素之一的二进制表示形式编码。 要计算错误代码,您需要在元素中找到“ 1”,并将其排出编号(单位)添加到值数组中的8 * n个元素(包含或不包含其他错误)之前。 是的,一次可能存在多个错误。 接下来,必须在文档中找到错误代码,该错误代码可在制造商的网站上下载。 pdfk的内容已复制到文本文件,该文本文件作为资源附加到项目中。 如果错误代码不同于8 * 32(即没有错误),则此代码将显示在错误字段中,然后单击警报按钮将其描述解析到文件中,然后显示在文本字段中。 顺便说一句,错误解码和解析是在类之外进行的,以控制ups。 在我看来,这现在不是一个正确的主意。

套件中包括一个气泵,在使用说明书中建议将其连接到数字量输出17和18。一个输出控制泵的开/关,第二个控制空气流动的方向。 因此,例如,气动抓持器被激活,该气动抓持器也被提供。

杂草


在开发Dobot的过程中,我遇到了一些麻烦。

  1. 支架上的孔不是按照标准光学面包板上的孔间距来制作的。 另一方面,一旦我的仁慈被误撞到一起,他们中的一个只会绕着固定螺栓的轴线滚动,我认为这避免了严重的损坏。
  2. 从第一段起是第二段。 Dobot碰撞后,他们的轴移动了。 起初这并不令人害怕,因为我编写了一种用于校准Dobot相对于摄像机的轴的方法。 可怕的事情发生在第3段中。
  3. 垂直轴也已移动,现在我的法线不正常。 如果您用点绘制两个垂直线,则可以通过相机检测到。 您可以确保由于垂直倾斜,现在dobot用笔绘制的不是其真实的X和Y轴,而是它们的投影。 并且这些突起可以具有小于90度的角度。 实际上,这导致较小的对准误差。 另一方面,它并不是那么可怕,因为误差是线性的。
  4. Dobot固件原则上大约为 有一个带有罂粟地址的小门框,在等待对UDP请求的响应时会遇到一些问题,但否则可以正常工作。
  5. 该设计提供了一个电池,需要在关闭友善电源后维持最后的坐标。 电池耗尽时,其上的电压会下降,这将擦除此数据。 因此,dobot被加载到错误状态。 要从这些状态推断出,必须首先调用清除错误消息的方法,然后为“起始”位置调用搜索方法。 您可以更换电池,包括好处。 但是,电池隐藏在支架中,要拧松电池,您必须拧松4个螺栓。 其中之一的插槽被击落。
  6. 在我的项目中,我使用了3张玻璃来增加桌子的高度。 马马虎虎的决定,因为杯子歪了。 事实是,当Dobot的垂直轴的值小于15 mm时,它就会开始产生错误,并且似乎并非所有功能都可用。 因此,工作空间必须位于Dobot的附着平面正上方。

结论


仁慈使我得以实施一个项目,该项目将太阳能电池组装在平铺的微型插座中,可以在视频中看到。 在相同的硅晶片上检查定位精度,并且在一个轴上限制为1个像素,在另一个轴上限制为10个像素。 该项目中使用的摄像头分辨率为20 MP,并且摄像头长边的视场约为17厘米,不难计算出1个像素对应于约30微米的线性尺寸。 碰巧的是,尽管使用了高质量的光学器件,但仍可以仅在其中心清晰地观察硅晶片,而晶片的边缘变得非常模糊,这导致沿短边确定其面的不确定性,并因此导致确定晶片中心的不确定性。 校准轴后,将相机焦点设置在板的短边。 应该指出的是,原则上不可能像视野中心那样集中在那里,但是仍然可以。 由于这种效果,沿着太阳能电池的长边的轴的定位误差在10个像素的范围内,而在短边上只有1个像素。 这相当于大约300和30微米。 这使我能够验证规范的完整性以确保准确性。

Source: https://habr.com/ru/post/zh-CN467407/


All Articles