Accélération lorsque l'appareil est incliné

13

Je travaille actuellement sur un appareil qui utilise un accéléromètre 3D toujours activé (en utilisant une échelle + -2g) et un gyroscope 3D (en utilisant une échelle + -250g) -capteur.

Je peux lire tous les vecteurs possibles (X, Y, Z) et leurs accélérations (g) et taux angulaire (dps) ainsi que l'angle où se trouve actuellement l'appareil. Mais mon problème est que lorsque l'appareil est en inclinaison (0g en l'absence d'inclinaison), l'accélération est comprise entre (vers le bas) 0g -> - 1g ou entre (vers le haut) 0g-> 1g selon l'angle sous lequel l'appareil est actuellement. Ci-dessous, une image qui, espérons-le, efface l'idée.

J'espère que cela aide

L'appareil sera situé dans une voiture et devrait mesurer l'accélération lorsque la voiture ralentit (frein). Cependant, si l'appareil est déjà en inclinaison, l'accéléromètre mesurera une certaine accélération provoquée par l'inclinaison, ce qui rend difficile de dire si l'appareil a vraiment une certaine accélération ou est-ce juste l'inclinaison qui provoque l'accélération.

Les axes X et Y produisent 0g et l'axe Z est de 1g lorsque l'appareil n'a pas d'inclinaison et est sur une surface plane. L'inclinaison entraîne la lecture de l'axe X vers 1g si l'inclinaison est vers le haut et vers -1g vers le bas. Le + -1g est atteint lorsque l'appareil est à 90 * degrés de la position d'origine

J'ai réfléchi à la façon d'éliminer cette accélération causée par l'inclinaison et de mesurer uniquement l'accélération réelle de l'appareil, mais je ne peux tout simplement pas penser à sortir de ce problème avec les données suivantes que je peux produire.

Fondamentalement, je pense que si je pouvais seulement mesurer l'accélération de l'axe X (image) même si le capteur est incliné comme sur l'image.

J'espère que ce message n'est pas trop difficile à comprendre à cause de mes compétences en anglais et de la façon dont j'essaie d'expliquer mon problème.

jumbojohn
la source
2
Pourquoi ne mesurez-vous pas simplement quand il n'y a pas d'accélération intéressante et utilisez-le comme point de comparaison?
PlasmaHH
Je pense que cela ne fonctionnerait pas. Si l'appareil est parfaitement immobile, les axes X et Y sont 0g et l'axe Z 1g. L'inclinaison entraîne une lecture de l'axe X de -1g à 1g selon l'inclinaison, comme je l'ai dit. Le freinage entraîne une diminution de la valeur mesurée sur l'axe X (accélération négative, donc la voiture ralentit). Si l'appareil est déjà par exemple incliné vers le bas, c'est donc quelque chose entre 0g - (-1g) comment puis-je dire que ce n'est pas une accélération causée par le freinage?
jumbojohn
Pourquoi ne calculez-vous pas l'accélération totale de trois axes au lieu de simplement l'axe Y? Je pense que c'est quelque chose de basique pour considérer les trois axes correctement!? Quelque chose comme ça
charansai
Le LSM6DSM n'a pas de magnétomètre. D'où avez-vous obtenu ces informations? Je pense que vous utilisez en fait la carte X-NUCLEO-IKS01A1 de ST, qui a à la fois le gyroscope / accéléromètre LSM6DSM et un magnétomètre LIS3MDL.
MrGerber
@MrGerber Merci de l'avoir remarqué. C'était ma mauvaise pour avoir mal lu la fiche technique du capteur.
jumbojohn

Réponses:

18

Seulement un croquis d'une solution.

Tenez compte des 3 axes.

L'accélération due à la gravité, quelle que soit l'inclinaison, sera toujours de 1G, en tant que somme vectorielle de X, Y, Z, quelle que soit l'inclinaison. Vous pouvez imaginer l'accélération au repos ou le mouvement stationnaire comme un point sur une sphère de rayon 1G. (Si vous êtes parfaitement horizontal, ce point sera (0, 0, -1) c'est à dire directement en dessous de vous).

L'accélération due au freinage déformera la sphère elle-même; la somme vectorielle de X, Y, Z ne sera plus 1G.

Donc

UNE=X2+Oui2+Z2

UNE

UNEUNE

À moins que vous ne tourniez ou dérapiez également, vous avez donc besoin des entrées du volant et de l'ABS pour être sûr; cela devient un problème de fusion de données. Cette approche fournira une estimation de l'accélération. Pour vérifier et affiner cette estimation, combinez-la avec d'autres sources de données (également peu fiables), comme dans la réponse de Phil Frost, en utilisant un filtre de Kalman.

Brian Drummond
la source
En fait, je n'ai jamais travaillé avec un accéléromètre / gyroscope auparavant, donc la vue d'ensemble n'est pas entièrement claire sur la façon dont ces choses fonctionnent et les mathématiques ne sont pas l'une de mes compétences les plus fortes, j'apprécierais donc les conseils / clarifications, merci.
jumbojohn
Bien que correct, je soupçonne fortement que les marges d'erreur vont être importantes. N'oubliez pas non plus que l'accélération verticale déformera la sphère (par exemple les ralentisseurs, les nids de poule), vous devrez donc peut-être résoudre ce problème en fonction de l'application.
Chris H
Mais la gravité n'est pas constante si vous regardez assez fort . Alors que la route la plus élevée des États-Unis ne réduit que $ g $ d'environ 0,1%, le passage des pôles à l'équateur fait une différence de 0,5%. La géologie peut également faire une différence de cet ordre de grandeur . Probablement pas un changement de jeu, mais ne négligez pas l'étalonnage
Chris H
Il vous suffit de modifier le rayon de la sphère G en fonction de votre emplacement ou de le mesurer avant de mettre le moteur en marche; c'est un non problème. Je suis d'accord pour dire que les bosses doivent probablement être traitées avec les patins et la direction.
Brian Drummond
Calibrer avant de démarrer le moteur est le genre de chose à laquelle je pensais. Le calibrage devait être rapide cependant si le constructeur n'est pas alors l'utilisateur final.
Chris H
9

Votre principale erreur est de ne pas traiter l'accélération comme un vecteur unique. Lorsque la voiture est au repos, ce vecteur sera toujours de 1 g vers le haut. Ne regardez pas seulement la composante X des données brutes de l'accéléromètre. Faites le vrai calcul vectoriel.

Mais mon problème est que lorsque l'appareil est en inclinaison (0g en l'absence d'inclinaison), l'accélération est comprise entre (vers le bas) 0g -> - 1g ou entre (vers le haut) 0g-> 1g.

Non, c'est le point. Ce que vous dites peut être vrai pour la composante X de la sortie de l'accéléromètre, mais ce n'est pas vrai pour l'accélération lorsque la voiture est au repos.

L'accélération mesurée idéale sera toujours l'accélération réelle de la voiture (par rapport à la terre), plus l'accélération de 1 g due à la gravité. Ce dernier est toujours dans le sens ascendant. Si vous connaissez l'orientation de la voiture, vous pouvez soustraire ces 1 g dus à la gravité pour trouver l'accélération que vous recherchez réellement.

Notez qu'il y a une erreur considérable dans de telles lectures, en particulier des capteurs MEMS bon marché. Alors que vous devriez être en mesure de vous faire une bonne idée des événements à court terme comme une accélération ou un freinage brusque, ces données sont loin d'être suffisantes pour effectuer au mieux la navigation inertielle pendant plus de quelques secondes.

Olin Lathrop
la source
L'accélération (mesurée) due à la gravité ne sera-t-elle pas dans le sens "haut"? Comme dans, la lecture que vous obtiendrez de l'appareil au repos dans la gravité de la Terre sera la même que celle que vous obtiendrez en dehors de tout champ gravitationnel, mais en accélérant dans la direction (relative à l'appareil) "vers le haut"?
psmears
@psmears: Oui, vous avez raison. La force est vers le bas, mais l'accélération apparente est vers le haut. Fixé.
Olin Lathrop
5

Comme d'autres réponses l'ont indiqué, l'accéléromètre fournit un vecteur tridimensionnel qui est la somme de la gravité et des autres accélérations sur la voiture en raison du moteur, des freins ou d'autres forces agissant sur la voiture. Votre objectif est alors de soustraire l'accélération gravitationnelle de la sortie de l'accéléromètre pour trouver les autres forces restantes.

Pour une meilleure précision, vous ne pouvez pas supposer que la gravité est toujours "en baisse" par rapport à l'accéléromètre. Par exemple, la voiture peut être sur une colline. Tous vos calculs doivent être effectués avec des mathématiques vectorielles en trois dimensions, et vous devez avoir une estimation de l'orientation de la voiture afin de connaître la direction du vecteur de gravité à soustraire.

Un filtre de Kalman est une approche courante ici. L'idée est de prendre toutes les données dont vous disposez qui pourraient modifier l'orientation de la voiture, puis effectuer une moyenne pondérée des mesures, combiner cela avec ce que vous savez sur la physique agissant sur la voiture, pour arriver à une estimation probabiliste de la nouvelle orientation de la voiture et sens "descendant".

Plus vous disposez de données et plus vous pouvez modéliser avec précision la physique de la voiture, plus cette estimation peut devenir précise.

Par exemple, si vous avez un gyroscope et que vous mesurez le tangage de la voiture, vous pouvez prédire que le vecteur de gravité va tourner vers l'arrière de la voiture. À court terme, disons que lorsque la voiture vient de commencer à monter une colline, cela peut aider le vecteur de gravité à adopter rapidement la bonne orientation.

Vous pouvez également supposer que la voiture ne freine ni n'accélère en moyenne. Ainsi, une sortie filtrée passe-bas de l'accéléromètre pourrait alimenter l'estimation de la direction "vers le bas". Cela fournit une mesure à long terme non soumise à la dérive inertielle.

La combinaison des données de l'accéléromètre et du gyroscope pour estimer la direction de la gravité fournit ainsi une estimation plus précise que l'une ou l'autre mesure seule.

Vous pouvez en outre intégrer ce que vous savez de l'enveloppe opérationnelle possible du véhicule. Par exemple, la voiture ne peut pas monter ou descendre des collines trop raides, donc lorsque l'accéléromètre indique de tels angles extrêmes, vous pourriez la peser moins, en supposant que la majeure partie de sa sortie est due aux freins ou au moteur, pas à la gravité.

Vous savez si le conducteur freine, cela va déplacer le vecteur d'accélération, et vous pouvez le soustraire du composant "down" estimé.

Ou si vous avez des données GPS et cartographiques, vous pouvez incorporer une estimation de la pente de la voiture en fonction de l'emplacement. Si vous disposez de données de haute précision, vous savez peut-être précisément sur quelle colline se trouve le véhicule. Si vous ne disposez que de données de faible précision, cela peut toujours être utile. Par exemple, si la voiture se trouve au Kansas, les collines sont peu probables. Si la voiture est à San Francisco, les collines sont plus probables et vous pourriez donner à l'accéléromètre moins de poids.

Si vous avez des données sur la consommation de carburant et la vitesse, sachant que plus de carburant est consommé en montée, vous pouvez l'utiliser pour estimer la montée ou la descente de la voiture en fonction de l'efficacité énergétique.

Etc. Plus vous en savez, meilleure sera votre estimation.

Phil Frost
la source
3

Vous auriez besoin d'un algorithme de fusion et utiliser des accéléromètres 3D, des capteurs 3D-Gyro et 3D-Magnetic. Avec cet algorithme de fusion, vous obtenez l'attitude, la gravité de la terre sert de référence pour détecter l'horizon - angles de tangage / lacet / roulis. Les deux autres capteurs mag / gyro aident à filtrer le mouvement dynamique. Comme votre voiture tournera également à gauche / droite, .. la force centrifuge sera ajoutée. Une fois que vous avez l'attitude, vous pouvez soustraire le vecteur gravitationnel et démonter l'accélération résultante dans les trois axes.

Marko Buršič
la source
3

Comme approche très basique, vous pouvez utiliser un filtre passe-haut pour éliminer la partie constante de l'accélération (qui correspond à la gravité) et garder la partie variable qui est due à la dynamique de la voiture. Supposons que ce rawsoit un vecteur contenant vos mesures X, Y et Z, et accsoit l'accélération de la voiture sans gravité. alors

void correct_for_gravity(float *raw, float *acc)
{
   const float k = 0.9;
   static float gravity[3];

   gravity[0] = k * gravity[0] + (1 - k) * raw[0];
   gravity[1] = k * gravity[1] + (1 - k) * raw[1];
   gravity[2] = k * gravity[2] + (1 - k) * raw[2];

   acc[0] = raw[0] - gravity[0];
   acc[1] = raw[1] - gravity[1];
   acc[2] = raw[2] - gravity[2];
}

Les composants individuels de accsont toujours affectés par l'inclinaison, mais la norme vectorielle n'est pas:

norm_acc = sqrt(acc[0]*acc[0] + acc[1]*acc[1] + acc[2]*acc[2]);

Bien sûr, cette méthode n'est pas très précise, surtout si l'inclinaison change à un rythme élevé. C'est à peu près autant que les mathématiques naïves vous mènent. Si vous avez besoin d'une meilleure précision, découvrez comment utiliser un filtre de Kalman.

Dmitry Grigoryev
la source
1

La réponse réside dans la définition précise du "ralentissement" .

De votre question:

L'appareil sera situé dans une voiture et devrait mesurer l'accélération lorsque la voiture ralentit (frein).

Cependant, ralentir n'est pas synonyme de freinage . Il existe deux définitions possibles:

  1. La vitesse de la voiture par rapport au sol diminue.
  2. Les freins de voiture sont appliqués.

Cette différence est importante en montée et en descente. Dans les descentes, la vitesse de la voiture augmentera si les freins ne sont pas appliqués. Et en montée, la vitesse peut ralentir même sans freiner.

Il s'avère que la détection de 1. est beaucoup plus difficile que 2. Définissons les axes par rapport à l'orientation de la voiture: X: direction avant-arrière, Y: direction gauche-droite, Z: direction haut-bas. Tous les axes alignés sur la voiture.

Solutions:

  1. Pour la définition 1., la meilleure approche consiste à supposer que la vitesse de la voiture ne peut changer que dans la direction X. Alors l'accélération mesurée a = g + vg est l'accélération due aux forces contrant la gravité, et v est l'accélération due au changement de vitesse. Vous pouvez supposer que la longueur de g est toujours égale à 9,8 m / s² et que v est toujours dans la direction X. Donc (g_x + v_x, g_y, g_z) = (a_x, a_y, a_z) , ce qui donne v_x = a_x - sqrt ((9.8m / s²) ² - g_y² - g_z²) . Cela ne fonctionnera que tant que | v | est inférieur à | g |, ou en d'autres termes, l'accélération due au moteur ou aux freins est inférieure à 1G. Cela devrait être une hypothèse assez sûre à moins que votre voiture n'ait un propulseur de fusée.

  2. Pour la définition 2., vous pouvez simplement prendre la lecture de l'axe des x directement. Si la voiture n'accélère pas ou ne freine pas, la seule force contre la gravité qui agit sur elle est la force normale de la surface de la route. Cette force est toujours dans la direction z par rapport à la voiture, donc elle ne change pas la lecture de l'axe x. Les freins et le moteur n'agissent que dans la direction x et seront directement visibles dans cette lecture.

jpa
la source
0

Il semble que vous utilisiez un appareil "overkill" pour votre application. Vous devez utiliser un appareil qui ne mesure que l'accélération x & y, de cette façon, l'inclinaison n'aura aucun effet mesurable. Bien que l' accélération totale puisse être plus petite ou plus grande, en raison de l'inclinaison, l'appareil ne mesurera que les composantes x et y de l'accélération dans l'avion dans lequel se trouve le véhicule.

Guill
la source