]> git.mxchange.org Git - flightgear.git/commitdiff
Improved tumbling behaviour -- the AI doesn't just freeze now, but
authordavid <david>
Sat, 5 Apr 2003 14:37:12 +0000 (14:37 +0000)
committerdavid <david>
Sat, 5 Apr 2003 14:37:12 +0000 (14:37 +0000)
appears still to be indicating.

Added a 'caged' property to the AI, for aerobatic work.

Temporarily disabled tumbling due to pitch, until I can learn more
about it.

Publish the current amount of tumble (-1.0:1.0) under
/instrumentation/attitude-indicator/tumble-norm.

src/Instrumentation/attitude_indicator.cxx
src/Instrumentation/attitude_indicator.hxx

index 3badf205557b7bcd16d9d81bcd2278eeeabfdd40..3558e6486045aa1779721db866e15b4a05968d2d 100644 (file)
@@ -14,7 +14,6 @@
 
 
 AttitudeIndicator::AttitudeIndicator ()
-    : _tumble(0)
 {
 }
 
@@ -33,6 +32,10 @@ AttitudeIndicator::init ()
     _tumble_flag_node =
         fgGetNode("/instrumentation/attitude-indicator/config/tumble-flag",
                   true);
+    _caged_node =
+        fgGetNode("/instrumentation/attitude-indicator/caged-flag", true);
+    _tumble_node =
+        fgGetNode("/instrumentation/attitude-indicator/tumble-norm", true);
     _pitch_out_node =
         fgGetNode("/instrumentation/attitude-indicator/indicated-pitch-deg",
                   true);
@@ -60,6 +63,13 @@ AttitudeIndicator::unbind ()
 void
 AttitudeIndicator::update (double dt)
 {
+                                // If it's caged, it doesn't indicate
+    if (_caged_node->getBoolValue()) {
+        _roll_out_node->setDoubleValue(0.0);
+        _pitch_out_node->setDoubleValue(0.0);
+        return;
+    }
+
                                 // Get the spin from the gyro
     _gyro.set_power_norm(_suction_node->getDoubleValue()/5.0);
     _gyro.update(dt);
@@ -75,29 +85,30 @@ AttitudeIndicator::update (double dt)
                                 // Calculate the tumble for the
                                 // next pass.
     if (_tumble_flag_node->getBoolValue()) {
-        if (_tumble < 1.0) {
-            if (fabs(roll) > 45.0) {
-                double target = (fabs(roll) - 45.0) / 45.0;
-                if (_tumble < target)
-                    _tumble = target;
-            }
-            if (fabs(pitch) > 45.0) {
-                double target = (fabs(pitch) - 45.0) / 45.0;
-                if (_tumble < target)
-                    _tumble = target;
-            }
-            if (_tumble > 1.0) {
-                _tumble = 1.0;
-            }
+        double tumble = _tumble_node->getDoubleValue();
+        if (fabs(roll) > 45.0) {
+            double target = (fabs(roll) - 45.0) / 45.0;
+            target *= target;   // exponential past +-45 degrees
+            if (roll < 0)
+                target = -target;
+
+            if (fabs(target) > fabs(tumble))
+                tumble = target;
+
+            if (tumble > 1.0)
+                tumble = 1.0;
+            else if (tumble < -1.0)
+                tumble = -1.0;
         }
-                                // Reerect in 5 minutes
-        _tumble -= dt/300.0;
-        if (_tumble < 0.0)
-            _tumble = 0.0;
-
-        responsiveness *= ((1.0 - _tumble) * (1.0 - _tumble) *
-                           (1.0 - _tumble) * (1.0 - _tumble));
-
+                                    // Reerect in 5 minutes
+        double step = dt/300.0;
+        if (tumble < -step)
+            tumble += step;
+        else if (tumble > step)
+            tumble -= step;
+
+        roll += tumble * 45;
+        _tumble_node->setDoubleValue(tumble);
     }
 
     roll = fgGetLowPass(_roll_out_node->getDoubleValue(), roll,
index b75ccd317822d49ec138e30527899b21b305ac54..00014bcb40851ee568c74c85343df0fb6806b4ca 100644 (file)
@@ -26,6 +26,8 @@
  *
  * /instrumentation/attitude-indicator/config/tumble-flag
  * /instrumentation/attitude-indicator/serviceable
+ * /instrumentation/attitude-indicator/caged-flag
+ * /instrumentation/attitude-indicator/tumble-norm
  * /orientation/pitch-deg
  * /orientation/roll-deg
  * /systems/vacuum[0]/suction-inhg
@@ -34,6 +36,7 @@
  *
  * /instrumentation/attitude-indicator/indicated-pitch-deg
  * /instrumentation/attitude-indicator/indicated-roll-deg
+ * /instrumentation/attitude-indicator/tumble-norm
  */
 class AttitudeIndicator : public FGSubsystem
 {
@@ -52,9 +55,9 @@ private:
 
     Gyro _gyro;
 
-    double _tumble;
-
     SGPropertyNode_ptr _tumble_flag_node;
+    SGPropertyNode_ptr _caged_node;
+    SGPropertyNode_ptr _tumble_node;
     SGPropertyNode_ptr _pitch_in_node;
     SGPropertyNode_ptr _roll_in_node;
     SGPropertyNode_ptr _suction_node;