Models.java 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. LineMap map;
  9. public Models(LineMap map) {
  10. this.map = map;
  11. }
  12. // return pdf(x) = standard Gaussian pdf
  13. private static double pdf(double x) {
  14. return Math.exp(-x*x / 2) / Math.sqrt(2 * Math.PI);
  15. }
  16. // return pdf(x, mu, signma) = Gaussian pdf with mean mu and stddev sigma
  17. private static double pdf(double x, double mu, double sigma) {
  18. return pdf((x - mu) / sigma) / sigma;
  19. }
  20. /* retorna a probabilidade do robo estar em (ap) sendo que ele saiu de (bp)
  21. * com um movimento de rotacao de ang graus.*/
  22. public double rotateProbability (Pose pa, Pose pb, double ang) {
  23. // if (pa.getX() != pb.getX() || pa.getY() != pb.getY()) return 0;
  24. // double delta = Math.abs(pb.getHeading()+ang-pa.getHeading());
  25. // if (delta > 180) delta -= 360;
  26. // return pdf(delta, 0, Math.sqrt(Math.abs(ang*0.1)));
  27. return motionModelOdometry(pa, pb, 0, ang);
  28. }
  29. /* retorna a probabilidade do robo estar em (pa) sendo que ele saiu de (pb)
  30. * com sendo que ele foi move centimetros para frente.*/
  31. public double moveProbability (Pose pa, Pose pb, double move) {
  32. return motionModelOdometry(pa, pb, move, 0);
  33. }
  34. private double probTriangularDistribution (double a, double b) {
  35. double r = Math.sqrt(b*6);
  36. double abs = Math.abs(a);
  37. if (abs > r) return 0;
  38. return (r-abs)/(6*b);
  39. }
  40. public double motionModelOdometry (Pose pa, Pose pb, double move, double ang) {
  41. double rot = ang+pa.getHeading();
  42. double dx = pa.getX()-pb.getX();
  43. double dy = pa.getY()-pb.getY();
  44. // teorico
  45. // atan2 retorna entre -180 e 180
  46. double rott = Math.toDegrees(Math.atan2(dy,dx))+pb.getHeading();
  47. double transt = dx*dx;
  48. transt += dy*dy;
  49. transt = Math.sqrt(transt);
  50. // System.out.println(rott);
  51. double p1 = probTriangularDistribution(rott-rot, rot+0.0001*move);
  52. double p2 = probTriangularDistribution(transt-move, 0.01*ang+move);
  53. return p1*p2;
  54. }
  55. /* retorna a probabilidade dele estar em (p) sendo que realizou a leitura do
  56. * conjunto data de medidas - pdf */
  57. public double readProbability (Pose p, ArrayList<DataRead> data) {
  58. double prob = 1.0;
  59. for (DataRead dp: data) {
  60. // os 90 é para a correcao do mapa
  61. float newang = (float) (p.getHeading() - dp.getSensorAngle() - 90);
  62. Pose pose = new Pose(p.getX(), p.getY(), newang);
  63. float mindist = Float.POSITIVE_INFINITY;
  64. int cone = 1; // CONE CONE
  65. for (int angulo = -cone / 2; angulo <= cone / 2; angulo++) {
  66. pose.setHeading((float) (newang - angulo));
  67. float dist = map.range(pose);
  68. if (dist > 0 && dist < mindist)
  69. mindist = dist;
  70. }
  71. double teoricaldistance = mindist;
  72. if (dp.getDistance() < 4 || dp.getDistance() > 240)
  73. continue;
  74. if (teoricaldistance == -1) {
  75. prob = 0;
  76. break;
  77. }
  78. prob *= pdf(dp.getDistance(), teoricaldistance, 40); // desvio padrao
  79. }
  80. return prob;
  81. }
  82. }