Python simulera en gräsklippare
Hej,
Jag har fått en skoluppgift där jag ska simulera en robotgräsklippare i Python.
Det är tillåtet att ta hjälp, söka info på nätet och använda tex ChatGPT sålänge man kan resonera kring koden och visa att man har full förståelse för den. Hittills har jag klarat mig utan hjälp, men har nu stött på ett problem som jag inte lyckas lösa.
När linjen har studsat första gången mot väggen, så fortsätter den genom att skapa en sågtandsform. Jag antar att det har att göra med speedX =- speedX i villkorssatsen på något sätt. Vad jag vill är att när linjen har studsat, ska den fortsätta rakt fram tills den når en vägg eller ett hinder igen, och först då ändra riktning.
Vore tacksam om någon kan presentera en lösning för detta så att jag kan gå vidare.
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from matplotlib.animation import FuncAnimation
import math
import random
plot_map = [[0, 0, 0, 0, 0],
[0, 0, 2, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]
rows = len(plot_map) # 5
cols = len(plot_map[0]) # 4
plt.figure()
# Assign color to value: 0 = green, 1 = cut, 2 = obsticle
color_map = ListedColormap(['green', 'yellow', 'red'], 'indexed')
print("Plot origo", plot_map[0][0])
# Plot grid
plot_map.reverse() # Turn plot upside-down
plt.pcolormesh(plot_map, edgecolors='k', linewidth=2, cmap=color_map)
# Fine tune plot layout
ax = plt.gca() # Get current axis object
ax.set_yticks(range(0, rows+1, 1))
ax.set_xticks(range(0, cols+1, 1))
plt.title(f"Colored grid of size {rows}x{cols}")
# Initiate list
positionsX = []
positionsY = []
# Start positions
positionsX.append(3)
positionsY.append(0)
# Set X-and Y length of map
map_cols = len(plot_map[0])
map_rows = len(plot_map)
# Random start angles for the line / first movement
randAngle = random.uniform(0, math.pi)
print("rand")
# Speed in m/s
speedV = 0.3
# Next movement function to FuncAnimation
def animate(i, angle):
# Speed for movement, set to -1 when change direction
speedX = speedV * math.cos(randAngle)
speedY = speedV * math.sin(randAngle)
for x in range(1):
# Check if outside map X (right side)
if positionsX[-1] + speedX >= map_cols:
speedX =- speedX
print("Detected collision (X+) with ", positionsX[-1], " angle ", angle, speedX)
# And check left side
elif positionsX[-1] + speedX < 0:
speedX =- speedX
print("Detected collision (X-) with ", positionsX[-1], " angle ", angle, speedX)
# Check if outside map Y (top)
if positionsY[-1] + speedY >= map_rows:
speedY =- speedY
print("Detected collision (Y+) with ", positionsY[-1], " angle ", angle, speedY)
# And check bottom
elif positionsY[-1] + speedY < 0:
speedY =- speedY
print("Detected collision (Y-) with ", positionsY[-1], " angle ", angle, speedY)
# Else continue in the same direction
positionsX.append(positionsX[-1] + speedX)
positionsY.append(positionsY[-1] + speedY)
print("Moving ahead with X ", positionsX[-1], " Y ", positionsY[-1], " angle ", angle, " speedX ", speedX, " speedY ", speedY, "\n")
plt.plot(positionsX, positionsY)
plt.xlabel(positionsX)
plt.ylabel(positionsY)
# Declare and call the animation function
ani = FuncAnimation(plt.gcf(), func=animate, fargs=(randAngle,), interval=1000)
plt.show()