rotation is now calculated on calibration.

master
Steffen Pohle 3 years ago
parent 68f68489f7
commit 4a9d471ca1

@ -33,18 +33,49 @@ enum {
POSCTL_MODE_CONTROL POSCTL_MODE_CONTROL
}; };
enum {
POSCTL_CALIB_MODE_OFF = 0,
POSCTL_CALIB_MODE_START,
POSCTL_CALIB_MODE_DELTA,
POSCTL_CALIB_MODE_AXIS1_MI,
POSCTL_CALIB_MODE_AXIS1_MA,
POSCTL_CALIB_MODE_AXIS2_MI,
POSCTL_CALIB_MODE_AXIS2_MA,
POSCTL_CALIB_MODE_FINISH
};
class PosCtl { class PosCtl {
private: private:
GMutex mutex; GMutex mutex;
int mode; int mode;
PID pid_axis[2]; PID pid_axis[2];
struct timeval calib_timestamp;
int calib_mode;
position_2d calib_pos;
void CalibModeStart(int x, int y);
void CalibModeDelta(int x, int y);
void CalibModeAxis(int x, int y);
void CalibModeFinish();
time_t test_t1; // FIXME: only for testing gui functions
public: public:
PosCtl(); PosCtl();
~PosCtl() {}; ~PosCtl() {};
double calib_rot_angle;
double calib_rot_len;
double calib_axis1_angle;
double calib_axis1_lenmi;
double calib_axis1_lenma;
double calib_axis2_angle;
double calib_axis2_lenmi;
double calib_axis2_lenma;
void LockMutex() { g_mutex_lock(&mutex); }; void LockMutex() { g_mutex_lock(&mutex); };
void UnLockMutex() { g_mutex_unlock(&mutex); }; void UnLockMutex() { g_mutex_unlock(&mutex); };

@ -59,10 +59,10 @@ void cb_posctl_angles_draw(GtkWidget *area, cairo_t *cr, int w, int h, gpointer
// rotation da // rotation da
GtkWidget *entry_rot_angle = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_rotangle")); GtkWidget *entry_rot_angle = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_rotangle"));
GtkWidget *entry_rot_len = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_rotlen")); GtkWidget *entry_rot_len = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_rotlen"));
GtkWidget *entry_axis1_angle = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a1anlge")); GtkWidget *entry_axis1_angle = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a1angle"));
GtkWidget *entry_axis1_lenmi = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a1lenmi")); GtkWidget *entry_axis1_lenmi = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a1lenmi"));
GtkWidget *entry_axis1_lenma = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a1lenma")); GtkWidget *entry_axis1_lenma = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a1lenma"));
GtkWidget *entry_axis2_angle = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2anlge")); GtkWidget *entry_axis2_angle = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2angle"));
GtkWidget *entry_axis2_lenmi = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2lenmi")); GtkWidget *entry_axis2_lenmi = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2lenmi"));
GtkWidget *entry_axis2_lenma = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2lenma")); GtkWidget *entry_axis2_lenma = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2lenma"));
@ -217,9 +217,22 @@ void cb_posctl_axis_draw(GtkWidget *area, cairo_t *cr, int w, int h, gpointer da
* posctl gui update * posctl gui update
*/ */
void posctl_gui_update() { void posctl_gui_update() {
char txt[255];
GtkWidget *btnclib = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_btn_calib")); GtkWidget *btnclib = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_btn_calib"));
GtkWidget *cbenable = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_enablectl")); GtkWidget *cbenable = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_enablectl"));
GtkWidget *e_cal_rotangle = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_rotangle"));
GtkWidget *e_cal_rotlen = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_rotlen"));
GtkWidget *e_cal_a1angle = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a1angle"));
GtkWidget *e_cal_a1lenmi = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a1lenmi"));
GtkWidget *e_cal_a1lenma = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a1lenma"));
GtkWidget *e_cal_a2angle = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2angle"));
GtkWidget *e_cal_a2lenmi = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2lenmi"));
GtkWidget *e_cal_a2lenma = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "posctl_entry_a2lenma"));
posctl.LockMutex(); posctl.LockMutex();
int m = posctl.GetMode(); int m = posctl.GetMode();
@ -232,6 +245,25 @@ void posctl_gui_update() {
gtk_widget_set_sensitive(cbenable, false); gtk_widget_set_sensitive(cbenable, false);
} }
strfromd (txt, sizeof(txt-1), (const char *)"%f", posctl.calib_rot_angle);
gtk_entry_set_text (GTK_ENTRY(e_cal_rotangle), txt);
strfromd (txt, sizeof(txt-1), (const char *)"%f", posctl.calib_rot_len);
gtk_entry_set_text (GTK_ENTRY(e_cal_rotlen), txt);
strfromd (txt, sizeof(txt-1), (const char *)"%f", posctl.calib_axis1_angle);
gtk_entry_set_text (GTK_ENTRY(e_cal_a1angle), txt);
strfromd (txt, sizeof(txt-1), (const char *)"%f", posctl.calib_axis1_lenmi);
gtk_entry_set_text (GTK_ENTRY(e_cal_a1lenmi), txt);
strfromd (txt, sizeof(txt-1), (const char *)"%f", posctl.calib_axis1_lenma);
gtk_entry_set_text (GTK_ENTRY(e_cal_a1lenma), txt);
strfromd (txt, sizeof(txt-1), (const char *)"%f", posctl.calib_axis2_angle);
gtk_entry_set_text (GTK_ENTRY(e_cal_a2angle), txt);
strfromd (txt, sizeof(txt-1), (const char *)"%f", posctl.calib_axis2_lenmi);
gtk_entry_set_text (GTK_ENTRY(e_cal_a2lenmi), txt);
strfromd (txt, sizeof(txt-1), (const char *)"%f", posctl.calib_axis2_lenma);
gtk_entry_set_text (GTK_ENTRY(e_cal_a2lenma), txt);
posctl.UnLockMutex(); posctl.UnLockMutex();
} }
@ -248,7 +280,16 @@ gboolean cb_thread_posctl (gpointer data) {
PosCtl::PosCtl() { PosCtl::PosCtl() {
mode = POSCTL_MODE_OFF; mode = POSCTL_MODE_OFF;
test_t1 = 0;
calib_mode = POSCTL_CALIB_MODE_OFF;
calib_rot_len = 0.0;
calib_rot_angle = 0.0;
calib_axis1_angle = 0.0;
calib_axis1_lenmi = 0.0;
calib_axis1_lenma = 0.0;
calib_axis2_angle = 0.0;
calib_axis2_lenmi = 0.0;
calib_axis2_lenma = 0.0;
}; };
@ -269,7 +310,8 @@ void PosCtl::StartCalibration() {
return; return;
} }
mode = POSCTL_MODE_CALIB; mode = POSCTL_MODE_CALIB;
test_t1 = time (NULL); calib_mode = POSCTL_CALIB_MODE_START;
gettimeofday (&calib_timestamp, NULL);
gdk_threads_add_idle(cb_thread_posctl, NULL); gdk_threads_add_idle(cb_thread_posctl, NULL);
} }
@ -305,16 +347,106 @@ void PosCtl::GetAxisParam ( int axis, double *min, double *max,
}; };
/*
* calibration functions
*/
void PosCtl::CalibModeStart(int x, int y) {
printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__);
calib_pos.x = x;
calib_pos.y = y;
calib_mode = POSCTL_CALIB_MODE_DELTA;
gettimeofday (&calib_timestamp, NULL);
gdk_threads_add_idle(cb_thread_posctl, NULL);
};
void PosCtl::CalibModeDelta(int x, int y) {
struct timeval tv;
float timediff;
gettimeofday (&tv, NULL);
timediff = (float)(tv.tv_sec - calib_timestamp.tv_sec) + ((tv.tv_usec - calib_timestamp.tv_usec) / 1000000.0);
if (timediff > 10.0) {
position_f_2d fp;
printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__);
fp.x = x - calib_pos.x;
fp.x /= (float)timediff;
fp.y = y - calib_pos.y;
fp.y /= (float)timediff;
LockMutex();
calib_rot_angle = atan2(fp.x, fp.y) * 180.0 / M_PI;
calib_rot_len = sqrt(fp.x * fp.x + fp.y * fp.y);
UnLockMutex();
calib_mode = POSCTL_CALIB_MODE_AXIS1_MA;
gettimeofday (&calib_timestamp, NULL);
gdk_threads_add_idle(cb_thread_posctl, NULL);
}
};
void PosCtl::CalibModeAxis(int x, int y) {
struct timeval tv;
float timediff;
gettimeofday (&tv, NULL);
timediff = (float)(tv.tv_sec - calib_timestamp.tv_sec) + ((tv.tv_usec - calib_timestamp.tv_usec) / 1000000.0);
if (timediff > 10.0) {
printf ("%s:%d %s calib_mode: %d\n", __FILE__, __LINE__, __FUNCTION__, calib_mode);
calib_mode++;
gettimeofday (&calib_timestamp, NULL);
gdk_threads_add_idle(cb_thread_posctl, NULL);
}
};
void PosCtl::CalibModeFinish() {
printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__);
mode = POSCTL_MODE_OFF;
calib_mode = POSCTL_CALIB_MODE_OFF;
gettimeofday (&calib_timestamp, NULL);
gdk_threads_add_idle(cb_thread_posctl, NULL);
};
/* /*
* Loop, if new data is aviable * Loop, if new data is aviable
*/ */
void PosCtl::Loop (int posx, int posy) { void PosCtl::Loop (int posx, int posy) {
time_t t = time(NULL); //
// calibration mode?
// FIXME:: only for testing gui function if (mode == POSCTL_MODE_CALIB) {
if ((t - test_t1) > 5) { switch (calib_mode) {
case (POSCTL_CALIB_MODE_START):
CalibModeStart(posx, posy);
break;
case (POSCTL_CALIB_MODE_DELTA):
CalibModeDelta(posx, posy);
break;
case (POSCTL_CALIB_MODE_AXIS1_MI):
case (POSCTL_CALIB_MODE_AXIS1_MA):
case (POSCTL_CALIB_MODE_AXIS2_MI):
case (POSCTL_CALIB_MODE_AXIS2_MA):
CalibModeAxis(posx, posy);
break;
case (POSCTL_CALIB_MODE_FINISH):
CalibModeFinish();
break;
default:
calib_mode = POSCTL_CALIB_MODE_OFF;
mode = POSCTL_MODE_OFF; mode = POSCTL_MODE_OFF;
gdk_threads_add_idle(cb_thread_posctl, NULL); gdk_threads_add_idle(cb_thread_posctl, NULL);
} }
}
}; };

@ -758,7 +758,7 @@
<property name="row-spacing">4</property> <property name="row-spacing">4</property>
<property name="column-spacing">4</property> <property name="column-spacing">4</property>
<child> <child>
<object class="GtkEntry" id="posctl_entry_a1anlge"> <object class="GtkEntry" id="posctl_entry_a1angle">
<property name="visible">True</property> <property name="visible">True</property>
<property name="sensitive">False</property> <property name="sensitive">False</property>
<property name="can-focus">True</property> <property name="can-focus">True</property>
@ -788,7 +788,7 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkEntry" id="posctl_entry_a2anlge"> <object class="GtkEntry" id="posctl_entry_a2angle">
<property name="visible">True</property> <property name="visible">True</property>
<property name="sensitive">False</property> <property name="sensitive">False</property>
<property name="can-focus">True</property> <property name="can-focus">True</property>

Loading…
Cancel
Save