A while ago, I mentioned I was planning to build an autonomous agent framework on .NET (this was in fact a long time ago). It’s time to wake this project up with a shiny description:
NSteer is a framework for simulating of autonomous agents for .NET.
Until we get down to the code, here is a little snapshot to get you hooked:
A bit of history: boids, flocks, herds, etc…
In 1986, Craig Reynolds wrote a little application that simulated bird group behaviors. The term Boids was born. The beauty of his approach was that the “bird” behavior was not created from some complicated mathematical equation, it all boiled down to 3 simple rules that each agent would follow:
- Separation: avoid neighbors,
- Cohesion: go towards the group center,
- Alignment: align with group velocity.
Since then there has been a lot action in this field and you can see applications of this approach in a lot of the blockbuster hits. Check out Craig’s web site for an impressive list of links to papers (I love this one), samples, frameworks and movies…. It was about time to bring .NET into the play.
Laying down concepts
Let’s start by identifying the concepts in our problem that we can later translate into interfaces:
- An Agent describes an independent entity that lives in a World. An Agent has a Vision, a Body and a Behavior
- A Body defines the cinematic properties of the agent (position, acceleration, etc…)
- A Vision defines the region where the Agent can “see” obstacles or neighbors
- The Behavior of the Agent will yield a steering force that will move the Agent. This is the “brain” of the agent.
- Agents are confined in a World.
- A Simulator that uses an Integrator to integrate the dynamics of the system.
We will also need ways to access the list of Agents, Obstacles, etc… To do so, I chose to use the Service – Component – Container pattern where different services give access to the agents, obstacles, etc...
In .Net, this pattern is already part of the framework. The
IContainer interfaces are defined in
System.ComponentModel and there already exists base class such as
ServiceContainer to get started.
For a start, we will define the following services:
- AgentService, gives access to the Agents,
- WorldService, gives access to the world dimension and properties,
- ObstacleService, gives access to the obstacles in the world,
- NeighorhoodService, let agent query about neighboring agents
At last, we need some concepts for visualization:
- A Sprite is a 2D drawing with background color, foreground color, etc… It can be hidden or made visible.
- A Scene is an abstraction of GDI+,(just in case I had the courage to implement the framework using DirectX or XAML).
There might be a couple more going down the road, but this looks like a good starting point. I’ll see on the next post how we lay down the interface and maybe get ready for testing.