Subversion Repositories svnkaklik

Rev

Rev 377 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log

Rev 377 Rev 379
Line 48... Line 48...
48
#define SEVER 122
48
#define SEVER 122
49
 
49
 
50
char vystup[50];
50
char vystup[50];
51
pthread_t thread_1, thread_2, thread_3;
51
pthread_t thread_1, thread_2, thread_3;
52
FILE *pRouraO,*pRouraI;
52
FILE *pRouraO,*pRouraI;
53
unsigned int vzdalenost;
53
unsigned int vzdalenost, lus, rus;
54
char command,ble;
54
char command,ble;
55
int param;
55
int param;
56
int file;
56
int file;
57
double nord, east;
57
double nord, east;
58
int done; // vlajka, ze se neco udelalo
58
int done; // vlajka, ze se neco udelalo
59
int last_cross; // posledni krizovatka
59
int last_cross; // posledni krizovatka
-
 
60
int korekce; // Byla korekce podle kompasu nebo zdi
-
 
61
int bod;
60
 
62
 
61
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
63
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
62
 
64
 
63
void *print_tele(void *unused);
65
void *print_tele(void *unused);
64
void *gps(void *unused);
66
void *gps(void *unused);
65
//void *sensors(void *unused);
67
//void *sensors(void *unused);
66
 
68
 
67
void I2C_addr (int Addr)
69
void I2C_addr (int Addr)  // vybere adresu cidla se kterym se bude komunikovat
68
{
70
{
69
    if (ioctl(file, I2C_SLAVE, Addr) == -1)
71
    if (ioctl(file, I2C_SLAVE, Addr) == -1)
70
    {
72
    {
71
        fprintf(stderr, "Failed to set address to 0x%02x.\n", Addr);
73
        fprintf(stderr, "Failed to set address to 0x%02x.\n", Addr);
72
        exit(-5);
74
        exit(-5);
73
    }
75
    }
74
}
76
}
75
 
77
 
-
 
78
int i2c_init()   // zinicializuje i2c
-
 
79
{
-
 
80
	file = open("/dev/i2c-0", O_RDWR);
-
 
81
	if (file < 0)
-
 
82
	{
-
 
83
		cerr << "Could not open /dev/i2c-0." << endl;
-
 
84
		return -1;
-
 
85
	}
-
 
86
	return 0;
-
 
87
}
-
 
88
 
76
void go (int Addr, int speed) // nastavi rychlost motoru
89
void go (int Addr, int speed) // nastavi rychlost motoru
77
{
90
{
78
    char Buf[1];
91
    char Buf[1];
79
 
92
 
80
    I2C_addr (Addr);
93
    I2C_addr (Addr);
Line 114... Line 127...
114
    Buf[0]=15;
127
    Buf[0]=15;
115
    Buf[1]=0xFF;
128
    Buf[1]=0xFF;
116
    write(file,Buf,2);
129
    write(file,Buf,2);
117
}
130
}
118
 
131
 
119
void TL (unsigned char azimut2)
132
void TL (unsigned char azimut2) // otoci robota na zadany azimut rotaci vlevo
120
{
133
{
121
    unsigned char azimut1;
134
    unsigned char azimut1;
122
 
135
 
123
    go(M1, 0);
136
    go(M1, 0);
124
    go(M2, 120);
137
    go(M2, 120);
125
    do
138
    do
126
    {
139
    {
127
        azimut1=read_azimut_mag();
140
        azimut1=read_azimut_mag();
128
//printf("az1: %d - az2: %d\n", azimut1, azimut2);
141
//printf("az1: %d - az2: %d\n", azimut1, azimut2);
129
        usleep(10000);
142
        usleep(10000);
130
    } while( (azimut1!=azimut2)&&((azimut1+1)!=azimut2)&&((azimut1+2)!=azimut2)&&((azimut1+3)!=azimut2) );
143
    } while( (azimut1!=azimut2)&&((azimut1+1)!=azimut2)&&((azimut1+2)!=azimut2)&&((azimut1+3)!=azimut2)&&((azimut1+4)!=azimut2) );
131
    go(M1, 0);
144
    go(M1, 0);
132
    go(M2, 0);
145
    go(M2, 0);
133
}
146
}
134
 
147
 
135
void TR (unsigned char azimut2)
148
void TR (unsigned char azimut2) // otoci robota na zadany azimut rotaci v pravo
136
{
149
{
137
    unsigned char azimut1;
150
    unsigned char azimut1;
138
 
151
 
139
    go(M1, 120);
152
    go(M1, 120);
140
    go(M2, 0);
153
    go(M2, 0);
141
    do
154
    do
142
    {
155
    {
143
        azimut1=read_azimut_mag();
156
        azimut1=read_azimut_mag();
144
        usleep(10000);
157
        usleep(10000);
145
    } while( (azimut1!=azimut2)&&((azimut1-1)!=azimut2)&&((azimut1-2)!=azimut2)&&((azimut1-3)!=azimut2) );
158
    } while( (azimut1!=azimut2)&&((azimut1-1)!=azimut2)&&((azimut1-2)!=azimut2)&&((azimut1-3)!=azimut2)&&((azimut1-4)!=azimut2) );
146
    go(M1, 0);
159
    go(M1, 0);
147
    go(M2, 0);
160
    go(M2, 0);
148
}
161
}
149
 
162
 
-
 
163
void SlowLeft()
-
 
164
{
-
 
165
    go(M1, 40);
-
 
166
    go(M2, 60);
-
 
167
}
-
 
168
 
150
void FindNearestCrossing(void)
169
void SlowRight()
-
 
170
{
-
 
171
    go(M1, 60);
-
 
172
    go(M2, 40);
-
 
173
}
-
 
174
 
-
 
175
void FindNearestCrossing(void) // vykonej nejakou akci (zatoceni) pokud se robot nachazi pobliz nejakeho waypointu
151
{
176
{
152
    int n;
177
    int n;
153
    double dist, pomN, pomE;
178
    double dist, pomN, pomE;
-
 
179
    unsigned char azimut;
154
 
180
 
155
    pthread_mutex_lock(&mutex);         // prepis souradnic do pracovnich promennych
181
    pthread_mutex_lock(&mutex);         // prepis souradnic do pracovnich promennych
156
    pomN=nord; pomE=east;
182
    pomN=nord; pomE=east;
157
    pthread_mutex_unlock(&mutex);
183
    pthread_mutex_unlock(&mutex);
158
    if ( GeoCalc::EllipsoidDistance(pomN, pomE, cros[last_cross].n, cros[last_cross].e)>((double)cros[n].dia+5) ) done=0; // znovu naviguj, pokud si dal nez... od krizovatky
184
//    if (last_cross!=-1) if ( GeoCalc::EllipsoidDistance(pomN, pomE, cros[last_cross].n, cros[last_cross].e)>((double)cros[n].dia+5) ) done=0; // znovu naviguj, pokud si dal nez... od krizovatky
159
    n=0;
185
    n=0;
160
    do
186
    do
161
    {
187
    {
162
        if (0==cros[n].id) break;
188
        if (0==cros[n].id) break;
163
        dist=GeoCalc::EllipsoidDistance(pomN, pomE, cros[n].n, cros[n].e);
189
        dist=GeoCalc::EllipsoidDistance(pomN, pomE, cros[n].n, cros[n].e);
164
        if (dist <= (double)cros[n].dia)
190
        if (dist <= (double)cros[n].dia)
165
        {
191
        {
166
//printf("Point ID: %d - Distance: %f\n",cros[n].id, dist);
192
//printf("Point ID: %d - Distance: %f\n",cros[n].id, dist);
167
            if (done==0)
193
            if (last_cross!=cros[n].id)
168
            {
194
            {
169
                last_cross=n;
195
                bod=cros[n].id;
170
                #include "nav.h"
196
                #include "nav.h"
171
                done=1;
197
//                done=1;
172
            }
198
            }
173
            break;
199
            break;
174
        }
200
        }
175
    } while(++n<POINTS);
201
    } while(++n<POINTS);
176
}
202
}
177
 
203
 
-
 
204
/*
178
int i2c_init()   // zinicializuje i2c
205
void FindWay(void) // koriguj smer podle kompasu
179
{
206
{
-
 
207
    int n;
-
 
208
    double dist, pomN, pomE;
-
 
209
 
-
 
210
    pthread_mutex_lock(&mutex);         // prepis souradnic do pracovnich promennych
-
 
211
    pomN=nord; pomE=east;
180
	file = open("/dev/i2c-0", O_RDWR);
212
    pthread_mutex_unlock(&mutex);
-
 
213
//    if (last_cross!=-1) if ( GeoCalc::EllipsoidDistance(pomN, pomE, cros[last_cross].n, cros[last_cross].e)>((double)cros[n].dia+5) ) done=0; // znovu naviguj, pokud si dal nez... od krizovatky
181
	if (file < 0)
214
    n=0;
-
 
215
    do
182
	{
216
    {
-
 
217
        if (0==way[n].id) break;
-
 
218
        dist=GeoCalc::EllipsoidDistance(pomN, pomE, way[n].n, way[n].e);
183
		cerr << "Could not open /dev/i2c-0." << endl;
219
        if (dist <= (double)way[n].dia)
-
 
220
        {
-
 
221
            if (last_way!=way[n].id)
184
		return -1;
222
            {
-
 
223
                last_way=way[n].id;
-
 
224
                switch (way[n].id)
-
 
225
                {
-
 
226
                    case 1:
-
 
227
                        TL(way[n].azimut);
-
 
228
                        break;
-
 
229
                    case 2:
-
 
230
                        TL(80);
-
 
231
                        break;
-
 
232
                };
185
	}
233
 
-
 
234
            }
-
 
235
            break;
186
	return 0;
236
        }
-
 
237
    } while(++n<POINTS);
187
}
238
}
-
 
239
*/
188
 
240
 
189
void turnL(unsigned char angle, signed char speed)    // otoci robota o zadany uhel
241
void turnL(unsigned char angle, signed char speed)    // otoci robota o zadany uhel (otaceni v levo)
190
{
242
{
191
int azimut;
243
int azimut;
192
 
244
 
193
    go(M1, speed);
245
    go(M1, -speed);
194
    go(M2, -speed);
246
    go(M2, speed);
195
    azimut=read_azimut_mag();
247
    azimut=read_azimut_mag();
196
    while(read_azimut_mag() >= (azimut + angle)) usleep(10000);
248
    while(read_azimut_mag() >= (azimut - angle)) usleep(10000);
197
    go(M1, 0);
249
    go(M1, 0);
198
    go(M2, 0);
250
    go(M2, 0);
199
}
251
}
200
 
252
 
201
void turnR()    // otoci robota o zadany uhel
253
void turnR(unsigned char angle, signed char speed)    // otoci robota o zadany uhel (otaceni v pravo)
202
{
254
{
-
 
255
int azimut;
-
 
256
 
-
 
257
    go(M1, speed);
-
 
258
    go(M2, -speed);
-
 
259
    azimut=read_azimut_mag();
-
 
260
    while(read_azimut_mag() >= (azimut + angle)) usleep(10000);
-
 
261
    go(M1, 0);
-
 
262
    go(M2, 0);
203
}
263
}
204
 
264
 
205
int main(int argc, char *argv[], char *envp[])
265
int main(int argc, char *argv[], char *envp[])
206
{
266
{
207
    int filtr;
267
    int filtr;
Line 209... Line 269...
209
 
269
 
210
	fprintf(stdout, "\n **** Starting Vector Control Programm **** \n \r");
270
	fprintf(stdout, "\n **** Starting Vector Control Programm **** \n \r");
211
 
271
 
212
    i2c_init();
272
    i2c_init();
213
 
273
 
214
    last_cross=0;
274
    last_cross=-1;
215
    command=0;
275
    command=0;
216
    filtr=0;
276
    filtr=0;
217
    done=0;
277
    done=0;
-
 
278
    korekce=0;
218
 
279
 
219
    pthread_create(&thread_1, NULL, print_tele, NULL);
280
    pthread_create(&thread_1, NULL, print_tele, NULL);
220
    pthread_create(&thread_3, NULL, gps, NULL);
281
    pthread_create(&thread_3, NULL, gps, NULL);
221
//    pthread_create(&thread_2, NULL, sensors, NULL);
282
//    pthread_create(&thread_2, NULL, sensors, NULL);
222
 
283
 
Line 286... Line 347...
286
                break;
347
                break;
287
 
348
 
288
            case 'g':
349
            case 'g':
289
    usleep(180000);  // simulace ostatnich  cidel (zdrzeni)
350
    usleep(180000);  // simulace ostatnich  cidel (zdrzeni)
290
 
351
 
291
//!!!KAKL                FindNearestCrossing();
352
                FindNearestCrossing();
-
 
353
//!!!                FindWay();
292
 
354
 
293
                vzdalenost=echo(US3_Addr);
355
                vzdalenost=echo(US3_Addr);
-
 
356
                usleep(30000);
-
 
357
                lus=echo(US1_Addr);
-
 
358
                usleep(30000);
-
 
359
                rus=echo(US2_Addr);
-
 
360
                usleep(30000);
-
 
361
 
294
                if ((vzdalenost>60)&&(vzdalenost<80))
362
                if ((vzdalenost>60)&&(vzdalenost<80))
295
                {
363
                {
-
 
364
 
-
 
365
//FindNearestCrossing();
-
 
366
 
-
 
367
//                    if(korekce==0)
-
 
368
                    {
296
                    go(M1, 60);
369
                        go(M1, 80);
297
                    go(M2, 60);
370
                        go(M2, 80);
-
 
371
                    };
-
 
372
                    korekce=0;
298
                    filtr=0;
373
                    filtr=0;
299
                    break;
374
                    break;
300
                };
375
                };
301
                if ((vzdalenost>30)&&(vzdalenost<130))
376
                if ((vzdalenost>30)&&(vzdalenost<130))
302
                {
377
                {
-
 
378
/*
-
 
379
                    if ((lus<70)&&(lus>30)&&(vzdalenost>60)) // prekazka vlevo
-
 
380
                    {
-
 
381
                        go(M1, 60);
-
 
382
                        go(M2, 40);
-
 
383
                        break;
-
 
384
                    };
-
 
385
 
-
 
386
*/
-
 
387
/*
-
 
388
                    if ((rus<40)&&(rus>30)) // prekazka vpravo
-
 
389
                    {
-
 
390
                        go(M1, 40);
-
 
391
                        go(M2, 60);
-
 
392
                    };
-
 
393
*/
-
 
394
 
303
                    filtr=0;
395
                    filtr=0;
-
 
396
/*
-
 
397
                    if (vzdalenost<40)
-
 
398
                    {
-
 
399
                        go(M1, 40);
-
 
400
                        go(M2, 60);
-
 
401
                        break;
-
 
402
                    }
-
 
403
                    if (vzdalenost>100)
-
 
404
                    {
-
 
405
                        go(M1, 60);
-
 
406
                        go(M2, 40);
-
 
407
                        break;
-
 
408
                    }
-
 
409
*/
304
                    if (vzdalenost<55)
410
                    if (vzdalenost<55)
305
                    {
411
                    {
306
                        go(M1, 30);
412
                        go(M1, 40);
307
                        go(M2, 60);
413
                        go(M2, 60);
308
                    }
414
                    }
309
                    else
415
                    else
310
                    {
416
                    {
311
                        go(M1, 60);
417
                        go(M1, 60);
312
                        go(M2, 30);
418
                        go(M2, 40);
313
                    }
419
                    }
314
                }
420
                }
315
                else
421
                else
316
                {
422
                {
317
                    filtr++;
423
                    filtr++;
Line 345... Line 451...
345
        fscanf(pRouraI,"%1s%d", &pom, &param);
451
        fscanf(pRouraI,"%1s%d", &pom, &param);
346
        fclose(pRouraI);
452
        fclose(pRouraI);
347
        if (pom!='i') command=pom;
453
        if (pom!='i') command=pom;
348
 
454
 
349
        pRouraO = fopen("/home/ble/pipe","w");
455
        pRouraO = fopen("/home/ble/pipe","w");
350
        fprintf(pRouraO,"US: %u cm - ",vzdalenost);
456
        fprintf(pRouraO,"US3: %u cm - ",vzdalenost);
351
 
457
 
352
        pthread_mutex_lock(&mutex);
458
        pthread_mutex_lock(&mutex);
353
        fprintf(pRouraO,"%fN %fE - ", nord, east);
459
        fprintf(pRouraO,"%fN %fE - ", nord, east);
354
        fprintf(pRouraO,"Bod:%d - ", last_cross);
460
        fprintf(pRouraO,"Bod:%d - ", bod);
355
        fprintf(pRouraO,"Len:%.1f m /", GeoCalc::EllipsoidDistance(nord, east, cros[last_cross].n, cros[last_cross].e));
461
        fprintf(pRouraO,"Len:%.1f m /", GeoCalc::EllipsoidDistance(nord, east, cros[last_cross].n, cros[last_cross].e));
356
        fprintf(pRouraO,"Az:%.2f Deg - ", GeoCalc::GCAzimuth(nord, east, cros[last_cross].n, cros[last_cross].e));
462
        fprintf(pRouraO,"Az:%.2f Deg - ", GeoCalc::GCAzimuth(nord, east, cros[last_cross].n, cros[last_cross].e));
357
        fprintf(pRouraO,"AzMag: %d (0-255)\n", read_azimut_mag());
463
        fprintf(pRouraO,"AzMag: %d (0-255)\n", read_azimut_mag());
-
 
464
        fprintf(pRouraO,"US1: %u cm - US2 %u cm\n",lus,rus);
-
 
465
 
358
        pthread_mutex_unlock(&mutex);
466
        pthread_mutex_unlock(&mutex);
359
 
467
 
360
        fclose(pRouraO);
468
        fclose(pRouraO);
361
    }
469
    }
362
}
470
}
Line 380... Line 488...
380
        pthread_mutex_unlock(&mutex);
488
        pthread_mutex_unlock(&mutex);
381
        usleep(800000);                     // NMEA nechodi castejc nez 1x za 1s
489
        usleep(800000);                     // NMEA nechodi castejc nez 1x za 1s
382
    }
490
    }
383
}
491
}
384
 
492
 
-
 
493
 
385
/*
494
/*
386
void *sensors(void *unused)
495
void *sensors(void *unused)
387
{
496
{
388
	char Buf[64];
497
	char Buf[64];
389
 
498
 
390
    while(true)
499
    while(true)
391
    {
500
    {
392
        I2C_addr(US_Addr);
501
        vzdalenost=echo(US3_Addr);
393
        Buf[0]=0x0;
-
 
394
        Buf[1]=0x51;
-
 
395
        write(file, Buf, 2);
-
 
396
        usleep(80000);
502
        usleep(20000);
397
        read(file, Buf, 3);
503
        left=echo(US1_Addr);
398
        vzdalenost=(Buf[1]*256+Buf[2]);
-
 
399
        usleep(300000);
504
        usleep(20000);
400
 
-
 
401
        I2C_addr(PIC_Addr);
505
        right=echo(US1_Addr);
402
        Buf[0]=command;
-
 
403
        write(file, Buf, 1);
-
 
404
        read(file, Buf, 1);
-
 
405
        ble=Buf[0];
506
        usleep(20000);
406
    }
507
    }
407
}
508
}
408
*/
509
*/