Skip to content

Commit 92560ae

Browse files
committed
pid wip
1 parent 751ad3d commit 92560ae

File tree

2 files changed

+21
-16
lines changed

2 files changed

+21
-16
lines changed

rotary_encoder/motorencoder.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def __init__(self, pi, enable_pin, forward_pin, backward_pin, feedback_pin_A, fe
2626

2727
# setting movement variables
2828
self._direction = 0
29-
self._distance_per_tick = 0.053 #(mm)
29+
self._distance_per_tick = 0.06 #(mm)
3030
self._ticks = 0
3131
self._power = 0
3232
self._encoder_speed = 0
@@ -157,15 +157,15 @@ def rotary_callback(self, tick):
157157
# taking groups of n ticks each
158158
if (self._ticks_counter == 0):
159159
self._start_timer = time() # clock started
160-
elif (self._ticks_counter == self._ticks_threshold):
160+
elif (abs(self._ticks_counter) == self._ticks_threshold):
161161
self._current_timer = time()
162162
elapse = self._current_timer - self._start_timer # calculating time elapse
163163
# calculating current speed
164164
self._encoder_speed = self._ticks_threshold * self._distance_per_tick / elapse # (mm/s)
165165

166166
self._ticks += tick # updating ticks
167167

168-
if(self._ticks_counter < self._ticks_threshold):
168+
if(abs(self._ticks_counter) < self._ticks_threshold):
169169
self._ticks_counter += 1
170170
else:
171171
self._ticks_counter = 0

rotary_encoder/wheelsaxel.py

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -102,12 +102,18 @@ def control_distance(self, power_left=100, power_right=100, target_distance=0):
102102
#self._wheelsAxle_lock.acquire() # wheelsAxle lock acquire
103103
self._is_moving = True
104104

105+
# get desired direction from power, then normalize on power > 0
106+
left_direction = power_left/abs(power_left)
107+
right_direction = power_right/abs(power_right)
108+
power_left = abs(power_left)
109+
power_right = abs(power_right)
110+
105111
self._left_motor.reset_state()
106112
self._right_motor.reset_state()
107113

108114
# applying tension to motors
109-
self._left_motor.control(power_left)
110-
self._right_motor.control(power_right)
115+
self._left_motor.control(power_left * left_direction)
116+
self._right_motor.control(power_right * right_direction)
111117

112118
#PID parameters
113119
# assuming that power_right is equal to power_left and that coderbot
@@ -122,7 +128,7 @@ def control_distance(self, power_left=100, power_right=100, target_distance=0):
122128
#KI = 0.005 # integral coefficient
123129

124130
# MEDIUM RESPONSE
125-
KP = 0.2 #proportional coefficient
131+
KP = 0.4 #proportional coefficient
126132
KD = 0.1 # derivative coefficient
127133
KI = 0.02 # integral coefficient
128134

@@ -138,15 +144,14 @@ def control_distance(self, power_left=100, power_right=100, target_distance=0):
138144
left_integral_error = 0
139145
right_integral_error = 0
140146
# moving for certaing amount of distance
141-
logging.debug("moving? " + str(self._is_moving) + " distance: " + str(self.distance()) + " target: " + str(target_distance))
142-
while(abs(self.distance()) < target_distance and self._is_moving == True):
147+
logging.info("moving? " + str(self._is_moving) + " distance: " + str(self.distance()) + " target: " + str(target_distance))
148+
while(abs(self.distance()) < abs(target_distance) and self._is_moving == True):
143149
# PI controller
144-
#logging.debug("control_distance.1")
145-
if(self._left_motor.speed() > 10 and self._right_motor.speed() > 10):
146-
#logging.debug("control_distance.2")
150+
logging.info("speed.left: " + str(self._left_motor.speed()) + " speed.right: " + str(self._right_motor.speed()))
151+
if(abs(self._left_motor.speed()) > 10 and abs(self._right_motor.speed()) > 10):
147152
# relative error
148-
left_error = (target_speed_left - self._left_motor.speed())/target_speed_left*100.0
149-
right_error = (target_speed_right - self._right_motor.speed())/target_speed_right*100.0
153+
left_error = (target_speed_left - self._left_motor.speed()) / target_speed_left * 100.0
154+
right_error = (target_speed_right - self._right_motor.speed()) / target_speed_right * 100.0
150155

151156
left_correction = (left_error * KP) + (left_derivative_error * KD) + (left_integral_error * KI)
152157
right_correction = (right_error * KP) + (right_derivative_error * KD) + (right_integral_error * KI)
@@ -161,14 +166,14 @@ def control_distance(self, power_left=100, power_right=100, target_distance=0):
161166
power_left_norm = max(min(corrected_power_left, 100), 0)
162167
power_right_norm = max(min(corrected_power_right, 100), 0)
163168

164-
logging.debug("ls:" + str(int(self._left_motor.speed())) + " rs: " + str(int(self._right_motor.speed())) +
169+
logging.info("ls:" + str(int(self._left_motor.speed())) + " rs: " + str(int(self._right_motor.speed())) +
165170
" le:" + str(int(left_error)) + " re: " + str(int(right_error)) +
166171
" lc: " + str(int(left_correction)) + " rc: " + str(int(right_correction)) +
167172
" lp: " + str(int(power_left_norm)) + " rp: " + str(int(power_right_norm)))
168173

169174
# adjusting power on each motors
170-
self._left_motor.adjust_power(power_left_norm)
171-
self._right_motor.adjust_power(power_right_norm)
175+
self._left_motor.adjust_power(power_left_norm * left_direction )
176+
self._right_motor.adjust_power(power_right_norm * right_direction)
172177

173178
left_derivative_error = left_error
174179
right_derivative_error = right_error

0 commit comments

Comments
 (0)