diff --git a/Tools/autotest/autotest.py b/Tools/autotest/autotest.py index 296c930d4faf7..2004665f33972 100755 --- a/Tools/autotest/autotest.py +++ b/Tools/autotest/autotest.py @@ -525,6 +525,8 @@ def run_step(step): } if opts.speedup is not None: fly_opts["speedup"] = opts.speedup + if opts.realflight_address is not None: + fly_opts["realflight_address"] = opts.realflight_address # handle "test.Copter" etc: if step in tester_class_map: @@ -1017,6 +1019,9 @@ def format_epilog(self, formatter): group_sim.add_option("", "--replay", action='store_true', help="enable replay logging for tests") + group_sim.add_option("--realflight-address", + default=None, + help="IP address of RealFlight simulator") parser.add_option_group(group_sim) group_completion = optparse.OptionGroup(parser, "Completion helpers") diff --git a/Tools/autotest/default_params/realflight-titan-cobra.parm b/Tools/autotest/default_params/realflight-titan-cobra.parm new file mode 100644 index 0000000000000..1406af2a91a7d --- /dev/null +++ b/Tools/autotest/default_params/realflight-titan-cobra.parm @@ -0,0 +1,99 @@ +# Titan Cobra RealFlight ArduPilot 4.5 +AIRSPEED_CRUISE,12.4 +AIRSPEED_MAX,18 +AIRSPEED_MIN,11 +ARMING_RUDDER,2 +ARSPD_OFFSET,2013 +ARSPD_SKIP_CAL,1 +ARSPD_USE,1 +BATT_ARM_VOLT,14.7 +BATT_CAPACITY,10800 +BATT_CRT_VOLT,14 +BATT_LOW_VOLT,14.4 +FLIGHT_OPTIONS,1026 +FLTMODE_CH,8 +FLTMODE1,17 +FLTMODE2,17 +FLTMODE3,19 +FLTMODE4,19 +FLTMODE5,5 +FLTMODE6,5 +INS_GYRO_FILTER,36 +NAVL1_PERIOD,9 +PTCH_LIM_MIN_DEG,-14 +PTCH_RATE_D,0.00903 +PTCH_RATE_FF,1.042 +PTCH_RATE_FLTD,18 +PTCH_RATE_FLTT,2.122 +PTCH_RATE_I,1.042 +PTCH_RATE_P,0.806 +PTCH_TRIM_DEG,4.2 +PTCH2SRV_RMAX_DN,75 +PTCH2SRV_RMAX_UP,75 +PTCH2SRV_TCONST,0.75 +Q_A_ACCEL_P_MAX,53000 +Q_A_ACCEL_R_MAX,49000 +Q_A_ACCEL_Y_MAX,4500 +Q_A_ANG_PIT_P,6 +Q_A_ANG_RLL_P,6 +Q_A_ANG_YAW_P,1.8 +Q_A_RAT_PIT_D,0.00527 +Q_A_RAT_PIT_FLTD,18 +Q_A_RAT_PIT_FLTT,18 +Q_A_RAT_PIT_I,0.328 +Q_A_RAT_PIT_P,0.328 +Q_A_RAT_RLL_D,0.00707 +Q_A_RAT_RLL_FLTD,18 +Q_A_RAT_RLL_FLTT,18 +Q_A_RAT_RLL_I,0.385 +Q_A_RAT_RLL_P,0.385 +Q_A_RAT_YAW_FLTE,5 +Q_A_RAT_YAW_FLTT,18 +Q_A_RAT_YAW_I,0.2 +Q_A_RAT_YAW_P,2 +Q_A_THR_MIX_MAN,0.5 +Q_ACRO_PIT_RATE,100 +Q_ACRO_RLL_RATE,100 +Q_ACRO_YAW_RATE,50 +Q_ASSIST_SPEED,9 +Q_ENABLE,1 +Q_M_BAT_VOLT_MAX,16.8 +Q_M_BAT_VOLT_MIN,13.2 +Q_M_THST_EXPO,0.67 +Q_M_THST_HOVER,0.322 +Q_OPTIONS,16384 +Q_P_ACCZ_I,0.656 +Q_P_ACCZ_P,0.328 +Q_P_VELXY_P,4 +Q_PILOT_SPD_DN,1.5 +Q_PLT_Y_RATE,50 +Q_TRANS_DECEL,0.8 +Q_VFWD_ALT,5 +Q_VFWD_GAIN,0.1 +Q_WVANE_ANG_MIN,0.5 +Q_WVANE_GAIN,4 +Q_WVANE_HGT_MIN,2 +RC3_DZ,80 +RLL_RATE_D,0.00625 +RLL_RATE_FF,0.387 +RLL_RATE_FLTD,18 +RLL_RATE_FLTT,3.183 +RLL_RATE_I,0.251 +RLL_RATE_P,0.251 +RLL2SRV_RMAX,75 +SERVO2_FUNCTION,80 +SERVO2_TRIM,1600 +SERVO4_FUNCTION,79 +SERVO4_TRIM,1600 +STAB_PITCH_DOWN,2.5 +TECS_CLMB_MAX,5.6 +TECS_PITCH_MAX,0 +TECS_RLL2THR,7 +TECS_SINK_MAX,3 +TECS_SINK_MIN,1.5 +THROTTLE_NUDGE,0 +TRIM_THROTTLE,47 +WP_LOITER_RAD,70 +WP_RADIUS,70 +SIM_FTAX_OPTS,25 +LOG_BITMASK,0x10FFFF diff --git a/Tools/autotest/quadplane.py b/Tools/autotest/quadplane.py index a5a61fe763f79..8b59938142811 100644 --- a/Tools/autotest/quadplane.py +++ b/Tools/autotest/quadplane.py @@ -703,12 +703,21 @@ def default_mode(self): return "MANUAL" def disabled_tests(self): - return { + tests = { "FRSkyPassThrough": "Currently failing", "CPUFailsafe": "servo channel values not scaled like ArduPlane", "GyroFFT": "flapping test", "ConfigErrorLoop": "failing because RC values not settable", } + for test in self.tests(): + name = "" + if isinstance(test, Test): + name = test.name + else: + name = test.__name__ + if name.lower().startswith("realflight"): + tests[name] = "needs RealFlight" + return tests def BootInAUTO(self): '''Test behaviour when booting in auto''' @@ -1858,6 +1867,46 @@ def RTL_AUTOLAND_1_FROM_GUIDED(self): self.fly_home_land_and_disarm() + def RealFlightTitanHover(self): + '''Test the RealFlight Titan Cobra''' + frame = "flightaxis" + if self.realflight_address is not None: + frame += f":{self.realflight_address}" + self.customise_SITL_commandline( + [ + "--home", "40.0594626,-88.5513292,206.0,0", + ], + frame, + wipe=True, + defaults_filepath="Tools/autotest/default_params/realflight-titan-cobra.parm" + ) + self.wait_ready_to_arm() + self.change_mode("QLOITER") + self.arm_vehicle() + self.set_rc(3, 2000) + self.wait_altitude(8, 12, relative=True) + self.set_rc(3, 1500) + stick_deflections = [ + (2000, 1500, "roll right"), + (1500, 1500, "center"), + (1000, 1500, "roll left"), + (1500, 1500, "center"), + (1500, 2000, "pitch forward"), + (1500, 1500, "center"), + (1500, 1000, "pitch back"), + (1500, 1500, "center"), + ] + n_iterations = 10 + for i in range(n_iterations): + print(f"Control input cycle: {i+1}/{n_iterations}") + for roll, pitch, msg in stick_deflections: + print(f"{msg}") + self.set_rc(1, roll) + self.set_rc(2, pitch) + self.delay_sim_time(0.5) + self.change_mode("QLAND") + self.wait_disarmed(timeout=120) + def tests(self): '''return list of all tests''' @@ -1906,5 +1955,6 @@ def tests(self): self.DCMClimbRate, self.RTL_AUTOLAND_1, # as in fly-home then go to landing sequence self.RTL_AUTOLAND_1_FROM_GUIDED, # as in fly-home then go to landing sequence + self.RealFlightTitanHover, ]) return ret diff --git a/Tools/autotest/vehicle_test_suite.py b/Tools/autotest/vehicle_test_suite.py index 08b179380d4c2..d4dda7a51fc98 100644 --- a/Tools/autotest/vehicle_test_suite.py +++ b/Tools/autotest/vehicle_test_suite.py @@ -1906,6 +1906,7 @@ def __init__(self, dronecan_tests=False, generate_junit=False, enable_fgview=False, + realflight_address=None, build_opts={}): self.start_time = time.time() @@ -1973,6 +1974,7 @@ def __init__(self, self.in_drain_mav = False self.tlog = None self.enable_fgview = enable_fgview + self.realflight_address = realflight_address self.rc_thread = None self.rc_thread_should_quit = False