Les premiers résultats de performance avec le M5Stack arrivent ! Le gain est énorme par rapport à MEGA, sur les fonctions mathématiques, et cela devient compatible d'une démarche cadencée à 5ms.
Temps de calcul de la trajectoire (Bezier&Trigo): 368us
Temps de calcul de la cinématique inverse (IK) : 93us
Temps transmission de la consigne de position et des limites en vitesse, courant et PWM aux servo Hip et Knee : 979us
Temps transmission du retour position, vitesse, courant et PWM des servo Hip et Knee : 2429us
Maintenant, c'est la communication avec les servo qui se traine un peu et c'est valable aussi bien pour le M5 que pour la MEGA ! C'est donc mon code. J'ai deux optimisations possibles.
1) la première consiste à transmettre les consignes aux deux servo en un seul message, et sans attendre d'acquittement.
Dans mon code Arduino, j'utilise la fonction write du protocole de communication. Il faut donc deux appels, un par servo. En plus, le servo acquitte cette commande avec un éventuel code d'erreur.
Je fais donc évoluer mon code pour utiliser la fonction sync write du protocole de communication. Un seul message, contenant toutes les consignes de tous les servos, suffit et les servos ne l'acquitte pas.
Illustration avant/après :
2) la seconde consiste à récupérer toutes les données feedback en un seul message par servo.
Dans mon code Arduino, j'utilise la fonction read du protocole de communication. Mais je récupère les informations une à une, et pour les deux servo successivement.
Je fais donc évoluer mon code pour utiliser la fonction read en mode burst. Un seul message, demandant toutes les informations utiles, pour chaque servo. L'acquittement renvoyé par le servo contient alors toutes les valeurs demandées.
Illustration avant/après :
Le résultat final est le suivant. Le temps d'émission des consignes et de récupération des informations de feedback (position réelle, vitesse, coutant, pwm) est plus que divisé par deux.
Temps de calcul de la trajectoire (Bezier&Trigo): 313us
Temps de calcul de la cinématique inverse (IK) : 73us
Temps transmission de la consigne de position et des limites en vitesse, courant et PWM aux servo Hip et Knee : 380us
Temps transmission du retour position, vitesse, courant et PWM des servo Hip et Knee : 1304us
Dans le cas d'un quadripède, le temps d'émission des consignes ne va pas augmenter beaucoup même si cela est en partie proportionnel au nombre de servo (taille du message contenant toutes les consignes). En revanche, pour le feedback, il faudra multiplier ce temps par le nombre de servo (compter 5ms pour 8 servos).
Note : Une optimisation consiste à récupérer le feedback de deux ou trois servo à chaque itération. il faut alors 4 itérations pour obtenir un feedback complet au prix d'une légère latence (20ms)... certainement acceptable.
Note : ma petite carte ne supporte pas encore la fonction sync read. qui permettrait encore de gagner un peu plus de temps pour le feedback. Ce serait une amélioration intéressante. Un peu complexe à développer au premier abord.
A suivre !