summaryrefslogtreecommitdiff
path: root/thirdparty/rvo2/src/RVO.h
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/rvo2/src/RVO.h')
-rw-r--r--thirdparty/rvo2/src/RVO.h406
1 files changed, 406 insertions, 0 deletions
diff --git a/thirdparty/rvo2/src/RVO.h b/thirdparty/rvo2/src/RVO.h
new file mode 100644
index 0000000000..81c9cbd8d3
--- /dev/null
+++ b/thirdparty/rvo2/src/RVO.h
@@ -0,0 +1,406 @@
+/*
+ * RVO.h
+ * RVO2-3D Library
+ *
+ * Copyright 2008 University of North Carolina at Chapel Hill
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Please send all bug reports to <geom@cs.unc.edu>.
+ *
+ * The authors may be contacted via:
+ *
+ * Jur van den Berg, Stephen J. Guy, Jamie Snape, Ming C. Lin, Dinesh Manocha
+ * Dept. of Computer Science
+ * 201 S. Columbia St.
+ * Frederick P. Brooks, Jr. Computer Science Bldg.
+ * Chapel Hill, N.C. 27599-3175
+ * United States of America
+ *
+ * <http://gamma.cs.unc.edu/RVO2/>
+ */
+
+#ifndef RVO_RVO_H_
+#define RVO_RVO_H_
+
+#include "API.h"
+#include "RVOSimulator.h"
+#include "Vector3.h"
+
+/**
+
+ \file RVO.h
+ \brief Includes all public headers in the library.
+
+ \namespace RVO
+ \brief Contains all classes, functions, and constants used in the library.
+
+ \mainpage RVO2-3D Library
+
+ \author Jur van den Berg, Stephen J. Guy, Jamie Snape, Ming C. Lin, and Dinesh Manocha
+
+ <b>RVO2-3D Library</b> is an easy-to-use C++ implementation of the
+ <a href="http://gamma.cs.unc.edu/CA/">Optimal Reciprocal Collision Avoidance</a>
+ (ORCA) formulation for multi-agent simulation in three dimensions. <b>RVO2-3D Library</b>
+ automatically uses parallelism for computing the motion of the agents if your machine
+ has multiple processors and your compiler supports <a href="http://www.openmp.org/">
+ OpenMP</a>.
+
+ Please follow the following steps to install and use <b>RVO2-3D Library</b>.
+
+ - \subpage whatsnew
+ - \subpage building
+ - \subpage using
+ - \subpage params
+
+ See the documentation of the RVO::RVOSimulator class for an exhaustive list of
+ public functions of <b>RVO2-3D Library</b>.
+
+ <b>RVO2-3D Library</b>, accompanying example code, and this documentation is
+ released for educational, research, and non-profit purposes under the following
+ \subpage terms "terms and conditions".
+
+
+ \page whatsnew What Is New in RVO2-3D Library
+
+ \section localca Three Dimensions
+
+ In contrast to RVO2 Library, <b>RVO2-3D Library</b> operates in 3D workspaces. It uses
+ a three dimensional implementation of <a href="http://gamma.cs.unc.edu/CA/">Optimal
+ Reciprocal Collision Avoidance</a> (ORCA) for local collision avoidance. <b>RVO2-3D
+ Library</b> does not replace RVO2 Library; for 2D applications, RVO2 Library should
+ be used.
+
+ \section structure Structure of RVO2-3D Library
+
+ The structure of <b>RVO2-3D Library</b> is similar to that of RVO2 Library.
+ Users familiar with RVO2 Library should find little trouble in using <b>RVO2-3D
+ Library</b>. <b>RVO2-3D Library</b> currently does not support static obstacles.
+
+ \page building Building RVO2-3D Library
+
+ We assume that you have downloaded <b>RVO2-3D Library</b> and unpacked the ZIP
+ archive to a path <tt>$RVO_ROOT</tt>.
+
+ \section xcode Apple Xcode 4.x
+
+ Open <tt>$RVO_ROOT/RVO.xcodeproj</tt> and select the <tt>Static Library</tt> scheme. A static library <tt>libRVO.a</tt> will be built in the default build directory.
+
+ \section cmake CMake
+
+ Create and switch to your chosen build directory, e.g. <tt>$RVO_ROOT/build</tt>.
+ Run <tt>cmake</tt> inside the build directory on the source directory, e.g.
+ <tt>cmake $RVO_ROOT/src</tt>. Build files for the default generator for your
+ platform will be generated in the build directory.
+
+ \section make GNU Make
+
+ Switch to the source directory <tt>$RVO_ROOT/src</tt> and run <tt>make</tt>.
+ Public header files (<tt>API.h</tt>, <tt>RVO.h</tt>, <tt>RVOSimulator.h</tt>, and <tt>Vector3.h</tt>) will be copied to the <tt>$RVO_ROOT/include</tt> directory and a static library <tt>libRVO.a</tt> will be compiled into the
+ <tt>$RVO_ROOT/lib</tt> directory.
+
+ \section visual Microsoft Visual Studio 2010
+
+ Open <tt>$RVO_ROOT/RVO.sln</tt> and select the <tt>RVOStatic</tt> project and a
+ configuration (<tt>Debug</tt> or <tt>Release</tt>). Public header files (<tt>API.h</tt>, <tt>RVO.h</tt>, <tt>RVOSimulator.h</tt>, and <tt>Vector3.h</tt>) will be copied to the <tt>$RVO_ROOT/include</tt> directory and a static library, e.g. <tt>RVO.lib</tt>, will be compiled into the
+ <tt>$RVO_ROOT/lib</tt> directory.
+
+
+ \page using Using RVO2-3D Library
+
+ \section structure Structure
+
+ A program performing an <b>RVO2-3D Library</b> simulation has the following global
+ structure.
+
+ \code
+ #include <RVO.h>
+
+ std::vector<RVO::Vector3> goals;
+
+ int main()
+ {
+ // Create a new simulator instance.
+ RVO::RVOSimulator* sim = new RVO::RVOSimulator();
+
+ // Set up the scenario.
+ setupScenario(sim);
+
+ // Perform (and manipulate) the simulation.
+ do {
+ updateVisualization(sim);
+ setPreferredVelocities(sim);
+ sim->doStep();
+ } while (!reachedGoal(sim));
+
+ delete sim;
+ }
+ \endcode
+
+ In order to use <b>RVO2-3D Library</b>, the user needs to include RVO.h. The first
+ step is then to create an instance of RVO::RVOSimulator. Then, the process
+ consists of two stages. The first stage is specifying the simulation scenario
+ and its parameters. In the above example program, this is done in the method
+ setupScenario(...), which we will discuss below. The second stage is the actual
+ performing of the simulation.
+
+ In the above example program, simulation steps are taken until all
+ the agents have reached some predefined goals. Prior to each simulation step,
+ we set the preferred velocity for each agent, i.e. the
+ velocity the agent would have taken if there were no other agents around, in the
+ method setPreferredVelocities(...). The simulator computes the actual velocities
+ of the agents and attempts to follow the preferred velocities as closely as
+ possible while guaranteeing collision avoidance at the same time. During the
+ simulation, the user may want to retrieve information from the simulation for
+ instance to visualize the simulation. In the above example program, this is done
+ in the method updateVisualization(...), which we will discuss below. It is also
+ possible to manipulate the simulation during the simulation, for instance by
+ changing positions, radii, velocities, etc. of the agents.
+
+ \section spec Setting up the Simulation Scenario
+
+ A scenario that is to be simulated can be set up as follows. A scenario consists
+ of a set of agents that can be manually specified. Agents may be added anytime
+ before or during the simulation. The user may also want to define goal positions
+ of the agents, or a roadmap to guide the agents around obstacles. This is not done
+ in <b>RVO2-3D Library</b>, but needs to be taken care of in the user's external
+ application.
+
+ The following example creates a scenario with eight agents exchanging positions.
+
+ \code
+ void setupScenario(RVO::RVOSimulator* sim) {
+ // Specify global time step of the simulation.
+ sim->setTimeStep(0.25f);
+
+ // Specify default parameters for agents that are subsequently added.
+ sim->setAgentDefaults(15.0f, 10, 10.0f, 2.0f, 2.0f);
+
+ // Add agents, specifying their start position.
+ sim->addAgent(RVO::Vector3(-50.0f, -50.0f, -50.0f));
+ sim->addAgent(RVO::Vector3(50.0f, -50.0f, -50.0f));
+ sim->addAgent(RVO::Vector3(50.0f, 50.0f, -50.0f));
+ sim->addAgent(RVO::Vector3(-50.0f, 50.0f, -50.0f));
+ sim->addAgent(RVO::Vector3(-50.0f, -50.0f, 50.0f));
+ sim->addAgent(RVO::Vector3(50.0f, -50.0f, 50.0f));
+ sim->addAgent(RVO::Vector3(50.0f, 50.0f, 50.0f));
+ sim->addAgent(RVO::Vector3(-50.0f, 50.0f, 50.0f));
+
+ // Create goals (simulator is unaware of these).
+ for (size_t i = 0; i < sim->getNumAgents(); ++i) {
+ goals.push_back(-sim->getAgentPosition(i));
+ }
+ }
+ \endcode
+
+ See the documentation on RVO::RVOSimulator for a full overview of the
+ functionality to specify scenarios.
+
+ \section ret Retrieving Information from the Simulation
+
+ During the simulation, the user can extract information from the simulation for
+ instance for visualization purposes, or to determine termination conditions of
+ the simulation. In the example program above, visualization is done in the
+ updateVisualization(...) method. Below we give an example that simply writes
+ the positions of each agent in each time step to the standard output. The
+ termination condition is checked in the reachedGoal(...) method. Here we give an
+ example that returns true if all agents are within one radius of their goals.
+
+ \code
+ void updateVisualization(RVO::RVOSimulator* sim) {
+ // Output the current global time.
+ std::cout << sim->getGlobalTime() << " ";
+
+ // Output the position for all the agents.
+ for (size_t i = 0; i < sim->getNumAgents(); ++i) {
+ std::cout << sim->getAgentPosition(i) << " ";
+ }
+
+ std::cout << std::endl;
+ }
+ \endcode
+
+ \code
+ bool reachedGoal(RVO::RVOSimulator* sim) {
+ // Check whether all agents have arrived at their goals.
+ for (size_t i = 0; i < sim->getNumAgents(); ++i) {
+ if (absSq(goals[i] - sim->getAgentPosition(i)) > sim->getAgentRadius(i) * sim->getAgentRadius(i)) {
+ // Agent is further away from its goal than one radius.
+ return false;
+ }
+ }
+ return true;
+ }
+ \endcode
+
+ Using similar functions as the ones used in this example, the user can access
+ information about other parameters of the agents, as well as the global
+ parameters, and the obstacles. See the documentation of the class
+ RVO::RVOSimulator for an exhaustive list of public functions for retrieving
+ simulation information.
+
+ \section manip Manipulating the Simulation
+
+ During the simulation, the user can manipulate the simulation, for instance by
+ changing the global parameters, or changing the parameters of the agents
+ (potentially causing abrupt different behavior). It is also possible to give the
+ agents a new position, which make them jump through the scene.
+ New agents can be added to the simulation at any time.
+
+ See the documentation of the class RVO::RVOSimulator for an exhaustive list of
+ public functions for manipulating the simulation.
+
+ To provide global guidance to the agents, the preferred velocities of the agents
+ can be changed ahead of each simulation step. In the above example program, this
+ happens in the method setPreferredVelocities(...). Here we give an example that
+ simply sets the preferred velocity to the unit vector towards the agent's goal
+ for each agent (i.e., the preferred speed is 1.0).
+
+ \code
+ void setPreferredVelocities(RVO::RVOSimulator* sim) {
+ // Set the preferred velocity for each agent.
+ for (size_t i = 0; i < sim->getNumAgents(); ++i) {
+ if (absSq(goals[i] - sim->getAgentPosition(i)) < sim->getAgentRadius(i) * sim->getAgentRadius(i) ) {
+ // Agent is within one radius of its goal, set preferred velocity to zero
+ sim->setAgentPrefVelocity(i, RVO::Vector3());
+ } else {
+ // Agent is far away from its goal, set preferred velocity as unit vector towards agent's goal.
+ sim->setAgentPrefVelocity(i, normalize(goals[i] - sim->getAgentPosition(i)));
+ }
+ }
+ }
+ \endcode
+
+ \section example Example Programs
+
+ <b>RVO2-3D Library</b> is accompanied by one example program, which can be found in the
+ <tt>$RVO_ROOT/examples</tt> directory. The example is named Sphere, and
+ contains the following demonstration scenario:
+ <table border="0" cellpadding="3" width="100%">
+ <tr>
+ <td valign="top" width="100"><b>Sphere</b></td>
+ <td valign="top">A scenario in which 812 agents, initially positioned evenly
+ distributed on a sphere, move to the antipodal position on the
+ sphere. </td>
+ </tr>
+ </table>
+
+
+ \page params Parameter Overview
+
+ \section globalp Global Parameters
+
+ <table border="0" cellpadding="3" width="100%">
+ <tr>
+ <td valign="top" width="150"><strong>Parameter</strong></td>
+ <td valign="top" width="150"><strong>Type (unit)</strong></td>
+ <td valign="top"><strong>Meaning</strong></td>
+ </tr>
+ <tr>
+ <td valign="top">timeStep</td>
+ <td valign="top">float (time)</td>
+ <td valign="top">The time step of the simulation. Must be positive.</td>
+ </tr>
+ </table>
+
+ \section agent Agent Parameters
+
+ <table border="0" cellpadding="3" width="100%">
+ <tr>
+ <td valign="top" width="150"><strong>Parameter</strong></td>
+ <td valign="top" width="150"><strong>Type (unit)</strong></td>
+ <td valign="top"><strong>Meaning</strong></td>
+ </tr>
+ <tr>
+ <td valign="top">maxNeighbors</td>
+ <td valign="top">size_t</td>
+ <td valign="top">The maximum number of other agents the agent takes into
+ account in the navigation. The larger this number, the
+ longer the running time of the simulation. If the number is
+ too low, the simulation will not be safe.</td>
+ </tr>
+ <tr>
+ <td valign="top">maxSpeed</td>
+ <td valign="top">float (distance/time)</td>
+ <td valign="top">The maximum speed of the agent. Must be non-negative.</td>
+ </tr>
+ <tr>
+ <td valign="top">neighborDist</td>
+ <td valign="top">float (distance)</td>
+ <td valign="top">The maximum distance (center point to center point) to
+ other agents the agent takes into account in the
+ navigation. The larger this number, the longer the running
+ time of the simulation. If the number is too low, the
+ simulation will not be safe. Must be non-negative.</td>
+ </tr>
+ <tr>
+ <td valign="top" width="150">position</td>
+ <td valign="top" width="150">RVO::Vector3 (distance, distance)</td>
+ <td valign="top">The current position of the agent.</td>
+ </tr>
+ <tr>
+ <td valign="top" width="150">prefVelocity</td>
+ <td valign="top" width="150">RVO::Vector3 (distance/time, distance/time)
+ </td>
+ <td valign="top">The current preferred velocity of the agent. This is the
+ velocity the agent would take if no other agents or
+ obstacles were around. The simulator computes an actual
+ velocity for the agent that follows the preferred velocity
+ as closely as possible, but at the same time guarantees
+ collision avoidance.</td>
+ </tr>
+ <tr>
+ <td valign="top">radius</td>
+ <td valign="top">float (distance)</td>
+ <td valign="top">The radius of the agent. Must be non-negative.</td>
+ </tr>
+ <tr>
+ <td valign="top" width="150">timeHorizon</td>
+ <td valign="top" width="150">float (time)</td>
+ <td valign="top">The minimum amount of time for which the agent's velocities
+ that are computed by the simulation are safe with respect
+ to other agents. The larger this number, the sooner this
+ agent will respond to the presence of other agents, but the
+ less freedom the agent has in choosing its velocities.
+ Must be positive. </td>
+ </tr>
+ <tr>
+ <td valign="top" width="150">velocity</td>
+ <td valign="top" width="150">RVO::Vector3 (distance/time, distance/time)
+ </td>
+ <td valign="top">The (current) velocity of the agent.</td>
+ </tr>
+ </table>
+
+
+ \page terms Terms and Conditions
+
+ <b>RVO2-3D Library</b>
+
+ Copyright 2008 University of North Carolina at Chapel Hill
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ */
+
+#endif /* RVO_RVO_H_ */