Hi, My code here seems to be working but the ground sensor area still does not seem to be following the line. Can anybody help? I'm using webots. Also... that is the voltage of e-puck batteries? #include <webots/robot.h> #include <webots/differential_wheels.h> #include <webots/camera.h> #include <math.h> #include <stdlib.h> #include <stdio.h> #include <webots/led.h> #include <string.h> #include <time.h> #include <webots/distance_sensor.h> #define TIME_STEP_CAM 64 #define TIME_STEP 64 #define TRUE 1 #define FALSE 0 #define LEFT 0 #define RIGHT 1 #define WHITE 0 #define BLACK 1 #define NB_LEDS 10 #define NB_DIST_SENS 8 #define PS_RIGHT_10 0 #define PS_RIGHT_45 1 #define PS_RIGHT_90 2 #define PS_RIGHT_REAR 3 #define PS_LEFT_REAR 4 #define PS_LEFT_90 5 #define PS_LEFT_45 6 #define PS_LEFT_10 7 #define NB_FLOOR_SENS 3 #define FS_WHITE 900 #define FS_LEFT 0 #define FS_CENTER 1 #define FS_RIGHT 2 WbDeviceTag cam; WbDeviceTag ps[NB_DIST_SENS]; WbDeviceTag fs[NB_FLOOR_SENS]; WbDeviceTag led[NB_LEDS]; int speed[2]={0,0}; int ps_value[NB_DIST_SENS]={0,0,0,0,0,0,0,0}; const int PS_OFFSET_REALITY[NB_DIST_SENS] = {480,170,320,500,600,680,210,640}; unsigned short fs_value[NB_FLOOR_SENS]={0,0,0}; unsigned short width,height; int i; int shapesize=0; int delay=0; int shapechecking,whitechecking; int Itriangle,square,triangle; int stop=0; void Sensor_check() { for(i=0;i<NB_FLOOR_SENS;i++) { fs_value[i]=(int)wb_distance_sensor_get_value(fs[i]); } for(i=0;i<NB_DIST_SENS;i++) { ps_value[i]=(int)wb_distance_sensor_get_value(ps[i]); } } void UTurn() { while((int)fs_value[0]>330) { speed[RIGHT]=400;//rotate right speed[LEFT]=-400; wb_differential_wheels_set_speed(speed[LEFT],speed[RIGHT]); Sensor_check(); } } void Offled() { for(i=0;i<9;i++) { wb_led_set(led[i],FALSE); } } void MoveObstacle() { Sensor_check(); while ((int)ps_value[0]<2000&&(int)ps_value[7]<2000) { Sensor_check(); speed[RIGHT]=300; speed[LEFT]=300; wb_differential_wheels_set_speed(speed[LEFT],speed[RIGHT]); } delay=10000; while (delay!=0) { wb_led_set(led[0],TRUE); wb_led_set(led[7],TRUE); wb_led_set(led[6],TRUE); speed[RIGHT]=450; speed[LEFT]=-450; wb_differential_wheels_set_speed(speed[LEFT],speed[RIGHT]); delay--; } Offled(); delay=12000; while (delay!=0) { wb_led_set(led[0],TRUE); wb_led_set(led[8],TRUE); speed[RIGHT]=650; speed[LEFT]=650; wb_differential_wheels_set_speed(speed[LEFT],speed[RIGHT]); delay--; } Offled(); delay=12000; while (delay!=0) { wb_led_set(led[5],TRUE); wb_led_set(led[4],TRUE); speed[RIGHT]=-650; speed[LEFT]=-650; wb_differential_wheels_set_speed(speed[LEFT],speed[RIGHT]); delay--; } Offled(); wb_led_set(led[0],TRUE); wb_led_set(led[1],TRUE); wb_led_set(led[2],TRUE); speed[RIGHT]=-300; speed[LEFT]=-300; wb_differential_wheels_set_speed(speed[LEFT],speed[RIGHT]); } void black_line() { Sensor_check(); if((int)fs_value[2]>330) { speed[RIGHT]=-180;//rotate right speed[LEFT]=100; wb_differential_wheels_set_speed(speed[LEFT],speed[RIGHT]); } else if((int)fs_value[0]>330) { speed[RIGHT]=100;// rotate left speed[LEFT]=-180; wb_differential_wheels_set_speed(speed[LEFT],speed[RIGHT]); } else if((int)fs_value[1]>330) { speed[RIGHT]=400;// forward speed[LEFT]=400; wb_differential_wheels_set_speed(speed[LEFT],speed[RIGHT]); } } void movewall() { speed[RIGHT]=400; speed[LEFT]=400; wb_differential_wheels_set_speed(speed[LEFT],speed[RIGHT]); Sensor_check(); while((int)ps_value[0]>200 || (int)ps_value[7]>200) { Sensor_check(); black_line(); } } void shape() { if(shapesize==0) { shapesize=shapechecking; } else if(shapesize<shapechecking&&whitechecking>3) { triangle++; } else if(shapesize>shapechecking&&whitechecking>3) { Itriangle++; } else if(shapesize==shapechecking&&whitechecking>3) { square++; } shapesize=shapechecking; } void shapecompare() { if(triangle>square&&triangle>Itriangle)//triangle { movewall(); } else if(triangle<square&&square>Itriangle)//square { MoveObstacle(); } else if(Itriangle>triangle&&square<Itriangle)// Itriangle { UTurn(); } Offled(); triangle=0; square=0; Itriangle=0; shapesize=0; whitechecking=0; } void CheckCamera() { int reg1,x,y; const unsigned char *image; cam = wb_robot_get_device("camera"); wb_camera_enable(cam,TIME_STEP_CAM); width = wb_camera_get_width(cam); height = wb_camera_get_height(cam); image = wb_camera_get_image(cam); for (y=38;y>0;y--) { for (x=0;x<width;x++) { reg1 = wb_camera_image_get_red(image,width,x,y); if (reg1<50) { shapechecking=x; whitechecking=x-1; shape(); y--; x=0; } } } } int main() { wb_robot_init(); char light[]="led0"; for(i=0;i<NB_LEDS;i++) { led[i]=wb_robot_get_device(light); light[3]++; } char named[]="fs0"; for (i = 0; i < NB_FLOOR_SENS; i++) { fs[i] = wb_robot_get_device(named); /* floor sensors */ wb_distance_sensor_enable(fs[i],TIME_STEP); named[2]++; } char textPS[]="ps0"; for(i=0;i<NB_DIST_SENS;i++) { ps[i]=wb_robot_get_device(textPS); wb_distance_sensor_enable(ps[i],TIME_STEP); textPS[2]++; } //main loop while(stop==0) { Sensor_check(); if((int)ps_value[0]>200||(int)ps_value[7]>200) { speed[RIGHT]=0; speed[LEFT]=0; wb_differential_wheels_set_speed(speed[LEFT],speed[RIGHT]); CheckCamera(); shapecompare(); } else { black_line(); } } /* Enter here exit cleanup code */ /* Necessary to cleanup webots stuff */ wb_robot_cleanup(); return 0; }
_______________________________________________ E-puck-user mailing list E-puck-user@gna.org https://mail.gna.org/listinfo/e-puck-user