Pratique innovante, étude de cas d'un robot composite pour la cueillette et la table de sable pour l'éducation au transport

introduction

Nous avons déjà présenté les scénarios d'application des robots de cueillette et de tri de fruits, et aujourd'hui, nous présenterons les scénarios de cueillette et de transport de fruits par robot composite.

En tant que domaine technologique le plus en vogue, la robotique révolutionne les industries et stimule l'innovation mondiale. Pour répondre à la demande croissante de personnel technique spécialisé dans ce domaine en pleine expansion, Elephant Robotics a développé une solution révolutionnaire d'enseignement de la robotique pour les collèges et les universités. Cette solution innovante combine une machine automatique de cueillette de fruits simulée avec un robot composite pour le tri des fruits et l'automatisation de la livraison, offrant aux étudiants une expérience d'apprentissage complète dans le domaine technologique le plus en vogue et le plus tendance.

Jetons-y un coup d'œil avec l'ambiance de l'exploration! Avec quelques questions :

● 复合机器人应用场景是什么?
● 这个场景有什么用,能够让我们学到什么?
● 这个场景有什么特别的地方?

Robot composé : automatisation de la distribution et de la livraison des fruits

Ce qui est montré sur la figure est la scène d'application de la combinaison de robot composite, qui se compose des parties suivantes.

MechArm  270Pi *2
monAGV *1
Caméra 3D/Caméra de profondeur *1
Arbre fruitier simulé *1
Pièces structurelles 3D quelques
Écran *2
Clavier souris *2
Routeur _ _ *1

Vous vous demandez peut-être comment fonctionne la combinaison, quels sont ses composants et comment elle fonctionne . Suivez ensuite nos traces pour explorer cette chose inconnue.

Il s'agit d'un diagramme structurel d'une scène, présentant les composants du diagramme :

● myAGV+R1 Arm :复合机器人,由myAGV搭载mechArm 270-Pi机械臂


            ● Obstacle:障碍物,阻挡myAGV前行的物体。


            ● Tree:仿真模拟果树,树上有果实


            ● R2 Arm:  mechArm 270 Pi,六轴机械臂


            ● Loading Area: 复合机器人到达该位置,等待ARM将果实的装载


            ● Unloading Area:复合机器人到达该位置,进行卸载果实


            ● Collection Area:收集区,将负载的果实卸载到收集区与内

Le robot composite commence à courir à partir de la position initiale. Il navigue de manière autonome, évite les obstacles et se dirige vers la "zone de chargement". Une fois arrivé sur place, le bras R2 saisit le fruit de l'arbre fruitier et le place sur le robot composite. Le robot composite passe ensuite à la cible suivante "Zone de déchargement". Après l'emplacement, R1Arm place les fruits chargés dans la "Zone de collecte".

présentation du produit

Bras robotisé - mechArm 270 Pi

Il s'agit d'un petit bras de robot à six axes, avec Raspberry-Pi comme contrôle principal, ESP32 comme contrôle auxiliaire, et la structure est une structure symétrique centrale (imitation de la structure industrielle ). Le mechArm 270-Pi a un poids corporel de 1 kg, une charge de 250 g et un rayon de travail de 270 mm. La conception est compacte et portable, petite mais puissante, facile à utiliser et peut fonctionner en collaboration et en toute sécurité.

myAGV - Raspberry Pi 4B

myAGV est un robot à châssis mobile contrôlé par Raspberry Pi 4B. Il adopte des roues mécaniques de niveau compétition et une conception entièrement enveloppée avec un cadre en métal. Il dispose d'un algorithme SLAM intégré pour réaliser la cartographie radar et la navigation automatique. Évitement dynamique des obstacles et autres les fonctions. Le Raspberry Pi 4 modèle B dispose d'un processeur plus rapide , de plus de mémoire et d' une mise en réseau plus rapide , et il peut se connecter via plusieurs ports USB  3.0 et USB 2.0 , Gigabit Ethernet et réseau sans fil 802.11ac double bande pour une meilleure connectivité des périphériques externes et des performances réseau. . La communauté Raspberry Pi est actuellement l'une des meilleures communautés de développement de matériel au monde. Il existe de nombreux cas intéressants et des solutions communes pour les développeurs .

caméra de profondeur

Avec la diversité des scénarios d'utilisation, les caméras 2D ordinaires ne peuvent pas répondre à nos besoins. Dans la scène, nous utilisons une caméra de profondeur. Une caméra de profondeur est une caméra capable d'obtenir des informations de profondeur d'une scène. Il peut non seulement capturer les informations de couleur et de luminosité de la scène, mais également percevoir les informations de distance et de profondeur entre les objets. Les caméras de profondeur utilisent généralement des sources de lumière infrarouge

Il peut obtenir de nombreuses informations, telles que des images de profondeur, des images couleur, des images infrarouges et des images de nuages ​​de points.

Avec la caméra de profondeur, nous pouvons obtenir avec précision les informations de position et de couleur du fruit sur l'arbre fruitier.

Préhenseur adaptatif - Effecteur terminal du bras robotique

Le préhenseur adaptatif est un effecteur terminal utilisé pour saisir, maintenir ou serrer des objets. Il se compose de deux griffes mobiles, qui peuvent contrôler le degré d'ouverture et de fermeture et la vitesse d'ouverture et de fermeture grâce au système de contrôle du bras robotique. .

réalisation de la fonction

Préparatifs avant de commencer

Environnement du compilateur :

# for myAGV to realize some functions
ROS1 Melodic(Gmapping,AMCL,DWA)
# for robotic arm(mechArm 270) to realize some functions
numpy==1.24.3
opencv-contrib-python==4.6.0.66
openni==2.3.0
pymycobot==3.1.2
PyQt5==5.15.9
PyQt5-Qt5==5.15.2
PyQt5-sip==12.12.1
pyserial==3.5

Nous classons principalement deux parties pour l'analyse fonctionnelle. La première partie est l'analyse de la structure et de la logique de l'ensemble du projet. La deuxième partie est l'analyse fonctionnelle de myAGV. La troisième partie est le contrôle du bras robotique. Les deuxième et troisième parties sont divisé en les parties suivantes un point de fonction.

monAGV:

● 建图导航
● 静态动态避障

MechArm:

机器视觉识别算法
● 机械臂的控制和机械臂路劲规划

Commençons par l'analyse de la structure du projet.

structuration du projet

Nous utilisons une image pour décrire le processus de l'ensemble du projet, qui peut être analysé en combinaison avec l'organigramme mentionné ci-dessus.

Tout d'abord, myAGV se rend dans la "zone de chargement" et attend que le bras robotisé saisisse les fruits de l'arbre fruitier et les place sur myAGV, puis myAGV transporte les fruits vers la "zone de déchargement" pour transporter les fruits chargés sur myAGV vers la "zone de collecte".bras à réaliser. Ce qui précède est décrit comme un cycle. Lorsque les fruits sont déchargés, myAGV reviendra dans la "zone de chargement" pour charger les fruits. Une fois le chargement terminé, il déchargera les fruits et poursuivra le cycle.

Analysons ensemble quels problèmes doivent être résolus dans l'ensemble du processus. La question la plus intuitive est la suivante : lorsque myAGV arrive à un emplacement cible, comment le bras robotique sait-il quand le saisir ? Cela implique un problème de communication entre myAGV et le bras robotique .

communication

Nous devons comprendre ce qu'est notre produit. mechArm est un bras robotique fixe à six axes avec Raspberry Pi comme carte de contrôle, et myAGV est un robot mobile avec Raspberry Pi comme carte de contrôle. Donc, la meilleure communication à l'heure actuelle est d'utiliser le protocole TCP/IP pour y parvenir. L'une de nos bibliothèques de méthodes couramment utilisées s'appelle socket. Son principe de fonctionnement est très simple. L'établissement d'un serveur et d'un client est similaire à la fonction de chat d'ins, tw et whatsapp que nous utilisons maintenant. Les messages peuvent être reçus et envoyés.

Vous trouverez ci-dessous un code pour configurer le serveur.

Code:

classTcpServer(threading.Thread):
def__init__(self, server_address)- >None:
        threading.Thread.__init__(self)
        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.s.bind(server_address)
print("server Binding succeeded!")
        self.s.listen(1)
        self.connected_obj =None

        self.good_fruit_str ="apple"
        self.bad_fruit_str ="orange"
        self.invalid_fruit_str ="none"

        self.target = self.invalid_fruit_str
        self.target_copy = self.target
        self.start_move =False


classTcpClient(threading.Thread):
def__init__(self, host, port, max_fruit =8, recv_interval =0.1, recv_timeout =30):
        threading.Thread.__init__(self)

        self.good_fruit_str ="apple"
        self.bad_fruit_str ="orange"
        self.invalid_fruit_str ="none"

        self.host = host
        self.port = port

# Initializing the TCP socket object
# specifying the usage of the IPv4 address family
#  designating the use of the TCP stream transmission protocol
        self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        self.client_socket.connect((self.host, self.port))
        self.current_extracted =0
        self.max_fruit = max_fruit
        self.recv_interval = recv_interval
        self.recv_timeout = recv_timeout

        self.response_copy = self.invalid_fruit_str
        self.action_ready =True

Après avoir traité la communication, le problème entre myAGV et le bras robotique peut être résolu. Lorsque myAGV arrive à destination, il envoie un message "je suis ici" au bras robotique, et le bras robotique effectue la cueillette des fruits après avoir reçu ce message.

monAGV

Navigation cartographique

Les voitures d'aujourd'hui ont des fonctions de navigation et de conduite automatique , qui peuvent être utilisées dans la vie réelle pour réaliser une conduite sans pilote , mais cette technologie n'est pas encore parfaite. Alors qu'est-ce qui est utilisé pour réaliser les fonctions de navigation automatique et d'évitement d'obstacles utilisées dans le robot composite ?

ROS : Il s'agit d'un système d'exploitation de robot open source , qui fournit une série d'outils pour le fonctionnement du robot, et comprend également les packages de fonctions que nous mentionnerons plus tard, Gmapping, AMCL, DWA. ROS est un système d'exploitation robotique puissant qui fournit des bibliothèques et des outils riches, ainsi qu'une architecture modulaire flexible, rendant le développement d'applications robotiques plus efficace, flexible et fiable.

Dans la vie quotidienne, nous utilisons la navigation et nos opérations sont généralement : ouvrir la carte, saisir la destination et sélectionner l'itinéraire vers la destination.

Tout d'abord, si nous voulons réaliser une zone, nous devons disposer d'une "carte" de cette zone, que nous appelons "cartographie".

Le GPS (Global Satellite Positioning System) est utilisé dans divers systèmes de positionnement pour collecter avec précision des informations sur le terrain et créer une carte précise.

Cela implique un algorithme de mappage, Gmapping.

gmapping est un algorithme permettant de construire une carte de l'environnement sur un robot. Il s'agit d'un algorithme SLAM (Simultaneous Localization and Mapping) basé sur des données lidar, qui peut construire une carte environnementale en temps réel pendant que le robot se déplace, et déterminer simultanément la position du robot.

Ici, nous montrons comment créer une carte gmapping.

Mouvement réel de la carte

Interface ROS

Vous pouvez voir que sur la carte, myAGV obtient les données de l'emplacement actuel via le radar, vérifie l'environnement environnant et marque les obstacles sur la carte. Selon la scène que nous avons construite, une boucle fermée est formée dans le système et la cartographie est terminée.

Ensuite, nous utilisons la fonction de navigation, qui, comme son nom l'indique, est "navigation". La condition préalable à la navigation est la nécessité d'un positionnement (l'emplacement de myAGV), qui utilise l'algorithme ACML fourni par ROS.

L'algorithme AMCL est un algorithme probabiliste de positionnement de robot. Il est basé sur la méthode de Monte Carlo et la théorie du filtrage bayésien. Il estime la position du robot dans l'environnement en temps réel en traitant les données portés par le robot,des capteurs

L'algorithme AMCL réalise le positionnement adaptatif du robot à travers les étapes suivantes :

1. 初始化粒子集合:首先,在机器人初始位置周围生成一组粒子,代表机器人可能的位置。

2. 运动模型更新:根据机器人的运动状态和控制信息,更新粒子集合中每个粒子的位置和状态信息。

3. 测量模型更新:根据机器人搭载的传感器数据,计算每个粒子的权重(即代表机器人在该粒子位置时传感器数据与实际数据的匹配程度),并通过归一化处理,将权重转化为概率分布。

4. 重采样:根据粒子的权重,对粒子集合进行重采样,从而提高定位精度并减少计算复杂度。

5. 机器人定位:根据粒子集合的概率分布,确定机器人在环境中的位置,并更新机器人状态估计信息。

Lorsque nous utilisons la navigation pour choisir une destination, le logiciel de navigation nous fournira plusieurs chemins parmi lesquels choisir, mais ici fournira également plusieurs chemins parmi lesquels choisir, mais le système aide à faire le choix optimal. Deux concepts sont impliqués, la planification de trajectoire globale et la planification de trajectoire locale. La navigation fournit un ensemble de cadres, dans lesquels global_planner est le planificateur global et local_planner est le planificateur de chemin local. Certains messages entre eux, tels que la trajectoire du plan global, sont transmis à l'intérieur du cadre, et il n'y a pas de sujet à suivre. En général, le module de navigation de ROS fournit un mécanisme pour réaliser la navigation autonome du robot en sélectionnant différents planificateurs.

L'évitement d'obstacles statique et dynamique est intégré dans le cadre de navigation.

Fonction d'évitement d'obstacles de navigation

D'après la figure ci-dessus, nous pouvons voir qu'en plus du planificateur, le module de navigation comprend également cost_map, qui est une carte en grille, et comprend également des informations sur les obstacles statiques, ce qui signifie quelles zones peuvent passer et lesquelles ne le peuvent pas. Dans le même temps, les informations sur les obstacles dynamiques sont publiées via des rubriques de capteurs, puis le cost_map est mis à jour en temps réel pour réaliser l'évitement dynamique des obstacles. En plus de la carte, le module de navigation a également besoin d'informations de positionnement, qui sont fournies par le module amcl. Si vous souhaitez le remplacer par d'autres modules de positionnement, il vous suffit de publier le même sujet. Dans le même temps, tf informations sont également fournies , c'est-à-dire la relation de conversion entre différents capteurs, ce qui est très courant dans les robots. Les informations de pose du robot sont fournies par l'odométrie, y compris la vitesse et l'angle du robot, qui sont fournies au planificateur local pour planifier la trajectoire.

La principale force de la fonction d'évitement d'obstacles est l'algorithme DWA, qui est conçu pour permettre au robot de planifier et de suivre rapidement et en toute sécurité des trajectoires dans des environnements complexes et dynamiques. Plus précisément, l'algorithme DWA est implémenté selon les étapes suivantes :

● 生成候选速度:在机器人当前速度和方向的基础上,根据机器人的动力学限制和环境条件,生成一组速度和方向的候选值。
 ● 评估轨迹:对于每个候选速度,预测机器人在未来一段时间内的轨迹,并评估轨迹的安全性和可达性。
● 选择最佳速度:根据轨迹的评估结果,选择满足安全和可达性要求的最佳速度和方向,并将其应用于机器人的控制系统中。

Algorithmes de vision industrielle

Comme mentionné précédemment, les caméras 2D ordinaires ne peuvent plus répondre à nos besoins, nous utilisons donc des caméras de profondeur 3D. L'étalonnage de la caméra est nécessaire avant d'utiliser la caméra de profondeur. Tutoriel sur l'étalonnage de la caméra ()

Calibrage de la caméra :

L'étalonnage de la caméra fait référence au processus de détermination des paramètres internes et externes de la caméra par une série de mesures et de calculs sur la caméra. Les paramètres internes de la caméra incluent la distance focale, la position du point principal, le pas de pixel, etc., tandis que les paramètres externes de la caméra incluent la position et la direction de la caméra dans le système de coordonnées mondial, etc. Le but de l'étalonnage de la caméra est de permettre à la caméra de capturer et d'enregistrer avec précision des informations telles que la position, la taille et la forme des objets dans le système de coordonnées mondial.

L'objet cible est un fruit, qui a différentes couleurs et formes, comme le rouge, l'orange et le jaune. Si vous souhaitez saisir le fruit avec précision sans l'endommager, vous devez obtenir les différentes informations sur le fruit, telles que la largeur, l'épaisseur, etc., et le saisir intelligemment .

À l'heure actuelle, la plus grande différence entre le fruit cible est la couleur, de sorte que les cibles rouge et orange seront sélectionnées.En ce qui concerne la reconnaissance de la couleur de la machine, la gamme de couleurs HSV doit être utilisée pour détecter la cible . La partie suivante du code est utilisée pour détecter le fruit cible.

Code

classDetector:
classFetchType(Enum):
        FETCH =False
        FETCH_ALL =True

"""
    Detection and identification class
    """

    HSV_DIST ={
# "redA": (np.array([0, 120, 50]), np.array([3, 255, 255])),
# "redB": (np.array([176, 120, 50]), np.array([179, 255, 255])),
"redA":(np.array([0,120,50]), np.array([3,255,255])),
"redB":(np.array([118,120,50]), np.array([179,255,255])),
# "orange": (np.array([10, 120, 120]), np.array([15, 255, 255])),
"orange":(np.array([8,150,150]), np.array([20,255,255])),
"yellow":(np.array([28,100,150]), np.array([35,255,255])),# old
# "yellow": (np.array([31, 246, 227]), np.array([35, 255, 255])),   # new
}

Notre première étape consiste à détecter correctement le fruit cible, afin d'obtenir les coordonnées, la profondeur et d'autres informations de l'objet cible. Nous définissons les attributs, coordonnées et autres informations du fruit pour faciliter le stockage et le rappel ultérieurs.

code:

class VideoCaptureThread(threading.Thread):
    def __init__(self, detector, detect_type = Detector.FetchType.FETCH_ALL.value):
        threading.Thread.__init__(self)
        self.vp = VideoStreamPipe()
        self.detector = detector                  
        self.finished = True                      
        self.camera_coord_list = []               
        self.old_real_coord_list = []             
        self.real_coord_list = []                 
        self.new_color_frame = None              
        self.fruit_type = detector.detect_target  
        self.detect_type = detect_type            
        self.rgb_show = None
        self.depth_show = None

Enfin, ce que nous voulons obtenir, ce sont les coordonnées du fruit, qui peuvent être envoyées au bras du robot pour exécuter les coordonnées de saisie, et les coordonnées de profondeur sont converties en coordonnées mondiales, ce qui représente plus de la moitié du succès. , il suffit de combiner les coordonnées mondiales avec le système de coordonnées du bras du robot. En convertissant, les coordonnées de saisie du fruit cible peuvent être obtenues.

# get world coordinate
 def convert_depth_to_world(self, x, y, z):
        fx = 454.367
        fy = 454.367
        cx = 313.847
        cy = 239.89

        ratio = float(z / 1000)
        world_x = float((x - cx) * ratio) / fx
        world_x = world_x * 1000
        world_y = float((y - cy) * ratio) / fy
        world_y = world_y * 1000
        world_z = float(z)

        return world_x, world_y, world_z

A ce stade, nous réalisons la détection de l'objet cible, et renvoyons les coordonnées qui peuvent être saisies, et les transmettons au bras robotique. Nous abordons ensuite le contrôle du bras robotique et la planification de la trajectoire.

Contrôle du manipulateur et planification de trajectoire

En ce qui concerne le contrôle du bras robotisé, tout le monde peut avoir du mal au début à réfléchir à la manière de faire bouger le bras robotisé selon ses propres idées. Mais ne vous inquiétez pas, le bras robotique mechArm270 dispose d'une bibliothèque de contrôle relativement complète, et pymycobot n'a besoin que de quelques lignes de code pour faire bouger le bras robotique.

PS : pymycobot est une bibliothèque de pyhon, une bibliothèque utilisée pour contrôler le mouvement du bras robotique, nous utilisons la dernière version , pymycobot==3.1.2

#Introduce two commonly used control methods
'''
Send the degrees of all joints to robot arm.
angle_list_degrees: a list of degree value(List[float]), length 6
speed: (int) 0 ~ 100,robotic arm's speed
'''
send_angles([angle_list_degrees],speed)
send_angles([10,20,30,45,60,0],100)
'''
Send the coordinates to robot arm
coords:a list of coordiantes value(List[float]), length 6
speed: (int) 0 ~ 100,robotic arm's speed
'''
send_coords(coords, speed)
send_coords([125,45,78,-120,77,90],50)

Il y a deux bras robotiques dans la scène, chacun remplissant une fonction différente. L'un d'eux consiste à effectuer la cueillette des fruits et l'autre à effectuer le chargement et le déchargement des fruits.

Lors de la réalisation du contrôle du bras robotisé, il est nécessaire de concevoir la planification de la trajectoire du bras robotisé pour saisir le fruit. Après avoir obtenu les coordonnées du fruit, il y a des exigences pour le chemin du bras robotisé.Pendant le mouvement du bras robotisé, il ne peut pas heurter d'autres structures ou faire tomber le fruit.

Voici le code pour planifier le chemin :

#处理果实世界坐标的方法
deftarget_coords(self):
        coord = self.ma.get_coords()
whilelen(coord)==0:
            coord = self.ma.get_coords()

        target = self.model_track()
        coord[:3]= target.copy()
        self.end_coords = coord[:3]

if DEBUG ==True:
print("coord: ", coord)
print("self.end_coords: ", self.end_coords)

        self.end_coords = coord

return coord

La planification de la trajectoire du bras robotisé de chargement et de déchargement est également basée sur le même principe pour réaliser le processus de chargement et de déchargement.

Faits saillants techniques

Du point de vue de l'ensemble du projet, qu'il s'agisse de la navigation de construction de cartes de myAGV, de la fonction d'évitement automatique d'obstacles ou de l'algorithme de reconnaissance de machine par caméra 3D, de la planification de la résistance de la route du bras robotique ou de la communication entre myAGV et le bras robotique, traitement logique. Chaque point de fonction a quelque chose à apprendre.

Certains des algorithmes que nous utilisons dans le projet ne sont pas la méthode optimale. Permettez-moi de donner un exemple pour illustrer l'algorithme gmapping utilisé dans la carte de construction. En plus de l'algorithme gmapping, l'algorithme FastSLAM : l'algorithme FastSLAM est un algorithme de mappage basé sur un filtre à particules ; l'algorithme Topo logic al Mapping est un algorithme de mappage basé sur la topologie, qui exprime l'environnement comme la structure d'un graphe, etc. .

Comme le dit le dicton, "les machines sont mortes, mais les gens sont vivants." Nous pouvons choisir des méthodes en fonction de divers facteurs externes pour obtenir les meilleurs résultats. Dans ce processus, il est nécessaire d'apprendre et d'explorer en permanence.

Résumer

Avec le développement continu de la science et de la technologie , dans le monde futur. Les machines seront les plus grandes aides pour nos êtres humains, et la tendance future du développement sera également vers l'intelligence, la flexibilité, l'efficacité et la sécurité. La tendance de développement des voitures mobiles comprend principalement la navigation autonome, la planification intelligente des trajets, la perception multimodale, etc. ; la tendance de développement des bras robotiques comprend principalement l'apprentissage autonome, le contrôle adaptatif, la reconnaissance visuelle, etc. Dans le même temps, le développement de robots composites doit également résoudre le problème de coordination du mouvement et du fonctionnement, et améliorer les performances et l'efficacité globales du système robotique.

Notre mise en place de ce scénario d'application est également une opportunité pratique pour les makers et les étudiants qui aiment les robots. Permettre aux étudiants d'approfondir leur compréhension et leur compréhension du bras robotique à travers des opérations pratiques. En outre, cette scène peut également permettre aux étudiants d'apprendre et de maîtriser des technologies telles que le contrôle du mouvement des bras robotiques, la reconnaissance visuelle et la saisie d'objets, les aidant à mieux maîtriser les connaissances et les compétences pertinentes des bras robotiques. Cela peut également aider les étudiants à exercer leurs capacités telles que le travail d'équipe, la pensée novatrice et la pensée compétitive, et à jeter des bases solides pour leur développement professionnel futur.

Je suppose que tu aimes

Origine blog.csdn.net/m0_71627844/article/details/131656458
conseillé
Classement