jotto

Untitled

Jan 5th, 2016
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.41 KB | None | 0 0
  1. import com.cyberbotics.webots.controller.*;
  2. import java.util.ArrayList;
  3.  
  4. public class sheepController extends Robot {
  5.     private static final int TIME_STEP = 64; // milliseconds
  6.     private static final int NUMBER_OF_CAMERAS = 3;
  7.     private static final int MAGIC = 5;
  8.     private static final double SPEED = 0.5;
  9.     private String[] cameras_name = {"camera_front", "camera_left", "camera_right", "camera_rear"};
  10.     private String[] wheels_name = {"wheel1", "wheel2", "wheel3", "wheel4"};
  11.     private String[] ds_names = {"ds_left_front", "ds_right_front", "ds_left_corner", "ds_right_corner", "ds_left_rear", "ds_right_rear", "ds_left_back", "ds_right_back" };
  12.     private int[][] image = new int[NUMBER_OF_CAMERAS][];
  13.     private int width;
  14.     private int height;
  15.     private DistanceSensor[] distanceSensors = new DistanceSensor[8];
  16.     private Motor[] motors = new Motor[4];
  17.     private Camera[] cameras = new Camera[NUMBER_OF_CAMERAS];
  18.     private ArrayList<Double> previousDirections = new ArrayList<Double>();
  19.    
  20.     public sheepController() {
  21.         super();
  22.         for (int i =0; i<distanceSensors.length; i++){
  23.             distanceSensors[i] = new DistanceSensor(ds_names[i]);
  24.             distanceSensors[i].enable(TIME_STEP);
  25.         }
  26.         for (int i =0; i<motors.length; i++){
  27.             motors[i] = new Motor(wheels_name[i]);
  28.             motors[i].setPosition(Double.POSITIVE_INFINITY);
  29.         }
  30.         for (int i =0; i<NUMBER_OF_CAMERAS; i++){
  31.             cameras[i] = new Camera(cameras_name[i]);
  32.             cameras[i].enable(TIME_STEP);
  33.         }
  34.         width = cameras[0].getWidth();
  35.         height = cameras[0].getHeight();
  36.     }
  37.    
  38.     public void run() {
  39.         while (step(TIME_STEP) != -1) {
  40.             for (int i = 0; i< NUMBER_OF_CAMERAS; i++)
  41.                 image[i] = cameras[i].getImage();
  42.            
  43.             int[] WhatIsOnTheImage = new int[NUMBER_OF_CAMERAS];
  44.             for (int c=0; c<NUMBER_OF_CAMERAS; c++)
  45.                 WhatIsOnTheImage[c] = whatIsThat(image[c]);
  46.            
  47.             AddCurrentDirection(calculateDirection(WhatIsOnTheImage));
  48.             setWheelsVelocity();
  49.         }
  50.     }
  51.    
  52.     private double calculateDirection(int[] whatIsHappeningOutside) {
  53.         // camery: 0 -przod, 2 - prawo, 1- lewo, 3?-tył
  54.         // wynik: 0- cos, 1- owca, 2- pies lub wilk
  55.         // ujemny return w lewo, dodatni w prawo
  56.         double direction = 0;
  57.         if (whatIsHappeningOutside[0] == 1) direction += Math.random()*10 - 5;
  58.         else if (whatIsHappeningOutside[0] == 2) {
  59.             direction += 180;
  60.         }
  61.         else {
  62.             double[] ds_values = new double[2];
  63.             for (int i=0; i<2 ; i++)
  64.                 ds_values[i] = distanceSensors[i].getValue();
  65.             if (ds_values[0] < 990.0 || ds_values[1] < 990.0) direction += 180;
  66.         }
  67.         for (int i = 1; i<NUMBER_OF_CAMERAS ;i++) {
  68.             if (whatIsHappeningOutside[i] == 2) {
  69.                 direction -= Math.signum(i-1.5)*(-50); //jeżeli wilk lub pies, to uciekaj
  70.                 break;
  71.             }
  72.             if (whatIsHappeningOutside[i] == 1) {
  73.                 direction += Math.signum(i-1.5)*20; //jeżeli owca, to się zbliż
  74.                 continue;
  75.             }
  76.         }
  77.         return direction;
  78.     }
  79.    
  80.     private void AddCurrentDirection(double direction) {
  81.         previousDirections.add(direction);
  82.         if (previousDirections.size() > MAGIC) previousDirections.remove(previousDirections.get(0));
  83.         //bo po co miec wiecej niz 100? to i tak duzo
  84.     }
  85.    
  86.     private void setWheelsVelocity() {
  87.         double weightedSumOfDirections = 0;
  88.         int sumOfWeights = 0;
  89.         for (int i = 1; i<=previousDirections.size(); i++) {
  90.             weightedSumOfDirections += i*(double)previousDirections.get(i-1);
  91.             sumOfWeights += i;
  92.         }
  93.         double direction = weightedSumOfDirections/(sumOfWeights*180);
  94.        
  95.         double left_speed = SPEED - direction*SPEED;
  96.         double right_speed = SPEED + direction*SPEED;
  97.        
  98.         motors[0].setVelocity(left_speed);
  99.         motors[1].setVelocity(right_speed);
  100.         motors[2].setVelocity(left_speed);
  101.         motors[3].setVelocity(right_speed);
  102.     }
  103.    
  104.     private int whatIsThat(int[] image) {
  105.         double red = 0;
  106.         double blue = 0;
  107.         double green = 0;
  108.         int temp = 35;
  109.         double numberOfPixels = 0;
  110.         for (int i= 3*width/9; i<6*width/9;i++)
  111.             for (int j = 4*height/9; j< 5*height/9; j++) {
  112.                 red += Camera.imageGetRed(image, width, i,j);
  113.                 green += Camera.imageGetGreen(image, width, i,j);
  114.                 blue += Camera.imageGetBlue(image, width, i,j);
  115.                 numberOfPixels ++;
  116.         }
  117.         red /= numberOfPixels;
  118.         green /= numberOfPixels;
  119.         blue /= numberOfPixels;
  120.         if (red < temp && green <temp && blue < temp) {
  121.             return 2;
  122.         }
  123.         if(red < 75 && green <75 && blue < 75){
  124.             return 1;
  125.         }
  126.         return 0;
  127.     }
  128.    
  129.     public static void main(String[] args) {
  130.         sheepController robot = new sheepController();
  131.         robot.run();
  132.     }
  133. }
Advertisement
Add Comment
Please, Sign In to add comment