From 7d7a2aced7901fedaaf4bb8b454caf7aa64e0da2 Mon Sep 17 00:00:00 2001
From: Randy Mackay <rmackay9@yahoo.com>
Date: Wed, 30 Apr 2014 11:17:59 +0900
Subject: [PATCH] Copter: init vert speed and accel for each flight mode

This resolves issue #1021 in which LAND mode could descend at the
PILOT_VELZ rate instead of the WPNAV_SPEED_DN

Pilot defined acceleration is used for AltHold, AutoTune , Circle,
Hybrid, Loiter, OF_Loiter and Sport flight modes
Waypoint Nav (ie. AutoPilot) acceleration is used for Auto, Land, RTL
---
 ArduCopter/control_althold.pde  | 1 +
 ArduCopter/control_autotune.pde | 5 +++++
 ArduCopter/control_circle.pde   | 5 +++++
 ArduCopter/control_hybrid.pde   | 1 +
 ArduCopter/control_land.pde     | 4 ++++
 ArduCopter/control_loiter.pde   | 3 ++-
 ArduCopter/control_ofloiter.pde | 7 +++++++
 ArduCopter/control_sport.pde    | 7 +++++++
 8 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/ArduCopter/control_althold.pde b/ArduCopter/control_althold.pde
index 1fc9b77c3..f15818056 100644
--- a/ArduCopter/control_althold.pde
+++ b/ArduCopter/control_althold.pde
@@ -12,6 +12,7 @@ static bool althold_init(bool ignore_checks)
 
     // initialize vertical speeds and leash lengths
     pos_control.set_speed_z(-g.pilot_velocity_z_max, g.pilot_velocity_z_max);
+    pos_control.set_accel_z(g.pilot_accel_z);
 
     return true;
 }
diff --git a/ArduCopter/control_autotune.pde b/ArduCopter/control_autotune.pde
index cf2cbf818..d57f40f53 100644
--- a/ArduCopter/control_autotune.pde
+++ b/ArduCopter/control_autotune.pde
@@ -194,6 +194,11 @@ static bool autotune_init(bool ignore_checks)
 
     // initialise altitude target to stopping point
     pos_control.set_target_to_stopping_point_z();
+
+    // initialize vertical speeds and leash lengths
+    pos_control.set_speed_z(-g.pilot_velocity_z_max, g.pilot_velocity_z_max);
+    pos_control.set_accel_z(g.pilot_accel_z);
+
     return true;
 }
 
diff --git a/ArduCopter/control_circle.pde b/ArduCopter/control_circle.pde
index 3a201e748..deb905873 100644
--- a/ArduCopter/control_circle.pde
+++ b/ArduCopter/control_circle.pde
@@ -10,6 +10,11 @@ static bool circle_init(bool ignore_checks)
     if ((GPS_ok() && inertial_nav.position_ok()) || ignore_checks) {
         circle_pilot_yaw_override = false;
         circle_nav.init();
+
+        // initialize vertical speeds and leash lengths
+        pos_control.set_speed_z(-g.pilot_velocity_z_max, g.pilot_velocity_z_max);
+        pos_control.set_accel_z(g.pilot_accel_z);
+
         return true;
     }else{
         return false;
diff --git a/ArduCopter/control_hybrid.pde b/ArduCopter/control_hybrid.pde
index 4bd77c65e..a0b309328 100644
--- a/ArduCopter/control_hybrid.pde
+++ b/ArduCopter/control_hybrid.pde
@@ -106,6 +106,7 @@ static bool hybrid_init(bool ignore_checks)
     
     // initialize vertical speeds and leash lengths
     pos_control.set_speed_z(-g.pilot_velocity_z_max, g.pilot_velocity_z_max);
+    pos_control.set_accel_z(g.pilot_accel_z);
 
     // initialise lean angles to current attitude
     hybrid.pilot_roll = 0;
diff --git a/ArduCopter/control_land.pde b/ArduCopter/control_land.pde
index 893577667..97f7dee16 100644
--- a/ArduCopter/control_land.pde
+++ b/ArduCopter/control_land.pde
@@ -18,6 +18,10 @@ static bool land_init(bool ignore_checks)
 
     // initialise altitude target to stopping point
     pos_control.set_target_to_stopping_point_z();
+
+    // initialize vertical speeds and leash lengths
+    pos_control.set_speed_z(wp_nav.get_speed_down(), wp_nav.get_speed_up());
+    pos_control.set_accel_z(wp_nav.get_accel_z());
     return true;
 }
 
diff --git a/ArduCopter/control_loiter.pde b/ArduCopter/control_loiter.pde
index 77fba105b..9829479ba 100644
--- a/ArduCopter/control_loiter.pde
+++ b/ArduCopter/control_loiter.pde
@@ -12,8 +12,9 @@ static bool loiter_init(bool ignore_checks)
         // set target to current position
         wp_nav.init_loiter_target();
 
-        // initialize vertical speeds
+        // initialize vertical speed and accelerationj
         pos_control.set_speed_z(-g.pilot_velocity_z_max, g.pilot_velocity_z_max);
+        pos_control.set_accel_z(g.pilot_accel_z);
 
         // initialise altitude target to stopping point
         pos_control.set_target_to_stopping_point_z();
diff --git a/ArduCopter/control_ofloiter.pde b/ArduCopter/control_ofloiter.pde
index 2cda161b3..32ddd011d 100644
--- a/ArduCopter/control_ofloiter.pde
+++ b/ArduCopter/control_ofloiter.pde
@@ -9,6 +9,13 @@ static bool ofloiter_init(bool ignore_checks)
 {
 #if OPTFLOW == ENABLED
     if (g.optflow_enabled || ignore_checks) {
+        // initialise altitude target to stopping point
+        pos_control.set_target_to_stopping_point_z();
+
+        // initialize vertical speed and acceleration
+        pos_control.set_speed_z(-g.pilot_velocity_z_max, g.pilot_velocity_z_max);
+        pos_control.set_accel_z(g.pilot_accel_z);
+
         return true;
     }else{
         return false;
diff --git a/ArduCopter/control_sport.pde b/ArduCopter/control_sport.pde
index 61b46deb8..275bdf7e0 100644
--- a/ArduCopter/control_sport.pde
+++ b/ArduCopter/control_sport.pde
@@ -7,6 +7,13 @@
 // sport_init - initialise sport controller
 static bool sport_init(bool ignore_checks)
 {
+    // initialize vertical speed and accelerationj
+    pos_control.set_speed_z(-g.pilot_velocity_z_max, g.pilot_velocity_z_max);
+    pos_control.set_accel_z(g.pilot_accel_z);
+
+    // initialise altitude target to stopping point
+    pos_control.set_target_to_stopping_point_z();
+
     return true;
 }
 
-- 
GitLab