Re: Patch for wheel spin velocity traction
David Savinkoff <[email protected]> Sun, 27 Dec 2015 20:58:15 -0700 (MST)
| Newsgroups | gmane.games.torcs.general |
|---|---|
| Message-ID | <311456940.11848979.1451275095738.JavaMail.zimbra@mailid.telus.net> |
Hi Everybody, This patch makes TORCS the best simulator wherever 'The Rubber meets the Road' is concerned. Try it. ----- David Savinkoff wrote: > ----- David Savinkoff wrote: > > Hi, > > > > In my last patch I had the following code: > > slip_magnitude = 0.000001f + sqrt( MAX(MAX((vn*vn + vt*vt) > > > > Where (v2) should be equal to (vn*vn + vt*vt) but is not, > > because of lack of precision of the float data type. > > > > Here I use (v2) for velocity squared because the car drives > > noticeably better, and (v2) is obviously more accurate. > > > > slip_magnitude = 0.000001f + sqrt( MAX(MAX((v2) > > > > BTW is there somewhere I can find recent TORCS source code > > changes so that I can test and experiment? > > > > Sincerely, > > David Savinkoff > > Hi, > > Here is another patch for floating point improvements. > > I used sqrtf() where it seemed to make a speed improvement > on my slow computer. > > I used (double) to get more accuracy for CosA and SinA > > It is obvious that (float) is not sufficient in some > circumstances, and that (double) is slower in others. > > I hope these improvements in wheel.cpp help with making > other problems more characterizable. > > Sincerely, > David Savinkoff > > ps. > > Speed Dreams should incorporate this patch too. > Note that this patch will give you deja vu a few times > per lap (even if you do motocross). ------------------------------------------------------------------------------ _______________________________________________ Torcs-users mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/torcs-users
wheel.cpp.2015dec27.diff
(text/x-patch, 3.1 KB)
--- torcs-1.3.6/src/modules/simu/simuv2/wheel.cpp 2013-08-29 06:01:32.000000000 -0700
+++ torcs-1.3.6/src/modules/simu/simuv2/wheel.cpp 2015-12-27 19:26:57.996358698 -0800
@@ -174,12 +174,12 @@
{
tWheel *wheel = &(car->wheel[index]);
tdble axleFz = wheel->axleFz;
- tdble vt, v, v2, wrl; // wheel related velocity
+ tdble vt, vn, v, v2, wrl, slip_magnitude; // wheel related velocity
tdble Fn, Ft;
tdble waz;
- tdble CosA, SinA;
+ double CosA, SinA;
tdble s, sa, sx, sy; // slip vector
- tdble stmp, F, Bx;
+ tdble F, Bx;
tdble mu;
wheel->state = 0;
@@ -215,8 +215,9 @@
// tangent velocity.
vt = wheel->bodyVel.x * CosA + wheel->bodyVel.y * SinA;
+ vn = wheel->bodyVel.y * CosA - wheel->bodyVel.x * SinA;
v2 = wheel->bodyVel.x * wheel->bodyVel.x + wheel->bodyVel.y * wheel->bodyVel.y;
- v = sqrt(v2);
+ v = sqrtf(v2);
// slip angle
if (v < 0.000001f) {
@@ -227,34 +228,36 @@
NORM_PI_PI(sa);
wrl = wheel->spinVel * wheel->radius;
+
if ((wheel->state & SIM_WH_ONAIR) != 0) {
sx = sy = 0.0f;
- } else if (v < 0.000001f) {
- sx = wrl;
- sy = 0.0f;
} else {
- sx = (vt - wrl) / fabs(vt);
- sy = sin(sa);
+ // Normalize the friction circle to get normalized vector components (sx, sy) while
+ // braking (vt), accelerating (wrl), or wheel counter spin (vt - wrl) for any angle.
+ // Softening factor 0.36 added to slip_magnitude affects low velocities and divide by zero.
+ slip_magnitude = 0.36f + sqrt( MAX(MAX((v2), (vn*vn + wrl*wrl)), (vn*vn + (vt - wrl)*(vt - wrl))) );
+ sx = (vt - wrl) / slip_magnitude;
+ sy = vn / slip_magnitude;
}
- Ft = 0.0f;
- Fn = 0.0f;
- s = sqrt(sx*sx+sy*sy);
+ s = sqrtf(sx*sx+sy*sy);
{
// calculate _skid and _reaction for sound.
- if (v < 2.0f) {
+ if ((v < 2.0f) || (zforce < 0.0002f)) {
car->carElt->_skid[index] = 0.0f;
} else {
- car->carElt->_skid[index] = MIN(1.0f, (s*zforce*0.0002f));
+ // skid energy :: F*d :: v*v :: s*s ... the empirical equation:
+ // n*(s*s + s) is represented in Damped Simple Harmonic Motion
+ // 0.841 = sin(1) and 1.159 = 1+1/(2*pi) were jovially chosen.
+ // Have a happy new year driving the best ever: TORCS
+ car->carElt->_skid[index] = MIN(0.841471f*(s*s+s), 1.159155f);
}
}
- stmp = MIN(s, 1.5f);
-
// MAGIC FORMULA
- Bx = wheel->mfB * stmp;
- F = sin(wheel->mfC * atan(Bx * (1.0f - wheel->mfE) + wheel->mfE * atan(Bx))) * (1.0f + stmp * simSkidFactor[car->carElt->_skillLevel]);
+ Bx = wheel->mfB * s;
+ F = sin(wheel->mfC * atan(Bx * (1.0f - wheel->mfE) + wheel->mfE * atan(Bx))) * (1.0f + s * simSkidFactor[car->carElt->_skillLevel]);
// load sensitivity
mu = wheel->mu * (wheel->lfMin + (wheel->lfMax - wheel->lfMin) * exp(wheel->lfK * zforce / wheel->opLoad));
@@ -264,11 +267,10 @@
wheel->rollRes = zforce * wheel->trkPos.seg->surface->kRollRes;
car->carElt->priv.wheel[index].rollRes = wheel->rollRes;
- if (s > 0.000001f) {
- // wheel axis based
- Ft -= F * sx / s;
- Fn -= F * sy / s;
- }
+ // wheel axis based
+ s = -0.000001f - s; // make Ft, Fn and s negative with stable divide by zero avoidance.
+ Ft = F * sx/s;
+ Fn = F * sy/s;
RELAXATION2(Fn, wheel->preFn, 50.0f);
RELAXATION2(Ft, wheel->preFt, 50.0f);