Models.java 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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. return motionModelOdometry(pa, pb, 0, ang);
  24. }
  25. /* retorna a probabilidade do robo estar em (pa) sendo que ele saiu de (pb)
  26. * com sendo que ele foi move centimetros para frente.*/
  27. public double moveProbability (Pose pa, Pose pb, double move) {
  28. return motionModelOdometry(pa, pb, move, 0);
  29. }
  30. private double probTriangularDistribution (double a, double b) {
  31. double r = Math.sqrt(b*6);
  32. double abs = Math.abs(a);
  33. if (abs > r) return 0;
  34. return (r-abs)/(6*b);
  35. }
  36. public double motionModelOdometry (Pose pa, Pose pb, double move, double ang) {
  37. double drot1 = n(Math.toRadians(ang));
  38. double pah = Math.toRadians(pa.getHeading() + Math.toRadians(90));
  39. double pbh = Math.toRadians(pb.getHeading() + Math.toRadians(90));
  40. double dtrans = move;
  41. double dx = pa.getX()-pb.getX();
  42. double dy = pa.getY()-pb.getY();
  43. double dcrot1 = n(Math.atan2(dy, dx) - pbh - Math.toRadians(90));
  44. double dctrans = Math.sqrt(dx*dx+dy*dy);
  45. double dcrot2 = n(pah - pbh - dcrot1);
  46. double p1 = probTriangularDistribution(n(pah-pbh-drot1), 0.001*dtrans+0.1*drot1);
  47. double p2 = probTriangularDistribution(dtrans-dctrans, dtrans+0.001*drot1);
  48. double p3 = probTriangularDistribution(dcrot2, 0.001*dtrans);
  49. if (dtrans == 0) p3 = 1.0;
  50. return p1*p2*p3;
  51. }
  52. private double n (double x) {
  53. return Math.atan2(Math.sin(x), Math.cos(x));
  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() + 270 - 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, 20); // desvio padrao
  79. }
  80. return prob;
  81. }
  82. }