From b57d17123f8cf76baef3d6285ea3b3eb66760405 Mon Sep 17 00:00:00 2001 From: Michelle Rossouw Date: Thu, 24 Aug 2023 14:28:48 +1000 Subject: [PATCH] Tools: Add simple Blimp autotest, testing Manual, Loiter and RTL modes --- Tools/autotest/autotest.py | 1 + Tools/autotest/blimp.py | 147 +++++++++++++++++++++++++++++++++---- Tools/scripts/build_ci.sh | 14 ++-- 3 files changed, 144 insertions(+), 18 deletions(-) diff --git a/Tools/autotest/autotest.py b/Tools/autotest/autotest.py index 207bf3e713..ef62a48e09 100755 --- a/Tools/autotest/autotest.py +++ b/Tools/autotest/autotest.py @@ -729,6 +729,7 @@ def write_fullresults(): results.addglob('APM:Copter documentation', 'docs/ArduCopter/index.html') results.addglob('APM:Rover documentation', 'docs/Rover/index.html') results.addglob('APM:Sub documentation', 'docs/ArduSub/index.html') + results.addglob('APM:Blimp documentation', 'docs/Blimp/index.html') results.addglobimage("Flight Track", '*.png') write_webresults(results) diff --git a/Tools/autotest/blimp.py b/Tools/autotest/blimp.py index e180ea0488..affeec2cec 100644 --- a/Tools/autotest/blimp.py +++ b/Tools/autotest/blimp.py @@ -14,15 +14,15 @@ from common import AutoTest # get location of scripts testdir = os.path.dirname(os.path.realpath(__file__)) -SITL_START_LOCATION = mavutil.location(-35.362938, 149.165085, 584, 270) +SITL_START_LOCATION = mavutil.location(-35.362938, 149.165085, 584, 0) -# Flight mode switch positions are set-up in arducopter.param to be -# switch 1 = Circle -# switch 2 = Land -# switch 3 = RTL -# switch 4 = Auto -# switch 5 = Loiter -# switch 6 = Stabilize +# Flight mode switch positions are set-up in blimp.parm to be +# switch 1 = Land +# switch 2 = Manual +# switch 3 = Velocity +# switch 4 = Loiter +# switch 5 = Manual +# switch 6 = Manual class AutoTestBlimp(AutoTest): @@ -105,16 +105,136 @@ class AutoTestBlimp(AutoTest): def set_autodisarm_delay(self, delay): self.set_parameter("DISARM_DELAY", delay) - def Speed(self): - '''test we can move''' + def FlyManual(self): + '''test manual mode''' self.change_mode('MANUAL') self.wait_ready_to_arm() self.arm_vehicle() + acc = 0.5 + # make sure we don't drift: - start = self.mav.location() + bl = self.mav.location() + tl = self.offset_location_ne(location=bl, metres_north=2, metres_east=0) + ttl = self.offset_location_ne(location=bl, metres_north=4, metres_east=0) + tr = self.offset_location_ne(location=bl, metres_north=4, metres_east=2) + ttr = self.offset_location_ne(location=bl, metres_north=4, metres_east=4) + + if self.mavproxy is not None: + self.mavproxy.send(f"map icon {bl.lat} {bl.lng} flag\n") + self.mavproxy.send(f"map icon {tl.lat} {tl.lng} flag\n") + self.mavproxy.send(f"map icon {ttl.lat} {ttl.lng} flag\n") + self.mavproxy.send(f"map icon {tr.lat} {tr.lng} flag\n") + self.mavproxy.send(f"map icon {ttr.lat} {ttr.lng} flag\n") + self.set_rc(2, 2000) - self.wait_distance_to_location(start, 2, 10, timeout=40) + self.wait_distance_to_location(tl, 0, acc, timeout=10) + self.set_rc(2, 1500) + self.wait_distance_to_location(ttl, 0, acc, timeout=15) + self.set_rc(1, 2000) + self.wait_distance_to_location(tr, 0, acc, timeout=10) + self.set_rc(1, 1500) + self.wait_distance_to_location(ttr, 0, acc, timeout=15) + self.change_mode('RTL') + self.wait_distance_to_location(bl, 0, 0.5, timeout=30, minimum_duration=5) # make sure it can hold position + self.change_mode('MANUAL') + + self.wait_distance_to_location(bl, 0, acc, timeout=5) # make sure we haven't moved from the spot + + self.set_rc(3, 2000) + self.wait_altitude(5, 5.5, relative=True, timeout=15) + self.set_rc(3, 1500) + + self.wait_distance_to_location(bl, 0, acc, timeout=5) # make sure we haven't moved from the spot + + self.set_rc(4, 1000) + self.wait_heading(340, accuracy=5, timeout=5) # short timeout to check yawrate + self.set_rc(4, 1500) + + self.wait_distance_to_location(bl, 0, acc, timeout=5) # make sure we haven't moved from the spot + + self.set_rc(3, 1000) + self.wait_altitude(0, 0.5, relative=True, timeout=20) + self.set_rc(3, 1500) + + self.wait_distance_to_location(bl, 0, acc, timeout=5) # make sure we haven't moved from the spot + + self.set_rc(4, 2000) + self.wait_heading(135, accuracy=5, timeout=10) # short timeout to check yawrate + self.set_rc(4, 1500) + + self.wait_distance_to_location(bl, 0, acc, timeout=5) # make sure we haven't moved from the spot + + self.disarm_vehicle() + + def FlyLoiter(self): + '''test loiter mode''' + + self.change_mode('LOITER') + self.wait_ready_to_arm() + self.arm_vehicle() + + siz = 5 + tim = 60 + + # make sure we don't drift: + bl = self.mav.location() + tl = self.offset_location_ne(location=bl, metres_north=siz, metres_east=0) + tr = self.offset_location_ne(location=bl, metres_north=siz, metres_east=siz) + br = self.offset_location_ne(location=bl, metres_north=0, metres_east=siz) + + print("Locations are:") + print("bottom left ", bl.lat, bl.lng) + print("top left ", tl.lat, tl.lng) + print("top right ", tr.lat, tr.lng) + print("bottom right ", br.lat, br.lng) + + if self.mavproxy is not None: + self.mavproxy.send(f"map icon {bl.lat} {bl.lng} flag\n") + self.mavproxy.send(f"map icon {tl.lat} {tl.lng} flag\n") + self.mavproxy.send(f"map icon {tr.lat} {tr.lng} flag\n") + self.mavproxy.send(f"map icon {br.lat} {br.lng} flag\n") + + self.set_parameter("SIMPLE_MODE", 1) + + self.set_rc(2, 2000) + self.wait_distance_to_location(tl, 0, 0.2, timeout=tim) + self.set_rc(2, 1500) + + self.set_rc(1, 2000) + self.wait_distance_to_location(tr, 0, 0.5, timeout=tim) + self.set_rc(1, 1500) + + self.set_rc(2, 1000) + self.wait_distance_to_location(br, 0, 0.5, timeout=tim) + self.set_rc(2, 1500) + + self.set_rc(1, 1000) + self.wait_distance_to_location(bl, 0, 0.5, timeout=tim) + self.set_rc(1, 1500) + + fin = self.mav.location() + + self.set_rc(4, 1700) + self.wait_heading(135, accuracy=2, timeout=tim) + self.set_rc(4, 1500) + + self.wait_distance_to_location(fin, 0, 0.15, timeout=5) # make sure we haven't moved from the spot + + self.set_rc(3, 2000) + self.wait_altitude(5, 5.5, relative=True, timeout=60) + self.set_rc(3, 1000) + self.wait_altitude(0, 0.5, relative=True, timeout=60) + self.set_rc(3, 1500) + + self.wait_distance_to_location(fin, 0, 0.15, timeout=5) # make sure we haven't moved from the spot + + self.set_rc(4, 1300) + self.wait_heading(0, accuracy=2, timeout=tim) + self.set_rc(4, 1500) + + self.wait_distance_to_location(fin, 0, 0.15, timeout=5) # make sure we haven't moved from the spot + self.disarm_vehicle() def tests(self): @@ -122,7 +242,8 @@ class AutoTestBlimp(AutoTest): # ret = super(AutoTestBlimp, self).tests() ret = [] ret.extend([ - self.Speed, + self.FlyManual, + self.FlyLoiter, ]) return ret diff --git a/Tools/scripts/build_ci.sh b/Tools/scripts/build_ci.sh index 12e654c5ba..4ae65daff8 100755 --- a/Tools/scripts/build_ci.sh +++ b/Tools/scripts/build_ci.sh @@ -163,6 +163,10 @@ for t in $CI_BUILD_TARGET; do run_autotest "Sub" "build.Sub" "test.Sub" continue fi + if [ "$t" == "sitltest-blimp" ]; then + run_autotest "Blimp" "build.Blimp" "test.Blimp" + continue + fi if [ "$t" == "unit-tests" ]; then run_autotest "Unit Tests" "build.unit_tests" "run.unit_tests" @@ -267,7 +271,7 @@ for t in $CI_BUILD_TARGET; do $waf bootloader continue fi - + if [ "$t" == "stm32f7" ]; then echo "Building mRoX21-777/" $waf configure --Werror --board mRoX21-777 @@ -339,7 +343,7 @@ for t in $CI_BUILD_TARGET; do $waf tests continue fi - + if [ "$t" == "fmuv2-plane" ]; then echo "Building fmuv2 plane" $waf configure --board fmuv2 @@ -367,11 +371,11 @@ for t in $CI_BUILD_TARGET; do if [ "$t" == "replay" ]; then echo "Building replay" $waf configure --board sitl --debug --disable-scripting - + $waf replay echo "Building AP_DAL standalone test" $waf configure --board sitl --debug --disable-scripting --no-gcs - + $waf --target tool/AP_DAL_Standalone $waf clean continue @@ -407,7 +411,7 @@ for t in $CI_BUILD_TARGET; do ./Tools/scripts/build_bootloaders.py --signing-key testkey_public_key.dat MatekL431-DShot continue fi - + if [ "$t" == "python-cleanliness" ]; then echo "Checking Python code cleanliness" ./Tools/scripts/run_flake8.py