@@ -104,48 +104,75 @@ def control_distance(self, power_left=100, power_right=100, target_distance=0):
104104 #PID parameters
105105 # assuming that power_right is equal to power_left and that coderbot
106106 # moves at 11.5mm/s at full PWM duty cycle
107- TARGET = 0.95 * power_right #velocity [mm/s]
108- KP = 0.02 #proportional coefficient
109- KI = 0.005
110- SAMPLETIME = 0.05
111- left_speed = TARGET
112- right_speed = left_speed
113- integral_error = 0
107+ MAX_SPEED = 260
108+ TARGET_LEFT = (MAX_SPEED / 100 ) * power_left #velocity [mm/s]
109+ TARGET_RIGHT = (MAX_SPEED / 100 ) * power_right # velocity [mm/s]
110+
111+ # SOFT RESPONSE
112+ #KP = 0.04 #proportional coefficient
113+ #KD = 0.02 # derivative coefficient
114+ #KI = 0.005 # integral coefficient
115+
116+ # MEDIUM RESPONSE
117+ #KP = 0.8 #proportional coefficient
118+ #KD = 0.04 # derivative coefficient
119+ #KI = 0.02 # integral coefficient
120+
121+ # STRONG RESPONSE
122+ KP = 0.9 # proportional coefficient
123+ KD = 0.05 # derivative coefficient
124+ KI = 0.03 # integral coefficient
125+
126+ SAMPLETIME = 0.1
127+
128+ left_speed = TARGET_LEFT
129+ right_speed = TARGET_RIGHT
130+
131+ left_derivative_error = 0
132+ right_derivative_error = 0
133+ left_integral_error = 0
134+ right_integral_error = 0
114135
115136 # moving for certaing amount of distance
116137 while (abs (self .distance ()) < target_distance ):
117138 # PI controller
118139
119140 # relative error
120- left_error = TARGET - self ._left_motor .speed ()
121- right_error = TARGET - self ._right_motor .speed ()
141+ left_error = TARGET_LEFT - self ._right_motor .speed ()
142+ right_error = TARGET_RIGHT - self ._left_motor .speed ()
122143
123- left_speed += (left_error * KP ) - (integral_error * KI )
124- right_speed += (right_error * KP ) + (integral_error * KI )
144+ left_speed += (left_error * KP ) + (left_derivative_error * KD ) + (left_integral_error * KI )
145+ right_speed += (right_error * KP ) + (right_derivative_error * KD ) + (right_integral_error * KI )
146+ print ("LEFT correction: %f" % (left_error * KP + left_derivative_error * KD + left_integral_error * KI ))
147+ print ("RIGHT correction: %f" % (right_error * KP + right_derivative_error * KD + right_integral_error * KI ))
125148
126149 # conrispondent new power
127- left_power = max (min (100 * left_speed / 95 , 100 ), 0 )
128- right_power = max (min (100 * right_speed / 95 , 100 ), 0 )
150+ left_power = max (min (100 * left_speed / MAX_SPEED , 100 ), 0 )
151+ right_power = max (min (100 * right_speed / MAX_SPEED , 100 ), 0 )
129152
130- print ("Left SPEED: %f" % (self ._left_motor .speed ()))
131- print ("Right SPEED: %f" % (self ._right_motor .speed ()))
132- print ("Left POWER: %f" % (left_power ))
133- print ("Right POWER: %f" % (right_power ))
153+ print ("Left SPEED: %f" % (self ._right_motor .speed ()))
154+ print ("Right SPEED: %f" % (self ._left_motor .speed ()))
155+ print ("Left POWER: %f" % (right_power ))
156+ print ("Right POWER: %f" % (left_power ))
157+ print ("" )
134158
135159 # adjusting power on each motors
136160 self ._left_motor .adjust_power (left_power )
137161 self ._right_motor .adjust_power (right_power )
138162
163+ print ("Left error: %f" % (left_error ))
164+ print ("Right error: %f" % (right_error ))
165+ print ("" )
139166
140- integral_error += (left_speed - right_speed )
141-
142- # restoring factor
143- left_speed = TARGET
144- right_speed = TARGET
145167
146168 # checking each SAMPLETIME seconds
147169 sleep (SAMPLETIME )
148170
171+ left_derivative_error = left_error
172+ right_derivative_error = right_error
173+ left_integral_error += left_error
174+ right_integral_error += right_error
175+
149176 # robot arrived
150177 self .stop ()
151178
0 commit comments