Buster wheel control.

Both front wheels are controlled independently by own servo and both back wheels by own motor. We need to calculate direction for front wheels and speed for back wheels.

../../../_images/210216-buster-wheel-control.png

Wheel control calculation buster/calc folder.

This code doesn’t handle numerical ambiguities:

# "steering" input from -90 degrees (right) to 90 degrees (left) is for direction. 0 = straight forward.
# "speed" is movement speed from -100% (backwards) to 100% (forward).
speed = 100
steering = 5

# Calculate center_x on back wheel axis as rotation center.
a = coeff * steering
center_x = f_wheel_y / math.tan(a)

# Calculate wheel directins in radians and convert to degrees
ar = math.atan((f_wheel_y)/(center_x - f_wheel_x))
al = math.atan((f_wheel_y)/(center_x + f_wheel_x))
r_dir = ar/coeff
l_dir = al/coeff

# Calculate motor speeds, sl is left motor speed and sr right motor. Positive values forward and negative back.
if center_x > b_wheel_x:
    sl = speed
    sr = sl * (center_x - b_wheel_x) /  (center_x + b_wheel_x)
elif center_x < -b_wheel_x:
    sr = speed
    sl = sr * (-center_x - b_wheel_x) /  (-center_x + b_wheel_x)
elif center_x > 0:
    sl = speed * (center_x + b_wheel_x) / (2 * b_wheel_x)
    sr = -sl * (b_wheel_x - center_x) /(b_wheel_x + center_x)
else:
    sr = speed * (-center_x + b_wheel_x) / (2 * b_wheel_x)
    sl = -sr * (b_wheel_x + center_x) /(b_wheel_x - center_x)
../../../_images/210219-grumpy-proto.png

Prototyping and testing.

../../../_images/210219-view-from-buster-camera.png

Wheel control (game controller widget).