Formula Student Autonomous Systems
The code for the main driverless system
Loading...
Searching...
No Matches
VehicleModelBicycle.hpp
Go to the documentation of this file.
1#pragma once
2
4#include <Eigen/Dense>
5#include <cmath>
6
8public:
9
10 // Physical constants
11 static constexpr double GRAVITY = 9.81;
12 static constexpr double ROLLING_RESISTANCE_COEFF = 0.015;
13 static constexpr double AIR_DENSITY = 1.29;
14
15 // Threshold constants
16 static constexpr double VELOCITY_THRESHOLD = 0.1;
17 static constexpr double ANGULAR_VELOCITY_THRESHOLD = 0.001;
18 static constexpr double TORQUE_THRESHOLD = 0.5;
19 static constexpr double VELOCITY_MIN_THRESHOLD = 0.3;
20
21 // Mathematical constants
22 static constexpr double TWO_PI = 2.0 * M_PI;
23
25
26 // Interface implementation
27 bool readConfig(ConfigElement& config) override;
28
29 // State getters
30
31 Eigen::Vector3d getPosition() override;
32 Eigen::Vector3d getOrientation() override;
33 Eigen::Vector3d getVelocity() override;
34 Eigen::Vector3d getAcceleration() override;
35 Eigen::Vector3d getAngularVelocity() override;
36 Eigen::Vector3d getAngularAcceleration() override;
37
38 Wheels getSteeringAngles() override;
39 double getSteeringWheelAngle() override;
40 double getVoltageTS() override;
41 double getCurrentTS() override;
42 Wheels getWheelspeeds() override;
43 Wheels getWheelOrientations() override;
44 Wheels getTorques() override;
45
46 // State setters
47 void setTorques(Wheels in) override;
48 void setRpmSetpoints(Wheels in) override;
49 void setMaxTorques(Wheels in) override;
50 void setMinTorques(Wheels in) override;
51 void setSteeringSetpointFront(double in) override;
52 void setSteeringSetpointRear(double in) override;
53 void setThrottle(Wheels in) override;
54 void setPowerGroundSetpoint(double in) override;
55 void setPosition(Eigen::Vector3d position) override;
56 void setOrientation(Eigen::Vector3d orientation) override;
57
58 // Simulation methods
59 void forwardIntegrate(double dt) override;
60 std::array<Eigen::Vector3d, 4> getWheelPositions() override;
61
62private:
63 // Component-based design
65 double cla; // Lift coefficient
66 double cda; // Drag coefficient
67 double aeroArea; // Reference area
68
69 // Calculate aerodynamic forces
70 void calculateForces(double velocityX, double& downforce, double& drag) const;
71 };
72
73 struct TireModel {
74 // Basic Magic Formula parameters
75 double Blat, Clat, Dlat, Elat;
76
77 // Magic Formula parameters
78 double NOMPRES = 83000;
79 double FNOM = 1110;
80 double LFZO = 1.0;
81
82 // Slip calculation constants
83 double eps_k = 1e-6;
84 double eps_y = 1e-6;
85 double LONGVL = 10.0;
86 double LMUY = 1.0;
87 double LVY = 1.0;
88 double LMUV = 0.0;
89
90 // Lateral force coefficients
91 double LKYC = 1.0;
92 double LCY = 1.0;
93 double LEY = 1.0;
94 double LYKA = 1.0;
95 double LVYKA = 1.0;
96 double LKY = 1.0;
97
98 // P-coefficients
99 double PPY1 = 0.43899;
100 double PPY2 = 1.3335;
101 double PPY3 = -0.15166;
102 double PPY4 = 0.053855;
103 double PPY5 = -0.81712;
104
105 double PVY1 = 0.047901;
106 double PVY2 = 0.014419;
107 double PVY3 = -0.3046;
108 double PVY4 = 1.4794;
109
110 double PKY1 = -39.1199;
111 double PKY2 = 1.6728;
112 double PKY3 = 0.86703;
113 double PKY4 = 2.0;
114 double PKY5 = 29.7896;
115 double PKY6 = -4.7914;
116 double PKY7 = -2.0621;
117
118 double PDY1 = 2.3352;
119 double PDY2 = -0.37521;
120 double PDY3 = 10.0;
121
122 double PHY1 = 0.00013682;
123 double PHY2 = -0.00046485;
124
125 double PEY1 = 0.68111;
126 double PEY2 = -0.35401;
127 double PEY3 = -0.080852;
128 double PEY4 = -5.562;
129 double PEY5 = -64.1838;
130
131 double PCY1 = 1.8528;
132
133 // R-coefficients
134 double RCY1 = 1.0;
135
136 double RBY1 = 5.0;
137 double RBY2 = 2.0;
138 double RBY3 = 0.02;
139 double RBY4 = 0.0;
140
141 double REY1 = -0.1;
142 double REY2 = 0.1;
143
144 double RHY1 = 0.0;
145 double RHY2 = 0.0;
146
147 double RVY1 = 0.0;
148 double RVY2 = 0.0;
149 double RVY3 = 0.0;
150 double RVY4 = 0.0;
151 double RVY5 = 0.0;
152 double RVY6 = 0.0;
153
154 // Variables for calculation
155 double p_input = 82737;
156 double y_input = 0.0;
157 double slip_ratio = 0.0;
158 double V_cx = 1.0;
159
160 // Zeta factors
161 double zeta_0 = 1.0;
162 double zeta_2 = 1.0;
163 double zeta_3 = 1.0;
164 double zeta_4 = 1.0;
165
166 // Calculate lateral force using Magic Formula
167 double calculateLateralForce(double slipAngle, double normalForce) const;
168 int sign(double value) const;
169 };
170
172 double gearRatio;
179
180 // Calculate torques from throttle and wheelspeeds
181 void calculateWheelTorques(const Wheels& throttleInputs, const Wheels& wheelspeeds, Wheels& torques) const;
182
183 // Calculate powertrain efficiency
184 double calculateEfficiency(const Wheels& torques) const;
185
186 // Calculate current
187 double calculateCurrent(const Wheels& torques, const Wheels& wheelspeeds, double voltage) const;
188 };
189
193
194 // Apply Ackermann steering geometry
195 void calculateSteeringAngles(double steeringInput, Wheels& steeringAngles) const;
196
197 // Calculate steering wheel angle
198 double calculateSteeringWheelAngle(const Wheels& steeringAngles) const;
199 };
201 double& steeringFront,
202 Eigen::Vector3d& rFL, Eigen::Vector3d& rFR,
203 Eigen::Vector3d& rRL, Eigen::Vector3d& rRR,
204 Eigen::Vector3d& rFront, Eigen::Vector3d& rRear,
205 Eigen::Vector3d& vFL, Eigen::Vector3d& vFR,
206 Eigen::Vector3d& vRL, Eigen::Vector3d& vRR) const;
207
209 double& Fx_FL, double& Fx_FR, double& Fx_RL, double& Fx_RR) const;
210
211 Eigen::Vector3d calculateAccelerations(
212 double steeringFront,
213 double Fx_FL, double Fx_FR, double Fx_RL, double Fx_RR,
214 double Fy_Front, double Fy_Rear,
215 double drag, const Eigen::Vector3d& friction) const;
216
218 const Eigen::Vector3d& vFL, const Eigen::Vector3d& vFR,
219 const Eigen::Vector3d& vRL, const Eigen::Vector3d& vRR);
220
221 // Physics calculation methods
222 Eigen::Vector3d getDynamicStates(double dt);
223 void calculateNormalForces(double& Fz_Front, double& Fz_Rear) const;
224 void calculateWeightTransfer(double& Fz_Front, double& Fz_Rear , double& Fx_FL, double& Fx_FR, double& Fx_RL, double& Fx_RR) const;
225 void calculateSlipAngles(double& kappaFront, double& kappaRear) const;
226 void updateWheelSpeeds(double dt);
227 double processSlipAngleLat(double alpha_input, double Fz);
228
229 // Vehicle state variables
230 Eigen::Vector3d position = Eigen::Vector3d::Zero(); // world x, y, z
231 Eigen::Vector3d orientation = Eigen::Vector3d::Zero(); // roll, pitch, yaw
232 Eigen::Vector3d velocity = Eigen::Vector3d::Zero(); // body x, y, z
233 Eigen::Vector3d angularVelocity = Eigen::Vector3d::Zero(); // roll rate, pitch rate, yaw rate
234 Eigen::Vector3d acceleration = Eigen::Vector3d::Zero(); // body x, y, z
235 Eigen::Vector3d angularAcceleration = Eigen::Vector3d::Zero(); // roll acc, pitch acc, yaw acc
236
237 // Wheel state
238 Wheels steeringAngles = {0.0, 0.0, 0.0, 0.0, 0.0}; // FL, FR, RL, RR
239 Wheels wheelspeeds = {0.0, 0.0, 0.0, 0.0, 0.0};
240 Wheels wheelOrientations = {0.0, 0.0, 0.0, 0.0, 0.0};
241 Wheels torques = {0.0, 0.0, 0.0, 0.0, 0.0};
242 Wheels rpmSetpoints = {0.0, 0.0, 0.0, 0.0, 0.0};
243 Wheels maxTorques = {0.0, 0.0, 0.0, 0.0, 0.0};
244 Wheels minTorques = {0.0, 0.0, 0.0, 0.0, 0.0};
245
246 // Input state
252
253 // Vehicle parameters
254 double lf, lr; // Distance from CoG to front/rear axle
255 double sf, sr; // Track width front/rear
256 double m; // Vehicle mass
257 double Izz; // Yaw moment of inertia
258 double h_cg; // Height of center of gravity
259
260 // Component models
265
266 //Testing getters && setters
267 public:
268 const AerodynamicsModel& getAeroModel() const { return aeroModel; }
269 const void getLongitudinalForces(double& Fx_FL, double& Fx_FR, double& Fx_RL, double& Fx_RR) const { calculateLongitudinalForces(Fx_FL, Fx_FR, Fx_RL, Fx_RR);}
271 const void getNormalForces(double& Fz_Front, double& Fz_Rear) const {calculateNormalForces(Fz_Front, Fz_Rear); }
272 const void getSlipAngles(double& kappaFront, double& kappaRear) const { calculateSlipAngles(kappaFront, kappaRear); }
273
275
277 double& steeringFront,
278 Eigen::Vector3d& rFL, Eigen::Vector3d& rFR,
279 Eigen::Vector3d& rRL, Eigen::Vector3d& rRR,
280 Eigen::Vector3d& rFront, Eigen::Vector3d& rRear,
281 Eigen::Vector3d& vFL, Eigen::Vector3d& vFR,
282 Eigen::Vector3d& vRL, Eigen::Vector3d& vRR
283 ) const {
284 calculateWheelGeometry(steeringFront, rFL, rFR, rRL, rRR, rFront, rRear, vFL, vFR, vRL, vRR);
285 }
286
287 const Eigen::Vector3d getCalculateAccelerations(double steeringFront, double Fx_FL, double Fx_FR, double Fx_RL, double Fx_RR,
288 double Fy_Front, double Fy_Rear, double drag, const Eigen::Vector3d& friction) const {
289 return calculateAccelerations(steeringFront, Fx_FL , Fx_FR, Fx_RL, Fx_RR,
290 Fy_Front, Fy_Rear, drag, friction);
291 }
292
293 Eigen::Vector3d getGetDynamicStates(double dt) {
294 return getDynamicStates(dt);
295 }
296
297
298 void setVelocity(const Eigen::Vector3d& vel) { velocity = vel; }
299
300 void setWheelSpeedsTester(const Eigen::Vector3d& vFL, const Eigen::Vector3d& vFR,const Eigen::Vector3d& vRL, const Eigen::Vector3d& vRR){ updateWheelSpeeds(vFL, vFR, vRL, vRR); }
301 };
void calculateNormalForces(double &Fz_Front, double &Fz_Rear) const
const AerodynamicsModel & getAeroModel() const
const Eigen::Vector3d getCalculateAccelerations(double steeringFront, double Fx_FL, double Fx_FR, double Fx_RL, double Fx_RR, double Fy_Front, double Fy_Rear, double drag, const Eigen::Vector3d &friction) const
std::array< Eigen::Vector3d, 4 > getWheelPositions() override
Wheels getTorques() override
double getCurrentTS() override
void setPosition(Eigen::Vector3d position) override
void setVelocity(const Eigen::Vector3d &vel)
void updateWheelSpeeds(double dt)
void setSteeringSetpointRear(double in) override
void setThrottle(Wheels in) override
const void getSlipAngles(double &kappaFront, double &kappaRear) const
double getSteeringWheelAngle() override
Eigen::Vector3d getAngularAcceleration() override
Eigen::Vector3d angularAcceleration
void calculateSlipAngles(double &kappaFront, double &kappaRear) const
void setRpmSetpoints(Wheels in) override
static constexpr double AIR_DENSITY
void setOrientation(Eigen::Vector3d orientation) override
void setTorques(Wheels in) override
Eigen::Vector3d getVelocity() override
Eigen::Vector3d getDynamicStates(double dt)
double processSlipAngleLat(double alpha_input, double Fz)
void calculateWeightTransfer(double &Fz_Front, double &Fz_Rear, double &Fx_FL, double &Fx_FR, double &Fx_RL, double &Fx_RR) const
Wheels getSteeringAngles() override
void setMinTorques(Wheels in) override
Wheels getWheelspeeds() override
void setWheelSpeedsTester(const Eigen::Vector3d &vFL, const Eigen::Vector3d &vFR, const Eigen::Vector3d &vRL, const Eigen::Vector3d &vRR)
Eigen::Vector3d getGetDynamicStates(double dt)
static constexpr double TORQUE_THRESHOLD
void setSteeringSetpointFront(double in) override
const void getWheelGeometry(double &steeringFront, Eigen::Vector3d &rFL, Eigen::Vector3d &rFR, Eigen::Vector3d &rRL, Eigen::Vector3d &rRR, Eigen::Vector3d &rFront, Eigen::Vector3d &rRear, Eigen::Vector3d &vFL, Eigen::Vector3d &vFR, Eigen::Vector3d &vRL, Eigen::Vector3d &vRR) const
const PowertrainModel & getPowertrainModel() const
Wheels getWheelOrientations() override
static constexpr double GRAVITY
void setPowerGroundSetpoint(double in) override
static constexpr double VELOCITY_MIN_THRESHOLD
bool readConfig(ConfigElement &config) override
static constexpr double VELOCITY_THRESHOLD
const SteeringModel & getSteeringModel() const
PowertrainModel powertrainModel
AerodynamicsModel aeroModel
static constexpr double TWO_PI
Eigen::Vector3d getPosition() override
static constexpr double ANGULAR_VELOCITY_THRESHOLD
void calculateLongitudinalForces(double &Fx_FL, double &Fx_FR, double &Fx_RL, double &Fx_RR) const
Eigen::Vector3d calculateAccelerations(double steeringFront, double Fx_FL, double Fx_FR, double Fx_RL, double Fx_RR, double Fy_Front, double Fy_Rear, double drag, const Eigen::Vector3d &friction) const
void setMaxTorques(Wheels in) override
void forwardIntegrate(double dt) override
void updateWheelSpeeds(const Eigen::Vector3d &vFL, const Eigen::Vector3d &vFR, const Eigen::Vector3d &vRL, const Eigen::Vector3d &vRR)
void calculateWheelGeometry(double &steeringFront, Eigen::Vector3d &rFL, Eigen::Vector3d &rFR, Eigen::Vector3d &rRL, Eigen::Vector3d &rRR, Eigen::Vector3d &rFront, Eigen::Vector3d &rRear, Eigen::Vector3d &vFL, Eigen::Vector3d &vFR, Eigen::Vector3d &vRL, Eigen::Vector3d &vRR) const
Eigen::Vector3d angularVelocity
static constexpr double ROLLING_RESISTANCE_COEFF
const void getLongitudinalForces(double &Fx_FL, double &Fx_FR, double &Fx_RL, double &Fx_RR) const
Eigen::Vector3d getOrientation() override
double getVoltageTS() override
Eigen::Vector3d getAcceleration() override
Eigen::Vector3d getAngularVelocity() override
const void getNormalForces(double &Fz_Front, double &Fz_Rear) const
void calculateForces(double velocityX, double &downforce, double &drag) const
void calculateWheelTorques(const Wheels &throttleInputs, const Wheels &wheelspeeds, Wheels &torques) const
double calculateCurrent(const Wheels &torques, const Wheels &wheelspeeds, double voltage) const
double calculateEfficiency(const Wheels &torques) const
void calculateSteeringAngles(double steeringInput, Wheels &steeringAngles) const
double calculateSteeringWheelAngle(const Wheels &steeringAngles) const
double calculateLateralForce(double slipAngle, double normalForce) const