Skip to content

Latest commit

 

History

History
343 lines (245 loc) · 13.1 KB

File metadata and controls

343 lines (245 loc) · 13.1 KB

Coding Intelligent Movement Steering Behaviors in Python

Slide 1:

Introduction to Steering Behaviors

Steering behaviors are algorithms that allow autonomous agents (such as characters in a game) to navigate their environment in a realistic and intelligent way. These behaviors can be combined to create complex and lifelike movement patterns, making them essential for games, simulations, and robotics. In this presentation, we'll explore various steering behaviors and implement them in Python using the Pygame library.

Slide 2:

Seek Behavior

The seek behavior is one of the most fundamental steering behaviors. It makes an agent steer towards a target position, adjusting its velocity and orientation to reach the target as directly as possible. This behavior is useful for creating agents that can navigate towards objectives or follow paths.

import pygame
import math

# Define the seek behavior
def seek(agent, target):
    desired_velocity = (target - agent.position).normalize() * agent.max_speed
    steering = desired_velocity - agent.velocity
    return steering

Slide 3:

Flee Behavior

The flee behavior is the opposite of the seek behavior. It makes an agent steer away from a target position, increasing its velocity and adjusting its orientation to escape the target as quickly as possible. This behavior is useful for creating agents that can avoid obstacles or threats.

import pygame
import math

# Define the flee behavior
def flee(agent, target):
    desired_velocity = (agent.position - target).normalize() * agent.max_speed
    steering = desired_velocity - agent.velocity
    return steering

Slide 4:

Arrive Behavior

The arrive behavior is similar to the seek behavior, but it also includes a mechanism for slowing down the agent as it approaches the target. This behavior is useful for creating agents that can smoothly reach and stop at a destination, rather than overshooting or colliding with the target.

import pygame
import math

# Define the arrive behavior
def arrive(agent, target, slow_radius):
    to_target = target - agent.position
    distance = to_target.length()

    if distance < slow_radius:
        desired_velocity = to_target * (agent.max_speed * distance / slow_radius)
    else:
        desired_velocity = to_target.normalize() * agent.max_speed

    steering = desired_velocity - agent.velocity
    return steering

Slide 5:

Wander Behavior

The wander behavior is used to simulate an agent's exploration or wandering behavior. It applies a small random force to the agent's velocity, causing it to gently drift and change direction over time. This behavior is useful for creating agents that can navigate and explore their environment in a more natural and lifelike way.

import pygame
import math
import random

# Define the wander behavior
def wander(agent, wander_radius, wander_distance, wander_jitter):
    wander_circle_center = agent.velocity.normalize() * wander_distance
    wander_circle_offset = random.uniform(-1, 1) * wander_jitter
    wander_point = wander_circle_center + agent.orientation.rotate(wander_circle_offset) * wander_radius

    desired_velocity = (wander_point - agent.position).normalize() * agent.max_speed
    steering = desired_velocity - agent.velocity
    return steering

Slide 6:

Pursuit Behavior

The pursuit behavior is used to make an agent chase and follow a moving target. It predicts the future position of the target based on its current velocity and adjusts the agent's steering to intercept the target at that predicted position. This behavior is useful for creating agents that can pursue and catch other moving agents or objects.

import pygame
import math

# Define the pursuit behavior
def pursuit(agent, target, max_prediction_time):
    to_target = target.position - agent.position
    relative_velocity = target.velocity - agent.velocity
    time = to_target.dot(relative_velocity) / relative_velocity.length_squared()

    if time > 0 and time < max_prediction_time:
        predicted_position = target.position + target.velocity * time
        return seek(agent, predicted_position)
    else:
        return seek(agent, target.position)

Slide 7:

Evade Behavior

The evade behavior is the opposite of the pursuit behavior. It makes an agent steer away from a predicted future position of a pursuing target. This behavior is useful for creating agents that can avoid being caught or captured by other agents or threats.

import pygame
import math

# Define the evade behavior
def evade(agent, target, max_prediction_time):
    to_target = agent.position - target.position
    relative_velocity = agent.velocity - target.velocity
    time = to_target.dot(relative_velocity) / relative_velocity.length_squared()

    if time > 0 and time < max_prediction_time:
        predicted_position = target.position + target.velocity * time
        return flee(agent, predicted_position)
    else:
        return flee(agent, target.position)

Slide 8:

Obstacle Avoidance Behavior

The obstacle avoidance behavior is used to make an agent steer around obstacles in its environment. It calculates the potential collision vectors with nearby obstacles and applies a steering force to avoid them. This behavior is essential for creating agents that can navigate complex environments without colliding with obstacles.

import pygame
import math

# Define the obstacle avoidance behavior
def obstacle_avoidance(agent, obstacles, detection_radius):
    closest_obstacle = None
    closest_distance = float('inf')

    for obstacle in obstacles:
        distance = (obstacle.position - agent.position).length()
        if distance < closest_distance and distance < detection_radius:
            closest_obstacle = obstacle
            closest_distance = distance

    if closest_obstacle:
        avoidance_force = (agent.position - closest_obstacle.position).normalize() / closest_distance
        return avoidance_force * agent.max_force
    else:
        return pygame.Vector2(0, 0)

Slide 9:

Path Following Behavior

The path following behavior is used to make an agent follow a predefined path or series of waypoints. It calculates the steering force required to stay on the path and adjusts the agent's velocity and orientation accordingly. This behavior is useful for creating agents that can navigate along specific routes or follow predetermined paths.

import pygame
import math

# Define the path following behavior
def path_following(agent, path, look_ahead_distance):
    closest_point, closest_distance = find_closest_point_on_path(agent.position, path)

    if closest_distance < look_ahead_distance:
        look_ahead_point = find_point_at_distance(closest_point, path, look_ahead_distance)
        return arrive(agent, look_ahead_point, look_ahead_distance / 2)
    else:
        return seek(agent, closest_point)

Slide 10:

Flocking Behavior

The flocking behavior is used to simulate the collective motion of a group of agents, such as a flock of birds or a school of fish. It combines three key rules: separation (avoiding crowding neighbors), alignment (steering towards the average heading of neighbors), and cohesion (steering towards the average position of neighbors). This behavior is useful for creating realistic and lifelike group dynamics.

import pygame
import math

# Define the flocking behavior
def flocking(agent, neighbors, separation_weight, alignment_weight, cohesion_weight):
    separation_force = pygame.Vector2(0, 0)
    alignment_force = pygame.Vector2(0, 0)
    cohesion_force = pygame.Vector2(0, 0)

    neighbor_count = 0
    for neighbor in neighbors:
        separation_force += (agent.position - neighbor.position).normalize() / (agent.position - neighbor.position).length_squared()
        alignment_force += neighbor.velocity
        cohesion_force += neighbor.position
        neighbor_count += 1

    if neighbor_count > 0:
        alignment_force /= neighbor_count
        alignment_force -= agent.velocity
        cohesion_force /= neighbor_count
        cohesion_force -= agent.position

    separation_force *= separation_weight
    alignment_force *= alignment_weight
    cohesion_force *= cohesion_weight

    return separation_force + alignment_force + cohesion_force

Slide 11:

Combining Behaviors

Steering behaviors can be combined to create more complex and sophisticated movement patterns. By blending multiple behaviors together, agents can exhibit a rich range of behaviors that adapt to different situations and environments. This slide demonstrates how to combine the seek and obstacle avoidance behaviors.

import pygame

# Combine seek and obstacle avoidance behaviors
def combined_behavior(agent, target, obstacles, detection_radius):
    seek_force = seek(agent, target)
    avoidance_force = obstacle_avoidance(agent, obstacles, detection_radius)

    # Adjust the weights of the behaviors as needed
    seek_weight = 0.8
    avoidance_weight = 0.2

    combined_force = seek_force * seek_weight + avoidance_force * avoidance_weight
    return combined_force

Slide 12:

Behavior Trees

Behavior trees are a powerful tool for combining and organizing steering behaviors in a modular and hierarchical way. They allow for complex decision-making and behavior selection based on various conditions and priorities. This slide introduces the basic structure of a behavior tree and how it can be used to manage steering behaviors.

class Sequence:
    def __init__(self, children):
        self.children = children

    def evaluate(self, agent):
        for child in self.children:
            result = child.evaluate(agent)
            if not result:
                return False
        return True

class Selector:
    def __init__(self, children):
        self.children = children

    def evaluate(self, agent):
        for child in self.children:
            result = child.evaluate(agent)
            if result:
                return True
        return False

# Example behavior tree
root = Selector([
    Sequence([SeekBehavior(), ObstacleAvoidanceBehavior()]),
    WanderBehavior()
])

# Evaluate the behavior tree
steering_force = root.evaluate(agent)

Slide 13:

Finite State Machines

Finite state machines (FSMs) provide another approach to organizing and managing steering behaviors. They define a set of states that an agent can transition between, with each state representing a specific behavior or set of behaviors. This slide illustrates how an FSM can be used to switch between different steering behaviors based on certain conditions.

class State:
    def __init__(self, behavior):
        self.behavior = behavior

    def execute(self, agent):
        return self.behavior(agent)

class FSM:
    def __init__(self, initial_state):
        self.current_state = initial_state

    def transition(self, new_state):
        self.current_state = new_state

    def execute(self, agent):
        return self.current_state.execute(agent)

# Define states and behaviors
seek_state = State(seek_behavior)
flee_state = State(flee_behavior)
wander_state = State(wander_behavior)

# Create the FSM
fsm = FSM(wander_state)

# Transition between states based on conditions
if agent.is_threatened:
    fsm.transition(flee_state)
elif agent.has_target:
    fsm.transition(seek_state)
else:
    fsm.transition(wander_state)

# Execute the current state's behavior
steering_force = fsm.execute(agent)

Slide 14:

Conclusion

In this presentation, we explored various steering behaviors in Python, including seek, flee, arrive, wander, pursuit, evade, obstacle avoidance, path following, and flocking. We also discussed how to combine behaviors and organize them using behavior trees and finite state machines. These techniques provide powerful tools for creating intelligent and lifelike movement patterns for autonomous agents in games, simulations, and robotics applications.

Meta:

Here is a title, description, and hashtags for a TikTok on the topic of steering behaviors in Python, with an institutional tone:

Coding Intelligent Movement: Steering Behaviors in Python

Explore the fascinating world of steering behaviors – the algorithms that enable autonomous agents to navigate complex environments with realistic and intelligent movement. In this institutional TikTok series, we'll delve into the implementation of various steering behaviors in Python, such as seek, flee, arrive, wander, pursuit, evade, obstacle avoidance, path following, and flocking.

Discover how these behaviors can be combined and organized using powerful techniques like behavior trees and finite state machines. Whether you're a game developer, roboticist, or simply curious about artificial intelligence, this series offers a comprehensive introduction to coding lifelike and adaptive movement for autonomous agents.

Join us on this educational journey and unlock the secrets of coding intelligent movement with Python. #SteeringBehaviors #PythonProgramming #ArtificialIntelligence #GameDev #Robotics #BehaviorTrees #FiniteStateMachines #AutonomousAgents #CodingEducation

Relevant Hashtags: #SteeringBehaviors #PythonProgramming #ArtificialIntelligence #GameDev #Robotics #BehaviorTrees #FiniteStateMachines #AutonomousAgents #CodingEducation #InstitutionalLearning #TechEducation