Chapter 11 TR
This commit is contained in:
@@ -13,7 +13,6 @@ class PIDController:
|
|||||||
|
|
||||||
def calculate(self, error, dt):
|
def calculate(self, error, dt):
|
||||||
self.integral += error * dt
|
self.integral += error * dt
|
||||||
|
|
||||||
# Add a low pass filter to the difference
|
# Add a low pass filter to the difference
|
||||||
difference = (error - self.error_prev) * self.d_filter_gain
|
difference = (error - self.error_prev) * self.d_filter_gain
|
||||||
self.error_prev += difference
|
self.error_prev += difference
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ class DistanceTracker:
|
|||||||
expected = time_proportion * self.total_distance_in_ticks + self.current_position
|
expected = time_proportion * self.total_distance_in_ticks + self.current_position
|
||||||
left.update(dt, expected)
|
left.update(dt, expected)
|
||||||
right.update(dt, expected)
|
right.update(dt, expected)
|
||||||
robot.uart.write(f"0, {expected:.2f},{left.actual:.2f}\n".encode())
|
robot.send_line(f"{expected:.2f},{left.actual:.2f},0")
|
||||||
|
|
||||||
|
|
||||||
distance_tracker = DistanceTracker()
|
distance_tracker = DistanceTracker()
|
||||||
@@ -61,23 +61,24 @@ async def command_handler():
|
|||||||
while True:
|
while True:
|
||||||
if robot.uart.in_waiting:
|
if robot.uart.in_waiting:
|
||||||
command = robot.uart.readline().decode().strip()
|
command = robot.uart.readline().decode().strip()
|
||||||
# PID settings
|
|
||||||
if command.startswith("M"):
|
if command.startswith("M"):
|
||||||
distance_tracker.speed = float(command[1:])
|
distance_tracker.speed = float(command[1:])
|
||||||
elif command.startswith("T"):
|
elif command.startswith("T"):
|
||||||
distance_tracker.time_interval = float(command[1:])
|
distance_tracker.time_interval = float(command[1:])
|
||||||
# Start/stop commands
|
elif command == "G":
|
||||||
elif command == "O":
|
|
||||||
distance_tracker.set_distance(0)
|
distance_tracker.set_distance(0)
|
||||||
elif command.startswith("O"):
|
elif command.startswith("G"):
|
||||||
await asyncio.sleep(5)
|
await asyncio.sleep(5)
|
||||||
distance_tracker.set_distance(float(command[1:]))
|
distance_tracker.set_distance(float(command[1:]))
|
||||||
# Print settings
|
|
||||||
elif command.startswith("?"):
|
elif command.startswith("?"):
|
||||||
robot.uart.write(f"M{distance_tracker.speed:.1f}\n".encode())
|
robot.send_line(f"M{distance_tracker.speed:.1f}")
|
||||||
robot.uart.write(f"T{distance_tracker.time_interval:.1f}\n".encode())
|
robot.send_line(f"T{distance_tracker.time_interval:.1f}")
|
||||||
await asyncio.sleep(3)
|
await asyncio.sleep(3)
|
||||||
await asyncio.sleep(0)
|
await asyncio.sleep(0)
|
||||||
|
|
||||||
asyncio.create_task(distance_tracker.loop())
|
try:
|
||||||
asyncio.run(command_handler())
|
motors_task = asyncio.create_task(distance_tracker.loop())
|
||||||
|
asyncio.run(command_handler())
|
||||||
|
finally:
|
||||||
|
motors_task.cancel()
|
||||||
|
robot.stop()
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
class PIDController:
|
class PIDController:
|
||||||
def __init__(self, kp, ki, kd, d_filter_gain=0.1, imax=None, imin=None):
|
def __init__(self, kp, ki, kd, d_filter_gain=0.1):
|
||||||
self.kp = kp
|
self.kp = kp
|
||||||
self.ki = ki
|
self.ki = ki
|
||||||
self.kd = kd
|
self.kd = kd
|
||||||
self.d_filter_gain = d_filter_gain
|
self.d_filter_gain = d_filter_gain
|
||||||
self.imax = imax
|
|
||||||
self.imin = imin
|
|
||||||
self.reset()
|
self.reset()
|
||||||
|
|
||||||
def reset(self):
|
def reset(self):
|
||||||
@@ -15,10 +13,6 @@ class PIDController:
|
|||||||
|
|
||||||
def calculate(self, error, dt):
|
def calculate(self, error, dt):
|
||||||
self.integral += error * dt
|
self.integral += error * dt
|
||||||
if self.imax is not None and self.integral > self.imax:
|
|
||||||
self.integral = self.imax
|
|
||||||
if self.imin is not None and self.integral < self.imin:
|
|
||||||
self.integral = self.imin
|
|
||||||
# Add a low pass filter to the difference
|
# Add a low pass filter to the difference
|
||||||
difference = (error - self.error_prev) * self.d_filter_gain
|
difference = (error - self.error_prev) * self.d_filter_gain
|
||||||
self.error_prev += difference
|
self.error_prev += difference
|
||||||
|
|||||||
Reference in New Issue
Block a user