@@ -105,8 +105,8 @@ def control_distance(self, power_left=100, power_right=100, target_distance=0):
105105 #PID parameters
106106 # assuming that power_right is equal to power_left and that coderbot
107107 # moves at 11.5mm/s at full PWM duty cycle
108- MAX_SPEED = 260
109- TARGET_LEFT = (MAX_SPEED / 100 ) * power_left #velocity [mm/s]
108+ MAX_SPEED = 180
109+ TARGET_LEFT = (MAX_SPEED / 100 ) * power_left #velocity [mm/s]
110110 TARGET_RIGHT = (MAX_SPEED / 100 ) * power_right # velocity [mm/s]
111111
112112 # SOFT RESPONSE
@@ -115,14 +115,14 @@ def control_distance(self, power_left=100, power_right=100, target_distance=0):
115115 #KI = 0.005 # integral coefficient
116116
117117 # MEDIUM RESPONSE
118- # KP = 0.8 #proportional coefficient
119- # KD = 0.04 # derivative coefficient
120- # KI = 0.02 # integral coefficient
118+ KP = 0.2 #proportional coefficient
119+ KD = 0.1 # derivative coefficient
120+ KI = 0.02 # integral coefficient
121121
122122 # STRONG RESPONSE
123- KP = 0.9 # proportional coefficient
124- KD = 0.05 # derivative coefficient
125- KI = 0.03 # integral coefficient
123+ # KP = 0.9 # proportional coefficient
124+ # KD = 0.05 # derivative coefficient
125+ # KI = 0.03 # integral coefficient
126126
127127 SAMPLETIME = 0.1
128128
@@ -134,45 +134,51 @@ def control_distance(self, power_left=100, power_right=100, target_distance=0):
134134 left_integral_error = 0
135135 right_integral_error = 0
136136
137+ power_left_norm = power_left
138+ power_right_norm = power_right
137139 # moving for certaing amount of distance
138140 while (abs (self .distance ()) < target_distance ):
139141 # PI controller
140-
141- # relative error
142- left_error = TARGET_LEFT - self ._right_motor .speed ()
143- right_error = TARGET_RIGHT - self ._left_motor .speed ()
144-
145- left_speed += (left_error * KP ) + (left_derivative_error * KD ) + (left_integral_error * KI )
146- right_speed += (right_error * KP ) + (right_derivative_error * KD ) + (right_integral_error * KI )
147- print ("LEFT correction: %f" % (left_error * KP + left_derivative_error * KD + left_integral_error * KI ))
148- print ("RIGHT correction: %f" % (right_error * KP + right_derivative_error * KD + right_integral_error * KI ))
149-
150- # conrispondent new power
151- left_power = max (min (100 * left_speed / MAX_SPEED , 100 ), 0 )
152- right_power = max (min (100 * right_speed / MAX_SPEED , 100 ), 0 )
153-
154- print ("Left SPEED: %f" % (self ._right_motor .speed ()))
155- print ("Right SPEED: %f" % (self ._left_motor .speed ()))
156- print ("Left POWER: %f" % (right_power ))
157- print ("Right POWER: %f" % (left_power ))
158- print ("" )
159-
160- # adjusting power on each motors
161- self ._left_motor .adjust_power (left_power )
162- self ._right_motor .adjust_power (right_power )
163-
164- print ("Left error: %f" % (left_error ))
165- print ("Right error: %f" % (right_error ))
166- print ("" )
167-
142+ if (self ._left_motor .speed () > 10 and self ._right_motor .speed () > 10 ):
143+ # relative error
144+ left_error = (TARGET_LEFT - self ._left_motor .speed ())/ TARGET_LEFT * 100.0
145+ right_error = (TARGET_RIGHT - self ._right_motor .speed ())/ TARGET_RIGHT * 100.0
146+
147+ power_left = power_left_norm + (left_error * KP ) + (left_derivative_error * KD ) + (left_integral_error * KI )
148+ power_right = power_left_norm + (right_error * KP ) + (right_derivative_error * KD ) + (right_integral_error * KI )
149+ #print("LEFT correction: %f" % (left_error * KP + left_derivative_error * KD + left_integral_error * KI))
150+ #print("RIGHT correction: %f" % (right_error * KP + right_derivative_error * KD + right_integral_error * KI))
151+
152+ # conrispondent new power
153+ power_left_norm = max (min (power_left , 100 ), 0 )
154+ power_right_norm = max (min (power_right , 100 ), 0 )
155+
156+ #print("Left SPEED: %f" % (self._right_motor.speed()))
157+ #print("Right SPEED: %f" % (self._left_motor.speed()))
158+ #print("Left POWER: %f" % (right_power))
159+ #print("Right POWER: %f" % (left_power))
160+ #print("")
161+ print ("ml:" , int (self ._right_motor .speed ()), " mr: " , int (self ._left_motor .speed ()),
162+ " le:" , int (left_error ), " re: " , int (right_error ),
163+ " ls: " , int (left_speed ), " rs: " , int (right_speed ),
164+ " lp: " , int (power_left ), " rp: " , int (power_right ))
165+
166+ # adjusting power on each motors
167+ self ._left_motor .adjust_power (power_left_norm )
168+ self ._right_motor .adjust_power (power_right_norm )
169+
170+ #print("Left error: %f" % (left_error))
171+ #print("Right error: %f" % (right_error))
172+ #print("")
173+
174+ left_derivative_error = left_error
175+ right_derivative_error = right_error
176+ left_integral_error += left_error
177+ right_integral_error += right_error
168178
169179 # checking each SAMPLETIME seconds
170180 sleep (SAMPLETIME )
171181
172- left_derivative_error = left_error
173- right_derivative_error = right_error
174- left_integral_error += left_error
175- right_integral_error += right_error
176182
177183 # robot arrived
178184 self .stop ()
0 commit comments