Models.java 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package config;
  2. import java.util.ArrayList;
  3. import lejos.geom.Line;
  4. import lejos.robotics.mapping.LineMap;
  5. import lejos.robotics.navigation.Pose;
  6. import robots.DataRead;
  7. public class Models {
  8. private static boolean USE_TRIANGULAR = false;
  9. private static int SONAR_CONE = 14;
  10. private static double SONAR_SIGMA = 9;
  11. private static double ALPHA1 = 0.01; // desvio padrao do erro no gito
  12. private static double ALPHA2 = 0.005; // desvio padrao do erro qunado gira proporconal ao deslocalmento
  13. private static double ALPHA3 = 0.1; // desvio padrao no erro do deslocamento
  14. private static double ALPHA4 = 0.01; // desvio padrao no erro do deslocamento baseado em quanto rodou (nao importa para o nosso robo)
  15. LineMap map;
  16. public Models(LineMap map) {
  17. this.map = map;
  18. }
  19. // return pdf(x, mu, signma) = Gaussian pdf with mean mu and stddev sigma
  20. private static double pdf(double x, double sigma) {
  21. if (USE_TRIANGULAR) {
  22. double r = Math.sqrt(sigma*6);
  23. double abs = Math.abs(x);
  24. if (abs > r) return 0;
  25. return (r-abs)/(6*sigma);
  26. }
  27. return Math.exp(-x*x / 2 / sigma) / Math.sqrt(2 * Math.PI * sigma);
  28. }
  29. private double probTriangularDistribution (double a, double b) {
  30. double r = Math.sqrt(b*6);
  31. double abs = Math.abs(a);
  32. if (abs > r) return 0;
  33. return (r-abs)/(6*b);
  34. }
  35. /* retorna a probabilidade do robo estar em (ap) sendo que ele saiu de (bp)
  36. * com um movimento de rotacao de ang graus.*/
  37. public double rotateProbability (Pose pa, Pose pb, double ang) {
  38. return motionModelOdometry(pa, pb, 0, ang);
  39. }
  40. /* retorna a probabilidade do robo estar em (pa) sendo que ele saiu de (pb)
  41. * com sendo que ele foi move centimetros para frente.*/
  42. public double moveProbability (Pose pa, Pose pb, double move) {
  43. return motionModelOdometry(pa, pb, move, 0);
  44. }
  45. /* retorna a probabilidade do robo estar em (pa) sendo que ele saiu de (pb)
  46. * sendo que ele rodou ang graus e foi move centimetros para frente.*/
  47. public double motionModelOdometry (Pose pa, Pose pb, double move, double ang) {
  48. double drot1 = n(Math.toRadians(ang));
  49. double pah = Math.toRadians(pa.getHeading());
  50. double pbh = Math.toRadians(pb.getHeading());
  51. double dtrans = move;
  52. double dx = pa.getX()-pb.getX();
  53. double dy = pa.getY()-pb.getY();
  54. double dcrot1 = n(Math.atan2(dy, dx) - Math.toRadians(90));
  55. double dctrans = Math.sqrt(dx*dx+dy*dy);
  56. double dcrot2 = n(pah - dcrot1);
  57. double p1 = probTriangularDistribution(n(pah-pbh-drot1), ALPHA2*dtrans+ALPHA1*drot1);
  58. double p2 = probTriangularDistribution(dtrans-dctrans, ALPHA3*dtrans+ALPHA4*drot1);
  59. double p3 = probTriangularDistribution(dcrot2, ALPHA2*dtrans);
  60. if (dtrans == 0) p3 = 1;
  61. return p1*p2*p3;
  62. }
  63. private double n (double x) {
  64. return Math.atan2(Math.sin(x), Math.cos(x));
  65. }
  66. /* retorna a probabilidade dele estar em (p) sendo que realizou a leitura do
  67. * conjunto data de medidas - pdf */
  68. public double readProbability (Pose p, ArrayList<DataRead> data) {
  69. double prob = 1.0;
  70. for (DataRead dp: data) {
  71. // os 90 é para a correcao do mapa
  72. float newang = (float) (p.getHeading() + 270 + dp.getSensorAngle());
  73. Pose pose = new Pose(p.getX(), p.getY(), newang);
  74. float mindist = Float.POSITIVE_INFINITY;
  75. int cone = SONAR_CONE; // CONE CONE
  76. for (int angulo = -cone / 2; angulo <= cone / 2; angulo++) {
  77. pose.setHeading((float) (newang - angulo));
  78. float dist = map.range(pose);
  79. if (dist > 0 && dist < mindist)
  80. mindist = dist;
  81. }
  82. double teoricaldistance = mindist;
  83. if (dp.getDistance() < 4 || dp.getDistance() > 240)
  84. continue;
  85. if (teoricaldistance == -1) {
  86. prob = 0;
  87. break;
  88. }
  89. prob *= pdf(dp.getDistance()-teoricaldistance, SONAR_SIGMA); // desvio padrao
  90. }
  91. return prob;
  92. }
  93. }