|
@@ -8,20 +8,39 @@ import lejos.robotics.navigation.Pose;
|
|
|
import robots.DataRead;
|
|
|
|
|
|
public class Models {
|
|
|
+
|
|
|
+ private static boolean USE_TRIANGULAR = false;
|
|
|
+ private static int SONAR_CONE = 10;
|
|
|
+ private static double SONAR_SIGMA = 10;
|
|
|
+
|
|
|
+ private static double ALPHA1 = 0.1; // desvio padrao do erro no gito
|
|
|
+ private static double ALPHA2 = 0.00015; // desvio padrao do erro qunado gira proporconal ao deslocalmento
|
|
|
+ private static double ALPHA3 = 0.1; // desvio padrao no erro do deslocamento
|
|
|
+ private static double ALPHA4 = 0.01; // desvio padrao no erro do deslocamento baseado em quanto rodou (nao importa para o nosso robo)
|
|
|
+
|
|
|
LineMap map;
|
|
|
public Models(LineMap map) {
|
|
|
this.map = map;
|
|
|
}
|
|
|
|
|
|
- // return pdf(x) = standard Gaussian pdf
|
|
|
- private static double pdf(double x) {
|
|
|
- return Math.exp(-x*x / 2) / Math.sqrt(2 * Math.PI);
|
|
|
- }
|
|
|
-
|
|
|
// return pdf(x, mu, signma) = Gaussian pdf with mean mu and stddev sigma
|
|
|
- private static double pdf(double x, double mu, double sigma) {
|
|
|
- return pdf((x - mu) / sigma) / sigma;
|
|
|
+ private static double pdf(double x, double sigma) {
|
|
|
+ if (USE_TRIANGULAR) {
|
|
|
+ double r = Math.sqrt(sigma*6);
|
|
|
+ double abs = Math.abs(x);
|
|
|
+ if (abs > r) return 0;
|
|
|
+ return (r-abs)/(6*sigma);
|
|
|
+ }
|
|
|
+ return Math.exp(-x*x / 2 / sigma) / Math.sqrt(2 * Math.PI * sigma);
|
|
|
}
|
|
|
+
|
|
|
+ private double probTriangularDistribution (double a, double b) {
|
|
|
+ double r = Math.sqrt(b*6);
|
|
|
+ double abs = Math.abs(a);
|
|
|
+ if (abs > r) return 0;
|
|
|
+ return (r-abs)/(6*b);
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
/* retorna a probabilidade do robo estar em (ap) sendo que ele saiu de (bp)
|
|
|
* com um movimento de rotacao de ang graus.*/
|
|
@@ -35,17 +54,12 @@ public class Models {
|
|
|
return motionModelOdometry(pa, pb, move, 0);
|
|
|
}
|
|
|
|
|
|
- private double probTriangularDistribution (double a, double b) {
|
|
|
- double r = Math.sqrt(b*6);
|
|
|
- double abs = Math.abs(a);
|
|
|
- if (abs > r) return 0;
|
|
|
- return (r-abs)/(6*b);
|
|
|
- }
|
|
|
-
|
|
|
+ /* retorna a probabilidade do robo estar em (pa) sendo que ele saiu de (pb)
|
|
|
+ * sendo que ele rodou ang graus e foi move centimetros para frente.*/
|
|
|
public double motionModelOdometry (Pose pa, Pose pb, double move, double ang) {
|
|
|
double drot1 = n(Math.toRadians(ang));
|
|
|
- double pah = Math.toRadians(pa.getHeading() + Math.toRadians(90));
|
|
|
- double pbh = Math.toRadians(pb.getHeading() + Math.toRadians(90));
|
|
|
+ double pah = Math.toRadians(pa.getHeading());
|
|
|
+ double pbh = Math.toRadians(pb.getHeading());
|
|
|
|
|
|
double dtrans = move;
|
|
|
|
|
@@ -53,14 +67,14 @@ public class Models {
|
|
|
double dx = pa.getX()-pb.getX();
|
|
|
double dy = pa.getY()-pb.getY();
|
|
|
|
|
|
- double dcrot1 = n(Math.atan2(dy, dx) - pbh - Math.toRadians(90));
|
|
|
+ double dcrot1 = n(Math.atan2(dy, dx) - Math.toRadians(90));
|
|
|
double dctrans = Math.sqrt(dx*dx+dy*dy);
|
|
|
- double dcrot2 = n(pah - pbh - dcrot1);
|
|
|
+ double dcrot2 = n(pah - dcrot1);
|
|
|
|
|
|
- double p1 = probTriangularDistribution(n(pah-pbh-drot1), 0.001*dtrans+0.1*drot1);
|
|
|
- double p2 = probTriangularDistribution(dtrans-dctrans, dtrans+0.001*drot1);
|
|
|
- double p3 = probTriangularDistribution(dcrot2, 0.001*dtrans);
|
|
|
- if (dtrans == 0) p3 = 1.0;
|
|
|
+ double p1 = probTriangularDistribution(n(pah-pbh-drot1), ALPHA2*dtrans+ALPHA1*drot1);
|
|
|
+ double p2 = probTriangularDistribution(dtrans-dctrans, ALPHA3*dtrans+ALPHA4*drot1);
|
|
|
+ double p3 = probTriangularDistribution(dcrot2, ALPHA2*dtrans);
|
|
|
+ if (dtrans == 0) p3 = 1;
|
|
|
return p1*p2*p3;
|
|
|
}
|
|
|
|
|
@@ -78,7 +92,7 @@ public class Models {
|
|
|
Pose pose = new Pose(p.getX(), p.getY(), newang);
|
|
|
|
|
|
float mindist = Float.POSITIVE_INFINITY;
|
|
|
- int cone = 1; // CONE CONE
|
|
|
+ int cone = SONAR_CONE; // CONE CONE
|
|
|
for (int angulo = -cone / 2; angulo <= cone / 2; angulo++) {
|
|
|
pose.setHeading((float) (newang - angulo));
|
|
|
float dist = map.range(pose);
|
|
@@ -94,7 +108,7 @@ public class Models {
|
|
|
prob = 0;
|
|
|
break;
|
|
|
}
|
|
|
- prob *= pdf(dp.getDistance(), teoricaldistance, 20); // desvio padrao
|
|
|
+ prob *= pdf(dp.getDistance()-teoricaldistance, SONAR_SIGMA); // desvio padrao
|
|
|
}
|
|
|
return prob;
|
|
|
}
|