@@ -2597,9 +2597,15 @@ def Soaring(self):
25972597 self .change_mode ('FBWB' )
25982598 self .delay_sim_time (5 )
25992599
2600+ # Descent to some in-between altitude
2601+ alt_mid = (alt_min + alt_ctf ) / 2
2602+ self .wait_altitude (alt_mid - 10 , alt_mid , timeout = 600 , relative = True )
2603+
26002604 # Now disable soaring (should hold altitude)
26012605 self .set_parameter ("SOAR_ENABLE" , 0 )
26022606 self .delay_sim_time (10 )
2607+ # Ensure the altitude is maintained (immediate check with wider margin)
2608+ self .wait_altitude (alt_mid - 15 , alt_mid + 5 , timeout = 1 , relative = True )
26032609
26042610 # And re-enable. This should force throttle-down
26052611 self .set_parameter ("SOAR_ENABLE" , 1 )
@@ -2608,7 +2614,51 @@ def Soaring(self):
26082614 # Now wait for descent and check throttle up
26092615 self .wait_altitude (alt_min - 10 , alt_min , timeout = 600 , relative = True )
26102616
2611- self .progress ("Waiting for climb" )
2617+ self .progress ("Waiting for climb in FBWB" )
2618+ self .wait_altitude (alt_ctf - 10 , alt_ctf , timeout = 600 , relative = True )
2619+
2620+ # Now set GUIDED mode and go to a nearby location
2621+ self .change_mode ("GUIDED" )
2622+ loc = self .mav .location ()
2623+ self .location_offset_ne (loc , 350 , 0 )
2624+ self .run_cmd_int (
2625+ mavutil .mavlink .MAV_CMD_DO_REPOSITION ,
2626+ p5 = int (loc .lat * 1e7 ),
2627+ p6 = int (loc .lng * 1e7 ),
2628+ p7 = alt_ctf ,
2629+ frame = mavutil .mavlink .MAV_FRAME_GLOBAL_RELATIVE_ALT ,
2630+ )
2631+
2632+ # GUIDED should glide en route to target
2633+ self .wait_servo_channel_value (3 , 1200 , timeout = 5 , comparator = operator .lt )
2634+ self .wait_altitude (alt_mid - 10 , alt_mid , timeout = 600 , relative = True )
2635+
2636+ # Maintain current altitude on soaring disable
2637+ self .set_parameter ("SOAR_ENABLE" , 0 )
2638+ self .delay_sim_time (10 )
2639+ self .wait_altitude (alt_mid - 15 , alt_mid + 5 , timeout = 1 , relative = True )
2640+ self .set_parameter ("SOAR_ENABLE" , 1 )
2641+
2642+ self .progress ("Waiting for climb in GUIDED" )
2643+ self .wait_altitude (alt_ctf - 10 , alt_ctf , timeout = 600 , relative = True )
2644+
2645+ # Now set LOITER mode
2646+ self .change_mode ("LOITER" )
2647+ self .delay_sim_time (5 )
2648+
2649+ # Loiter should also glide around target
2650+ self .wait_servo_channel_value (3 , 1200 , timeout = 5 , comparator = operator .lt )
2651+ self .wait_altitude (alt_min - 10 , alt_min , timeout = 600 , relative = True )
2652+
2653+ # Check altitude hold also in climb
2654+ self .wait_altitude (alt_mid - 10 , alt_mid , timeout = 600 , relative = True )
2655+ # Maintain current altitude on soaring disable
2656+ self .set_parameter ("SOAR_ENABLE" , 0 )
2657+ self .delay_sim_time (10 )
2658+ self .wait_altitude (alt_mid - 15 , alt_mid + 5 , timeout = 1 , relative = True )
2659+ self .set_parameter ("SOAR_ENABLE" , 1 )
2660+
2661+ self .progress ("Waiting for climb in LOITER" )
26122662 self .wait_altitude (alt_ctf - 10 , alt_ctf , timeout = 600 , relative = True )
26132663
26142664 # Back to auto
0 commit comments