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.
62 lines
2.2 KiB
62 lines
2.2 KiB
from LogAnalyzer import Test,TestResult |
|
import DataflashLog |
|
|
|
|
|
class TestBalanceTwist(Test): |
|
'''test for badly unbalanced copter, including yaw twist''' |
|
def __init__(self): |
|
Test.__init__(self) |
|
self.name = "Motor Balance" |
|
|
|
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 |
|
|
|
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 and x<3000), 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
|
|
|