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. I tried
doing simulation but the screen turns all distorted so i'm not able to see what
its doing.
#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
[email protected]
https://mail.gna.org/listinfo/e-puck-user