mirror of https://github.com/ArduPilot/ardupilot
86 lines
2.7 KiB
Python
86 lines
2.7 KiB
Python
# AP_FLAKE8_CLEAN
|
|
|
|
from LogAnalyzer import Test, TestResult
|
|
from VehicleType import VehicleType
|
|
|
|
|
|
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 != VehicleType.Copter:
|
|
self.result.status = TestResult.StatusType.NA
|
|
return
|
|
|
|
self.result.status = TestResult.StatusType.UNKNOWN
|
|
if "RCOU" not in logdata.channels:
|
|
return
|
|
|
|
ch = []
|
|
|
|
for i in range(8):
|
|
for prefix in "Chan", "Ch", "C":
|
|
if prefix + repr((i + 1)) in logdata.channels["RCOU"]:
|
|
ch.append(map(lambda x: x[1], logdata.channels["RCOU"][prefix + repr((i + 1))].listData))
|
|
|
|
ch = zip(*ch)
|
|
num_channels = 0
|
|
ch = list(ch)
|
|
for i in range(len(ch)):
|
|
ch[i] = list(filter(lambda x: (x > 0 and x < 3000), ch[i]))
|
|
if num_channels < len(ch[i]):
|
|
num_channels = len(ch[i])
|
|
|
|
if logdata.frame:
|
|
num_channels = logdata.num_motor_channels()
|
|
|
|
if num_channels < 2:
|
|
return
|
|
|
|
try:
|
|
min_throttle = (
|
|
logdata.parameters["RC3_MIN"]
|
|
+ logdata.parameters["THR_MIN"]
|
|
/ (logdata.parameters["RC3_MAX"] - logdata.parameters["RC3_MIN"])
|
|
/ 1000.0
|
|
)
|
|
except KeyError:
|
|
min_throttle = (
|
|
logdata.parameters["MOT_PWM_MIN"]
|
|
/ (logdata.parameters["MOT_PWM_MAX"] - logdata.parameters["RC3_MIN"])
|
|
/ 1000.0
|
|
)
|
|
|
|
ch = list(filter(lambda x: sum(x) / num_channels > min_throttle, ch))
|
|
|
|
if len(ch) == 0:
|
|
return
|
|
|
|
avg_sum = 0
|
|
avg_ch = []
|
|
for i in range(num_channels):
|
|
avg = list(map(lambda x: x[i], ch))
|
|
avg = sum(avg) / len(avg)
|
|
avg_ch.append(avg)
|
|
avg_sum += avg
|
|
avg_all = avg_sum / num_channels
|
|
|
|
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
|