diff --git a/Tools/autotest/ArduPlane_Tests/FlyEachFrame/basic-quadplane.txt b/Tools/autotest/ArduPlane_Tests/FlyEachFrame/basic-quadplane.txt new file mode 100644 index 0000000000..d4ec44c2e0 --- /dev/null +++ b/Tools/autotest/ArduPlane_Tests/FlyEachFrame/basic-quadplane.txt @@ -0,0 +1,13 @@ +QGC WPL 110 +0 0 0 16 0.000000 0.000000 0.000000 0.000000 -35.363262 149.165237 584.390015 1 +1 0 3 84 0.000000 0.000000 0.000000 0.000000 -35.361279 149.164230 30.000000 1 +2 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.361229 149.163025 80.000000 1 +3 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.364563 149.163773 80.000000 1 +4 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.364384 149.164795 80.000000 1 +5 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.361027 149.164093 80.000000 1 +6 0 0 177 2.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1 +7 0 3 189 0.000000 0.000000 0.000000 0.000000 -35.362915 149.162613 60.000000 1 +8 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.363136 149.162750 60.000000 1 +9 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.365467 149.164215 55.000000 1 +10 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.365009 149.165482 39.889999 1 +11 0 3 85 0.000000 0.000000 0.000000 1.000000 -35.363041 149.165222 0.000000 1 diff --git a/Tools/autotest/ArduPlane_Tests/FlyEachFrame/basic.txt b/Tools/autotest/ArduPlane_Tests/FlyEachFrame/basic.txt new file mode 100644 index 0000000000..b6a88b10c2 --- /dev/null +++ b/Tools/autotest/ArduPlane_Tests/FlyEachFrame/basic.txt @@ -0,0 +1,13 @@ +QGC WPL 110 +0 0 0 16 0.000000 0.000000 0.000000 0.000000 -35.363262 149.165237 584.390015 1 +1 0 3 22 15.000000 0.000000 0.000000 0.000000 -35.361279 149.164230 30.000000 1 +2 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.361229 149.163025 80.000000 1 +3 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.364563 149.163773 80.000000 1 +4 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.364384 149.164795 80.000000 1 +5 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.361027 149.164093 80.000000 1 +6 0 0 177 2.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1 +7 0 3 189 0.000000 0.000000 0.000000 0.000000 -35.362915 149.162613 60.000000 1 +8 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.363136 149.162750 60.000000 1 +9 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.365467 149.164215 55.000000 1 +10 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.365009 149.165482 39.889999 1 +11 0 3 21 0.000000 0.000000 0.000000 1.000000 -35.363041 149.165222 0.000000 1 diff --git a/Tools/autotest/arduplane.py b/Tools/autotest/arduplane.py index 5f3476f610..b873a678cd 100644 --- a/Tools/autotest/arduplane.py +++ b/Tools/autotest/arduplane.py @@ -20,6 +20,7 @@ from common import AutoTestTimeoutException from common import NotAchievedException from common import PreconditionFailedException from pymavlink.rotmat import Vector3 +from pysim import vehicleinfo import operator @@ -522,7 +523,7 @@ class AutoTestPlane(AutoTest): return self.wait_level_flight() - def fly_mission(self, filename, mission_timeout=60.0, strict=True): + def fly_mission(self, filename, mission_timeout=60.0, strict=True, quadplane=False): """Fly a mission from a file.""" self.progress("Flying mission %s" % filename) num_wp = self.load_mission(filename, strict=strict)-1 @@ -530,7 +531,10 @@ class AutoTestPlane(AutoTest): self.change_mode('AUTO') self.wait_waypoint(1, num_wp, max_dist=60) self.wait_groundspeed(0, 0.5, timeout=mission_timeout) - self.wait_statustext("Auto disarmed", timeout=60) + if quadplane: + self.wait_statustext("Throttle disarmed", timeout=60) + else: + self.wait_statustext("Auto disarmed", timeout=60) self.progress("Mission OK") def fly_do_reposition(self): @@ -2880,6 +2884,49 @@ class AutoTestPlane(AutoTest): want_result=mavutil.mavlink.MAV_RESULT_DENIED ) + def fly_each_frame(self): + vinfo = vehicleinfo.VehicleInfo() + vinfo_options = vinfo.options[self.vehicleinfo_key()] + known_broken_frames = { + "firefly": "falls out of sky after transition", + "plane-tailsitter": "does not take off; immediately emits 'AP: Transition VTOL done' while on ground", + "quadplane-cl84": "falls out of sky instead of transitioning", + "quadplane-tilttri": "falls out of sky instead of transitioning", + "quadplane-tilttrivec": "loses attitude control and crashes", + } + for frame in sorted(vinfo_options["frames"].keys()): + self.start_subtest("Testing frame (%s)" % str(frame)) + if frame in known_broken_frames: + self.progress("Actually, no I'm not - it is known-broken (%s)" % + (known_broken_frames[frame])) + continue + frame_bits = vinfo_options["frames"][frame] + print("frame_bits: %s" % str(frame_bits)) + if frame_bits.get("external", False): + self.progress("Actually, no I'm not - it is an external simulation") + continue + model = frame_bits.get("model", frame) + # the model string for Callisto has crap in it.... we + # should really have another entry in the vehicleinfo data + # to carry the path to the JSON. + actual_model = model.split(":")[0] + defaults = self.model_defaults_filepath(actual_model) + if type(defaults) != list: + defaults = [defaults] + self.customise_SITL_commandline( + ["--defaults", ','.join(defaults), ], + model=model, + wipe=True, + ) + mission_file = "basic.txt" + quadplane = self.get_parameter('Q_ENABLE') + if quadplane: + mission_file = "basic-quadplane.txt" + self.wait_ready_to_arm() + self.arm_vehicle() + self.fly_mission(mission_file, strict=False, quadplane=quadplane) + self.wait_disarmed() + def tests(self): '''return list of all tests''' ret = super(AutoTestPlane, self).tests() @@ -3069,6 +3116,10 @@ class AutoTestPlane(AutoTest): "Test smart battery logging etc", self.SmartBattery), + ("FlyEachFrame", + "Fly each supported internal frame", + self.fly_each_frame), + ("LogUpload", "Log upload", self.log_upload), diff --git a/Tools/autotest/pysim/vehicleinfo.py b/Tools/autotest/pysim/vehicleinfo.py index 4ecba30690..87e9330f74 100644 --- a/Tools/autotest/pysim/vehicleinfo.py +++ b/Tools/autotest/pysim/vehicleinfo.py @@ -269,23 +269,31 @@ class VehicleInfo(object): "gazebo-zephyr": { "waf_target": "bin/arduplane", "default_params_filename": "default_params/gazebo-zephyr.parm", + "external": True, }, "last_letter": { "waf_target": "bin/arduplane", + "default_params_filename": "default_params/plane.parm", + "external": True, }, "CRRCSim": { "waf_target": "bin/arduplane", + "default_params_filename": "default_params/plane.parm", + "external": True, }, "jsbsim": { "waf_target": "bin/arduplane", "default_params_filename": "default_params/plane-jsbsim.parm", + "external": True, }, "scrimmage-plane" : { "waf_target": "bin/arduplane", "default_params_filename": "default_params/plane.parm", + "external": True, }, "calibration": { "extra_mavlink_cmds": "module load sitl_calibration;", + "external": True, # lies! OTOH, hard to take off with this }, }, },