2014-01-27 02:38:57 -04:00
from LogAnalyzer import Test , TestResult
import DataflashLog
2016-09-07 19:54:50 -03:00
from VehicleType import VehicleType
2014-01-27 02:38:57 -04:00
class TestBalanceTwist ( Test ) :
2014-10-21 17:30:55 -03:00
''' test for badly unbalanced copter, including yaw twist '''
def __init__ ( self ) :
Test . __init__ ( self )
2014-10-27 01:53:42 -03:00
self . name = " Motor Balance "
2014-01-27 02:38:57 -04:00
2014-10-21 17:30:55 -03:00
def run ( self , logdata , verbose ) :
self . result = TestResult ( )
self . result . status = TestResult . StatusType . GOOD
2014-01-27 02:38:57 -04:00
2016-09-07 19:54:50 -03:00
if logdata . vehicleType != VehicleType . Copter :
2014-10-21 17:30:55 -03:00
self . result . status = TestResult . StatusType . NA
return
2014-01-27 02:38:57 -04:00
2014-10-21 17:30:55 -03:00
self . result . status = TestResult . StatusType . UNKNOWN
if not " RCOU " in logdata . channels :
return
ch = [ ]
for i in range ( 8 ) :
2016-09-07 19:54:50 -03:00
for prefix in " Chan " , " Ch " , " C " :
if prefix + ` ( i + 1 ) ` in logdata . channels [ " RCOU " ] :
ch . append ( map ( lambda x : x [ 1 ] , logdata . channels [ " RCOU " ] [ prefix + ` ( i + 1 ) ` ] . listData ) )
2014-10-21 17:30:55 -03:00
ch = zip ( * ch )
num_channels = 0
for i in range ( len ( ch ) ) :
2014-10-27 01:50:31 -03:00
ch [ i ] = filter ( lambda x : ( x > 0 and x < 3000 ) , ch [ i ] )
2014-10-21 17:30:55 -03:00
if num_channels < len ( ch [ i ] ) :
num_channels = len ( ch [ i ] )
if num_channels < 2 :
return
2016-09-07 19:54:50 -03:00
try :
min_throttle = logdata . parameters [ " RC3_MIN " ] + logdata . parameters [ " THR_MIN " ] / ( logdata . parameters [ " RC3_MAX " ] - logdata . parameters [ " RC3_MIN " ] ) / 1000.0
except KeyError as e :
min_throttle = logdata . parameters [ " MOT_PWM_MIN " ] / ( logdata . parameters [ " MOT_PWM_MAX " ] - logdata . parameters [ " RC3_MIN " ] ) / 1000.0
2014-10-21 17:30:55 -03:00
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 \n Average motor output = %.0f \n Difference 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