Robot Principal 26
Documentation du Club Robot INSA Rennes 2026
Chargement...
Recherche...
Aucune correspondance
Wheeledbase.h
Aller à la documentation de ce fichier.
1//
2// Created by boris on 28/10/2024.
3//
10#ifndef WHEELEDBASE_H
11#define WHEELEDBASE_H
12
13#include <functional>
14
15#include "WheelMotor.h"
16#include "Components/Codewheel.h"
17#include "Components/Odometry.h"
18#include "Controller/PID.h"
20#include "Controller/PositionController.h"
21#include "MoveStrategy/PurePursuit.h"
23#include <memory>
24
25#include "DRV8844.h"
26#include "Logger.h"
27
28// Parameters identifiers
36#define SLOWDOWN_FACTOR 0.5
37#define SLOWDOWN_DISTANCE 0
38#define ALIGN_DISTANCE 130
40
47namespace Wheeledbase {
48
55 {
56 const float LEFTWHEEL_RADIUS;
57 const float LEFTWHEEL_CONSTANT;
58 const float LEFTWHEEL_MAXPWM;
59 const float RIGHTWHEEL_RADIUS;
60 const float RIGHTWHEEL_CONSTANT;
61 const float RIGHTWHEEL_MAXPWM;
62 const long LEFTCODEWHEEL_COUNTSPERREV;
63 const long RIGHTCODEWHEEL_COUNTSPERREV;
64 const float LEFTCODEWHEEL_RADIUS;
65 const float RIGHTCODEWHEEL_RADIUS;
66
67 const float ODOMETRY_AXLETRACK;
68 const float ODOMETRY_SLIPPAGE;
69
70 const float VELOCITYCONTROL_AXLETRACK;
71 const float VELOCITYCONTROL_MAXLINACC;
72 const float VELOCITYCONTROL_MAXLINDEC;
73 const float VELOCITYCONTROL_MAXANGACC;
74 const float VELOCITYCONTROL_MAXANGDEC;
75 const bool VELOCITYCONTROL_SPINSHUTDOWN;
76
77 /*---- LINEAR VELOCITIES PID ----*/
78 const float LINVELPID_KP;
79 const float LINVELPID_KI;
80 const float LINVELPID_KD;
81
82 const float LINVELPID_MINOUTPUT;
83 const float LINVELPID_MAXOUTPUT;
84
85 /*---- ANGULAR VELOCITIES PID ----*/
86 const float ANGVELPID_KP;
87 const float ANGVELPID_KI;
88 const float ANGVELPID_KD;
89
90 const float ANGVELPID_MINOUTPUT;
91 const float ANGVELPID_MAXOUTPUT;
92
93 /*---- POSITION PID ----*/
94 const float POSITIONCONTROL_LINVELKP;
95 const float POSITIONCONTROL_ANGVELKP;
96
97 const float POSITIONCONTROL_LINVELMAX;
98 const float POSITIONCONTROL_ANGVELMAX;
99 const float POSITIONCONTROL_LINPOSTHRESHOLD;
100 const float POSITIONCONTROL_ANGPOSTHRESHOLD;
101 const float PUREPURSUIT_LOOKAHEAD;
102 const float PUREPURSUIT_LOOKAHEADBIS;
103
104 // Timesteps
105 const float ODOMETRY_TIMESTEP;
106 const float PID_CONTROLLERS_TIMESTEP;
107 const float POSITIONCONTROL_TIMESTEP;
108
109 // DC motors driver
110 const int LEFT_MOTOR_EN;
111 const int LEFT_MOTOR_PWM;
112 const int LEFT_MOTOR_DIR;
113 const int RIGHT_MOTOR_EN;
114 const int RIGHT_MOTOR_PWM;
115 const int RIGHT_MOTOR_DIR;
116 const int DRIVER_RESET;
117 const int DRIVER_FAULT;
118 };
119
125 struct WheeledBase {
126 std::unique_ptr<WheelMotor> leftWheel;
127 std::unique_ptr<WheelMotor> rightWheel;
128
129 std::unique_ptr<Codewheel> leftCodewheel;
130 std::unique_ptr<Codewheel> rightCodewheel;
131
132 std::unique_ptr<Odometry> odometry;
133
134 std::unique_ptr<VelocityController> velocityControl;
135 std::unique_ptr<PositionController> positionControl;
136
153 std::unique_ptr<DRV8844> driver,
154 std::unique_ptr<WheelMotor> leftWheel,
155 std::unique_ptr<WheelMotor> rightWheel,
156 std::unique_ptr<Codewheel> leftCodewheel,
157 std::unique_ptr<Codewheel> rightCodewheel,
158 std::unique_ptr<Odometry> odometry,
159 std::unique_ptr<VelocityController> velocityControl,
160 std::unique_ptr<PositionController> positionControl,
161 std::unique_ptr<PID> linVelPID,
162 std::unique_ptr<PID> angVelPID,
163 WBConstants& param,
164 const std::function<void()>& halSetup
165 );
166 };
167
168 [[noreturn]] void run(WheeledBase* wheeledBase, const std::function<void()>& delayFunc);
169
174 enum WBParameterID : uint8_t {
175 WBPID_LEFTWHEEL_RADIUS_ID,
176 WBPID_LEFTWHEEL_CONSTANT_ID,
177 WBPID_LEFTWHEEL_MAXPWM_ID,
178 WBPID_RIGHTWHEEL_RADIUS_ID,
179 WBPID_RIGHTWHEEL_CONSTANT_ID,
180 WBPID_RIGHTWHEEL_MAXPWM_ID,
181 WBPID_LEFTCODEWHEEL_RADIUS_ID,
182 WBPID_LEFTCODEWHEEL_COUNTSPERREV_ID,
183 WBPID_RIGHTCODEWHEEL_RADIUS_ID,
184 WBPID_RIGHTCODEWHEEL_COUNTSPERREV_ID,
185 WBPID_ODOMETRY_AXLETRACK_ID,
186 WBPID_ODOMETRY_SLIPPAGE_ID,
187 WBPID_VELOCITYCONTROL_AXLETRACK_ID,
188 WBPID_VELOCITYCONTROL_MAXLINACC_ID,
189 WBPID_VELOCITYCONTROL_MAXLINDEC_ID,
190 WBPID_VELOCITYCONTROL_MAXANGACC_ID,
191 WBPID_VELOCITYCONTROL_MAXANGDEC_ID,
192 WBPID_VELOCITYCONTROL_SPINSHUTDOWN_ID,
193 WBPID_LINVELPID_KP_ID,
194 WBPID_LINVELPID_KI_ID,
195 WBPID_LINVELPID_KD_ID,
196 WBPID_LINVELPID_MINOUTPUT_ID,
197 WBPID_LINVELPID_MAXOUTPUT_ID,
198 WBPID_ANGVELPID_KP_ID,
199 WBPID_ANGVELPID_KI_ID,
200 WBPID_ANGVELPID_KD_ID,
201 WBPID_ANGVELPID_MINOUTPUT_ID,
202 WBPID_ANGVELPID_MAXOUTPUT_ID,
203 WBPID_POSITIONCONTROL_LINVELKP_ID,
204 WBPID_POSITIONCONTROL_ANGVELKP_ID,
205 WBPID_POSITIONCONTROL_LINVELMAX_ID,
206 WBPID_POSITIONCONTROL_ANGVELMAX_ID,
207 WBPID_POSITIONCONTROL_LINPOSTHRESHOLD_ID,
208 WBPID_POSITIONCONTROL_ANGPOSTHRESHOLD_ID,
209 WBPID_PUREPURSUIT_LOOKAHED_ID,
210 WBPID_PUREPURSUIT_LOOKAHEADBIS_ID
211 };
212
213 inline auto wb_logger = Logger("WHEELEDBASE");
214
215 // Instructions prototypes
220 void disable(const WheeledBase* wheeledBase);
221
230 void gotoDelta(WheeledBase* wheeledBase, PurePursuit* purePursuit, float dx, float dy, bool bloquant=true); //bloquant: do we pass at the next step after ?
231
232 //void TURNTO_DELTA(WheeledBase* wheeledBase, float dtheta, bool bloquant=true);
233
234 //void TENTATIVE_POUR_PLUSTARD();
235
242 void setOpenloopVelocities(WheeledBase* wheeledBase, float leftWheelVel, float rightWheelVel);
243
250 void getCodewheelsCounters(WheeledBase* wheeledBase, float *leftCodewheelCounter, float *rightCodewheelCounter);
251
258 void setVelocities(WheeledBase* wheeledBase, float linVelSetpoint, float angVelSetpoint);
259
265 void resetPurepursuit(WheeledBase* wheeledBase, PurePursuit* purePursuit);
266
273 void addPurepursuitWaypoint(PurePursuit* purePursuit, float x, float y);
274
282 void startPurepursuit(WheeledBase* wheeledBase, PurePursuit* purePursuit, PurePursuit::Direction direction, float finalAngle);
283
291 void startTurnonthespot(WheeledBase* wheeledBase, TurnOnTheSpot* turnOnTheSpot, bool dir, float theta);
292
300 void startTurnonthespotDir(const WheeledBase* wheeledBase, TurnOnTheSpot* turnOnTheSpot, TurnOnTheSpot::Direction dir, float theta);
301
311 void purepursuit(WheeledBase* wheeledBase, PurePursuit* purePursuit, const Position** waypoints, uint16_t nb_waypoints, PurePursuit::Direction dir, float finalAngle);
312
322 void wbGoto(WheeledBase* wheeledBase, PurePursuit* purePursuit, Position* pos, bool alignFirst=true, PurePursuit::Direction dir=PurePursuit::NONE,bool bloquant=true);
323
333 void gotoWaypoints(WheeledBase* wheeledBase, PurePursuit* purePursuit, bool alignFirst=true, PurePursuit::Direction dir=PurePursuit::NONE, int nb_waypoints=1, ...);
334
344 void gotoWaypointsArray(WheeledBase* wheeledBase, PurePursuit* purePursuit, Position* positions[], bool alignFirst=true, PurePursuit::Direction dir=PurePursuit::NONE, int nb_waypoints=1);
345
347 void gotoFunct(WheeledBase* wheeledBase, PurePursuit* purePursuit, TurnOnTheSpot* turnOnTheSpot, Position* pos, void* duringMovingFunct, void* approachFunct, bool alignFirst=true, PurePursuit::Direction dir=PurePursuit::NONE, float finalAngle=MAXFLOAT);
348
354 uint8_t positionReached(const WheeledBase* wheeledBase);
355
363 void getVelocitiesWanted(const WheeledBase* wheeledBase, float *linOutput, float *angOutput, bool spin=true);
364
370 void setPosition(WheeledBase* wheeledBase, const Position* pos);
371
377 const Position* getPosition(const WheeledBase* wheeledBase);
378
385 void getVelocities(const WheeledBase* wheeledBase, float *linVel, float *angVel);
386
394 void setParameterValue(WheeledBase* wheeledBase, PurePursuit* purePursuit, WBParameterID paramID, float value);
395
403 float getParameterValue(const WheeledBase* wheeledBase, const PurePursuit* purePursuit, WBParameterID paramID);
404
410 void printParams(const WheeledBase* wheeledBase, const PurePursuit* purePursuit);
411};
412
413
414
415#endif //WHEELEDBASE_H
Implémentation d'AbstractMoveStrategy qui fait tourner le robot sur lui-même.
Contrôleur de vitesse pour un robot à base différentielle.
Log pour la sortie console avec des couleurs et éventuellement la sortie LCD.
Definition Logger/Logger.h:49
Trajectoire courbe le long d'une ligne brisée.
Definition PurePursuit.h:18
Direction
Sens de déplacement pour le robot.
Definition PurePursuit.h:35
Rotation du robot sans translations.
Definition TurnOnTheSpot.h:16
Fonctions de convénience pour faire les déplacements facilement.
void disable(const WheeledBase *wheeledBase)
Désactive la base roulante.
Definition Wheeledbase.cpp:107
WBParameterID
Des identifiants permettant d'accéder à la plupart des paramètres de la base roulante.
Definition Wheeledbase.h:174
void resetPurepursuit(WheeledBase *wheeledBase, PurePursuit *purePursuit)
Réinitialise le purepursuit.
Definition Wheeledbase.cpp:233
void getVelocitiesWanted(const WheeledBase *wheeledBase, float *linOutput, float *angOutput, bool spin=true)
Récupère les vitesses linéaire et angulaire souhaitées.
Definition Wheeledbase.cpp:607
void gotoDelta(WheeledBase *wheeledBase, PurePursuit *purePursuit, float dx, float dy, bool bloquant=true)
Déplace la base roulante d'une certaine distance dans le référentiel du robot.
void printParams(const WheeledBase *wheeledBase, const PurePursuit *purePursuit)
Affiche les paramètres de la base roulante.
Definition Wheeledbase.cpp:854
void gotoWaypointsArray(WheeledBase *wheeledBase, PurePursuit *purePursuit, Position *positions[], bool alignFirst=true, PurePursuit::Direction dir=PurePursuit::NONE, int nb_waypoints=1)
Suit une liste de waypoint en utilisant purepursuit mais sans les varargs.
Definition Wheeledbase.cpp:460
void gotoFunct(WheeledBase *wheeledBase, PurePursuit *purePursuit, TurnOnTheSpot *turnOnTheSpot, Position *pos, void *duringMovingFunct, void *approachFunct, bool alignFirst=true, PurePursuit::Direction dir=PurePursuit::NONE, float finalAngle=MAXFLOAT)
Honnêtement aucune idée de ce que fait cette fonction.
Definition Wheeledbase.cpp:530
void gotoWaypoints(WheeledBase *wheeledBase, PurePursuit *purePursuit, bool alignFirst=true, PurePursuit::Direction dir=PurePursuit::NONE, int nb_waypoints=1,...)
Suit une liste de waypoint en utilisant purepursuit.
Definition Wheeledbase.cpp:388
void wbGoto(WheeledBase *wheeledBase, PurePursuit *purePursuit, Position *pos, bool alignFirst=true, PurePursuit::Direction dir=PurePursuit::NONE, bool bloquant=true)
Va à un point en utilisant purepursuit.
Definition Wheeledbase.cpp:319
float getParameterValue(const WheeledBase *wheeledBase, const PurePursuit *purePursuit, WBParameterID paramID)
Récupère la valeur d'un paramètre de la base roulante.
Definition Wheeledbase.cpp:742
void getCodewheelsCounters(WheeledBase *wheeledBase, float *leftCodewheelCounter, float *rightCodewheelCounter)
Récupère les compteurs des roues codeuses.
Definition Wheeledbase.cpp:222
void startTurnonthespotDir(const WheeledBase *wheeledBase, TurnOnTheSpot *turnOnTheSpot, TurnOnTheSpot::Direction dir, float theta)
démarre turn on the spot mais avec moins de magie dans la direction de rotation
Definition Wheeledbase.cpp:288
void setVelocities(WheeledBase *wheeledBase, float linVelSetpoint, float angVelSetpoint)
Fixe une vitesse linéaire et angulaire pour la base roulante.
Definition Wheeledbase.cpp:227
void setParameterValue(WheeledBase *wheeledBase, PurePursuit *purePursuit, WBParameterID paramID, float value)
Met un paramètre de la base roulante à jour.
Definition Wheeledbase.cpp:633
void startTurnonthespot(WheeledBase *wheeledBase, TurnOnTheSpot *turnOnTheSpot, bool dir, float theta)
démarre turn on the spot
Definition Wheeledbase.cpp:269
auto wb_logger
Le logger pour la base roulante.
Definition Wheeledbase.h:213
void getVelocities(const WheeledBase *wheeledBase, float *linVel, float *angVel)
Récupère les vitesses linéaire et angulaire actuelles.
Definition Wheeledbase.cpp:628
void setOpenloopVelocities(WheeledBase *wheeledBase, float leftWheelVel, float rightWheelVel)
Définit les vitesses en boucle ouverte pour les roues.
Definition Wheeledbase.cpp:215
void startPurepursuit(WheeledBase *wheeledBase, PurePursuit *purePursuit, PurePursuit::Direction direction, float finalAngle)
Démarre le purepursuit.
Definition Wheeledbase.cpp:238
void setPosition(WheeledBase *wheeledBase, const Position *pos)
Met à jour la position de l'odométrie.
Definition Wheeledbase.cpp:619
void purepursuit(WheeledBase *wheeledBase, PurePursuit *purePursuit, const Position **waypoints, uint16_t nb_waypoints, PurePursuit::Direction dir, float finalAngle)
Démarre purepursuit ? honnêtement jsp trop.
Definition Wheeledbase.cpp:307
uint8_t positionReached(const WheeledBase *wheeledBase)
Est-ce que la position est atteinte ?
Definition Wheeledbase.cpp:298
const Position * getPosition(const WheeledBase *wheeledBase)
Récupère la position de l'odométrie.
Definition Wheeledbase.cpp:623
void addPurepursuitWaypoint(PurePursuit *purePursuit, float x, float y)
Ajoute un waypoint au purepursuit.
Definition Wheeledbase.cpp:264
Structure de position.
Definition Odometry.h:17
Défini un certain nombre de constantes et paramètres pour la wheeledbase.
Definition Wheeledbase.h:55
Représente les divers composants de la base roulante.
Definition Wheeledbase.h:125
WheeledBase(std::unique_ptr< DRV8844 > driver, std::unique_ptr< WheelMotor > leftWheel, std::unique_ptr< WheelMotor > rightWheel, std::unique_ptr< Codewheel > leftCodewheel, std::unique_ptr< Codewheel > rightCodewheel, std::unique_ptr< Odometry > odometry, std::unique_ptr< VelocityController > velocityControl, std::unique_ptr< PositionController > positionControl, std::unique_ptr< PID > linVelPID, std::unique_ptr< PID > angVelPID, WBConstants &param, const std::function< void()> &halSetup)
Definition Wheeledbase.cpp:12