|
|
|
|
@ -7,10 +7,15 @@
|
|
|
|
|
************************************************************************************/
|
|
|
|
|
|
|
|
|
|
#include <ctype.h>
|
|
|
|
|
#ifdef BUILD_WINDOWS
|
|
|
|
|
#include "windows.h"
|
|
|
|
|
#else
|
|
|
|
|
#include <arpa/inet.h>
|
|
|
|
|
#endif
|
|
|
|
|
#include <sys/stat.h>
|
|
|
|
|
#include <math.h>
|
|
|
|
|
|
|
|
|
|
#include "debug.h"
|
|
|
|
|
#include "convert.h"
|
|
|
|
|
#include "configuration.h"
|
|
|
|
|
#include "videodev-simulation.h"
|
|
|
|
|
@ -191,48 +196,69 @@ Simulation::Simulation() {
|
|
|
|
|
posY = h/2;
|
|
|
|
|
running = 0;
|
|
|
|
|
|
|
|
|
|
#ifdef DEBUG_POSCTL
|
|
|
|
|
debug_tofile((char*)"simulation.log", (char*)"\n");
|
|
|
|
|
debug_tofile((char*)"simulation.log", (char*)"dAngle,dLen,x,y,dx,dy,timedelay,a1.defAngle,a1.defLen,a1.v,a1.dx,a1.dy,a2.defAngle,a2.defLen,a2.v,a2.dx,a2.dy,finalX,finalY\n");
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
Reset();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void Simulation::Reset() {
|
|
|
|
|
int i;
|
|
|
|
|
static int _first_run = 1;
|
|
|
|
|
|
|
|
|
|
LockMutex();
|
|
|
|
|
|
|
|
|
|
time_t t = time(NULL);
|
|
|
|
|
srandom (t);
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// object movement
|
|
|
|
|
dAngle = 360.0 * (double)random() / (double) RAND_MAX;
|
|
|
|
|
dLen = 1.0 + 5.0 * (double)random() / (double) RAND_MAX;
|
|
|
|
|
printf ("%s:%d %s dAngle:%f dLen:%f\n", __FILE__, __LINE__, __FUNCTION__, dAngle, dLen);
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// axis movement
|
|
|
|
|
i = 0;
|
|
|
|
|
|
|
|
|
|
axis[i % 2].defAngle = dAngle + (10.0 * (double)random() / ((double) RAND_MAX)) - 5.0;
|
|
|
|
|
axis[i % 2].defLen = dLen + (3.0 * (double)random() / ((double) RAND_MAX) - 1.5);
|
|
|
|
|
axis[i % 2].v = 1.0;
|
|
|
|
|
axis[i % 2].active = 1;
|
|
|
|
|
i++;
|
|
|
|
|
axis[i % 2].defAngle = dAngle + (10.0 * (double)random() / ((double) RAND_MAX)) + 85.0;
|
|
|
|
|
axis[i % 2].defLen = dLen + (3.0 * (double)random() / ((double) RAND_MAX) - 1.5);
|
|
|
|
|
axis[i % 2].v = 1.0;
|
|
|
|
|
axis[i % 2].active = 1;
|
|
|
|
|
|
|
|
|
|
srand (t);
|
|
|
|
|
|
|
|
|
|
if (_first_run) {
|
|
|
|
|
//
|
|
|
|
|
// object movement
|
|
|
|
|
dAngle = 360.0 * (double)rand() / (double) RAND_MAX;
|
|
|
|
|
dLen = 1.0 + 5.0 * (double)rand() / (double) RAND_MAX;
|
|
|
|
|
printf ("%s:%d %s dAngle:%f dLen:%f\n", __FILE__, __LINE__, __FUNCTION__, dAngle, dLen);
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// axis movement
|
|
|
|
|
i = 0;
|
|
|
|
|
|
|
|
|
|
axis[i % 2].defAngle = 180.0 + dAngle + (10.0 * (double)rand() / ((double) RAND_MAX)) - 5.0;
|
|
|
|
|
axis[i % 2].defLen = dLen + (3.0 * (double)rand() / ((double) RAND_MAX) - 1.5);
|
|
|
|
|
axis[i % 2].v = 1.0;
|
|
|
|
|
axis[i % 2].active = 1;
|
|
|
|
|
|
|
|
|
|
i++;
|
|
|
|
|
axis[i % 2].defAngle = 180.0 + dAngle + (10.0 * (double)rand() / ((double) RAND_MAX)) + 85.0;
|
|
|
|
|
axis[i % 2].defLen = dLen + (3.0 * (double)rand() / ((double) RAND_MAX) - 1.5);
|
|
|
|
|
axis[i % 2].v = 1.0;
|
|
|
|
|
axis[i % 2].active = 1;
|
|
|
|
|
|
|
|
|
|
// normalize angle between 0..360°
|
|
|
|
|
for (i = 0; i < 2; i++) {
|
|
|
|
|
while (axis[i].defAngle < 0.0) axis[i].defAngle += 360.0;
|
|
|
|
|
while (axis[i].defAngle > 360.0) axis[i].defAngle -= 360.0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
dAngle +=45.0;
|
|
|
|
|
axis[0].defAngle += 45.0;
|
|
|
|
|
axis[1].defAngle += 45.0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
printf ("%s:%d %s Axis1: %f° Len:%f Axis2: %f° Len:%f\n", __FILE__, __LINE__, __FUNCTION__,
|
|
|
|
|
axis[0].defAngle,axis[0].defLen, axis[1].defAngle,axis[1].defLen);
|
|
|
|
|
UnLockMutex();
|
|
|
|
|
_first_run = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Simulation::~Simulation() {
|
|
|
|
|
LockMutex ();
|
|
|
|
|
running = 0;
|
|
|
|
|
UnLockMutex ();
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -248,7 +274,10 @@ void Simulation::ThreadProcess() {
|
|
|
|
|
int r = 1;
|
|
|
|
|
struct timeval tv;
|
|
|
|
|
double ms;
|
|
|
|
|
double dx, dy;
|
|
|
|
|
double dx[3], dy[3];
|
|
|
|
|
#ifdef DEBUG_POSCTL
|
|
|
|
|
double x, y;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
get_cycletime (&tv);
|
|
|
|
|
if (running) return;
|
|
|
|
|
@ -263,25 +292,40 @@ void Simulation::ThreadProcess() {
|
|
|
|
|
// simulate rotation movement
|
|
|
|
|
|
|
|
|
|
// calculate movement
|
|
|
|
|
dx = sindeg(dAngle) * dLen * ms;
|
|
|
|
|
dy = -cosdeg(dAngle) * dLen * ms;
|
|
|
|
|
posX += dx;
|
|
|
|
|
posY += dy;
|
|
|
|
|
dx[0] = sindeg(dAngle) * dLen * ms;
|
|
|
|
|
dy[0] = -cosdeg(dAngle) * dLen * ms;
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// simulate motor axis movement
|
|
|
|
|
for (int i = 0; i < 2; i++)
|
|
|
|
|
if (axis[i].active) {
|
|
|
|
|
dx = sindeg(axis[i].defAngle) * axis[i].defLen * (1.0 + axis[i].v) * ms;
|
|
|
|
|
dy = -cosdeg(axis[i].defAngle) * axis[i].defLen * (1.0 + axis[i].v) * ms;
|
|
|
|
|
posX -= dx;
|
|
|
|
|
posY -= dy;
|
|
|
|
|
dx[i+1] = sindeg(axis[i].defAngle) * axis[i].defLen * (1.0 + axis[i].v) * ms;
|
|
|
|
|
dy[i+1] = -cosdeg(axis[i].defAngle) * axis[i].defLen * (1.0 + axis[i].v) * ms;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
dx[i+1] = 0.0;
|
|
|
|
|
dy[i+1] = 0.0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// this is needed for debugging
|
|
|
|
|
#ifdef DEBUG_POSCTL
|
|
|
|
|
x = posX; y = posY;
|
|
|
|
|
#endif
|
|
|
|
|
posX = posX + dx[0] + dx[1] + dx[2];
|
|
|
|
|
posY = posY + dy[0] + dy[1] + dy[2];
|
|
|
|
|
if (posX < 0) posX = w - 1.0;
|
|
|
|
|
if (posY < 0) posY = h - 1.0;
|
|
|
|
|
if (posX > w) posX = 0.0;
|
|
|
|
|
if (posY > h) posY = 0.0;
|
|
|
|
|
|
|
|
|
|
#ifdef DEBUG_POSCTL
|
|
|
|
|
debug_tofile((char*)"simulation.log", (char*)"%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g\n",
|
|
|
|
|
dAngle, dLen, x, y, dx[0], dy[0], ms,
|
|
|
|
|
axis[0].defAngle,axis[0].defLen,axis[0].v,dx[1],dy[1],
|
|
|
|
|
axis[1].defAngle,axis[1].defLen,axis[1].v,dx[2],dy[2],
|
|
|
|
|
posX, posY
|
|
|
|
|
);
|
|
|
|
|
#endif
|
|
|
|
|
r = running;
|
|
|
|
|
UnLockMutex();
|
|
|
|
|
} while (r);
|
|
|
|
|
|