Autonomous Rover Navigation Brain v0.2

"""
Star Aristocracy - Autonomous Rover Navigation Brain v0.2
Born Again Technologies Division
Simulates rover decision-making with obstacle detection and pathfinding
"""

import random
import math
import csv
import time
from datetime import datetime

class RoverBrain:
    def __init__(self, grid_size=20, start=(0, 0), goal=(19, 19)):
        self.grid_size = grid_size
        self.position = list(start)
        self.goal = goal
        self.heading = 0  # degrees, 0=North
        self.speed = 0.0  # m/s
        self.obstacles = self._generate_obstacles()
        self.telemetry_log = []
        self.battery = 100.0
        
    def _generate_obstacles(self):
        """Generate random obstacle positions"""
        obstacles = set()
        for _ in range(30):
            x = random.randint(0, self.grid_size - 1)
            y = random.randint(0, self.grid_size - 1)
            obstacles.add((x, y))
        return obstacles
    
    def scan_surroundings(self):
        """Simulate LIDAR/sensor scan in 8 directions"""
        directions = [
            (-1, 0), (1, 0), (0, -1), (0, 1),  # N, S, W, E
            (-1, -1), (-1, 1), (1, -1), (1, 1)  # Diagonals
        ]
        obstacles_detected = []
        for dx, dy in directions:
            check_x = self.position[0] + dx
            check_y = self.position[1] + dy
            if (check_x, check_y) in self.obstacles:
                obstacles_detected.append((dx, dy))
        return obstacles_detected
    
    def calculate_next_move(self, obstacles_nearby):
        """Simple pathfinding: move toward goal while avoiding obstacles"""
        goal_vector = (self.goal[0] - self.position[0], 
                       self.goal[1] - self.position[1])
        
        # Normalize possible moves
        moves = [(-1, 0), (1, 0), (0, -1), (0, 1)]
        best_move = None
        best_score = -999999
        
        for move in moves:
            next_pos = (self.position[0] + move[0], self.position[1] + move[1])
            
            # Skip if out of bounds or obstacle
            if (next_pos[0] < 0 or next_pos[0] >= self.grid_size or
                next_pos[1] < 0 or next_pos[1] >= self.grid_size or
                next_pos in self.obstacles):
                continue
            
            # Score: distance to goal (lower is better)
            dist = math.sqrt((next_pos[0] - self.goal[0])**2 + 
                           (next_pos[1] - self.goal[1])**2)
            score = -dist
            
            if score > best_score:
                best_score = score
                best_move = move
        
        return best_move
    
    def move(self, direction):
        """Execute movement and update telemetry"""
        if direction is None:
            self.speed = 0
            return False
        
        self.position[0] += direction[0]
        self.position[1] += direction[1]
        self.speed = 0.5  # m/s
        self.battery -= 0.2
        
        # Log telemetry
        self.telemetry_log.append({
            'timestamp': datetime.now().isoformat(),
            'x': self.position[0],
            'y': self.position[1],
            'speed': self.speed,
            'battery': round(self.battery, 2),
            'distance_to_goal': round(math.sqrt(
                (self.position[0] - self.goal[0])**2 + 
                (self.position[1] - self.goal[1])**2
            ), 2)
        })
        return True
    
    def at_goal(self):
        """Check if rover reached destination"""
        return tuple(self.position) == self.goal
    
    def save_telemetry(self, filename='rover_telemetry.csv'):
        """Export telemetry to CSV"""
        if not self.telemetry_log:
            return
        
        keys = self.telemetry_log[0].keys()
        with open(filename, 'w', newline='') as f:
            writer = csv.DictWriter(f, fieldnames=keys)
            writer.writeheader()
            writer.writerows(self.telemetry_log)
        print(f"[ROVER] Telemetry saved to {filename}")

def main():
    print("=" * 50)
    print("STAR ARISTOCRACY - ROVER NAVIGATION BRAIN v0.2")
    print("=" * 50)
    
    rover = RoverBrain()
    step = 0
    max_steps = 100
    
    print(f"Mission: Navigate from {rover.position} to {rover.goal}")
    print(f"Obstacles detected: {len(rover.obstacles)}")
    print()
    
    while step < max_steps and not rover.at_goal() and rover.battery > 0:
        obstacles = rover.scan_surroundings()
        next_move = rover.calculate_next_move(obstacles)
        
        if next_move is None:
            print(f"[STEP {step}] BLOCKED - No safe path available")
            break
        
        rover.move(next_move)
        
        if step % 10 == 0:
            print(f"[STEP {step}] Position: {rover.position}, "
                  f"Battery: {rover.battery:.1f}%, "
                  f"Distance: {rover.telemetry_log[-1]['distance_to_goal']:.1f}m")
        
        step += 1
        time.sleep(0.05)  # Simulate processing delay
    
    print()
    if rover.at_goal():
        print(f"✓ MISSION SUCCESS - Goal reached in {step} steps")
    elif rover.battery <= 0:
        print("✗ MISSION FAILED - Battery depleted")
    else:
        print("✗ MISSION FAILED - Path blocked or timeout")
    
    rover.save_telemetry()
    print(f"Final position: {rover.position}")
    print(f"Battery remaining: {rover.battery:.1f}%")

if __name__ == "__main__":
    main()

Leave a Reply

Your email address will not be published. Required fields are marked *