Nous travaillons avec le cobot Dobot M1

Il y a un an sur Habré, la revue du robot de bureau Dobot Magician est sortie. Dans cet article, je propose d'évaluer son frère aîné Dobot M1 en action. J'essaierai également d'expliquer pourquoi j'ai choisi ce modèle particulier pour mon projet, je décrirai le processus de développement de la démo en Qt / c ++, ainsi que certains moments désagréables que j'ai rencontrés lors du processus de développement.

Présentation


Cette année, j'ai travaillé dans l'un des instituts de recherche les plus courants. Au début, tout était plutôt décontracté, et l'année ne promettait rien d'intéressant, jusqu'à ce qu'un jour, lors d'un rassemblement, une discussion n'ait commencé sur la façon de réaliser un assemblage carrelé de cellules solaires (cellules solaires en bardeaux). Cette approche n'est pas nouvelle, disent-ils , c'est l'une des premières façons d'assembler des panneaux pour les satellites spatiaux.

Je ne sais pas à quel point c'est vrai parce que je n'ai pas vu d'articles ou de brevets. Mais l'intérêt du public pour cette décision s'est réchauffé, en partie aussi parce qu'il y a quelques années, SunPower a déployé ses nouveaux panneaux, qu'elle appelait la série P. Il se trouve que dans le monde du photovoltaïque, comme le sanpower fait quelque chose, alors tout le monde doit le faire aussi. Nous y voilà. Tout est simple: nous préparons les substrats, les coupons en bandes et assemblons. À ce moment-là, j'ai remarqué que je ne collecterais certainement rien manuellement, car mes mains ne différaient pas en particulier sur la planéité. Sinon, le résultat pourrait être quelque chose comme une vidéo sur YouTube. Et nous, après tout, nous sommes une institution entière, si nous faisons vraiment quelque chose, ce n'est pas une ferme collective. J'ai proposé d'acheter des robots et de les configurer pour le processus souhaité, et ils m'ont donné le feu vert.

Il est à noter que nous avons décidé de commencer plus simplement et d'assembler des mini-panneaux. Un mini-panneau est un panneau solaire plus petit que la norme. Nous le faisons pour tester les processus techniques. Tout d'abord, j'ai été guidé par un panneau d'une taille de 1 cellule solaire standard avec des plans de mise à l'échelle vers un panneau de 2 x 2. La taille du côté d'une cellule solaire est de 16 cm. Par conséquent, des robots étaient nécessaires avec un champ d'accès de 32 x 32 cm. Je voulais une précision plus précise et le prix était moins cher . Alors, armé d'une barre de recherche, j'ai commencé à étudier les phrases. J'ai décidé que 6 axes ne sont pas nécessaires pour le projet, 4 suffisent, donc le choix s'est limité aux robots comme une cicatrice. J'ai découvert que l'achat de robots industriels s'accompagne de dépenses supplémentaires, telles que la conception d'un espace de travail sûr et le fait de laisser l'ingénieur d'application sur le site d'installation, qui programme le robot pour votre tâche. Les bons robots industriels sont chers en principe, et les services d'ingénieurs augmenteront encore le prix, de plus, il était intéressant de mettre en œuvre le projet vous-même. Par conséquent, le choix s'est limité aux cobots, robots collaboratifs, avec des exigences de sécurité moindres et plus conviviaux pour l'auto-prototypage. J'ai donc rapidement trouvé la société Dobot. J'ai immédiatement laissé tomber le Dobot Magician en raison de la taille et de la précision, qui est de 100 microns. Je leur ai écrit une demande de spécifications et leur ai dit où acheter. J'ai découvert qu'avec les API, il y a des API et elles peuvent être programmées en C ++. Cela me convenait, mais je ne pouvais pas simplement l'acheter directement. Heureusement, j'ai trouvé un fournisseur aux Pays-Bas qui m'a vendu 2 pièces pour 8700 euros avec TVA, livré de Chine, et en même temps pris en charge tout le dédouanement.

Caractéristiques gentillesse




Le Dobot M1 se positionne comme un robot collaboratif professionnel à 4 axes abordable. Il peut supporter jusqu'à 1,5 kg de charge (non testé), a une portée allant jusqu'à 400 mm (pas partout) et une précision allant jusqu'à 20 microns (vérifié). L'espace de travail de la gentillesse est illustré dans la figure ci-dessous. Il n'est pas difficile de remarquer qu'en raison des caractéristiques de conception, il y a une zone aveugle avec un rayon légèrement inférieur à 15 centimètres à l'avant. De plus, cette carte spatiale ne prend pas en compte l'orientation de la main. Le Dobot peut être droitier ou gaucher, je n'ai toujours pas compris comment cela peut être activé en déplacement sans étalonnage supplémentaire. Par défaut, Dobot est droitier, ce qui signifie que la zone droite est limitée par la zone d'accès de la 2e articulation, lorsque la première articulation est dirigée vers la droite. La zone réelle de l'espace de travail représente donc environ les 2/3 de ce qui est indiqué dans le dessin officiel.



Goodness dispose de ports d'E / S: entrées et sorties numériques avec des niveaux de 24 V (les niveaux par défaut sont élevés), ainsi que des entrées analogiques. Quel type d'ADC est là, je ne sais pas. Des ports sont disponibles sur le panneau arrière du support et sur la main elle-même pour travailler avec des buses. J'ai oublié de photographier le connecteur sur le bras lui-même, mais c'est un type de CAA. Il existe également une interface d'extension pour laquelle vous pouvez acheter des frais supplémentaires. Dobot se connecte à un PC via RS-232 ou via un réseau.



Matériaux de fabrication du boîtier: polycarbonate, apparemment, plus un support en métal peint en noir. Cette conception ne provoque pas un sentiment de prime, mais aussi un sens de l'artisanat. J'en ai acheté un entièrement chargé et un dans la base. Je n'ai pas testé la buse laser et l'impression 3D.

Pour tester la qualité de la gentillesse, j'ai utilisé le programme M1Studio pour Windows, qui est téléchargé sur le site Web de l'entreprise. Mais c’est tout. De plus, armé d'api, de Qt et d'un poste de travail avec des guêpes élémentaires, je me suis assis pour écrire une démo pour travailler avec plusieurs hauts et bas.

Nous écrivons une démo


En fait, la démo est déjà disponible sur le github . La documentation de l'API et du protocole de communication peut être téléchargée sur le site Web du fabricant.

Tout d'abord, nous avons utilisé la méthode SearchDobot () de l'API, qui ne montrait rien sous Linux, et ne fonctionnait dans Windows que si le dobot était connecté via RS-232. C'est étrange, car M1Studiya définit parfaitement dobotov sur le réseau. Avec des adresses IP connues, la méthode ConnectDobot () fonctionne très bien. C'est bon, je pensais, je vais configurer le routeur et laisser l'adresse IP être attachée au coquelicot. Le lendemain, j'ai été surpris par le fait que les bontés ne réagissent pas. Il s'est avéré que lorsqu'il est allumé, le dobot a une adresse de pavot aléatoire. C'est une telle fonctionnalité du firmware, qui a été corrigé dans la nouvelle version en mai, mais que j'avais cependant peur d'installer.

Armé d'un programme d'analyse des paquets réseau, j'ai découvert que Dobot répondait à la demande UDP du port 6000 avec le texte «WhoisDobotM1» réponse UDP avec du texte contenant le numéro de modèle du Dobot. Sur cette base, une méthode personnalisée a été écrite qui envoie des requêtes sur l'ensemble du sous-réseau et, dans le cas d'une réponse, initialise la gentillesse.

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

L'interface de démonstration est assez simple et est présentée dans l'image ci-dessous.



Pour initialiser et contrôler la gentillesse, j'ai écrit une classe dans laquelle j'ai implémenté les fonctions dont j'ai besoin: contrôle d'axe, mouvement de point en point en ligne droite et dans une courbe, retour à la position initiale, contrôle de la pompe à air, mais aussi suivi des positions et des erreurs. Prenons tour à tour. Lorsque la classe est initialisée, l'adresse IP de gentillesse est stockée dans la variable, la première connexion à celle-ci se produit, la file d'attente de commandes entière est nettoyée, même si la file d'attente est vide, et les paramètres d'accélération et de vitesse pour les moteurs sont définis.

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

J'ai décidé d'utiliser un vecteur avec des éléments de ma classe pour contrôler les dobots lorsque leur nombre est supérieur à 1. Chaque élément du vecteur a une variable qui stocke l'adresse IP du dobot. Parce que la bibliothèque est une, et il y a plusieurs dobotov, puis dans chaque méthode de la classe, vous devez d'abord appeler la méthode de connexion à un dobot spécifique. Cela peut sembler tordu, mais tout est sous le capot, puis travailler avec cette classe est très pratique.

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

Le mouvement d'un point à un autre dans API Goodness est mis en œuvre par plusieurs méthodes: en ligne droite, en courbe et d'une autre manière dont je ne me souviens pas. Dans la figure ci-dessous, deux trajectoires de mouvement entre 2 points sont visibles. La première est une ligne droite qui, avec un étalonnage correct de l'appareil, ne se bifurque pas lors des allers-retours. La deuxième trajectoire est la ligne courbe que vous obtenez, car le micrologiciel de gentillesse ajuste séquentiellement les moteurs pour obtenir les coordonnées souhaitées. Il est à noter que le déplacement en ligne droite n'est pas toujours possible, certaines positions des articulations ne permettent pas d'atteindre du point A au point B en ligne droite.



La surveillance de position de Dobot est implémentée à l'aide de la classe Qtimer, dont le signal Qtimer :: timeout est lié à ma méthode MainWindow :: on_getPoseTimer. Je dois admettre que c'est une solution médiocre, car un fonctionnement réactif de l'application avec ups n'est possible que si vous définissez un délai d'expiration de 1000 ms. Avec des délais plus courts, des secousses commencent à se faire sentir lors de la gestion des hauts. J'ai remarqué que parfois dobot peut être stupide pendant un certain temps lors de la réception d'une commande, et si vous envoyez des commandes assez souvent, la probabilité de devenir stupide augmente. Cela est peut-être dû à l'appel constant à ConnectDobot, qui peut sembler inutile dans cette démo, mais la démo a été écrite en parallèle avec le projet principal, et dans le projet principal, j'ai vraiment besoin d'une telle implémentation. Cependant, pour surveiller la connexion n'est pas appelé à chaque fois, mais le problème avec la suspension demeure. Un timeout de 1 s, malheureusement, ne fournit pas une mesure aussi fluide de la position de la gentillesse dans l'espace, qui, par exemple, est implémentée dans le Studio M1, mais, d'autre part, ce n'est pas important.

Dans la même méthode, une demande d'erreurs se produit. Dans la gentillesse de l'API, la transmission du code d'erreur est implémentée via la structure AlarmState.

 struct alarmState { uint8_t value[32]; }; 

Cette structure est un tableau d'éléments à 8 bits et le code d'erreur est codé dans la représentation binaire de l'un des plusieurs éléments du tableau. Pour calculer le code d'erreur, vous devez trouver «1» dans l'élément et ajouter son numéro de décharge (unité) à 8 * n éléments (contenant ou non d'autres erreurs) avant dans le tableau de valeurs. Oui, il peut y avoir plus d'une erreur à la fois. Ensuite, le code d'erreur doit être trouvé dans le document, qui peut être téléchargé sur le site Web du fabricant. Le contenu de pdfk a été copié dans un fichier texte, qui est boulonné au projet en tant que ressource. Si le code d'erreur diffère de 8 * 32 (c'est-à-dire qu'il n'y a pas d'erreur), alors ce code apparaît dans le champ d'erreur et en cliquant sur le bouton Alarme, sa description est analysée dans le fichier, puis affichée dans le champ de texte. Par ailleurs, le décodage et l'analyse des erreurs sont effectués en dehors de la classe pour contrôler les ups. Cela ne me semble plus tout à fait la bonne idée.

Une pompe à air est incluse dans le kit, qui dans le manuel d'instructions suggère de se connecter aux sorties numériques 17 et 18. Une sortie contrôle la marche / arrêt de la pompe, et la seconde contrôle la direction du mouvement de l'air. Ainsi, par exemple, une pince pneumatique est activée, qui est également fournie.

Les mauvaises herbes


Dans le processus d'exploitation du Dobot, j'ai rencontré quelques problèmes.

  1. Les trous dans le support ne sont pas faits pour le pas des trous dans la planche à pain optique standard. D'un autre côté, une fois quand, par erreur, mes gentillesse sont entrées en collision, l'une d'elles a simplement fait défiler l'axe du boulon de fixation, ce qui, je pense, a évité de graves dommages.
  2. Du premier paragraphe suit le second. Après la collision des Dobot, leurs axes se sont déplacés. Ce n'était pas effrayant au début, car j'ai écrit une méthode pour calibrer l'axe du Dobot par rapport à la caméra. La chose terrible s'est produite au paragraphe 3.
  3. L'axe vertical a également changé et maintenant ma normale n'est pas normale. Cela peut être détecté par la caméra, si vous dessinez deux perpendiculaires avec les points. Vous pouvez vous assurer qu'en raison de la verticale inclinée, dobot dessine maintenant avec un stylo non pas ses vrais axes X et Y, mais leurs projections. Et ces projections peuvent avoir un angle inférieur à 90 degrés. En réalité, cela conduit à une petite erreur d'alignement. En revanche, ce n'est pas si effrayant car l'erreur est linéaire.
  4. Firmware Dobot, en principe, env. Il y avait un petit montant avec une adresse de pavot, il y a quelques problèmes avec l'attente des réponses aux demandes UDP, mais sinon ça marche bien.
  5. La conception fournit une batterie, qui est nécessaire pour maintenir les dernières coordonnées après avoir désactivé la gentillesse. Lorsque la batterie meurt, sa tension baisse, ce qui efface ces données. Pour cette raison, le dobot est chargé dans un état d'erreur. Pour déduire de ces états, vous devez d'abord appeler la méthode pour effacer les messages d'erreur, puis appeler la méthode de recherche pour la position "home". Vous pouvez remplacer la batterie, l'avantage est inclus. Cependant, la batterie est cachée dans le support, et pour y accéder, vous avez dû dévisser 4 boulons. La fente de l'un d'eux est abattue.
  6. Dans mon projet, j'ai utilisé 3 feuilles de verre pour augmenter le niveau de la table. Décision moyenne, car le verre est tordu. Le fait est que Dobot commence à générer des erreurs lorsque son axe vertical a une valeur inférieure à 15 mm, et il semble que toutes les fonctions ne soient pas disponibles. Il est donc nécessaire que l'espace de travail soit situé juste au-dessus du plan de fixation du Dobot.

Conclusion


La gentillesse m'a permis de mettre en œuvre un projet d'assemblage de cellules solaires dans une mini-prise carrelée, visible en vidéo. La précision de positionnement a été vérifiée sur les mêmes tranches de silicium et était dans la limite de 1 pixel sur un axe et de 10 pixels dans un autre. La caméra dans ce projet a été utilisée avec une résolution de 20 MP, et le champ de vision de la caméra le long du côté était d'environ 17 cm, il n'est pas difficile de calculer qu'un pixel correspondait à une taille linéaire d'environ 30 microns. Il se trouve que l'optique utilisée, bien que de haute qualité, permet d'observer clairement des tranches de silicium uniquement en leur centre, tandis que les bords des tranches deviennent très flous, ce qui conduit à une incertitude dans la détermination de leurs faces sur des côtés courts, et par conséquent à une incertitude dans la détermination du centre de la tranche. Après avoir calibré les axes, j'ai réglé la mise au point de la caméra sur les petits côtés des plaques. Il est à noter qu'en principe, il était impossible de se focaliser là comme au centre du champ de vision, mais quand même. En raison de cet effet, l'erreur de positionnement le long de l'axe le long du côté long de la cellule solaire était dans la limite de 10 pixels, mais seulement 1 pixel sur le côté court. Ce qui correspond à environ 300 et 30 microns. Cela m'a permis de vérifier l'intégrité des spécifications pour la précision.

Source: https://habr.com/ru/post/fr467407/


All Articles