Re #150: add gyroscopic forces and non-constant weight force in z direction to simuv2.1
git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@3087 30fe4595-0a0c-4342-8851-515496e4dcbd Former-commit-id: 5dce93c188260a60ad2ccf37fcd0fa3288dc139d Former-commit-id: 74682c28d6bd08a68c99dc241e3319a7fae862fa
This commit is contained in:
parent
51fa082d07
commit
a02dfc2a3d
4 changed files with 33 additions and 1 deletions
|
@ -167,7 +167,7 @@ SimCarUpdateForces(tCar *car)
|
||||||
SinTheta = (-car->wheel[FRNT_RGT].zRoad - car->wheel[REAR_RGT].zRoad
|
SinTheta = (-car->wheel[FRNT_RGT].zRoad - car->wheel[REAR_RGT].zRoad
|
||||||
+ car->wheel[FRNT_LFT].zRoad + car->wheel[REAR_LFT].zRoad) / (2.0 * car->wheeltrack);
|
+ car->wheel[FRNT_LFT].zRoad + car->wheel[REAR_LFT].zRoad) / (2.0 * car->wheeltrack);
|
||||||
F.F.y = -w * SinTheta;
|
F.F.y = -w * SinTheta;
|
||||||
F.F.z = w; /* not 3D */
|
F.F.z = w - (F.F.x*F.F.x + F.F.y*F.F.y)/(2.0*w);/*Taylor-polinom of sqrt(w^2-F.F.x^2-F.F.y^2)*/
|
||||||
F.M.x = F.M.y = F.M.z = 0;
|
F.M.x = F.M.y = F.M.z = 0;
|
||||||
|
|
||||||
/* Wheels */
|
/* Wheels */
|
||||||
|
@ -179,10 +179,13 @@ SimCarUpdateForces(tCar *car)
|
||||||
/* moments */
|
/* moments */
|
||||||
F.M.x += car->wheel[i].forces.z * car->wheel[i].staticPos.y +
|
F.M.x += car->wheel[i].forces.z * car->wheel[i].staticPos.y +
|
||||||
car->wheel[i].forces.y * (car->statGC.z + car->wheel[i].rideHeight);
|
car->wheel[i].forces.y * (car->statGC.z + car->wheel[i].rideHeight);
|
||||||
|
F.M.x += car->wheel[i].torques.x;
|
||||||
F.M.y -= car->wheel[i].forces.z * car->wheel[i].staticPos.x +
|
F.M.y -= car->wheel[i].forces.z * car->wheel[i].staticPos.x +
|
||||||
car->wheel[i].forces.x * (car->statGC.z + car->wheel[i].rideHeight);
|
car->wheel[i].forces.x * (car->statGC.z + car->wheel[i].rideHeight);
|
||||||
|
F.M.y += car->wheel[i].torques.y;
|
||||||
F.M.z += -car->wheel[i].forces.x * car->wheel[i].staticPos.y +
|
F.M.z += -car->wheel[i].forces.x * car->wheel[i].staticPos.y +
|
||||||
car->wheel[i].forces.y * car->wheel[i].staticPos.x;
|
car->wheel[i].forces.y * car->wheel[i].staticPos.x;
|
||||||
|
F.M.z += car->wheel[i].torques.z;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Aero Drag */
|
/* Aero Drag */
|
||||||
|
|
|
@ -51,10 +51,18 @@ SimSteerUpdate(tCar *car)
|
||||||
steer2 = atan2((car->wheelbase * tanSteer) , (car->wheelbase - tanSteer * car->wheeltrack));
|
steer2 = atan2((car->wheelbase * tanSteer) , (car->wheelbase - tanSteer * car->wheeltrack));
|
||||||
|
|
||||||
if (steer > 0) {
|
if (steer > 0) {
|
||||||
|
car->wheel[FRNT_RGT].torques.x =
|
||||||
|
car->wheel->cosax * (steer2 - car->wheel[FRNT_RGT].steer) * car->wheel[FRNT_RGT].prespinVel * car->wheel[FRNT_RGT].I / SimDeltaTime;
|
||||||
car->wheel[FRNT_RGT].steer = steer2;
|
car->wheel[FRNT_RGT].steer = steer2;
|
||||||
|
car->wheel[FRNT_LFT].torques.x =
|
||||||
|
car->wheel->cosax * (steer - car->wheel[FRNT_LFT].steer) * car->wheel[FRNT_LFT].prespinVel * car->wheel[FRNT_LFT].I / SimDeltaTime;
|
||||||
car->wheel[FRNT_LFT].steer = steer;
|
car->wheel[FRNT_LFT].steer = steer;
|
||||||
} else {
|
} else {
|
||||||
|
car->wheel[FRNT_RGT].torques.x =
|
||||||
|
car->wheel->cosax * (steer - car->wheel[FRNT_RGT].steer) * car->wheel[FRNT_RGT].prespinVel * car->wheel[FRNT_RGT].I / SimDeltaTime;
|
||||||
car->wheel[FRNT_RGT].steer = steer;
|
car->wheel[FRNT_RGT].steer = steer;
|
||||||
|
car->wheel[FRNT_LFT].torques.x =
|
||||||
|
car->wheel->cosax * (-steer2 - car->wheel[FRNT_LFT].steer) * car->wheel[FRNT_LFT].prespinVel * car->wheel[FRNT_LFT].I / SimDeltaTime;
|
||||||
car->wheel[FRNT_LFT].steer = -steer2;
|
car->wheel[FRNT_LFT].steer = -steer2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,6 +58,8 @@ SimWheelConfig(tCar *car, int index)
|
||||||
} else {
|
} else {
|
||||||
wheel->relPos.ax = wheel->staticPos.ax;
|
wheel->relPos.ax = wheel->staticPos.ax;
|
||||||
}
|
}
|
||||||
|
wheel->cosax = cos(wheel->relPos.ax);
|
||||||
|
wheel->sinax = sin(wheel->relPos.ax);
|
||||||
|
|
||||||
wheel->lfMin = MIN(0.8f, wheel->lfMin);
|
wheel->lfMin = MIN(0.8f, wheel->lfMin);
|
||||||
wheel->lfMax = MAX(1.6f, wheel->lfMax);
|
wheel->lfMax = MAX(1.6f, wheel->lfMax);
|
||||||
|
@ -103,6 +105,7 @@ SimWheelConfig(tCar *car, int index)
|
||||||
wheel->feedBack.Tq = 0.0f;
|
wheel->feedBack.Tq = 0.0f;
|
||||||
wheel->feedBack.brkTq = 0.0f;
|
wheel->feedBack.brkTq = 0.0f;
|
||||||
wheel->rel_vel = 0.0f;
|
wheel->rel_vel = 0.0f;
|
||||||
|
wheel->torques.x = wheel->torques.y = wheel->torques.z = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -276,9 +279,25 @@ SimWheelUpdateRotation(tCar *car)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
tWheel *wheel;
|
tWheel *wheel;
|
||||||
|
tdble deltan;
|
||||||
|
tdble cosaz, sinaz;
|
||||||
|
|
||||||
for (i = 0; i < 4; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
wheel = &(car->wheel[i]);
|
wheel = &(car->wheel[i]);
|
||||||
|
/*calculate gyroscopic forces*/
|
||||||
|
cosaz = cos(wheel->relPos.az);
|
||||||
|
sinaz = sin(wheel->relPos.az);
|
||||||
|
if( (i == 0) || (i == 1) ){
|
||||||
|
wheel->torques.y = wheel->torques.x * sinaz;
|
||||||
|
wheel->torques.x = wheel->torques.x * cosaz;
|
||||||
|
} else {
|
||||||
|
wheel->torques.x = wheel->torques.y =0.0;
|
||||||
|
}
|
||||||
|
deltan = -(wheel->in.spinVel - wheel->prespinVel) * wheel->I / SimDeltaTime;
|
||||||
|
wheel->torques.x -= deltan * wheel->cosax *sinaz;
|
||||||
|
wheel->torques.y += deltan * wheel->cosax *cosaz;
|
||||||
|
wheel->torques.z = deltan * wheel->sinax;
|
||||||
|
/*update rotation*/
|
||||||
wheel->spinVel = wheel->in.spinVel;
|
wheel->spinVel = wheel->in.spinVel;
|
||||||
FLOAT_RELAXATION2(wheel->spinVel, wheel->prespinVel, 50.0f);
|
FLOAT_RELAXATION2(wheel->spinVel, wheel->prespinVel, 50.0f);
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@ typedef struct
|
||||||
|
|
||||||
/* dynamic */
|
/* dynamic */
|
||||||
t3Dd forces; /* forces acting on car */
|
t3Dd forces; /* forces acting on car */
|
||||||
|
t3Dd torques; /* torques acting on car (gyroscopic forces) */
|
||||||
tdble rollRes; /* Rolling Resistance (summed over the car) */
|
tdble rollRes; /* Rolling Resistance (summed over the car) */
|
||||||
tdble rideHeight; /* height of the bottom of the car */
|
tdble rideHeight; /* height of the bottom of the car */
|
||||||
tdble zRoad; /* z of the road */
|
tdble zRoad; /* z of the road */
|
||||||
|
@ -56,6 +57,7 @@ typedef struct
|
||||||
/* static */
|
/* static */
|
||||||
tPosd staticPos; /* pos relative to the GC (z is suspension travel at rest) */
|
tPosd staticPos; /* pos relative to the GC (z is suspension travel at rest) */
|
||||||
/* and angles are camber (ax), caster (ay) and toe (az) */
|
/* and angles are camber (ax), caster (ay) and toe (az) */
|
||||||
|
tdble cosax, sinax;/*cosinus and sinus of relPos.ax*/
|
||||||
tdble rollCenter;
|
tdble rollCenter;
|
||||||
|
|
||||||
tdble weight0; /* initial weight on this wheel */
|
tdble weight0; /* initial weight on this wheel */
|
||||||
|
|
Loading…
Reference in a new issue