Aller au contenu


cocothebo

Inscrit(e) (le) 11 oct. 2014
Déconnecté Dernière activité janv. 20 2019 10:35
-----

#101654 Utiliser un tableau 2 dimensions en paramètre d'une fonction

Posté par cocothebo - 18 janvier 2019 - 09:34

Ah oui le sizeof(Double) est pas beau :) D'ailleurs le sizeof(int) de la ligne du dessus est pas forcément toujours vrai, le premier c'est la taille de N pointeurs (souvent de la taille d'un int mais bon faut faire gaffe), bref un sizeof(int*) serait mieux.

 

Bah en fait le malloc il est pas à prendre en compte, c'est la fonction que tu veux réutiliser, l'initialisation du tableau c'est pour l'exemple.

 

Ce que j'aime bien dans cette solution c'est le fait de pouvoir utiliser qqc qui rappelle vraiment un tableau à deux dimensions et l'utiliser comme tel.

 

 

Pour la petite précision, effectivement on peut mettre "int t[l][c]" plutot que "int t[][c]", mais dans l'absolu ça ne sert à rien d'avoir la taille de la première colonne, on le voit quand on y accède de la façon "t[i*c+j]" qui n'utilise pas le nombre de ligne.

 

Après un peu de réflexion, je pense qu'on ne pourra pas utiliser un tableau static (int[][]) en entrée sur un int**, même si l'un peut se faire passer pour l'autre, dans l'absolu ces deux déclarations n'ont pas la même sémantique au final, l'un est vraiment un tableau (donc un espace mémoire de nbLigne*nbColonnes continu), l'autre un pointeur qui pointe sur un pointeur qui pointe vers un entier.

 

 

Même si j'ai pas eu bcp de temps, j'ai bien aimé, ça faisait longtemps que j'avais pas trop réfléchi à comment ça marche en vrai, et c'est la que je vois qu'il me manque quelques notions sur le fonctionnement interne du C.




#101642 Utiliser un tableau 2 dimensions en paramètre d'une fonction

Posté par cocothebo - 18 janvier 2019 - 05:15

Un malloc et on en parle plus hein ;)

 

mais même sans on peut faire relativement propre, même si le paramètre sera un int * et non int**:

// Passage d'un tableau à 2 dimensions (fonctionne !)
const int l=3;
const int c=2;
int t[l][c]= {{0, 1},
              {2, 3},
              {4, 5}};
void setup() { 
  Serial.begin(9600);
  readtab(&t[0][0], l, c);
  Serial.println();Serial.println();Serial.println();Serial.println();
  readtab((int *)t, l, c);
}
void loop() {}
 
void readtab(int *tab, int lg, int cl){
  for(int i=0; i<lg*cl; i++){
      Serial.print(tab[i]);
      Serial.print(" ");
  }
}

La version avec malloc et l'utilisation d'un int** (on peut faire avec un int* comme au dessus, mais faut changer les malloc):

// Passage d'un tableau à 2 dimensions (fonctionne !)
const int l = 3;
const int c = 2;
int t[l][c] = {{0, 1},
  {2, 3},
  {4, 50}
};
void setup() {
  Serial.begin(9600);
  int** myTab = malloc(l * sizeof(int));
  for (int i = 0 ; i < l ; i++) {
    myTab[i] = malloc(c * sizeof(double));
  }

  for (int i = 0; i < l; i++) {
    for (int j = 0; j < c; j++) {
      myTab[i][j] = t[i][j];
    }
  }

  readtab(myTab, l, c);
}
void loop() {}

void readtab(int **tab, int lg, int cl) {
  for (int i = 0; i < lg; i++) {
    for (int j = 0; j < cl; j++) {
      Serial.print(tab[i][j]); Serial.print(" ");
    }
    Serial.println();
  }
}

 




#101413 Détection de mouvement

Posté par cocothebo - 11 janvier 2019 - 02:48

Bonjour,

 

Pour fair de la détection d'entrée dans les cases, le plus simple reste de faire une "barriere laser", c'est très directif et à chaque fois qu'on coupe le faisceau (pe avec une hystérésis pour éviter de détecter plusieurs fois le même ajout), on ajoute un.

Attention avec des capteurs US, il ne faut pas qu'ils se perturbent, suivant l'agencement des cases ça peut être un problème.

 

Bien sur pour chaque case il faudra pouvoir détecter, mais si les cases sont toutes contigues, il suffira de faire un réseau de capteur (un par case sur la longueur et un par case sur la largeur) en croisant les détections on connait la case.

Sur 32 case en 8*4 par exemple on n'a besoin au final que de 12 détecteurs au lieu des 32.

 

A voir si il faut vraiment des lasers ou juste des leds haute luminosité directives, mais dans tous les cas même les diodes lasers très faible puissance ne coutent pas trop cher il me semble.

Mais si tu peux passer par des leds infrarouges (genre télécommande quoi), la ça ne coute que quelques cetimes la led et idem pour le récepteur et c'est minuscule.




#101406 Blabla divers

Posté par cocothebo - 11 janvier 2019 - 12:33

Ce n'est pas de la robotique, mais c'est tellement énorme que je n'ai pas résisté.

C'est une video issue d'un simu de vol non?

 

Le son semble très étonnant, quadn ils jouent à la "fusée" pas une poussière, etc.

 

Bon après même si c'est vraiment sur simu, ça n'enlève pas qu'il faut savoir piloter ce genre d'engins...




#101379 Projet SSI

Posté par cocothebo - 10 janvier 2019 - 02:13

Salut,

 

Ben la réponse "facile" c'est de savoir ta consommation moyenne puis après ben tu regardes ce qu'il faut pour tenir 10.5h.

Ex: tu trouves que ton moteur en croisière consomme 20W en instantané, pour 1h il faudra une batterie d'au moins 20W.h, pour 10h 10 fois plus.

 

Le plus imprécis dans tout cela sera d'estimer la pente moyenne et la vitesse moyenne, la consommation ne sera pas la même pour 1% et 3km/h ou 6% et 7km/h.

Si vous êtes en terminal, il va peut être falloir à minima expliquer les forces s'appliquant sur votre chariot pour expliquer la consommation "prévue", sinon ya aussi google qui donne la consommation pour une masse, vitesse, pente, accélération (qui doit surement pouvoir être oubliée si on considère que la marche est longue et presque régulière) et quelques autres paramètres (qui vous seront difficillement quantifiables, comme la résistance à l'avancement dues aux roues et le chemin, à l'aérodynamisme même si à cette vitesse c'est plus que négligeable, etc)

Attention quand même, si tu calcules la pussiance nécessaire pour faire avancer le chariot dans les conditions prévues, il faudra rajouter les "pertes" de la chaine de transmission (le moteur à une certaine efficacité, son controleur aussi) et prévoir un peu de marge parce qu'une batterie aura du mal à débiter sa capacité totale.

 

Je suppose que cdcf = cahier des charges fonctionnels?

 

Dans tous les cas, attention, pour moi vous commencez mal, si votre chariot est à l'échelle 1/3, oui les dimensions sont divisées par 3, mais non ça ne veut pas dire que le poids est seulement divisé par 3.

Juste pour l'exemple extrême, prend un cube d'1m de côté rempli d'eau. On a donc 1000L soit 1 tonne d'eau. A l'echelle 1/10, on a un cube de 10cm de côté, soit 1litre d'eau ou 1kg. Bref on a un facteur 1000 sur le poids, ce qui est facile à comprendre, on a divisé par 10 mais sur 3 dimensions, et 103 = 1000.

(Pour une surface c'est donc le carré de l'échelle, pour une surface le cube)

 

Bref tout cela pour dire que votre chariot si il était plein devrait subir une réduction de poids d'un facteur 33 = 27, dans la vraie vie, il y a du vide, donc le poids ne sera pas autant diminué, mais serait bcp plus faible que juste 3 fois moins.

Idem pour le poinds transporté, il pourra surement contenir un volume 27 fois moindre donc un poids environ 27 fois moindre.

 

Par contre pour la viteese, on applique le facteur d'échelle si on veut conserver la même impression de vitesse (la vitesse peut être exprimées en longueur du chariot par unité de temps, si la longueur diminue, la vitesse diminue proportionnellement).




#101353 Lego - Arduino Kame Quadruped

Posté par cocothebo - 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é.




#101322 Lego - Arduino Kame Quadruped

Posté par cocothebo - 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 :)




#100778 Comment faire un capteur de terrasse?

Posté par cocothebo - 13 décembre 2018 - 09:46

Bonjour,

 

Je pense que Mike m'a devancé sur la réponse.

 

Un petit bémol quand même, ne pas jouer avec des laser de plus de 1mW pour ça, c'est trop dangereux après (surtout en extérieur sans contrôle précis de la barrière), dans la vidéo, le laser fait 250mW il me semble, ce qui peut bruler quasi instantanément une rétine à quelques mètres (dizaine de mètres ?).

 

Bref moi j'essaierai plutot avec un fil enterré, genre à 10/15cm de la terrasse, enterré pas trop profond (allé parreil 10/15cm max), une tenison pulsée, ça fait un mini champ que tu pourras capter. Après en théorie c'est facile, à voir en vrai comment faire, mais toutes les tondeuses automatiques que j'ai déjà vue et qui peuvent par exemple suivre un chemin pour avoir 2 zones de tontes, utilisent le système de fil comme guidage.

(et ça ressemble bcp à la bande magnétique proposée plus haut, c'est juste actif au lieu d'être passif)




#100722 Comment faire un capteur de terrasse?

Posté par cocothebo - 11 décembre 2018 - 10:14

Salut,

 

Ya aussi en utilisant un fil électrique pour limiter la zone, tu fais passer une tension et ta un "récepteur" sur le robot, quand il capte suffisament le signal c'est qu'il est à coté.

 

Ou une barriere infrarouge laser, bref je pense qu'il y a pas mal de moyens, reste à voir le plus simple et durable (la bande magnétique, j'lui donne pas longue vie avec soleil pluie..)

 

Il me semble que les tondeuses robots du commerce utilise la technique du fil (soit pour guider soit pour limiter les zones)




#100278 Recherche d’une sonde à ultrason très précise ARDUINO

Posté par cocothebo - 20 novembre 2018 - 11:40

Salut,

 

A mon avis tu ne trouveras pas une sonde ultrason qui permette de faire cela, du moins à bas coût (ou même à Bakou).

Les capteurs de distance US pour la robotique ne sont pas faites (du moins pas de base) pour capter plus que le premier echo, je doute même qu'un second echo soit vraiment disponible vu la puissance d'émission.

 

Après la sonde professionnelle, ça m'étonne qu'elle ne soit pas "compatible" arduino, normalement presque tout l'est (desfois il faut un adaptateur). Cette sonde communique sur quelle interface et quel protocole?

 

Peut être que ce qu'il faut c'est changer le principe de mesure, mais cela demandera forcément du temps, de la calibration et surtout si c'est pour faire des mesures "opposables", il faut pouvoir montrer que la méthode fonctionne et savoir la marge d'erreur etc. bref un process qualité classique qui devient vite compliqué à metrre en oeuvre si c'est une méthode non qualifiée habituellement.

 

Bien sûr, si le besoin c'est d'avoir l'épaisseur et la non présence de bulle, il faut une méthode qui puisse "radiographier" la couche de béton, et ça c'est pas si simple, il faut trouver un type de rayonnement qui traverse au moins partiellement le béton et l'air et dont la reflexion est différente dans l'air et le béton. Dans l'absolu qu'elque chose qui est pratiquement complétement renvoyé par la fonte serait un plus.

C'est pour ça que la sonde utilisée est sur des US, ça coûte au final pas très cher comparé à par exemple des rayons X.

 

Bref soit tu utilises une sonde déjà éprouvée que tu motorises (c'est le plus facile), soit tu changes tout et ben en plus de la motorisation il faut trouver un capteur qui fonctionne comme voulu à un prix moindre, ce qui n'est surement pas facile.




#99650 Une nouvelle manière de développer des robots.

Posté par cocothebo - 30 octobre 2018 - 11:23

Super, merci pour la réponse :)

 

Et je n'aurais pas pensé que la cible soit justement des dev spéciaux. Je voyais plus cela comme une simplification pour "tout le monde" d'où mes interrogations.

 

Pour la comparaison KNX, je pense que votre système reste proche dans l'idée, surtout qu'un module KNX (vu comme une adresse) permet souvent des fonctions multiples ou permet de voir plusieurs actionneurs comme pour votre cas avec les servos.

C'est je trouve super, quoi pour la domotique ça me semble un concept vraiment important ce côté complétement décentralisé, en robotique j'avoue que j'ai un peu plus de mal à voir comment implémenter cela sur des projets complexes.

Et même si je ne suis pas complétement adepte du biomimétisme à tout va, on peut remarquer que les organismes à "intelligence" déportée sont plutôt des organismes assez simple, sinon ya quand même presque toujours (toujours?) un cerveau en chef d'orchestre.

Par contre effectivement un certain nombre de réactions sont réflexes et ne passe pas par ce cerveau, souvent les réactions primaires qui se doivent d'être très rapide.

 

Bref au final votre solution avec un module style Rasp PI pourrait être assez proche de "l'architecture" évoluée de la nature, un cerveau pour les traitements les plus complexes, mais un peu de réactions déportées pour quand les réactions se doivent d'être les plus rapide possible.

 

 

Une chose de sûre, je vais suivre vos développements!




#99633 Gato, mon petit quadrupède

Posté par cocothebo - 29 octobre 2018 - 04:26

A mon tour de ne pas être d'accord :P

 

La tu montres un robot qui effectivement utilise un mécanisme "en losange", mais avec deux degrés de liberté, c'est à mon avis complémtement différent d'un mécanisme qui n'en a qu'un.

 

D'ailleurs sur ces robots, les moteurs ne font jamais (il me semble) de tour complet, et on revient à une remarque que j'avais faite (pe sur le post du logiciel linkage), avec un seul degré de liberté (une rotation), le mécanisme ne peut pas "couper court" pour changer de position, pour aller d'un point A à B sur sa courbe, il n'a que deux choix, tourner dans un sens ou l'autre.

Avec deux, on est plus obligé de faire ce genre de compromis (moins obligé).

Puis surtout, avec deux, l'espace atteignable est vraiment meileur (si ya un caillou, on peut remonter la patte, ce qu'un mécnaisme avec un seul degré de liberté ne pourra faire).

 

 

Par contre continues tes recherches sur le domaine, je trouve cela intéressant, et d'ailleurs les robots de Theo Jensen sont vraiment impressionnants, j'ai toujours eu un faible pour eux mêmes s'ils ont énormément de limitations!




#99580 Une nouvelle manière de développer des robots.

Posté par cocothebo - 26 octobre 2018 - 10:19

Salut,

 

Surement beaucoup de travail sur le projet mais je reste circonspect sur le résultat et l'intérêt.

 

Peut être que j'ai raté quelquechose mais pour simplifier le truc, pour moi là on a un système de modules actionneurs/capteurs que l'on peut assembler facilement. Puis il faut une tour de contrôle qui n'est pas dans ces modules (le PC quoi, un PI).

Le gros avantage c'est que les modules s'assemblent sans difficultés, pas besoin de paramétrer des tonnes de trucs, mais après ça le gros d'un robot c'est pas d'arriver à controller un moteur ou lire l'état d'un potentiomètre, c'est de justement réaliser son "cerveau" et la je ne crois pas que la solution apporte énormément, plutôt cosmétique à mon avis, avec un environnement unifié qui permet d'avoir accès facilement aux modules dans un langage assez haut niveau.

(Je passe sur la conception mécanique vu que ça ne me semble pas du tout le sujet ici)

 

Bref la cible est qui? Parce que si je prends qqu qui veut faire de la robotique "sérieuse" (ie. les gens du forum quoi, pas des chercheurs ou autre, mais pas qqu qui veut juste refaire un AT-AT parce qu'il aime Star Wars), le plus long sera pas d'associer 10 servo et 5 capteurs, ce sera de faire fonctionner l'ensemble de façon cohérente.

Et pour celui qui veut jsute faire rapidemment un petit robot (pas péjoratif, sans se prendre la tête quoi), quel est l'avantage de la solution par rapport aux LEGO par exemple? Surtout que la on reste su du Python ce qui peut faire peur à des débutant, un langage graphique serait il me semble plus approprié.

Voila j'ai du mal à voir qui cela peut intéresser mais je me doute que vous y avez déjà pensé/étudié pour se lancer dans la création d'entreprise.

 

Ce qui serait top (à mon avis), c'est d'avoir quelque chose un peu comme le KNX pour la domestique, en gros un ensemble de modules indépendant qui sont capables de faire des actions sans avoir besoin d'un acteur principal, bref chaque module indépendant avec ses actions programmées pour lui.

Si je termine le // avec KNX, on fait une programmation globale (pas le choix faut bien y passer) mais chaque module reçoit son bout de code autonome.

 

Après attention, ne pas se méprendre sur mon discours ici, ce n'est pas faire juste du bashing parce que c'est top de voir des gens essayer de faire avancer le bouzin et surtout venir nous expliquer leur démarche ici!

Et je vous souhaite que la boîte fonctionne, je sais à quel point c'est difficile de monter et surtout faire vivre une boîte...




#99423 Projet RobEx pour passionné de robotique et de patrimoine - un nouvel espoir

Posté par cocothebo - 15 octobre 2018 - 09:02

Juste une question, ça vient d'ou cette idéee de "décontamination"?

 

Tu comptes visiter les entrailles de Tchernobyl (bon là c'est pas les bactéries le plus inquiétant)?

 

 

Parce que dans un châteu/maison/ce que tu veux d'abandonné, je ne vois pas ce qui te fait si peur. A mon avis, c'est moins risqué de visiter une ruine que de toucher son clavier d'ordi...

Ce que je veux dire c'est que sauf exception ou site officiellement "contaminé", je pense pas qu'il y ait plus de risque que de "jouer" dans la boue, ou se couper une taillant une haie ou autre.

 

Parce que truc habituel, décontaminé c'est bien, mais c'est très compliqué => gros risque d'émergence de résistances et c'est là ou les gros problèmes arrivent.

 

Autant pour le projet octupus je veux bien, un endroit qui reçoit les déjections d'animaux en quantité folle, c'est pas une mauvaise idée, mais un château à l'abandon...




#99374 Au bistrot du coin ...

Posté par cocothebo - 08 octobre 2018 - 01:03

Tiens suis pas vraiment d'accord, pour moi la marche (comme la marche humaine) c'est être capable de rattraper un déséquilibre permanent. Bon ok on pourrait dire que c'est un équilibre qui "bouge" mais bon pour moi la marche dynamique c'est une succession de chutes rattrapées.

 

Après c'est sur que pour la "base" en robotique c'est une marche purement stable mais c'est aussi ça qui fait que c'est pas du tout "humain".