|
@@ -26,17 +26,12 @@ public class Models {
|
|
|
/* retorna a probabilidade do robo estar em (ap) sendo que ele saiu de (bp)
|
|
|
* com um movimento de rotacao de ang graus.*/
|
|
|
public double rotateProbability (Pose pa, Pose pb, double ang) {
|
|
|
-// if (pa.getX() != pb.getX() || pa.getY() != pb.getY()) return 0;
|
|
|
-// double delta = Math.abs(pb.getHeading()+ang-pa.getHeading());
|
|
|
-// if (delta > 180) delta -= 360;
|
|
|
-// return pdf(delta, 0, Math.sqrt(Math.abs(ang*0.1)));
|
|
|
return motionModelOdometry(pa, pb, 0, ang);
|
|
|
}
|
|
|
|
|
|
/* retorna a probabilidade do robo estar em (pa) sendo que ele saiu de (pb)
|
|
|
* com sendo que ele foi move centimetros para frente.*/
|
|
|
public double moveProbability (Pose pa, Pose pb, double move) {
|
|
|
-
|
|
|
return motionModelOdometry(pa, pb, move, 0);
|
|
|
}
|
|
|
|
|
@@ -48,22 +43,29 @@ public class Models {
|
|
|
}
|
|
|
|
|
|
public double motionModelOdometry (Pose pa, Pose pb, double move, double ang) {
|
|
|
- double rot = ang+pa.getHeading();
|
|
|
+ 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 dtrans = move;
|
|
|
+
|
|
|
|
|
|
double dx = pa.getX()-pb.getX();
|
|
|
double dy = pa.getY()-pb.getY();
|
|
|
-
|
|
|
- // teorico
|
|
|
- // atan2 retorna entre -180 e 180
|
|
|
- double rott = Math.toDegrees(Math.atan2(dy,dx))+pb.getHeading();
|
|
|
- double transt = dx*dx;
|
|
|
- transt += dy*dy;
|
|
|
- transt = Math.sqrt(transt);
|
|
|
-// System.out.println(rott);
|
|
|
-
|
|
|
- double p1 = probTriangularDistribution(rott-rot, rot+0.0001*move);
|
|
|
- double p2 = probTriangularDistribution(transt-move, 0.01*ang+move);
|
|
|
- return p1*p2;
|
|
|
+
|
|
|
+ double dcrot1 = n(Math.atan2(dy, dx) - pbh - Math.toRadians(90));
|
|
|
+ double dctrans = Math.sqrt(dx*dx+dy*dy);
|
|
|
+ double dcrot2 = n(pah - pbh - 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;
|
|
|
+ return p1*p2*p3;
|
|
|
+ }
|
|
|
+
|
|
|
+ private double n (double x) {
|
|
|
+ return Math.atan2(Math.sin(x), Math.cos(x));
|
|
|
}
|
|
|
|
|
|
/* retorna a probabilidade dele estar em (p) sendo que realizou a leitura do
|
|
@@ -72,7 +74,7 @@ public class Models {
|
|
|
double prob = 1.0;
|
|
|
for (DataRead dp: data) {
|
|
|
// os 90 é para a correcao do mapa
|
|
|
- float newang = (float) (p.getHeading() - dp.getSensorAngle() - 90);
|
|
|
+ float newang = (float) (p.getHeading() + 270 - dp.getSensorAngle() - 90);
|
|
|
Pose pose = new Pose(p.getX(), p.getY(), newang);
|
|
|
|
|
|
float mindist = Float.POSITIVE_INFINITY;
|
|
@@ -92,7 +94,7 @@ public class Models {
|
|
|
prob = 0;
|
|
|
break;
|
|
|
}
|
|
|
- prob *= pdf(dp.getDistance(), teoricaldistance, 40); // desvio padrao
|
|
|
+ prob *= pdf(dp.getDistance(), teoricaldistance, 20); // desvio padrao
|
|
|
}
|
|
|
return prob;
|
|
|
}
|