Un petit aperçu de mon objectif
Je suis en train de construire un robot mobile autonome qui doit naviguer dans une zone inconnue, doit éviter les obstacles et recevoir des entrées vocales pour effectuer diverses tâches. Il doit également reconnaître les visages, les objets, etc. J'utilise un capteur Kinect et des données d'odométrie de roue comme capteurs. J'ai choisi C # comme langue principale car les pilotes officiels et sdk sont facilement disponibles. J'ai terminé le module Vision et PNL et je travaille sur la partie Navigation.
Mon robot utilise actuellement l'Arduino comme module de communication et un processeur Intel i7 x64 bits sur un ordinateur portable comme processeur.
Voici l'aperçu du robot et de son électronique:
Le problème
J'ai implémenté un algorithme SLAM simple qui obtient la position du robot à partir des encodeurs et ajoute ce qu'il voit en utilisant le kinect (comme une tranche 2D du nuage de points 3D) à la carte.
Voici à quoi ressemblent actuellement les plans de ma chambre:
Ceci est une représentation approximative de ma chambre actuelle:
Comme vous pouvez le voir, ce sont des cartes très différentes et donc vraiment mauvaises.
- Est-ce attendu de l'utilisation d'un calcul juste mort?
- Je connais les filtres à particules qui l'affinent et je suis prêt à l'implémenter, mais comment améliorer ce résultat?
Mise à jour
J'ai oublié de mentionner mon approche actuelle (que j'avais auparavant à oublier mais). Mon programme fait à peu près ceci: (j'utilise une table de hachage pour stocker la carte dynamique)
- Prenez le nuage de points de Kinect
- Attendre les données d'odométrie en série entrantes
- Synchroniser à l'aide d'une méthode basée sur l'horodatage
- Estimer la pose du robot (x, y, thêta) en utilisant des équations sur Wikipedia et des données d'encodeur
- Obtenir une "tranche" du nuage de points
- Ma tranche est essentiellement un tableau des paramètres X et Z
- Tracez ensuite ces points en fonction de la pose du robot et des paramètres X et Z
- Répéter
Je vous suggère d'essayer les filtres à particules / EKF.
Ce que vous faites actuellement:
-> Dead Reckoning: Vous regardez votre position actuelle sans aucune référence.
-> Localisation continue: vous savez à peu près où vous êtes sur la carte.
Si vous n'avez pas de référence et ne savez pas où vous vous trouvez sur la carte, quelles que soient les actions que vous entreprenez, il vous sera difficile d'obtenir une carte parfaite.
Par exemple: vous êtes dans une pièce circulaire. Vous continuez d'avancer. Vous savez quel a été votre dernier coup. La carte que vous obtiendrez sera celle d'une structure en forme de boîte droite. Cela se produira à moins que et jusqu'à ce que vous ayez un moyen de localiser ou de savoir où vous êtes précisément sur la carte, en continu.
La localisation peut être effectuée via EKF / Filtres à particules si vous avez un point de référence de départ. Cependant, le point de référence de départ est un must.
la source
Parce que vous utilisez le calcul à plat, les erreurs d'estimation de la pose du robot s'accumulent dans le temps. D'après mon expérience, après un certain temps, l'estimation de la posture de la mort devient inutile. Si vous utilisez des capteurs supplémentaires, comme le gyroscope ou l'accéléromètre, l'estimation de la pose s'améliorera, mais comme vous n'avez aucun retour à un moment donné, elle divergera comme auparavant. Par conséquent, même si vous disposez de bonnes données du Kinect, la construction d'une carte précise est difficile car votre estimation de pose n'est pas valide.
Vous devez localiser votre robot en même temps que vous essayez de construire votre carte (SLAM!). Ainsi, lors de la création de la carte, la même carte est également utilisée pour localiser le robot. Cela garantit que votre estimation de pose ne divergera pas et que la qualité de votre carte devrait être meilleure. Par conséquent, je suggère d'étudier certains algorithmes SLAM (par exemple FastSLAM) et d'essayer d'implémenter votre propre version.
la source