Aller au contenu


Photo
- - - - -

Détecter les collisions avec un accéléromètre

BNO055 MPU6050 accéléromètre choc collisions

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

#1 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 409 messages
  • Gender:Male
  • Location:Paris

Posté 21 mai 2018 - 07:47

Je cherche un moyen de détecter les chocs lorsqu'un robot est en mouvement.

Détecter si le robot a buté sur un obstacle et agir en conséquence.

J'ai testé avec un NBO055. Je prend les valeurs brut de l'accéléromètre. Très simplement, j'arrive à obtenir les dépassement de seuils fixés arbitrairement. Là, j'ai cherché sur l'axe X. C'est la même chose sur l'axe Y. Au final, j'aurai besoin des 2 pour obtenir un vecteur sur le plan XY. Jusque là, pas de pb.

 

Le code de mon test :

Spoiler

 

Fichier joint  IMG_4310 2.jpg   134,55 Ko   26 téléchargement(s)

 

 

En dehors de la video, j'ai testé de bouger le BNO le long d'une règle avec une butée massive. A l'oeil, j'ai appliqué une vitesse toujours la même.  Mais je n'arrive pas à obtenir un cas reproductible. Je déclenche un choc pour une certaine vitesse. Et l'essai d'après, en allant plus vite, pas de dépassement du seuil au moment du choc ... J'ai testé des seuils sur la valeur d'accélération, sa dérivée , son intégrale, l'intégrale de la dérivée ... ne sachant plus quoi tester.

 

Je crois que je m'y prend mal. Vous auriez une solution simple pour donner un mouvement uniforme rectiligne que je pourrait stopper brutalement ?

 

Peut-être que j'aurai facilement ce mouvement uniforme sur le robot final. Mais je voudrait valider que la technique de détection des chocs est la bonne.

 


Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#2 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 018 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é 21 mai 2018 - 09:46

Un code que j'utilise perso pour ce genre de chose : 

void Accelerometer(int xaxis, int yaxis, int zaxis)
{
  static int oldx,oldy,oldz,vibration;                        // local variables used for impact detection
   
  vibration--;                                                // loop counter prevents false triggering cause by impact vibration
  if(vibration<0) vibration=0;                                // as robot vibrates due to impact
  
  if(vibration>0) return;                                     // until vibration has subsided no further calculations required
  
  deltx=xaxis-oldx;                                           // difference between old and new axis readings
  delty=yaxis-oldy;
  deltz=zaxis-oldz;
  magnitude=sqrt(sq(deltx)+sq(delty)+sq(deltz));              // magnitude of delta x,y,z using Pythagorus's Theorum
  
  oldx = xaxis;
  oldy = yaxis;
  oldz = zaxis;

  if (magnitude>sensitivity)                                  // has a new impact occured
  {
    vibration=devibrate;                                      // reset anti-vibration counter
    return;
  }
  else
  {
    magnitude=0;                                              // no impact detected
    deltx=0;
    delty=0;
    deltz=0;
  }
}
  

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 !

 

Les réalisations de Mike118  

 

 

 


#3 ashira

ashira

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 290 messages
  • Gender:Male

Posté 21 mai 2018 - 09:58

Tu devrais mettre ton module sur ton robot et voir ce que tu as comme bruit. 



#4 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 409 messages
  • Gender:Male
  • Location:Paris

Posté 21 mai 2018 - 10:43

Merci tous les 2 ^^

 

Ashira, en effet, ça me paraît plus simple pour observer le comportement réel.

 

Mike, si je comprend bien l'algo, on a 2 constantes à trouver pour le faire fonctionner :

- devibrate : il exprime un délai entre une collision et le test suivant de magnitude.

- sensitivity : c'est le seuil de magnitude qui détermine la collision.

 

Je vais tester ça ;)


Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#5 Melmet

Melmet

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 129 messages
  • Gender:Male
  • Location:Saint-Sozy (46200)

Posté 22 mai 2018 - 06:07

Apres y a aussi les détecteurs de vibration... liens


Ne demande jamais à un robot de faire ce que tu peux faire toi même. :nono: :laugh1:


#6 cocothebo

cocothebo

    Membre passionné

  • Membres
  • PipPipPip
  • 341 messages
  • Gender:Male

Posté 22 mai 2018 - 12:12

Salut,

 

Moi je travaillerais sur l'axe des Z, c'est plus simple. Après si ca marche sur un axe ça devrait être applicable facilement sur les autres.

 

Pourquoi sur Z, parce que tu peux choisir de faire "tomber" le module d'une hauteur fixe pour rester dans des conditions similaires. Ou autre possibilité, tu mets le capteur fixé dans une petite boite "dure" et tu fais tomber qqc dessus (genre boulon/ecrou) toujours d'une hauteur fixée, ça a l'avantage de ne pas risquer d'abimer ton module.



#7 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 018 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é 22 mai 2018 - 01:00

Merci tous les 2 ^^

 

Ashira, en effet, ça me paraît plus simple pour observer le comportement réel.

 

Mike, si je comprend bien l'algo, on a 2 constantes à trouver pour le faire fonctionner :

- devibrate : il exprime un délai entre une collision et le test suivant de magnitude.

- sensitivity : c'est le seuil de magnitude qui détermine la collision.

 

Je vais tester ça ;)

 

Oui exactement =)


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 !

 

Les réalisations de Mike118  

 

 

 


#8 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 409 messages
  • Gender:Male
  • Location:Paris

Posté 22 mai 2018 - 02:42

Merci ^^

Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#9 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 409 messages
  • Gender:Male
  • Location:Paris

Posté 22 mai 2018 - 06:36

Apres y a aussi les détecteurs de vibration... liens

 

Au début, j'ai pensé à faire un capteur d'accélération avec un pendule et utiliser un joystick tête en bas pour avoir la mesure sur le plan XY.

Si ça fonctionne, je trouve l'accéléromètre électronique plus facile à mettre en pratique :)

 

Pour ta solution, j'ai pas vraiment compris comment ça fonctionne.


Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#10 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 018 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é 22 mai 2018 - 06:59

 

 

 

Pour ta solution, j'ai pas vraiment compris comment ça fonctionne.

 

 

le code que j'ai proposé?


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 !

 

Les réalisations de Mike118  

 

 

 


#11 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 409 messages
  • Gender:Male
  • Location:Paris

Posté 22 mai 2018 - 07:18

@Mike, je répondais à Melmet :)

 

Sisi, je pense avoir compris :) Voilà le code que j'en ai fait. Je l'ai placé dans une méthode qui peut être appelée en boucle.

 

 

Je testerai sur le robot directement.

#ifndef BNOSensor_h
#define BNOSensor_h

#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BNO055.h>
#include <utility/imumaths.h>

#define SENSITIVITY 2.0
#define DEVIBRATE 5
#define BNO055_SAMPLERATE_DELAY_MS 10

Adafruit_BNO055 bno = Adafruit_BNO055();

class BNOSensor {
  public:
    BNOSensor();
    void init();
    boolean detectImpact();
  private:
    double oldAccelX;
    double oldAccelY;
    int vibration;
    unsigned long lastSampleTime;
};

BNOSensor::BNOSensor() {

}

void BNOSensor::init() {
  if (!bno.begin()) {
    /* There was a problem detecting the BNO055 ... check your connections */
    Serial.print("Ooops, no BNO055 detected ... Check your wiring or I2C ADDR!");
    while (1);
  }
  bno.setExtCrystalUse(true);
  lastSampleTime = millis();
}

boolean BNOSensor::detectImpact() {
  
  if(millis() - lastSampleTime < BNO055_SAMPLERATE_DELAY_MS) return false;
  lastSampleTime = millis();
  vibration--;                                                // loop counter prevents false triggering cause by impact vibration
  if(vibration<0) vibration=0;                                // as robot vibrates due to impact
  
  if(vibration>0) return false;                                     // until vibration has subsided no further calculations required

  // Possible vector values can be:
  // - VECTOR_ACCELEROMETER - m/s^2
  // - VECTOR_LINEARACCEL   - m/s^2
  // - VECTOR_GRAVITY       - m/s^2
  imu::Vector<3> vector = bno.getVector(Adafruit_BNO055::VECTOR_LINEARACCEL);
  double accelX = vector.x();
  double accelY = vector.y();
  
  double magnitude = sqrt( sq(accelX - oldAccelX) + sq(accelY - oldAccelY) );
  
  oldAccelX = accelX;                                              // store previous accelerometer readings for comparison
  oldAccelY = accelY;

  if (magnitude > SENSITIVITY) {           // has a new impact occured
    vibration=DEVIBRATE;                                      // reset anti-vibration counter
    return true;
  }

  return false;
}

#endif

Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#12 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 018 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é 22 mai 2018 - 07:52

Super ! Hâte de voir si ça répond à ton besoin ;)


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 !

 

Les réalisations de Mike118  

 

 

 


#13 olivthill

olivthill

    Membre occasionnel

  • Membres
  • Pip
  • 143 messages
  • Gender:Male
  • Location:Normandie
  • Interests:Robots humanoides.

Posté 22 mai 2018 - 10:41

Apres y a aussi les détecteurs de vibration... liens

Ce détecteur est moins pratique qu'un accéléromètre. Il ne s'agit que d'une boite contenant une bille métallique en contact avec une (ou deux peut-être) des quatre broches. Selon la position de la bille, telle ou telle broche est conductrice ou pas. Le nombre de possibilités est beaucoup plus restreint qu'avec un accélérateur. Donc on peut régler beaucoup moins finement la sensibilité. D'autre détecteurs sont encore plus simples en étant juste un tube contenant une bille encore qui ne donnera que deux valeurs, selon le côté où elle se trouve. Maintenant que les prix des accéléromètres ont beaucoup baissé et coûtent pratiquement le même prix que ces boites rudimentaires, il serait dommage de s'en priver.







Aussi étiqueté avec au moins un de ces mots-clés : BNO055, MPU6050, accéléromètre, choc, collisions

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

0 members, 0 guests, 0 anonymous users