La cible est l'angle dans le système de coordonnées bidimensionnel J'écris un programme avec un angle de -180 ° à 180 °, mais je pense qu'il peut être de 0 à 360 ° avec un peu de réécriture.
Dans mes recherches de maîtrise, je crée une application de positionnement en intérieur sous Android (Java) et j'utilise un filtre à particules. Parmi eux, il fallait prendre l'opération de moyennage des vecteurs d'état de chaque particule. Il existe trois vecteurs d'état (x, y, θ), dont (x, y) peut être simplement divisé par le nombre, mais l'angle ne fonctionne pas en raison du problème de périodicité (décrit plus loin). Alors je l'ai fait moi-même
Il est expliqué en détail avec des chiffres sur le site suivant http://d.hatena.ne.jp/ootanAW/20111030/1319981509 En termes simples, la moyenne de 350 ° et 10 ° (à l'angle défini par [0 ° ~ 360 °]) est de 180 °, non? Mais vu la périodicité, je veux que la moyenne soit de 0 ° Cette fois, je pense à [-180 ° ~ 180 °], mais le même problème se produit.
Selon le site de ↓, il semble y avoir une méthode pour convertir une fois l'angle en vecteur sur le cercle unitaire, le synthétiser, faire la moyenne des vecteurs, puis le reconvertir. https://staff.aist.go.jp/toru-nakata/averageangle.html
La procédure est la suivante
C'est pourquoi je l'ai écrit Il est également téléchargé sur gist, alors n'hésitez pas à l'utiliser (je vous serais reconnaissant si vous pouviez signaler des lacunes).
Angle_average.java
import java.lang.Math;
public class Angle_average{
public static void main(String[] args){
final class vector{
double x;
double y;
}
System.out.println("Angle moyen");
//Déclaration / initialisation de variable
double ang_avg;
// -----Entrez ici l'angle pour lequel vous souhaitez calculer la moyenne-----
double[] angles = {10.0, 30.0, -10.0, -30.0};
int len = angles.length;
double[] angles_rad = new double[len];
vector[] vectors = new vector[len];
vector vector_avg = new vector();
for (int i = 0; i < vectors.length; i++) {
vectors[i] = new vector();
}
for (int i = 0; i < angles.length; i++) {
angles_rad[i] = angles[i] * (Math.PI / 180.0);
vectors[i].x = Math.cos(angles_rad[i]);
vectors[i].y = Math.sin(angles_rad[i]);
}
//Trouvez la moyenne
vector_avg.x = 0.0;
vector_avg.y = 0.0;
for (int i = 0; i < vectors.length; i++) {
vector_avg.x += vectors[i].x;
vector_avg.y += vectors[i].y;
}
vector_avg.x = vector_avg.x / (double)vectors.length;
vector_avg.y = vector_avg.y / (double)vectors.length;
ang_avg = Math.atan2(vector_avg.y, vector_avg.x);
//Correction d'erreur de calcul
if(Math.abs(ang_avg) < Math.pow(10, -8)){
ang_avg = 0.0;
}
System.out.println(Double.toString(Math.toDegrees(ang_avg)) + "\n");
}
}
Recommended Posts