Ajout de la boucle d'asservissement en position. Fonctionnel mais les gains ne sont pas optimisés.
This commit is contained in:
parent
4d004496db
commit
2d93697571
@ -27,7 +27,9 @@ void AsserMoteur_Init(){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @brief Défini une consigne de vitesse pour le moteur indiqué.
|
||||||
|
/// @param moteur : Moteur à asservir
|
||||||
|
/// @param _consigne_mm_s : consigne de vitesse en mm/s
|
||||||
void AsserMoteur_setConsigne_mm_s(enum t_moteur moteur, double _consigne_mm_s){
|
void AsserMoteur_setConsigne_mm_s(enum t_moteur moteur, double _consigne_mm_s){
|
||||||
consigne_mm_s[moteur] = _consigne_mm_s;
|
consigne_mm_s[moteur] = _consigne_mm_s;
|
||||||
|
|
||||||
@ -50,6 +52,8 @@ double AsserMoteur_getVitesse_mm_s(enum t_moteur moteur, int step_ms){
|
|||||||
return distance / temps;
|
return distance / temps;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @brief Fonction d'asservissement des moteurs, à appeler périodiquement
|
||||||
|
/// @param step_ms
|
||||||
void AsserMoteur_Gestion(int step_ms){
|
void AsserMoteur_Gestion(int step_ms){
|
||||||
// Pour chaque moteur
|
// Pour chaque moteur
|
||||||
for(uint moteur=MOTEUR_A; moteur<MOTEUR_C+1; moteur++ ){
|
for(uint moteur=MOTEUR_A; moteur<MOTEUR_C+1; moteur++ ){
|
||||||
|
41
Asser_Position.c
Normal file
41
Asser_Position.c
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
#include "Localisation.h"
|
||||||
|
#include "Commande_vitesse.h"
|
||||||
|
#include "math.h"
|
||||||
|
|
||||||
|
#define GAIN_P_POSITION 100
|
||||||
|
#define GAIN_P_ORIENTATION 100
|
||||||
|
|
||||||
|
/// @brief Asservissement de la position du robot. Les gains sont déterminés pour des positions très proches du robot
|
||||||
|
/// C'est à la consigne d'être défini avant pour être atteignable.
|
||||||
|
/// Nécessite l'appel des fonctions QEI_update(); Localisation_gestion(); AsserMoteur_Gestion(_step_ms);
|
||||||
|
/// @param position_consigne : position à atteindre dans le référentiel de la table.
|
||||||
|
void Asser_Position(struct position_t position_consigne){
|
||||||
|
double vitesse_x_mm_s, vitesse_y_mm_s, rotation_radian_s;
|
||||||
|
double vitesse_robot_x_mm_s, vitesse_robot_y_mm_s;
|
||||||
|
double delta_x_mm, delta_y_mm, delta_orientation_radian;
|
||||||
|
struct position_t position_actuelle;
|
||||||
|
|
||||||
|
position_actuelle = Localisation_get();
|
||||||
|
|
||||||
|
// Calcul de l'erreur
|
||||||
|
delta_x_mm = position_consigne.x_mm - position_actuelle.x_mm;
|
||||||
|
delta_y_mm = position_consigne.y_mm - position_actuelle.y_mm;
|
||||||
|
delta_orientation_radian = position_consigne.angle_radian - position_actuelle.angle_radian;
|
||||||
|
|
||||||
|
// Asservissement
|
||||||
|
vitesse_x_mm_s = delta_x_mm * GAIN_P_POSITION;
|
||||||
|
vitesse_y_mm_s = delta_y_mm * GAIN_P_POSITION;
|
||||||
|
rotation_radian_s = delta_orientation_radian * GAIN_P_ORIENTATION;
|
||||||
|
|
||||||
|
// Projection des translations dans le référentiel du robot
|
||||||
|
// C'est pas bon, c'est l'inverse !!!
|
||||||
|
//vitesse_robot_x_mm_s = cos(position_actuelle.angle_radian) * vitesse_x_mm_s - sin(position_actuelle.angle_radian) * vitesse_y_mm_s;
|
||||||
|
//vitesse_robot_y_mm_s = sin(position_actuelle.angle_radian) * vitesse_x_mm_s + cos(position_actuelle.angle_radian) * vitesse_y_mm_s;
|
||||||
|
vitesse_robot_x_mm_s = cos(position_actuelle.angle_radian) * vitesse_x_mm_s + sin(position_actuelle.angle_radian) * vitesse_y_mm_s;
|
||||||
|
vitesse_robot_y_mm_s = -sin(position_actuelle.angle_radian) * vitesse_x_mm_s + cos(position_actuelle.angle_radian) * vitesse_y_mm_s;
|
||||||
|
|
||||||
|
// Commande en vitesse
|
||||||
|
commande_vitesse(vitesse_robot_x_mm_s, vitesse_robot_y_mm_s, rotation_radian_s);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
1
Asser_Position.h
Normal file
1
Asser_Position.h
Normal file
@ -0,0 +1 @@
|
|||||||
|
void Asser_Position(struct position_t position_consigne);
|
@ -11,6 +11,7 @@ add_executable(test
|
|||||||
test.c
|
test.c
|
||||||
APDS_9960.c
|
APDS_9960.c
|
||||||
Asser_Moteurs.c
|
Asser_Moteurs.c
|
||||||
|
Asser_Position.c
|
||||||
Commande_vitesse.c
|
Commande_vitesse.c
|
||||||
QEI.c
|
QEI.c
|
||||||
gyro.c
|
gyro.c
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#include "Asser_Moteurs.h"
|
#include "Asser_Moteurs.h"
|
||||||
#include "Geometrie_robot.h"
|
#include "Geometrie_robot.h"
|
||||||
|
|
||||||
|
/// @brief Commande de la vitesse dans le référentiel du robot
|
||||||
|
/// @param vitesse_x_mm_s : Vitesse x en mm/s dans le référentiel du robot
|
||||||
|
/// @param vitesse_y_mm_s : Vitesse y en mm/s dans le référentiel du robot
|
||||||
|
/// @param orientation_radian_s : Rotation en radian/s dans le référentiel du robot
|
||||||
void commande_vitesse(double vitesse_x_mm_s, double vitesse_y_mm_s, double orientation_radian_s){
|
void commande_vitesse(double vitesse_x_mm_s, double vitesse_y_mm_s, double orientation_radian_s){
|
||||||
double vitesse_roue_a, vitesse_roue_b, vitesse_roue_c;
|
double vitesse_roue_a, vitesse_roue_b, vitesse_roue_c;
|
||||||
|
|
||||||
|
97
test.c
97
test.c
@ -3,6 +3,7 @@
|
|||||||
#include "pico/stdlib.h"
|
#include "pico/stdlib.h"
|
||||||
#include "hardware/gpio.h"
|
#include "hardware/gpio.h"
|
||||||
#include "pico/binary_info.h"
|
#include "pico/binary_info.h"
|
||||||
|
#include "math.h"
|
||||||
|
|
||||||
#include "gyro.h"
|
#include "gyro.h"
|
||||||
#include "Temps.h"
|
#include "Temps.h"
|
||||||
@ -13,7 +14,8 @@
|
|||||||
#include "Asser_Moteurs.h"
|
#include "Asser_Moteurs.h"
|
||||||
#include "Localisation.h"
|
#include "Localisation.h"
|
||||||
#include "Commande_vitesse.h"
|
#include "Commande_vitesse.h"
|
||||||
#include "math.h"
|
#include "Asser_Position.h"
|
||||||
|
|
||||||
|
|
||||||
const uint LED_PIN = 25;
|
const uint LED_PIN = 25;
|
||||||
const uint LED_PIN_ROUGE = 28;
|
const uint LED_PIN_ROUGE = 28;
|
||||||
@ -34,6 +36,9 @@ int test_avance(void);
|
|||||||
int test_cde_vitesse_rotation();
|
int test_cde_vitesse_rotation();
|
||||||
int test_cde_vitesse_rectangle();
|
int test_cde_vitesse_rectangle();
|
||||||
int test_cde_vitesse_cercle();
|
int test_cde_vitesse_cercle();
|
||||||
|
int test_asser_position_avance();
|
||||||
|
int test_asser_position_avance_et_tourne();
|
||||||
|
void affiche_localisation();
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
bi_decl(bi_program_description("This is a test binary."));
|
bi_decl(bi_program_description("This is a test binary."));
|
||||||
@ -139,6 +144,8 @@ int mode_test(){
|
|||||||
printf("E - Commande en vitesse - rotation pure\n");
|
printf("E - Commande en vitesse - rotation pure\n");
|
||||||
printf("F - Commande en vitesse - carré\n");
|
printf("F - Commande en vitesse - carré\n");
|
||||||
printf("G - Commande en vitesse - cercle\n");
|
printf("G - Commande en vitesse - cercle\n");
|
||||||
|
printf("H - Asser Position - avance\n");
|
||||||
|
printf("I - Asser Position - avance et tourne\n");
|
||||||
printf("M - pour les moteurs\n");
|
printf("M - pour les moteurs\n");
|
||||||
printf("L - pour la localisation\n");
|
printf("L - pour la localisation\n");
|
||||||
stdio_flush();
|
stdio_flush();
|
||||||
@ -180,6 +187,16 @@ int mode_test(){
|
|||||||
while(test_cde_vitesse_cercle());
|
while(test_cde_vitesse_cercle());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'H':
|
||||||
|
case 'h':
|
||||||
|
while(test_asser_position_avance());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'I':
|
||||||
|
case 'i':
|
||||||
|
while(test_asser_position_avance_et_tourne());
|
||||||
|
break;
|
||||||
|
|
||||||
case 'M':
|
case 'M':
|
||||||
case 'm':
|
case 'm':
|
||||||
/* code */
|
/* code */
|
||||||
@ -205,6 +222,74 @@ int mode_test(){
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int test_asser_position_avance_et_tourne(){
|
||||||
|
int lettre, _step_ms = 1, temps_ms=0;
|
||||||
|
struct position_t position_consigne;
|
||||||
|
|
||||||
|
position_consigne.angle_radian = 0;
|
||||||
|
position_consigne.x_mm = 0;
|
||||||
|
position_consigne.y_mm = 0;
|
||||||
|
|
||||||
|
printf("Le robot avance à 100 mm/s\n");
|
||||||
|
multicore_launch_core1(affiche_localisation);
|
||||||
|
do{
|
||||||
|
QEI_update();
|
||||||
|
Localisation_gestion();
|
||||||
|
AsserMoteur_Gestion(_step_ms);
|
||||||
|
|
||||||
|
position_consigne.angle_radian = (double) temps_ms /1000. ;
|
||||||
|
/*
|
||||||
|
if(temps_ms < 10000){
|
||||||
|
position_consigne.y_mm = (double) temps_ms * 100. / 1000.;
|
||||||
|
}else if(temps_ms < 10000){
|
||||||
|
position_consigne.y_mm = 1000 - (double) temps_ms * 100. / 1000.;
|
||||||
|
}else{
|
||||||
|
temps_ms = 0;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
position_consigne.y_mm = (double) temps_ms * 100. / 1000.;
|
||||||
|
|
||||||
|
Asser_Position(position_consigne);
|
||||||
|
temps_ms += _step_ms;
|
||||||
|
sleep_ms(_step_ms);
|
||||||
|
|
||||||
|
lettre = getchar_timeout_us(0);
|
||||||
|
}while(lettre == PICO_ERROR_TIMEOUT);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int test_asser_position_avance(){
|
||||||
|
int lettre, _step_ms = 1, temps_ms=0;
|
||||||
|
struct position_t position;
|
||||||
|
|
||||||
|
position.angle_radian = 0;
|
||||||
|
position.x_mm = 0;
|
||||||
|
position.y_mm = 0;
|
||||||
|
|
||||||
|
printf("Le robot avance à 100 mm/s\n");
|
||||||
|
do{
|
||||||
|
QEI_update();
|
||||||
|
Localisation_gestion();
|
||||||
|
AsserMoteur_Gestion(_step_ms);
|
||||||
|
|
||||||
|
if(temps_ms < 5000){
|
||||||
|
position.x_mm = (double) temps_ms * 100. / 1000.;
|
||||||
|
}else if(temps_ms < 10000){
|
||||||
|
position.x_mm = 1000 - (double) temps_ms * 100. / 1000.;
|
||||||
|
}else{
|
||||||
|
temps_ms = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Asser_Position(position);
|
||||||
|
temps_ms += _step_ms;
|
||||||
|
sleep_ms(_step_ms);
|
||||||
|
|
||||||
|
lettre = getchar_timeout_us(0);
|
||||||
|
}while(lettre == PICO_ERROR_TIMEOUT);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int test_cde_vitesse_rotation(){
|
int test_cde_vitesse_rotation(){
|
||||||
int lettre, _step_ms = 1;
|
int lettre, _step_ms = 1;
|
||||||
@ -252,7 +337,6 @@ int test_cde_vitesse_rectangle(){
|
|||||||
|
|
||||||
int test_cde_vitesse_cercle(){
|
int test_cde_vitesse_cercle(){
|
||||||
int lettre, _step_ms = 1, temps_ms=0;
|
int lettre, _step_ms = 1, temps_ms=0;
|
||||||
uint64_t t_apres, t_avant;
|
|
||||||
|
|
||||||
printf("déplacement en cercle du robot : 100 mm/s\n");
|
printf("déplacement en cercle du robot : 100 mm/s\n");
|
||||||
do{
|
do{
|
||||||
@ -289,6 +373,15 @@ int test_avance(void){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void affiche_localisation(){
|
||||||
|
struct position_t position;
|
||||||
|
while(1){
|
||||||
|
position = Localisation_get();
|
||||||
|
printf("X: %f, Y: %f, angle: %f\n", position.x_mm, position.y_mm, position.angle_radian *180. / 3.141592654);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void test_asser_moteur_printf(){
|
void test_asser_moteur_printf(){
|
||||||
int _step_ms = 1;
|
int _step_ms = 1;
|
||||||
while(1){
|
while(1){
|
||||||
|
Loading…
Reference in New Issue
Block a user