Aller au contenu


Photo

Lego - Arduino Kame Quadruped

Quadrupède Lego HC05 Oracid Kame servomoteur

  • Veuillez vous connecter pour répondre
28 réponses à ce sujet

#21 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 06 janvier 2019 - 04:46

Ce projet arrive donc à son terme. Je suis vraiment très satisfait.
Au début, les "spiders", c'étaient pas trop mon truc. Et puis, j'y ai pris goût et au final, je trouve que c'est un quadruped vraiment très efficace et facile à faire.

Bien entendu, je ne vais pas m'arrêter en si bon chemin et déjà, j'ai un autre projet en tête.
Devinez quoi ? Faire un quadrupède qui monte des escaliers !!! Si, si…



  • Mike118 et pmdd aiment ceci

#22 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 934 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 08 janvier 2019 - 07:02

Super ce robot! Hate de voir le prochain qui montera les escaliers ;) 
Du coup le code final utilisé c'est celui qui est présenté ici ?

 

Bonne continuation pour la suite ! =)

 

 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#23 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 08 janvier 2019 - 09:01

Super ce robot!

Merci Mike.

Pour le code, je l'ai mis sur GitHub. C'est une première pour moi.
https://github.com/o...ruped-kinematic
Mais si quelqu'un préfère le voir ici, pas de problème.

#24 cocothebo

cocothebo

    Membre passionné

  • Membres
  • PipPipPip
  • 341 messages
  • Gender:Male

Posté 08 janvier 2019 - 10:05

Sympa le résultat même si tu pourrais encore bcp l'améliorer, par exemple (et ça peut servir pour le quadrupède grimpeur), ne pas dépendre d'une cinématique complètement fixe mais s'adapter (un peu) aux conditions.

Certes c'est compliqué je pense mais pour monter les escalier je me dis qu'une cinématique complètement fixée ne fonctionnera pas bien...

 

Pour le programme, j'ai l'impression que tu te compliques quand même franchement la vie, du moins ça me semble bien compliqué (ou c'est moi qui n'ai rien compris :P), quoi c'est surtout l'utilisation de pointeurs qui alourdissent les notations. Moi j'applique toujours le paradigme "un pointeur sauf si nécessaire = problèmes".

 

Je ne comprends pas pourquoi tu dois avoir 3 boucles imbriquées pour parcourir ton tableau à deux dimensions. Dans ma compréhension, tu a une ligne par servo, chaque ligne a les différentes positions (finales il me semble), et donc tu mets à jour chaques servo puis passe à la valeur suivante. Mais pour cela une double boucle imbriquée devrait suffire donc qqc doit m'échapper...

 

 

Dans tous les cas continues tes recherches j'aime bien lire l'évolution :)


  • Oracid aime ceci

#25 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 09 janvier 2019 - 07:26

et donc tu mets à jour chaques servo puis passe à la valeur suivante.

Et non ! Je boucle également sur chaque case du tableau. Les servos progressent de degré en degré.
Concrètement, les 8 servos fonctionnent simultanément. Quand ils ont avancé d'un seul degré, c'est au suivant d'avancer etc.

Les pointeurs, c'est très intéressant pour faire des boites noires. Nul besoin d'en comprendre le contenu.
Pour le reste, tu as parfaitement raison.
Au début, je vais sans doute un peu tricher, mon quadruped sera programmé pour monter mes escaliers qui somme toute sont standard.
Après, on verra. Mais ce ne sera déjà pas si mal. Non ?

#26 cocothebo

cocothebo

    Membre passionné

  • Membres
  • PipPipPip
  • 341 messages
  • Gender:Male

Posté 09 janvier 2019 - 12:03

Les pointeurs, c'est très intéressant pour faire des boites noires. Nul besoin d'en comprendre le contenu.

Oui dans l'absolu un pointeur c'est une adresse mémoire, ce qu'il y a derrière est dépendant du programme, par contre ce côté justement boite noire est vite "dangereux" pour la compréhension, la maintenabilité (et la sécurité), etc.

 

Passer des pointeurs sur des entiers n'a pour moi d'intérêt que quand on veut travailler sur la valeur d'origine et non sur une copie de la variable. Dans ton cas, tu passes juste des longueurs qui ne sont pas changées, le pointeur ne fait qu'alourdir beaucoup les notations et demande plus de "travail" au processeur pour éxécuter le programme (bon sur un exemple simple c'est pas trop grave, mais si on complexifie les choses, ça dégrade les performances, sauf si le compilo est suffisamment intelligent pour optimiser cela mais j'en suis pas sur).

 

A noter aussi que souvent un int * toto en C c'est une des manière de déclarer un tableau, ça peut aussi porter à confusion.

 

 

Au début, je vais sans doute un peu tricher, mon quadruped sera programmé pour monter mes escaliers qui somme toute sont standard.
Après, on verra. Mais ce ne sera déjà pas si mal. Non ?

Ah oui hein loin de moi de dire que ce n'est pas bien ce que tu fais, comme dit dans mon message précédent j'apprécie lire tes avancées, problèmes, résolutions c'est super et faut continuer ;)

Et tu as raison il vaut mieux commencer par simplifier puis aller en complexifiant, je me disais juste que comme tu as maintenant la base, tu pouvais améliorer certains points. Et aussi que suivant la précision mécanique, je me demande si une cinématique toute prédéfinie sera suffisante mais la justement si tu le testes on saura :)



#27 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 09 janvier 2019 - 02:22

Pour les pointeurs, il y a quelques années, c'était le graal.
Avec l'avènement de Java, c'est passer de mode. C'est peut-être une question de génération.

J'ai pas mal programmé en Macro Assembleur IBM 370. J'avais déjà programmé un peu en C. Quand je suis arrivé dans cet environnement, j'ai été surpris de voir que tout le monde programmait avec des pointeurs sans en avoir conscience, sans même savoir ce que c'était.
Certains avaient 20 ans de métier et n'étaient absolument pas intéressés par l'informatique. Quand à la micro-informatique, n'en parlons pas. Ils faisaient ce boulot parce que c'était bien payé.
Je me rappelle d'une chose, ils voulaient tous programmer en Cobol. Le Cobol pour eux, c'était la classe au-dessus, seuls les meilleurs étaient sélectionnés.
Pour ceux qui l'ignorent, le Cobol est sans doute le language le plus nul (et le plus utilisé) qui est jamais existé. C'est mon avis, et je parle en connaissance de cause.

Je n'ai aucune compétence en technique des langages, mais à ma connaissance, le noyau UNIX est fait en C, pur et dur.(Windows aussi, je crois.)
J'ai travaillé quelques années sur UNIX et j'ai du mal à imaginer que quelque soit la fonction, le passage de paramètres se face autrement qu'en pointeur.
J'ai quelques bouquins sur différents sujets, en C, dans mon grenier, des gros pavés le plus souvent. Tous, sans exception utilisent des pointeurs.

L'argument en faveur de l'utilisation des pointeurs, c'était la rapidité et la concision du code.
C'était peut-être faux. Je ne sais pas ! Je suis complètement ignorant de ces choses là.

#28 cocothebo

cocothebo

    Membre passionné

  • Membres
  • PipPipPip
  • 341 messages
  • Gender:Male

Posté 09 janvier 2019 - 04:19

Oula attention, je dis pas qu'il ne faut pas utiliser les pointeurs, les pointeurs c'est une adresse en mémoire (que ce soit dans la pile ou dans le tas).

Il y a beaucoup de cas où c'est utile voir indispensable, mais je maintiens si on veut passer une information genre un entier dont on ne veut pas conserver les modifications, un pointeur est inutile.

 

Quand on écrit une fonction on peut passer les paramètres de deux façon:

  • par valeur: c'est le cas par défaut (sans pointeur quoi), dans ce cas le paramètre passé est une copie du paramètre dans la fonction appelante (mère). Toute modification de celui ci ne sera donc pas visible en dehors de la fonction fille. 
  • par référence: avec un pointeur. La on passe l'@ mémoire ou est stocké la donnée, si on modifie cet espace mémoire, la modification se faisant sur la valeur "initiale", même en sortant de la fonction fille, la modif est gardée.

En pratique on utilise le passage par valeur que sur des types simples, sinon la recopie de la valeur coute du temps et surtout de la place mémoire (en pile). Quoi après ça dépend pour le temps, puisqu'on ajoute une indirection (on à l'adresse de la valeur pas la valeur directement, donc il faut d'abord lire l'adresse puis y aller), dans ton exemple je suis presque sur que ça perd du temps (après faudrait mesurer pour être sur), en règle générale ça gagne du temps de passer par référence (au moins sur l'appel de fonction).

 

Pour linux / WIndows oui c'est (en partie) du C, un exemple (le premier fichier C dans le kernel, je connaissait meme pas son existence) dans le kernel : https://github.com/t...r/kernel/acct.c, regarde la fonction  check_free_space (ligne 101), le paramètre est un pointeur parce que dans le code on modifie l'objet passé (par exemple ligne 116/123/128) et aussi parce que c'est surement un objet créé dans le tas.

 

Par contre dans ce même fichier ligne 315, la fonction encode_comp_t prend en paramètre un long directement, parce que dans ce cas la valeur n'étant pas modifié dans la fonction c'est plus simple.

 

 

 

Par exemple, le passage par valeur des paramètres:

int maFonctionParValeur(int valeur) { 
  valeur++;
  return valeur
}

Le passage par référence sera:

int maFonctionParReference(int* valeur) { 
  (*valeur)++;
  return *valeur
}

Maintenant, considérons le programme appellant suivant:

int val = 0;

print(maFonctionParValeur(val));     // On affiche ce que retourne la fonction, ici 1

print(val);                          // on affiche ce que vaut notre variable val, ici 0
                                     // la fonction précédente n'a pas changé notre variable

print(maFonctionParReference(&val)); //on affiche ce que retourne la 2eme fonction, ici 1

print(val);                          // on affiche ce que vaut notre variable val, ici 1
                                     // parce "val" a été passé par référence et non par valeur

Moi franchement je ne suis pas dogmatique mais plutôt pragmatique. Je ne sais pas si les pointeurs sont ou ne sont pas à la mode, de toute façon ils sont nécessaires (que ce soit en Java, même caché ou un langage comme C ou c'est très visible), et c'est vrai dans tous les langages ou on peut gérer la mémoire.

Les pointeurs sont pratiquement obligatoires sur un programme, mais il vaut mieux les éviter quand pas nécessaire.

 

Le cas le plus courant c'est par exemple si dans ton code au lieu d'appeller Kinematic avec toutes les références 

Kinematic(&lgTab, Tab1[0], &nbSrv, &Speed, &Foot, &SrvAdjust[0] );

tu oublies un "&", la c'est le drame, un gros risque d'avoir la fameuse "Segmentation Fault".

Evidemment dans ton cas le code est suffisamment petit pour que ce soit facilement détectable, sur un gros projet ça peut devenir un peu plus compliqué.


Modifié par cocothebo, 09 janvier 2019 - 04:29 .

  • Mike118 et R1D1 aiment ceci

#29 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 09 janvier 2019 - 07:33

Tout ce que tu dis semble se tenir.
Dans mon prochain programme, je tiendrai compte de tes remarques.
Merci pour ces explications.

 

Du coup discutons ici de la façon de gérer ce tableau 2 dimensions en paramètre de la fonction 

 

Une fois la meilleure solution trouvée le code mis à jour pourra être proposé dans ce fil. 







Aussi étiqueté avec au moins un de ces mots-clés : Quadrupède, Lego, HC05, Oracid, Kame, servomoteur

0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users