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.
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.
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;
}
}
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.
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.