Comment puis-je améliorer la carte dans mon robot autonome mobile à l'aide de KINECT


9

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:

aperçu du robot électronique du robot


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:

à quoi ressemble une carte de ma chambre Une autre carte ma chambre

Ceci est une représentation approximative de ma chambre actuelle:

entrez la description de l'image ici

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

Réponses:


1

Est-ce ce à quoi on pourrait s'attendre: en principe oui. Bien que vous puissiez améliorer votre modèle d'odométrie, en général, il ne suffit pas d'obtenir une bonne carte. Sans description de votre système, il est difficile de dire comment l'améliorer. Sur la plupart des systèmes, l'estimation de la translation est meilleure que la rotation. Vous pouvez ajouter un gyroscope et mesurer la rotation. Cela devrait améliorer considérablement vos résultats.

Au lieu d'implémenter vous-même un filtre à particules, vous pouvez utiliser une implémentation SLAM, par exemple depuis openslam . Cela devrait vous faire gagner beaucoup de temps et donnera très probablement de meilleurs résultats.


Vous me faites me sentir mieux en disant que c'est prévu: D, mais je suis vraiment convaincu que mon odométrie est très bonne, ( spécialement ma rotation : D). J'ai ajouté une mise à jour qui décrit brièvement le système (si cela ne suffit pas, je peux vous donner du code ou toute autre information). Je vais essayer d'utiliser un gyroscope demain, puis mettre à jour les résultats. J'adorerais utiliser les algorithmes d'OpenSlam, mais j'utilise C # (pour pouvoir utiliser le SDK officiel), et la plupart des bibliothèques pour ces tâches sont soit en C ++ soit fournies en ROS (Linux uniquement). Je serais certainement ravi de les utiliser, mais je ne vois pas de netteté!
Shreyas Kapur

tinyslam prétend utiliser 200 lignes de code c. Je suppose que le porter en c # ne devrait pas être si difficile.
Jakob

Hou la la! Mais je suppose qu'il n'utilise aucun filtre à particules et fait la même chose que je fais. Mais je vais certainement essayer de mettre cela en œuvre. Merci beaucoup :-)
Shreyas Kapur

1

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.


Merci pour la réponse, très bel exemple en effet, j'utiliserai sûrement EKF, mais le problème est que je ne suis pas mauvais en mathématiques, mais pas très bon aussi, et j'utilise C #, donc je n'ai pas de bibliothèques et je ne l'implémente pas moi-même me prendra des âges. Des suggestions à ce sujet?
Shreyas Kapur

Il vaudrait bien mieux rafraîchir vos mathématiques et suivre quelques cours que de faire quelque chose que vous ne comprenez pas et que vous ne pouvez pas déboguer. Apprenez-le et mettez-le en œuvre. Il sera certainement utile à l'avenir.
Naresh

Recherchez également les implémentations C # sur github. Le travail est plus populaire qu'il n'y paraît.
Naresh

Merci pour les suggestions, le fera sûrement demain. J'essaie de mon mieux pour apprendre les mathématiques, et j'espère le faire et je suis sûr que cela ira un long chemin. J'ai 13 ans ce qui est le goulot d'étranglement pour apprendre ici, nous n'avons même pas été initiés aux matrices à l'école! :-(
Shreyas Kapur

Je sais que tu as 13 ans :) L'Internet s'en fout. Vous pouvez vous procurer des matrices à la Khan Academy. Probabilité et statistiques également.
Naresh

1

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.


Merci pour votre réponse :-). Je me rends compte que le calcul des morts est erroné mais la carte que j'ai construite était à très petite échelle. J'ai déplacé le robot lentement et lentement pour minimiser autant d'erreurs que possible, le robot n'a pas bougé beaucoup. J'ai en fait étudié beaucoup d'algorithmes SLAM d'OpenSlam, mais comme je l'ai dit à Naresh, "Je ne suis pas mauvais en mathématiques, mais pas très bon aussi, et j'utilise C #, donc je n'ai pas de bibliothèques et je ne le mets pas en œuvre moi-même me prendra des âges. " Des suggestions à ce sujet?
Shreyas Kapur

Faites-vous du post-traitement avec les données Kinect? Il est possible que les données contiennent du bruit et si vous les laissez non traitées, elles pourraient invalider votre carte. Essayez de simplifier le problème. Laissez le robot immobile et cartographiez les murs devant lui. Comment ça marche maintenant? Si la carte est claire, cela signifie que le problème se produit à cause du mouvement. Sinon, le problème est beaucoup plus fondamental.
Demetris
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.