import numpy as np
class Rover:
def __init__(self, start=(0, 0), heading=0):
self.pos = np.array(start, dtype=float)
self.heading = heading # degrees
self.speed = 0.1
def rotate(self, deg):
self.heading = (self.heading + deg) % 360
def forward(self):
rad = np.radians(self.heading)
self.pos += np.array([np.cos(rad), np.sin(rad)]) * self.speed
def step(self, obstacles):
# Simple lidar simulation
distances = []
for angle in (-30, 0, 30):
rad = np.radians(self.heading + angle)
scan_ray = self.pos + np.array([np.cos(rad), np.sin(rad)]) * 1.0
distances.append(
np.min([np.linalg.norm(scan_ray - ob) for ob in obstacles])
)
# Avoid obstacles
if distances[1] < 0.25: # obstacle forward
if distances[0] > distances[2]:
self.rotate(-20) # turn left
else:
self.rotate(20) # turn right
else:
self.forward() # clear → advance
return self.pos
# Example run
if __name__ == "__main__":
rover = Rover()
obstacles = [np.array([1, 1]), np.array([2, 0.5])]
for t in range(200):
pos = rover.step(obstacles)
print(f"t={t}, pos={pos}")
Leave a Reply