From 0955284d7e1851cbbd06a523caa1859a1c612e0c Mon Sep 17 00:00:00 2001 From: Jonathan Challinger Date: Tue, 21 Oct 2014 13:30:55 -0700 Subject: [PATCH] LogAnalyzer: balance/twist initial commit --- Tools/LogAnalyzer/tests/TestBalanceTwist.py | 66 +++++++++++++++++---- 1 file changed, 54 insertions(+), 12 deletions(-) diff --git a/Tools/LogAnalyzer/tests/TestBalanceTwist.py b/Tools/LogAnalyzer/tests/TestBalanceTwist.py index b175ef21a1..c06d26b259 100644 --- a/Tools/LogAnalyzer/tests/TestBalanceTwist.py +++ b/Tools/LogAnalyzer/tests/TestBalanceTwist.py @@ -3,18 +3,60 @@ import DataflashLog class TestBalanceTwist(Test): - '''test for badly unbalanced copter, including yaw twist''' + '''test for badly unbalanced copter, including yaw twist''' + def __init__(self): + Test.__init__(self) + self.name = "Balance/Twist" - def __init__(self): - Test.__init__(self) - self.name = "Balance/Twist" - - def run(self, logdata, verbose): - self.result = TestResult() - self.result.status = TestResult.StatusType.GOOD + def run(self, logdata, verbose): + self.result = TestResult() + self.result.status = TestResult.StatusType.GOOD - if logdata.vehicleType != "ArduCopter": - self.result.status = TestResult.StatusType.NA - return + if logdata.vehicleType != "ArduCopter": + self.result.status = TestResult.StatusType.NA + return - # TODO: implement copter test for unbalanced or twisted copter frame \ No newline at end of file + self.result.status = TestResult.StatusType.UNKNOWN + if not "RCOU" in logdata.channels: + return + + ch = [] + + for i in range(8): + if "Chan"+`(i+1)` in logdata.channels["RCOU"]: + ch.append(map(lambda x: x[1], logdata.channels["RCOU"]["Chan"+`(i+1)`].listData)) + elif "Ch"+`(i+1)` in logdata.channels["RCOU"]: + ch.append(map(lambda x: x[1], logdata.channels["RCOU"]["Ch"+`(i+1)`].listData)) + + ch = zip(*ch) + num_channels = 0 + for i in range(len(ch)): + ch[i] = filter(lambda x: x != 0, ch[i]) + if num_channels < len(ch[i]): + num_channels = len(ch[i]) + + if num_channels < 2: + return + + min_throttle = logdata.parameters["RC3_MIN"] + logdata.parameters["THR_MIN"] / (logdata.parameters["RC3_MAX"]-logdata.parameters["RC3_MIN"])/1000.0 + ch = filter(lambda x:sum(x)/num_channels > min_throttle, ch) + + if len(ch) == 0: + return + + avg_all = map(lambda x:sum(x)/num_channels,ch) + avg_all = sum(avg_all)/len(avg_all) + avg_ch = [] + for i in range(num_channels): + avg = map(lambda x: x[i],ch) + avg = sum(avg)/len(avg) + avg_ch.append(avg) + + self.result.statusMessage = "Motor channel averages = %s\nAverage motor output = %.0f\nDifference between min and max motor averages = %.0f" % (str(avg_ch),avg_all,abs(min(avg_ch)-max(avg_ch))) + + self.result.status = TestResult.StatusType.GOOD + + if abs(min(avg_ch)-max(avg_ch)) > 75: + self.result.status = TestResult.StatusType.WARN + if abs(min(avg_ch)-max(avg_ch)) > 150: + self.result.status = TestResult.StatusType.FAIL