@@ -105,8 +105,8 @@ def control_distance(self, power_left=100, power_right=100, target_distance=0):
105
105
#PID parameters
106
106
# assuming that power_right is equal to power_left and that coderbot
107
107
# 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]
110
110
TARGET_RIGHT = (MAX_SPEED / 100 ) * power_right # velocity [mm/s]
111
111
112
112
# SOFT RESPONSE
@@ -115,14 +115,14 @@ def control_distance(self, power_left=100, power_right=100, target_distance=0):
115
115
#KI = 0.005 # integral coefficient
116
116
117
117
# 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
121
121
122
122
# 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
126
126
127
127
SAMPLETIME = 0.1
128
128
@@ -134,45 +134,51 @@ def control_distance(self, power_left=100, power_right=100, target_distance=0):
134
134
left_integral_error = 0
135
135
right_integral_error = 0
136
136
137
+ power_left_norm = power_left
138
+ power_right_norm = power_right
137
139
# moving for certaing amount of distance
138
140
while (abs (self .distance ()) < target_distance ):
139
141
# 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
168
178
169
179
# checking each SAMPLETIME seconds
170
180
sleep (SAMPLETIME )
171
181
172
- left_derivative_error = left_error
173
- right_derivative_error = right_error
174
- left_integral_error += left_error
175
- right_integral_error += right_error
176
182
177
183
# robot arrived
178
184
self .stop ()
0 commit comments