mirror of
https://github.com/RobotechLille/cdf2018-principal
synced 2024-12-04 14:06:05 +01:00
Attente fin de consigne
This commit is contained in:
parent
de62a72457
commit
289898a763
|
@ -37,6 +37,8 @@
|
||||||
#define D_DIR_ECART_MAX 5.0 // mm
|
#define D_DIR_ECART_MAX 5.0 // mm
|
||||||
#define O_DIR_ECART_MIN (6.0 / 360.0 * 2.0 * M_PI) // rad
|
#define O_DIR_ECART_MIN (6.0 / 360.0 * 2.0 * M_PI) // rad
|
||||||
#define O_DIR_ECART_MAX (45.0 / 360.0 * 2.0 * M_PI) // rad
|
#define O_DIR_ECART_MAX (45.0 / 360.0 * 2.0 * M_PI) // rad
|
||||||
|
#define D_CONS_THRESOLD 1.0 // mm
|
||||||
|
#define O_CONS_THRESOLD (6.0 / 360.0 * 2.0 * M_PI) // rad
|
||||||
#define O_GAIN 3.0
|
#define O_GAIN 3.0
|
||||||
#define P 3.0
|
#define P 3.0
|
||||||
#define I 0.0
|
#define I 0.0
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
@ -15,6 +15,9 @@ pthread_mutex_t movCons;
|
||||||
pthread_mutex_t movEnableMutex;
|
pthread_mutex_t movEnableMutex;
|
||||||
pthread_cond_t movEnableCond;
|
pthread_cond_t movEnableCond;
|
||||||
bool movEnableBool;
|
bool movEnableBool;
|
||||||
|
pthread_mutex_t movDoneMutex;
|
||||||
|
pthread_cond_t movDoneCond;
|
||||||
|
bool movDoneBool;
|
||||||
|
|
||||||
float xDiff;
|
float xDiff;
|
||||||
float yDiff;
|
float yDiff;
|
||||||
|
@ -47,6 +50,9 @@ void configureMovement()
|
||||||
pthread_mutex_init(&movEnableMutex, NULL);
|
pthread_mutex_init(&movEnableMutex, NULL);
|
||||||
pthread_cond_init(&movEnableCond, NULL);
|
pthread_cond_init(&movEnableCond, NULL);
|
||||||
movEnableBool = false;
|
movEnableBool = false;
|
||||||
|
pthread_mutex_init(&movDoneMutex, NULL);
|
||||||
|
pthread_cond_init(&movDoneCond, NULL);
|
||||||
|
movDoneBool = false;
|
||||||
|
|
||||||
pthread_create(&tMovement, NULL, TaskMovement, NULL);
|
pthread_create(&tMovement, NULL, TaskMovement, NULL);
|
||||||
|
|
||||||
|
@ -78,6 +84,25 @@ void setDestination(struct position* pos)
|
||||||
pthread_mutex_unlock(&movCons);
|
pthread_mutex_unlock(&movCons);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void waitDestination()
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&movDoneMutex);
|
||||||
|
while (!movDoneBool) {
|
||||||
|
pthread_cond_wait(&movDoneCond, &movDoneMutex);
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&movDoneMutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void sendTo(float x, float y, float o)
|
||||||
|
{
|
||||||
|
enableConsigne();
|
||||||
|
struct position pos = {x, y, o};
|
||||||
|
setDestination(&pos);
|
||||||
|
waitDestination();
|
||||||
|
brake();
|
||||||
|
disableConsigne();
|
||||||
|
}
|
||||||
|
|
||||||
float angleGap(float target, float actual)
|
float angleGap(float target, float actual)
|
||||||
{
|
{
|
||||||
return fmod(target - actual + M_PI, 2 * M_PI) - M_PI;
|
return fmod(target - actual + M_PI, 2 * M_PI) - M_PI;
|
||||||
|
@ -135,7 +160,7 @@ void* TaskMovement(void* pData)
|
||||||
// Si on est loin de la consigne, l'angle cible devient celui orienté vers la consigne
|
// Si on est loin de la consigne, l'angle cible devient celui orienté vers la consigne
|
||||||
if (dDirEcart > D_DIR_ECART_MAX) {
|
if (dDirEcart > D_DIR_ECART_MAX) {
|
||||||
oRetenu = true;
|
oRetenu = true;
|
||||||
// Si on est proche de la consigne, l'angle cible devient celui voulu par la consigne
|
// Si on est proche de la consigne, l'angle cible devient celui voulu par la consigne
|
||||||
} else if (dDirEcart < D_DIR_ECART_MIN) {
|
} else if (dDirEcart < D_DIR_ECART_MIN) {
|
||||||
oRetenu = false;
|
oRetenu = false;
|
||||||
}
|
}
|
||||||
|
@ -146,13 +171,20 @@ void* TaskMovement(void* pData)
|
||||||
// pour se réorienter vers l'angle de la consigne
|
// pour se réorienter vers l'angle de la consigne
|
||||||
if (oDirEcartAbs > O_DIR_ECART_MAX) {
|
if (oDirEcartAbs > O_DIR_ECART_MAX) {
|
||||||
dRetenu = true;
|
dRetenu = true;
|
||||||
// Si l'écart avec l'angle orienté vers la consigne est petit, la distance cible devient
|
// Si l'écart avec l'angle orienté vers la consigne est petit, la distance cible devient
|
||||||
// la distance entre la position actuelle et la consigne
|
// la distance entre la position actuelle et la consigne
|
||||||
} else if (oDirEcartAbs < O_DIR_ECART_MIN) {
|
} else if (oDirEcartAbs < O_DIR_ECART_MIN) {
|
||||||
dRetenu = false;
|
dRetenu = false;
|
||||||
}
|
}
|
||||||
dErr = dRetenu ? 0 : dDirEcart;
|
dErr = dRetenu ? 0 : dDirEcart;
|
||||||
|
|
||||||
|
// Calcul si on est arrivé
|
||||||
|
pthread_mutex_lock(&movDoneMutex);
|
||||||
|
clock_gettime(CLOCK_REALTIME, &pidNow);
|
||||||
|
movDoneBool = !dRetenu && !oRetenu && dDirEcart < D_CONS_THRESOLD && oEcart < O_CONS_THRESOLD;
|
||||||
|
pthread_cond_signal(&movDoneCond);
|
||||||
|
pthread_mutex_unlock(&movDoneMutex);
|
||||||
|
|
||||||
// Ordre → Volt
|
// Ordre → Volt
|
||||||
// Nombre de rotation nécessaire sur les deux roues dans le même sens pour arriver à la distance voulue
|
// Nombre de rotation nécessaire sur les deux roues dans le même sens pour arriver à la distance voulue
|
||||||
float dErrRev = dErr / WHEEL_PERIMETER;
|
float dErrRev = dErr / WHEEL_PERIMETER;
|
||||||
|
|
Loading…
Reference in a new issue