Les moteurs tournent à 2ms/deg et la simulation est à temps reel. Les mouvements paraissent réalisables mais je vais pouvoir vérifier tout ça pour de vrai et tout casser très bientôt !
- Forthman aime ceci
Posté par yougo
- 19 octobre 2020 - 11:31
Updates:
Après pas mal des tests pour avoir une marche qui est relativement stable et qui ne risque pas trop de détruire le robot je commence à avoir des résultats corrects (perfectibles mais corrects), pour rappel tout le contrôle du robot est 100% réalisé par un réseau de neurones entrainé grace à des méthodes de reinforcement learning comme expliqué plus haut.
Pour l'instant j'ai donc deux modes le mode "standby" qui maintient le robot au même point, et le mode "waypoint" qui amène le robot à un point [x, y], sur terrain plat pour le moment.
Ça fait du bien de voir le "bout tu tunnel" (il est encore long) je commençais à plus trop y croire honnêtement...
Posté par yougo
- 15 octobre 2019 - 09:03
Bonjour bonjour;
Avant de commencer j'aimerais excuser cette absence et ce manque de communication tout en vous prévenant que cela risque de rester comme cela pendant un petit moment encore. Les raisons sont purement personnelles et je ne veux pas les détailler pour le moment. En plus de ça j'ai la chance d'être maintenant en école d'ingénieurs en robotique et j'aimerais ne pas ratter mon diplôme, comprenez que cela rajoute un poids en plus dans la balance et enlève du temps pour travailler sur le projet.
Voilà,ceci dit, le projet est loin d'etre au point mort,donc permetez moi de vous informer sur l'avancement global !
Niveau hardware, il y a eu peu d'avancées, une V2 a été designée mais pas encore n'imprime ni testée hors des simulations... Oui, maintenant il y a des simulations, beaucoup de simulations.
En fait c'est bel et bien au niveau software que tout avance depuis 1 an et surtout ces derniers mois. Après avoir fini de construire un environement de simulation de walk-e pour faire interface avec ROS-Gazebo et OpenAI gym, j'ai enfin pu lancer les premiers entrainements de réseaux de neurones pour le robot.
OpenAI gym est un formidable outil utilisé pour faciliter la comparaison et l'utilisation de différents algorithmes de re-enforcement sur un même environement. Je m'en suis donc servi pour comparer plusieurs algorithmes, Q-learning, Deep-Q-learning, Deep Deterministic Policy gradient.
Tous ces algorithmes fonctionnent sur une base commune, si le robot fait une action que l'on juge "bonne" il est récompensé par son action, et un (ou plusieurs) réseaux de neurones (ou tables, pour le Q learning), apprennent les actions qui font gagner des récompenses au robot et optimisent ces actions pour qu'il en gagne un maximum.Votre façon de juger si votre robot fait des bonnes actions est donc cruciale et va déterminer tout ce qu'il va apprendre.
Ex de mauvais jugement: J'avais fait une fonction très basique comme : si le robot avance de x mètres, le récompenser de x*10
résultats, le robot faisait un grand saut en avant pour arriver le plus loin possible...
En bref, l'AI que vous êtes en train d'éduquer va essayer toutes les solutions pour gagner des points, et si elle est récompensée alors qu'elle ne le devrait pas, elle va essayer d'optimiser une solution qui ne serait pas la solution optimale et vous perdrez simplement votre temps. Pour pallier à ça vous pouvez:
Designer une fonction de jugement la plus parfaite possible.
Ajouter une part d'aléatoire, le plus utilise étant le processus d'Ornstein-Uhlenbeck.
Choisir son algorithme est tout aussi important :
le premier n'était pas du tout concluant et je le déconseille fortement si votre probleme est relativement complexe, les tables de Q learning ne permettent pas de stocker assez d'information pour apprendre à marcher par exemple. Cependant il est simple et formateur et est une porte d'entree pour apprendre le reinforcement learning.
Le DQN a permis au robot de faire ses premiers pas", c'est aussi là qu'il a appris à se jeter le plus loin possible la tete la première. Je ne me suis pas beaucoup attardé sur le DQN et je suis passé sur le DDPG pour plusieurs raisons :
le DDPG a un énorme avantage sur le DQN, il permet au robot de deviner la valeur de tous les angles à chaque moment, là ou le DQN ne peut qu'incrémenter/décrémenter un seul angle et attendre le moment t+1 pour réajuster un autre angle. De façon plus mathématique Le DQN permet de prendre des décisions discrètes alors que le DDPG permet de prendre des décisions continues.
Si vous êtes curieux tous ces algorithmes sont passionnants et je conseille de vous renseigner là-dessus. Commencez par les tables de Q learning puis le DQN puis le DDPG, car ils sont tous plus ou moins une amélioration du précédent.
Je suis donc en train d'expérimenter avec cet algorithme, le fameux DDPG, en fait j'ai fini de l'implémenter, je m'assure que les paramètres que le réseau de neurones ne peut pas modifier par lui-même (hyperparametres), comme le nombre de couches dans le réseau, le nombre de neurones et l'intensité du processus de randomisation des actions soient optimales pour que le robot puisse apprendre comme il faut. En fait je suis en train d'automatiser ce processus pour pouvoir suivre mes cours plutôt que de passer mes soirées à essayer de deviner un set de nombres en espérant tomber sur la parfaite combinaison .
Pour résumer grossièrement, là on en est au stade ou le robot passe des journées à essayer d'apprendre à marcher dans une simulation, pour l'instant le record est de 3 pas avant de s'effondrer au sol.
.
Ceux qui nous suivent sur twitter ont déjà pu voit les premiers entrainements du robot en simulation. J'aimerais faire une vidéo (travaillée cette fois) pour présenter tout ça quand le robot marchera d'une façon moins aléatoire dans les simulations (bientot esperons ).
Merci encore a tous ceux qui soutiennent le projet et encore désolé du manque d'info, je peux vous assurer que je donne tout ce que j'ai pour ce projet.
Posté par yougo
- 02 décembre 2018 - 01:06
Posté par yougo
- 31 octobre 2018 - 04:04
Salut,
Pour tous ceux qui n'auraient pas vu mais qui suivent ce sujet, il y a un questionnaire pour aider le projet juste ici :
Le lien du sondage :
Le post est ici si vous voulez en savoir plus :
https://www.robot-ma...walk-e-sondage/
Pour l'instant il y a juste 4 réponses, c'est un peu tristounet... Donc si vous avez un peu de temps n’hésitez pas a faire un tour dessus.
Merci d'avance !
Posté par yougo
- 28 octobre 2018 - 08:47
Posté par yougo
- 10 avril 2018 - 05:03
Non, tu as un GameObject qui flotte en forme de losange, tu cliques dessus et là tu peux modifier manuellement l'angle de chaque moteur !
Forcement le but n'est pas de faire ca manuellement mais avec du code c'est pourquoi dans le code il y a :
public void setAngle(int pvanglerech) { this.anglerech = pvanglerech; } //permet de changer l'angle visé
qui va te permettre d'agir sur le code a partir d'une autre classe
j'ai aussi mis le GO 'head' en kinematic, ce qui explique pourquoi le robot flotte dans le vide.
Posté par yougo
- 09 avril 2018 - 05:01
Salut les Makers !
//@walk-e Team //vous pouvez utiliser et modifier ce code comme bon vous semble using UnityEngine; using System.Collections; using System.Collections.Generic; using System; public class ScriptMoteur : MonoBehaviour { public HingeJoint hingeJoint3D; GameObject mainServo; private JointMotor motor; [Tooltip("Angle of the target servo in degrees")] [Range(-180f, 180f)] public float targetServoAngle; private float anglerech; //angle que le moteur cherche à atteindre //boucle qui va s'exécuter au lancement de la simu juste une fois void Start() { anglerech = targetServoAngle; this.motor = hingeJoint3D.motor; //unity a déjà prévu d'ajouter des moteurs surs la jointure //donc hingeJoint3D.motor est un moteur que l'on va pouvoir controler this.motor.force = 50; //on peut changer la force du moteur this.motor.targetVelocity = 0; //on peut changer la vitesse de rotation this.motor.freeSpin = false; //pour le laisser en roue libre this.hingeJoint3D.motor = motor; // hingeJoint3D.motor = motor pour que hingeJoint3D.motor prenne bien les modifs de motors //j'oubliais ca au debut donc forcement ca marche pas trop this.hingeJoint3D.useMotor = true; //on lui dit qu'elle doit utiliser le moteur Debug.Log("ServoMoteurEnAction"); } //ici c'est une boucle qui tourne tout le long de le sium à chaque rafraîchissement de l'ecran void Update() { //on calcule la distance entre this.hingeJoint3D.angle (angle actuel) et l'angle cible float distance = Mathf.DeltaAngle(this.hingeJoint3D.angle, targetServoAngle); //en fonction de ca on déduit le sens de rotation if (distance < 0) { motorActiv(-1); } else { motorActiv(1); } this.hingeJoint3D.motor = motor; //on oublie pas à la fin de void Update() de bien utiliser hingeJoint3D.motor = motor; sinon les modifs appliqués a motor ne s'appliquent pas } //un setter si jamais on veut changer l'angle cible dans une classe externe public void setAngle(int pvanglerech) { this.anglerech = pvanglerech; } //fonction 'principale' private void motorActiv(int way) { this.motor.targetVelocity = 100 * way; this.motor.force = 100; UpdateRotationLimits(way); hingeJoint3D.useLimits = true; } //on change juste les limites pour stoper le moteur void UpdateRotationLimits(int direction) { var limits = new JointLimits(); if (direction == 1) { limits.max = targetServoAngle; limits.min = 0; } if (direction == -1) { limits.min = targetServoAngle; limits.max = 0; } hingeJoint3D.limits = limits; } //ce qui suit fut trouvé sur internet (Open Source bien sur) ------------------------- float AngleFromAngle1ToAngle2Degrees(float angle1, float angle2) { angle1 = WrapAngleDegrees(angle1); angle2 = WrapAngleDegrees(angle2); if (angle2 - angle1 < 180 && angle2 > angle1) { return angle2 - angle1; } else if (angle2 - angle1 > 180 && angle2 > angle1) { return -(360 - (angle2 - angle1)); } else if (angle1 - angle2 < 180 && angle1 > angle2) { return -(angle1 - angle2); } else if (angle1 - angle2 > 180 && angle1 > angle2) { return 360 - (angle1 - angle2); } else if (angle1 - angle2 == 180) { return 180; } else if (angle2 - angle1 == 180) { return 180; } return 0; } // Convenience function to keep the angles in range from -360 to 360 static float WrapAngleDegrees(float angle) { angle = (float)Math.IEEERemainder(angle, 360); if (angle <= 0) { angle += 360; } else { if (angle > 360) { angle -= 360; } } return angle; } }
Posté par yougo
- 08 avril 2018 - 08:59
Je ne suis pas vraiment neutre a propos du premier point, mais je me permet !
-je pense que tant que vous restez sur de la marche STATIQUE, vous pouvez faire des trucs cool quelque soit la taille de votre robot sans trop vous prendre la tette.
-Pour moi il y a un point à ne pas négliger (sauf si vous prenez des plans qui existent) c'est la simulation 3D !
Je veux dire par la qu'il vaut mieux prendre 1 mois pour faire votre simu que de construire le robot tette baissée et au final voir que ca ne marche pas pour x raison (équilibrage du poids par exemple).
Ca peut paraître fastidieux mais je conseille vraiment ! Ca va peut-être vous sauver quelques €, et en plus vous serrez déjà prêt pour la simu quand vous voudrez faire votre prochain projet.
Posté par yougo
- 07 avril 2018 - 08:04
Salut,
Une petite vidéo pour illustrer ce que je dis dessus faite au téléphone et avec un son pas fou, je m'en excuse d'avance
Ca me permet de reprendre avec vous depuis le début, ici vous pourrez donc voir la toute première étape du robot qui était de se tenir debout sans les gyros.
Je vous laisse regarder, c'est la première fois que vous le voyez allumé il me semble :
voila c'est rien de sorcier, mais bon c'est cool quoi, on peut voir que les servos fonctionnent bien, que la taille du robot est assez cool aussi, qu'il est moche mais ca c'est sur le point de changer (on va le faire marcher avant de changer les design quand meme) .
Il n'est pas stable à 100% , c'est normal, il n'est pas fait pour, il est fait pour de la marche DYNAMIQUE, donc comme vous, êtres humains ! et tout comme vous quand on lui coupe ses gyros (qu'on vous éclate votre oreille interne),il est plus dur pour lui d'ajuster sa posture (il ne le fait pas du tout en fait)
Bref voila pour aujourd'hui (j'ai un peu plus de temps en ce moment je vais essayer de nourrir ce topic un peu plus)
Posté par yougo
- 31 mars 2018 - 05:21
Salut à tous,
Il y a quelques mois je voulais faire de la simulation pour Walk-e,
j'ai donc installé Anykode Marilou et tester un peu le logiciel, je n'ai pas vraiment apprécié, pas user friendly et la partie code est infecte à mes yeux.
J'ai donc décidé de chercher un peu, et puis je me suis tourné vers un logiciel gratuit, user friendly, avec une des plus grosses communautés :
UNITY !
Pour ceux qui ne connaissent pas, Unity est simplement une plateforme de game dev , qui comporte un moteur physique 3D vraiment simple à comprendre dont le code est en C# (ou JS comme vous voulez). Le plus c'est comme je l'ai dit : la communauté ! Impossible de ne pas trouver une explication à quoique ce soit en moins de 5 min sur internet.
Voici par exemple quelques tests du début de nos simulations :
/!\ ce ne sont pas des vidéos de grande qualité /!\
Le titre dit tout :
La fin est plutôt drôle
Et plus sérieusement les simulations servent vraiment énormément on a par example pu sortir les angles avec lesquels
le robot est stable naturellement sur la simu, l'appliquer en vrai, et BOUM ca marche, sans aucun programme de stabilisation
avec gyro ou quoi le robot tient debout.
Posté par yougo
- 30 mars 2018 - 07:36
Si jamais ce post intéresse encore des gens, j'ai pu discuter avec le vendeur et j'ai trouvé sa chaine YOUKU (YouTube de la Chine) si vous voulez voir les perfs des servos, il a pleinnn de produits je me suis dit que ca pouvait être cool, meme pour des rovers ou autre, enfin je vous laisse juger :
http://i.youku.com/i/UNTYxNTE2NzQ4/videos?spm=a2hzp.8244740.0.0
(bon courage pour naviguer sur le site par contre)
Et aussi en passant pour ceux qui se disent, "ouaiiiis mais aliexpress/ebay c'est pas fiable ..." sachez que ce vendeur m'a remboursé car je n'avais pas reçu son colis qui était au final perdu en route, donc ce n’était meme pas de ca faute.
Je dis ca car je vois pas mal de gens qui n'aiment pas commander en Chine par peur de se faire avoir, je comprends, je suis sur que des problèmes arrivent, mais sachez en tout cas que ce shop est fiable (Ca fait un peu pompeux mais c'est juste pour vous donner un retour d’expérience vu qu'on est à +- 15 commandes chez ce vendeur )
Voila, et si vous êtes intéressés, bientôt je pourrais vous donner les codes C# pour faire des simulations 3D des servos ASME-03A sur unity3D
Posté par yougo
- 12 novembre 2017 - 01:57
Salut les Makers,
Je vous joint ici la vidéo de Walk-e qui se tient debout, je tenais à vous le montrer en avance (avant qu'on tourne une vrai vidéo) car je suis plutôt content :
https://twitter.com/Projet_WALK_E/status/929489323371716609
Ceci grace à une MPU6050 tout à fait basique qui permet de faire les corrections en direct sur le robot
Vous pouvez noter la barre en metal qui traverse Walk-e, c'est en fait pour y accrocher les cables (en vert)
qui eux memes sont reliés au portique (blanc).
Ils permettent de le rattraper au cas ou il tombe (ce qui est arrivé quand meme pas mal de fois je vais pas vous le cacher hein )
Mais en aucun cas on soulage le poids du robot avec les cables verts, ils sont totalement lâche.
Pour information le robot est donc capable de lever son poids , mais en plus de ca une charge utile, pour l'instant je n'ai pas déterminé
combien exactement, mais en y accrochant sur la tette 3 bouteilles de lait (oui bon on fait avec ce qu'on a) il bronche pas.
[les bouteilles font 1L donc je suppose que ca fait du 3Kg]
Voila c’était les news du week-end
Posté par yougo
- 22 août 2017 - 06:06
On a fini a 100% le robot, maintenant on bosse le code !
Voici quelques photos pour le fun :
(prises avec un portable déso)
ici l'intérieur :
donc qui contient :
+raspb
+ arduino mega
+arduino nano
+ voltmètre
+relais
+ écran Oled
+ gyro/accéléromètre
+ Modules abaisseurs de tension
+Batterie
(juste ici )
l’extérieur est pas mal je trouve :
et comment on veut le tester : (oui oui c'est bien une tyrolienne )