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
[email protected]
https://mail.gna.org/listinfo/e-puck-user