@ -51,12 +51,10 @@ class OptTimeCalculator(AutoConfigClass):
t22 = max ( 0 , ( l2 - ( self . a_max_2 * t21 * t21 ) ) / self . v_max_2 )
T2 = t22 + 2 * t21 + offset
Topen = max ( T1 , T2 )
topen_1_acc , topen_1_speed = self . calcFirstOpen ( Topen , l1 + Fs1 )
topen_1_acc , topen_1_speed = self . calcFirstOpen ( T1 , l1 + Fs1 )
offset = self . calcSecondOpenOffset ( topen_1_acc , topen_1_speed , Fs1 )
topen_2_acc , topen_2_speed = self . calcSecondOpen ( T open - offset , l2 )
topen_2_acc , topen_2_speed = self . calcSecondOpen ( T 2 - offset , l2 )
self . allTimes [ " topen_1_acc " ] = topen_1_acc
self . allTimes [ " topen_2_offset " ] = offset
@ -67,11 +65,13 @@ class OptTimeCalculator(AutoConfigClass):
self . allTimes [ " topen_2_acc " ] = topen_2_acc
self . allTimes [ " topen_2_speed " ] = topen_2_speed
if s1 > l1 :
raise ValueError ( " S1 > L1 - недопустимый сценарий " )
if s2 > l2 :
raise ValueError ( " S2 > L2 - недопустимый сценарий " )
if s1 > = l1 :
raise Exception ( """ S1 >= L1 - недопустимый сценарий,
проверьте dist_open_after_1 , dist_close_end_1 """ )
if s2 > = l2 :
raise Exception ( """ S2 >= L2 - недопустимый сценарий,
проверьте dist_open_after_2 , dist_close_end_2 """ )
s1 + = Fs1
topen_1_mark = sqrt ( 2 * s1 / self . a_max_1 )
if topen_1_mark > topen_1_acc :
@ -95,7 +95,6 @@ class OptTimeCalculator(AutoConfigClass):
self . allTimes [ " topen_1_mark " ] = topen_1_mark
self . allTimes [ " topen_2_mark " ] = topen_2_mark
self . allTimes [ " topen " ] = Topen
def Tgrow ( self ) - > None :
@ -103,13 +102,19 @@ class OptTimeCalculator(AutoConfigClass):
vF0 = v0 * self . k_hardness_1
vFmax = min ( self . v_max_1 * self . k_hardness_1 , sqrt ( self . k_hardness_1 / ( self . mass_1 ) ) * self . Ftogrow )
l = sqrt ( self . eff_control * * 2 + self . mass_1 / self . k_hardness_1 * vF0 * * 2 )
L = sqrt ( self . k_hardness_1 / self . mass_1 * self . eff_control * * 2 + vF0 * vF0 )
tspeed = sqrt ( self . mass_1 / self . k_hardness_1 ) * ( arcsin ( vFmax / L ) - arccos ( sqrt ( self . k_hardness_1 / self . mass_1 ) * self . eff_control / L ) )
Fspeed = - self . eff_control * cos ( self . freq * tspeed ) + self . eff_control + 1 / self . freq * vF0 * sin ( self . freq * tspeed )
Fmeet = 1 / self . freq * sqrt ( self . freq * * 2 * self . Ftogrow * * 2 - vFmax * * 2 )
eps = 1e1
if self . freq * * 2 * self . Ftogrow * * 2 - vFmax * * 2 < - eps :
raise Exception ( """ Номинальная траектория набора усилия не может быть достигнута, максимальная скорость превысила скорость траектории
, проверьте параметры k_hardness_1 , mass_1 , k_prop """ )
Fmeet = 1 / self . freq * sqrt ( self . freq * * 2 * self . Ftogrow * * 2 - vFmax * * 2 + eps )
Fstart_prop = self . Fstart_prop
if Fmeet > Fstart_prop :
raise Exception ( """ Номинальная траектория набора усилия была достигнута на фазе подпора
, проверьте параметры v_max_1 , k_prop """ )
tmeet = ( Fmeet - Fspeed ) / vFmax
tend = self . tGrowNominal ( Fstart_prop ) - self . tGrowNominal ( Fmeet )
vp = 1 / sqrt ( self . k_hardness_1 * self . mass_1 ) * sqrt ( self . Ftogrow * * 2 - self . Fstart_prop * * 2 )
@ -133,14 +138,15 @@ class OptTimeCalculator(AutoConfigClass):
v0s = [ ]
pos0s = [ ]
for i in range ( 1 , 3 ) :
tq = tmark
assert tq > 0
v0 = closeAlgo ( " V " + str ( i ) , " Open " , tq )
if tmark < 0 :
raise Exception ( """ Отрицательное время этапа раскрытия,
проверьте dist_open_after_ { 1 , 2 } , time_command """ )
v0 = closeAlgo ( " V " + str ( i ) , " Open " , tmark )
v0s . append ( v0 )
x0 = closeAlgo ( " X " + str ( i ) , " Open " , t q )
x0 = closeAlgo ( " X " + str ( i ) , " Open " , t mark )
x1 = contact [ i - 1 ] - self . __dict__ [ " dist_close_end_ " + str ( i ) ]
x = x1 - x0
pos0s . append ( closeAlgo ( " X " + str ( i ) , " Open " , t q ) )
pos0s . append ( closeAlgo ( " X " + str ( i ) , " Open " , t mark ) )
Tfull = self . time_robot_movement
@ -156,7 +162,9 @@ class OptTimeCalculator(AutoConfigClass):
t3 = ( Tfull + v0 / a ) / 2
sqrtval = a * * 2 * ( a * * 2 * ( Tfull + 2 * t3 ) * * 2 - 8 * a * Sfull + 2 * a * v0 * ( Tfull + 2 * t3 ) - 3 * v0 * * 2 )
assert sqrtval > = 0
if sqrtval < 0 :
raise Exception ( """ Невозможно с S_ {i} добраться но H*_ {i} за указанное время,
проверьте dist_open_after_ { i } , dist_close_end_ { i } , time_command , time_robot_movement """ )
t1max = ( ( Tfull + 2 * t3 ) + v0 / a ) / ( 2 ) - sqrt ( sqrtval ) * sqrt ( 2 ) / ( 4 * a * * 2 )
t1 = min ( t1max , ( vmax - abs ( v0 ) ) / a )
t1 = max ( 0 , min ( t1 , - v0 / a + sqrt ( v0 * * 2 / ( a * * 2 ) + ( abs ( maxL ) - v0 * v0 / a ) / a ) ) )
@ -165,7 +173,7 @@ class OptTimeCalculator(AutoConfigClass):
t5max = ( Tfull - v0 / a ) / 2 - t1
v1 = v0 + a * t1
S1 = v0 * t1 + a * t1 * t1 / 2 + v1 * t31 - a * t31 * t31 / 2
S2max = abs ( Sfull ) + abs ( S1 )
S2max = Sfull + S1
t5 = min ( t5max , ( vmax ) / a , sqrt ( S2max / a ) )
t3 = abs ( v0 ) / a + t1 + t5
t32 = t5
@ -181,7 +189,7 @@ class OptTimeCalculator(AutoConfigClass):
t2 = max ( 0 , min ( t2max , ( abs ( maxL ) - abs ( Smovement ) ) / v1 ) )
t4 = max ( 0 , Sleft / v3 + v1 / v3 * t2 )
tstay = Tfull - t1 - t2 - t3 - t4 - t5
tstay = max ( 0 , Tfull - t1 - t2 - t3 - t4 - t5 )
self . allTimes [ " tmovement_ " + str ( i ) + " _acc " ] = t1
self . allTimes [ " tmovement_ " + str ( i ) + " _speed " ] = t2