Table des matières:

Véhicule autonome : 7 étapes (avec photos)
Véhicule autonome : 7 étapes (avec photos)

Vidéo: Véhicule autonome : 7 étapes (avec photos)

Vidéo: Véhicule autonome : 7 étapes (avec photos)
Vidéo: [Comment ça marche ?] Comment fonctionne une voiture autonome ? 2024, Novembre
Anonim
Véhicule autonome
Véhicule autonome
Véhicule autonome
Véhicule autonome

Ce projet est un robot de navigation autonome qui essaie d'atteindre sa position cible tout en évitant les obstacles sur son chemin. Le robot sera équipé d'un capteur LiDAR qui sera utilisé pour détecter des objets dans son environnement. Au fur et à mesure que des objets sont détectés et que le robot se déplace, une carte en temps réel sera mise à jour. La carte sera utilisée pour enregistrer les emplacements des obstacles qui ont été identifiés. De cette façon, le robot ne tentera pas à nouveau un chemin raté vers la position du but. Il tentera à la place des chemins qui n'ont pas d'obstacles ou des chemins qui n'ont pas encore été vérifiés pour les obstacles.

Le robot se déplacera par deux roues entraînées par un moteur à courant continu et deux roues pivotantes. Les moteurs seront fixés au bas d'une plate-forme circulaire. Les moteurs seront contrôlés par deux pilotes de moteur. Les pilotes de moteur recevront des commandes PWM du processeur Zynq. Les encodeurs sur chaque moteur sont tous utilisés pour garder une trace de la position et de l'orientation des véhicules. L'ensemble du système sera alimenté par une batterie LiPo.

Étape 1: Assemblage du véhicule

Assemblage du véhicule
Assemblage du véhicule
Assemblage du véhicule
Assemblage du véhicule
Assemblage du véhicule
Assemblage du véhicule
Assemblage du véhicule
Assemblage du véhicule

Le robot est propulsé par deux moteurs fixés aux roues latérales, puis supporté en plus par deux roues pivotantes, une à l'avant et une à l'arrière. La plate-forme et les supports de moteur étaient en tôle d'aluminium. Un moyeu de moteur a été acheté pour attacher les roues au moteur. Cependant, un coupleur intermédiaire personnalisé devait être fabriqué car le motif des trous du moyeu était différent du motif des trous de la roue.

Le moteur sélectionné était un moteur Port Escap 12V DC avec encodeurs intégrés. Ce moteur peut être acheté sur ebay pour un prix très raisonnable (voir nomenclature). Recherchez les mots-clés "12V Escap 16 Coreless Geared DC Motor with Encoders" sur ebay pour trouver le moteur. Il y a généralement une bonne quantité de vendeurs parmi lesquels choisir. Les spécifications et les brochages des moteurs sont indiqués dans les schémas ci-dessous.

L'assemblage du robot a commencé par une conception de modèle CAO du châssis. Le modèle ci-dessous montre la vue de dessus du profil de forme 2D conçu pour le châssis.

Il est suggéré que le châssis soit conçu comme un profil 2D afin qu'il puisse être facilement fabriqué. Nous découpons une feuille d'aluminium de 12"X12" dans la forme du châssis à l'aide d'un cutter à jet d'eau. La plate-forme du châssis peut également être coupée avec une scie à ruban.

Étape 2: Montage des moteurs

Moteurs de montage
Moteurs de montage
Moteurs de montage
Moteurs de montage

L'étape suivante consiste à fabriquer les supports de moteur. Il est suggéré que les supports de moteur soient fabriqués en tôle d'aluminium à 90 degrés. A l'aide de cette pièce, le moteur peut être fixé en porte-à-faux sur une face de la tôle à l'aide des deux

Les trous M2 du moteur et de l'autre face peuvent être boulonnés à la plate-forme. Des trous doivent être percés dans le support du moteur afin que des vis puissent être utilisées pour fixer le moteur sur le support du moteur et le support du moteur sur la plate-forme. Le support moteur est visible sur la figure ci-dessus.

Ensuite, le moyeu du moteur Pololu (voir la nomenclature) est placé sur l'arbre du moteur et serré avec la vis de réglage et la clé Allen fournies. Le modèle de trou du moyeu du moteur Pololu ne correspond pas au modèle de trou de la roue VEX, un coupleur intermédiaire personnalisé doit donc être fabriqué. Il est suggéré que la tôle d'aluminium utilisée pour fabriquer la plate-forme du châssis soit utilisée pour fabriquer le coupleur. La configuration des trous et les dimensions de ce couple sont illustrées dans la figure ci-dessous. Le diamètre extérieur et la forme (n'a pas besoin d'être un cercle) du coupleur en aluminium personnalisé n'ont pas d'importance tant que tous les trous s'adaptent à la pièce.

Étape 3: Création de la conception de blocs Vivado

Création de la conception de blocs Vivado
Création de la conception de blocs Vivado
Création de la conception de blocs Vivado
Création de la conception de blocs Vivado

- Commencez par créer un nouveau projet Vivado et sélectionnez le Zybo Zynq 7000 Z010 comme appareil cible.

- Cliquez ensuite sur créer un nouveau design de bloc et ajoutez l'IP Zynq. Double-cliquez sur l'adresse IP du Zynq et importez les paramètres XPS fournis pour le Zynq. Activez ensuite UART0 avec MIO 10..11 sous l'onglet MIO configurations, et assurez-vous également que Timer 0 et Watchdog timer sont activés.

- Ajouter deux AXI GPIOS à la conception du bloc. Pour GPIO 0, activez le double canal et réglez les deux sur toutes les sorties. Définissez la largeur GPIO pour le canal 1 à 4 bits et pour le canal 2 à 12 bits, ces canaux seront utilisés pour définir la direction du moteur et envoyer le nombre de ticks mesurés par l'encodeur au processeur. Pour GPIO 1, définissez un seul canal sur toutes les entrées avec une largeur de canal de 4 bits. Il sera utilisé pour recevoir les données des encodeurs. Rendez tous les ports GPIO externes.

- Suivant Ajouter deux AXI Timer. Rendez les ports pwm0 sur les deux temporisateurs externes. Ce seront les PWM qui contrôlent la vitesse à laquelle les moteurs tournent.

- Enfin, lancez l'automatisation du bloc et l'automatisation de la connexion. Vérifiez que la conception du bloc que vous avez correspond à celle fournie.

Étape 4: Communiquer avec le LiDAR

Ce LiDAR utilise un protocole SCIP 2.0 pour communiquer via UART, le fichier joint décrit l'intégralité du protocole.

Pour communiquer avec le LiDAR, nous utiliserons UART0. Le LiDAR renvoie 682 points de données représentant chacun la distance à un objet à cet angle. Le LiDAR balaye dans le sens inverse des aiguilles d'une montre de -30 degrés à 210 degrés avec un pas de 0,351 degrés.

- Toutes les communications vers le LiDAR se font avec des caractères ASCI, se référer au protocole SCIP pour le format utilisé. Nous commençons par envoyer la commande QT pour allumer le LiDAR. Nous envoyons ensuite la commande GS plusieurs fois en demandant 18 points de données à la fois à ft dans la FIFO UARTS de 64 octets. Les données renvoyées par le LiDAR sont ensuite analysées et stockées dans le tableau global SCANdata.

- Chaque point de données stocké correspond à 2 octets de données codées. Le passage de ces données dans le décodeur renverra une distance en millimètres.

Dans le fichier main_av.c vous trouverez les fonctions suivantes pour communiquer avec le LiDAR

sendLIDARcmd(commande)

- Cela enverra la chaîne d'entrée au LiDAR via l'UART0

recvLIDARdata()

- Celui-ci recevra les données après l'envoi d'une commande au LiDAR et stockera les données dans le RECBuffer

requestDistanceData()

- Cette fonction enverra une série de commandes pour récupérer les 682 points de données. Après la réception de chaque ensemble de 18 points de données, parseLIDARinput() est appelé pour analyser les données et stocker de manière incrémentielle les points de données dans SCANdata.

Étape 5: Remplir la grille avec des obstacles

Remplir la grille avec des obstacles
Remplir la grille avec des obstacles
Remplir la grille avec des obstacles
Remplir la grille avec des obstacles

Le GRID qui est stocké est un tableau 2D avec chaque valeur d'index représentant un emplacement. Les données stockées dans chaque index sont respectivement un 0 ou un 1, Aucun obstacle et obstacle. La distance carrée en millimètres que chaque index représente peut être modifiée avec la définition GRID_SCALE dans le fichier vehicle.h. La taille du tableau 2D peut également être modifiée pour permettre au véhicule de balayer une plus grande zone en modifiant la définition GRID_SIZE.

Une fois qu'un nouvel ensemble de données de distance est scanné à partir du LiDAR updateGrid() est appelé. Cela va parcourir chaque point de données stocké dans le tableau SCANdata pour déterminer quels index de la grille ont des obstacles. En utilisant l'orientation actuelle du véhicule, nous pouvons déterminer l'angle qui correspond à chaque point de données. Pour déterminer où se trouve un obstacle, multipliez simplement la distance correspondante par le cos/sin de l'angle. L'ajout de ces deux valeurs à la position actuelle x et y du véhicule renverra l'index dans la grille de l'obstacle. La division de la distance renvoyée par cette opération par le GRID_SCALE nous permettra de faire varier la taille de la distance carrée de chaque index.

Les images ci-dessus montrent l'environnement actuel des véhicules et la grille résultante.

Étape 6: Communiquer avec les moteurs

Pour communiquer avec les moteurs, nous commençons par initialiser les GPIO pour contrôler la direction dans laquelle le moteur tourne. Ensuite, écrire directement à l'adresse de base des PWM dans la minuterie AXI nous permet de définir des éléments tels que la période et le rapport cyclique qui contrôlent directement le vitesse à laquelle tourne le moteur.

Étape 7: Planification du chemin

A mettre en œuvre dans un futur proche.

En utilisant les fonctionnalités de grille et de moteur décrites précédemment, il est très facile de mettre en œuvre des algorithmes tels que A*. Au fur et à mesure que le véhicule se déplace, il continuera à scanner la zone environnante et déterminera si le chemin sur lequel il se trouve est toujours valide

Conseillé: