aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSMotors.cs27
1 files changed, 18 insertions, 9 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs b/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs
index 91255bd..6d0db2e 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs
@@ -388,6 +388,12 @@ public class BSPIDVMotor : BSVMotor
388 public Vector3 integralFactor { get; set; } 388 public Vector3 integralFactor { get; set; }
389 public Vector3 derivFactor { get; set; } 389 public Vector3 derivFactor { get; set; }
390 390
391 // The factors are vectors for the three dimensions. This is the proportional of each
392 // that is applied. This could be multiplied through the actual factors but it
393 // is sometimes easier to manipulate the factors and their mix separately.
394 // to
395 public Vector3 FactorMix;
396
391 // Arbritrary factor range. 397 // Arbritrary factor range.
392 // EfficiencyHigh means move quickly to the correct number. EfficiencyLow means might over correct. 398 // EfficiencyHigh means move quickly to the correct number. EfficiencyLow means might over correct.
393 public float EfficiencyHigh = 0.4f; 399 public float EfficiencyHigh = 0.4f;
@@ -402,6 +408,7 @@ public class BSPIDVMotor : BSVMotor
402 proportionFactor = new Vector3(1.00f, 1.00f, 1.00f); 408 proportionFactor = new Vector3(1.00f, 1.00f, 1.00f);
403 integralFactor = new Vector3(1.00f, 1.00f, 1.00f); 409 integralFactor = new Vector3(1.00f, 1.00f, 1.00f);
404 derivFactor = new Vector3(1.00f, 1.00f, 1.00f); 410 derivFactor = new Vector3(1.00f, 1.00f, 1.00f);
411 FactorMix = new Vector3(0.5f, 0.25f, 0.25f);
405 RunningIntegration = Vector3.Zero; 412 RunningIntegration = Vector3.Zero;
406 LastError = Vector3.Zero; 413 LastError = Vector3.Zero;
407 } 414 }
@@ -417,15 +424,18 @@ public class BSPIDVMotor : BSVMotor
417 set 424 set
418 { 425 {
419 base.Efficiency = Util.Clamp(value, 0f, 1f); 426 base.Efficiency = Util.Clamp(value, 0f, 1f);
427
420 // Compute factors based on efficiency. 428 // Compute factors based on efficiency.
421 // If efficiency is high (1f), use a factor value that moves the error value to zero with little overshoot. 429 // If efficiency is high (1f), use a factor value that moves the error value to zero with little overshoot.
422 // If efficiency is low (0f), use a factor value that overcorrects. 430 // If efficiency is low (0f), use a factor value that overcorrects.
423 // TODO: might want to vary contribution of different factor depending on efficiency. 431 // TODO: might want to vary contribution of different factor depending on efficiency.
424 float factor = ((1f - this.Efficiency) * EfficiencyHigh + EfficiencyLow) / 3f; 432 float factor = ((1f - this.Efficiency) * EfficiencyHigh + EfficiencyLow) / 3f;
425 // float factor = (1f - this.Efficiency) * EfficiencyHigh + EfficiencyLow; 433 // float factor = (1f - this.Efficiency) * EfficiencyHigh + EfficiencyLow;
434
426 proportionFactor = new Vector3(factor, factor, factor); 435 proportionFactor = new Vector3(factor, factor, factor);
427 integralFactor = new Vector3(factor, factor, factor); 436 integralFactor = new Vector3(factor, factor, factor);
428 derivFactor = new Vector3(factor, factor, factor); 437 derivFactor = new Vector3(factor, factor, factor);
438
429 MDetailLog("{0},BSPIDVMotor.setEfficiency,eff={1},factor={2}", BSScene.DetailLogZero, Efficiency, factor); 439 MDetailLog("{0},BSPIDVMotor.setEfficiency,eff={1},factor={2}", BSScene.DetailLogZero, Efficiency, factor);
430 } 440 }
431 } 441 }
@@ -439,18 +449,17 @@ public class BSPIDVMotor : BSVMotor
439 RunningIntegration += error * timeStep; 449 RunningIntegration += error * timeStep;
440 450
441 // A simple derivitive is the rate of change from the last error. 451 // A simple derivitive is the rate of change from the last error.
442 Vector3 derivFactor = (error - LastError) * timeStep; 452 Vector3 derivitive = (error - LastError) * timeStep;
443 LastError = error; 453 LastError = error;
444 454
445 // Correction = -(proportionOfPresentError + accumulationOfPastError + rateOfChangeOfError) 455 // Correction = (proportionOfPresentError + accumulationOfPastError + rateOfChangeOfError)
446 Vector3 ret = -( 456 Vector3 ret = error * timeStep * proportionFactor * FactorMix.X
447 error * proportionFactor 457 + RunningIntegration * integralFactor * FactorMix.Y
448 + RunningIntegration * integralFactor 458 + derivitive * derivFactor * FactorMix.Z
449 + derivFactor * derivFactor 459 ;
450 );
451 460
452 MDetailLog("{0},BSPIDVMotor.step,ts={1},err={2},runnInt={3},derivFact={4},ret={5}", 461 MDetailLog("{0},BSPIDVMotor.step,ts={1},err={2},runnInt={3},deriv={4},ret={5}",
453 BSScene.DetailLogZero, timeStep, error, RunningIntegration, derivFactor, ret); 462 BSScene.DetailLogZero, timeStep, error, RunningIntegration, derivitive, ret);
454 463
455 return ret; 464 return ret;
456 } 465 }