You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
37 lines
1.6 KiB
37 lines
1.6 KiB
from LogAnalyzer import Test,TestResult |
|
import DataflashLog |
|
|
|
|
|
class TestGPSGlitch(Test): |
|
'''test for bad GPS data (satellite count, hdop), and later for sudden repositioning beyond what the drone could do''' |
|
|
|
def __init__(self): |
|
self.name = "GPS" |
|
|
|
def run(self, logdata): |
|
self.result = TestResult() |
|
self.result.status = TestResult.StatusType.PASS |
|
|
|
if "GPS" not in logdata.channels: |
|
self.result.status = TestResult.StatusType.FAIL |
|
self.result.statusMessage = "No GPS log data" |
|
return |
|
|
|
# define and check different thresholds for WARN level and FAIL level |
|
minSatsWARN = 6 |
|
minSatsFAIL = 5 |
|
maxHDopWARN = 3.0 |
|
maxHDopFAIL = 10.0 |
|
foundBadSatsWarn = logdata.channels["GPS"]["NSats"].min() < minSatsWARN |
|
foundBadHDopWarn = logdata.channels["GPS"]["HDop"].max() > maxHDopWARN |
|
foundBadSatsFail = logdata.channels["GPS"]["NSats"].min() < minSatsFAIL |
|
foundBadHDopFail = logdata.channels["GPS"]["HDop"].max() > maxHDopFAIL |
|
if foundBadSatsFail or foundBadHDopFail: |
|
self.result.status = TestResult.StatusType.FAIL |
|
self.result.statusMessage = "Min satellites: %s, Max HDop: %s" % (logdata.channels["GPS"]["NSats"].min(), logdata.channels["GPS"]["HDop"].max()) |
|
elif foundBadSatsWarn or foundBadHDopWarn: |
|
self.result.status = TestResult.StatusType.WARN |
|
self.result.statusMessage = "Min satellites: %s, Max HDop: %s" % (logdata.channels["GPS"]["NSats"].min(), logdata.channels["GPS"]["HDop"].max()) |
|
|
|
# TODO: also test for sudden repositioning beyond what the drone could reasonably achieve, like is done with glitch protection - or is that logged when it happens? |
|
# ...
|
|
|