Au moment de la rédaction de cet article, le coût final estimé du produit est d'environ 70 000 roubles. Si vous avez une imprimante 3D, vous pouvez en déduire en toute sécurité 20000 roubles. S'il n'y a pas d'imprimante, son apparence sera un bonus agréable. Je décrirai toutes les dépenses en supposant que nous n'avons que de l'argent.
À quoi ressemble le résultat:
Il convient également de noter que pour programmer la main, nous avons besoin d'un ordinateur avec Linux OS installé (j'utilise Ubuntu 18.04) et du framework ROS (j'utilise Melodic).
La question peut se poser "pourquoi 70K roubles est bon marché?"
Je réponds.Au départ, je ne voulais pas me soucier de créer un bras robotique et j'ai pensé acheter quelque chose de simple, mais suffisamment fonctionnel pour être assemblé.
Quels étaient les critères de fonctionnalité et la simplicité minimale acceptable pour moi (c'est-à-dire pourquoi les manipulateurs d'aliexpress ne conviennent PAS) peuvent être discutés dans les commentaires afin de ne pas alourdir ceux qui sont évidents et / ou non intéressés.
Des solutions compétitives sur le marché
Je décrirai cependant brièvement des exemples de ce que j'ai envisagé sur le marché:
1) top3dshop.ru/robots/manipulators/dobot-magician-basic.html
176 000 roubles. Vous pouvez acheter DOBOT non seulement dans ce magasin, mais cela coûte généralement encore plus cher. Il y a sûrement une chance de le trouver dans un endroit moins cher, mais il coûtera toujours beaucoup plus cher que 70 000 roubles.
2) robotbaza.ru/product/robot-manipulyator-widowx-robotic-arm-mark-ii 280000
roubles. Encore plus cher. En général, les manipulateurs de TossenRobotics directement du fabricant coûtent de l'argent super sain. Mais la livraison en Russie (et j'étais ici) depuis leur magasin ne peut pas être commandée.
Un peu plus loin, je dirai que nous allons faire une copie du kit de bras de robot PhantomX Pincher Mark II, qui est produit par TossenRobotics.
Au total, on constate que 70 000 roubles ne sont pas du tout si chers.
Que devons-nous acheter?
Je cite tous les prix au moment de la rédaction de cet article (juillet 2020):
1) 6 moteurs DYNAMIXEL AX-12A que
j'ai achetés au prix de 7200 roubles pour 1 pièce, mais il semble que vous puissiez le trouver pour 6000 si vous le souhaitez vraiment. Supposons que vous n'ayez pas de chance et que vous achèteriez également pour 7200 roubles
Coût total: 43 200 roubles
2) Imprimante 3D
N'importe quelle simple fera l'affaire, vous pouvez garder dans les 20 000 roubles.
3) Arduino Uno + Power Shield
Coût: ~ 4000 roubles
4) En option (mais je le recommande vivement): Alimentation de laboratoire
Coût: ~ 3500 roubles
Assemblée
Excellent! Nous avons acheté tout ce dont nous avions besoin (probablement la plus longue attente pour la livraison des moteurs, ils m'ont été transportés pendant plus d'un mois).
Et après?
1) Imprimons des pièces pour le manipulateur sur une imprimante 3D.
Téléchargez les fichiers STL à partir d'ici
2) Associez-le aux moteurs. Il ne devrait y avoir aucun problème avec l'assemblage, mais s'ils apparaissent soudainement, vous pouvez utiliser cette instruction.
Créer un modèle 3D
Classe! Nous avons un coup de main, mais il doit être contrôlé d'une manière ou d'une autre. Je voudrais tirer le meilleur parti des réalisations de l'humanité, nous allons donc installer ROS pour nous-mêmes .
Afin de fonctionner pleinement avec le manipulateur dans ROS, vous devez en faire un modèle URDF . Nous en aurons besoin pour contrôler le bras robotisé à l'aide du package MoveIT!
Au moment d'écrire ces lignes, la dernière version stable est disponible pour Melodic / Ubuntu 18.04, ce qui explique mon choix de la version du système et du framework au début de l'article.
Construire un modèle URDF est une partie assez laborieuse (et, à mon avis, la plus ennuyeuse) de ce projet. Il faut finir un peu avec un fichier stl des modèles de composants et les relier entre eux dans un fichier au format XML, en sélectionnant manuellement les coefficients corrects de déplacement des pièces les unes par rapport aux autres.
Qui veut - peut faire le travail vous-même, tout le reste Sauvez vos nerfs et donnez simplement un lien vers votre fichier terminé:
github.com/vladmiron85/armbot/blob/master/catkin_ws/src/armbot_description/urdf/base.urdf
Dans ce modèle, mais passionnant appareils, cependant, au moment de capturer des objets dans le monde réel, nous sommes encore loin. Pour d'autres tâches, ce modèle est plus que suffisant.
Le modèle ressemble à ceci:
À partir du fichier URDF résultant, nous allons créer le MoveIT! Config, qui nous permettra de simuler les mouvements du manipulateur et d'envoyer des commandes de contrôle à un vrai bras robotique.
Il existe un excellent tutoriel pour créer une config ( lien )
Ici, je peux à nouveau gagner du temps et fournir ma config. Il se trouve ici:
github.com/vladmiron85/armbot/tree/master/catkin_ws/src/armbot_moveit_config
Vous pouvez télécharger la configuration depuis le github et l'exécuter avec la commande suivante:
roslaunch armbot_moveit_config demo.launch
Quelque chose comme ça sera possible de contrôler notre vrai bras robotique via rviz lorsque nous le connectons à ROS:
Et la vraie main?
Passons du monde des modèles 3D à la dure réalité. Nous avons un manipulateur préalablement assemblé. Je voudrais le déplacer d'une manière ou d'une autre. Faisons cela avec l'Arduino UNO et le Power Shield.
Connectons le premier moteur du manipulateur (qui est ci-dessous) au Power Shield et à l'alimentation comme suit:
Oui, nous allons connecter la broche de données du moteur directement aux 3 et 4 broches de l'Arduino. Un lecteur curieux du manuel Dynamixel (le voici ) remarquera immédiatement que la communication avec le monde extérieur au niveau du moteur est organisée selon la communication série asynchrone semi-duplex, ce qui signifie que la broche de données est immédiatement utilisée pour recevoir des commandes et pour répondre.
Par défaut, au niveau matériel, l'Arduino ne peut fonctionner qu'avec UART Full Duplex. Ce problème peut être contourné en utilisant la bibliothèque Soft Serial, ce que nous ferons. C'est l'utilisation du mode Half Duplex qui explique la connexion de la broche de données du moteur aux broches 3 et 4 du blindage en même temps.
En plus de la communication semi-duplex, travailler avec Dynamixel via Arduino présente quelques points intéressants qui peuvent ne pas être tout à fait évidents dès le début. Rassemblons-les tous.
Comment déplacer notre manipulateur?
1) Tout d'abord, téléchargez la bibliothèque requise. Il s'appelle ardyno et peut être obtenu via le gestionnaire de bibliothèque Arduino, ou ici ( lien )
2) Par défaut, Dynamixel AX-12A veut travailler avec un débit en bauds = 1000000. Cependant, l'interface série logicielle ne supportera pas cette vitesse, donc le débit en bauds doit être réduit à 57600. Ainsi, le début du fichier avec votre programme ressemblera à ceci:
#include "DynamixelMotor.h"
// communication baudrate
const long unsigned int baudrate = 57600;
SoftwareDynamixelInterface interface(3, 4);
3) Tous nos moteurs sont connectés en série les uns avec les autres. Alors, pour adresser chacun d'eux, vous devez connaître son identifiant? C'est vraiment le cas, l'objet DynamixelMotor reçoit deux paramètres lors de l'initialisation: l'interface (la même pour tout le monde, nous l'avons définie dans le paragraphe précédent) et l'id (tout le monde doit avoir différent, sinon le comportement du manipulateur sera très étrange)
DynamixelMotor motor(interface, id);
L'identifiant de chaque moteur devra être défini manuellement. Il semble que, étant connectés en série, ils auraient pu se calculer en utilisant les nombres de 1 à 6, mais ce n'est pas fourni. Par conséquent, vous devez connecter chaque moteur séparément à l'Arduino (en se déconnectant du reste) et exécuter le programme suivant:
#include "DynamixelMotor.h"
// communication baudrate
const long unsigned int baudrate = 57600;
// id of the motor
const uint8_t id=1;
SoftwareDynamixelInterface interface(3, 4);
DynamixelMotor motor(interface, id);
void setup()
{
interface.begin(baudrate);
delay(100);
// check if we can communicate with the motor
// if not, we turn the led on and stop here
uint8_t status=motor.init();
if(status!=DYN_STATUS_OK)
{
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
while(1);
}
motor.changeId(NEW_ID);
}
void loop()
{}
Au départ, tous les moteurs ont id = 1, c'est pourquoi nous indiquons en haut
const uint8_t id=1;
NEW_ID pour chaque moteur doit être remplacé par un nombre de 1 à 6 (oui, ok, le premier moteur peut être laissé seul). Nous les numérotons de bas en haut.
Hourra! nous avons un manipulateur à part entière que nous pouvons déplacer, et nous avons également un modèle 3D pour celui-ci. Vous pouvez prendre ROS et programmer des trucs sympas. Mais c'est déjà une histoire pour un article séparé (et non un). Cette histoire est terminée, merci de votre attention!