Trajectory Generation¶
This documents serves to provide a detailed overview of the trajectory generation pieces available as part of the data collection module. During the data generation run, the drone moves along the WayPoint
objects defined during trajectory generation which makes this step crucial in terms of the quantity, quality and variety of data generated through the module.
At present, we support the following kinds of trajectories:
These trajectories can either be defined through the config
or through API's
Takeoff-Landing¶
Imagine a circular plane in x-y around the specified geo-location
. Trajectories of this pattern move the drone vertically up from points on this circular plane. At each height, the drone rotates through n
yaw positions as defined through the config. In the diagram below, the blue circle is the circular plane. This pattern can be used to collect data above an object of interest. E.g. Get images of a landing pad below the sim agent from varying angles/heights
The following parameters define the trajectory:
trajectory-len
: Desired number of waypointsaltitude-change
: delta between starting and max altitude inm
radius
: Radius of the circular plane inm
An example of this trajectory being defined in the config can be found here
Programmatically, this trajectory can be defined as:
from projectairsim.datacollection.trajectory.takeoff_landing_trajectory import TakeoffLandingTrajectory
takeoff_landing = TakeoffLandingTrajectory(trajectory_len=300, altitude_change=20, radius=5)
Conic¶
For this pattern, the drone moves up vertically in a conic path w.r.t the geo-location
. The shape on the cone is defined through its params. This pattern can be used to collect data above an object of interest. E.g. Get images of a landing pad below the sim agent from varying angles/heights
The following parameters define the trajectory:
trajectory-len
: Desired number of waypointsaltitude-change
: delta between starting and max altitude inm
FOV
: Field Of View w.r.t to thegeo-location
indeg
. Defines the shape of the cone
An example of this trajectory being defined in the config can be found here
Programmatically, this trajectory can be defined as:
from projectairsim.datacollection.trajectory.conical_trajectory import ConicalTrajectory
conic = ConicalTrajectory(trajectory_len=450, altitude_change=40, field_of_view=45)
Port2Port¶
This pattern allows the user to generate trajectories between two points in space. This pattern allows for the generation of either random trajectories between those points or a planned one. This pattern can be used to collect data around an area of interest. E.g. Get images from different positions between Downtown and Cap Hill in Seattle
The random trajectories are generated through an implementation of the RRT planning algorithm with euclidean-distance-to-goal
being hte only heuristic for progression through space. Given the random nature, we allow users to specify n
number of these to be generated for a given pair of points
The planned trajectory is generated through the A* planning algorithm with the heuristic again being euclidean-distance-to-goal
. Since we are aiming for a planned path, optimality is looked for when progressing through space. Given the planned nature of this trajectory, only one
of these can be generated between a pair of points
The following parameters define the trajectory:
trajectory-len
: Desired number of waypointstrajectory-type
: Enum[“random”, “optimal”]num-trajectories
: [Only applicable iftype
israndom
] Number ofrandom
trajectories to be generatedstart-geo
: [lat, lon, alt] for start locationend-geo
: [lat, lon, alt] for goal location
An example of this trajectory being defined in the config can be found here
Programmatically, this trajectory can be defined as:
from projectairsim.datacollection.trajectory.port2port_trajectory import Port2PortTrajectory
from projectairsim.datacollection.types import GeoCoordinates
port2port = port2port = Port2PortTrajectory(
config_dir="path/to/config",
trajectory_len=1000,
trajectory_type="optimal",
start_geo=list(GeoCoordinates(33.047, -97.2919, 250)),
end_geo=list(GeoCoordinates(34.589, -96.235, 50)),
)
Cylindrical¶
This pattern allows the user to move the sim agent along the surface of a hypothetical cylinder in space. Port-2-port optimal
trajectories are generated from the points on the outer surface to corresponding points on the inner surface. The cylinder is centered around the geo-location
this trajectory is assigned to. This pattern can be used to collect data around an object of interest. E.g. Get images from all angles of an AirTaxi in the scene
The following parameters define the trajectory :
trajectory-len
: Desired number of waypointsaltitude-change
: Change in altitude +/- the initial altitude inm
outer-radius
: Outer radius of the hypothetical cylinder inm
inner-radius
: Inner radius of the hypothetical cylinder inm
angular-variations
: Number of points along each circular face from which port-2-port trajectories are generated (int
)
An example of this trajectory being defined in the config can be found here
Programmatically, this trajectory can be defined as:
from projectairsim.datacollection.trajectory.cylindrical_trajectory import CylindricalTrajectory
cylindrical = CylindricalTrajectory(
trajectory_len=250,
altitude_change=5,
outer_radius=20,
inner_radius=10,
angular_variation=6,
)
Note:¶
The output trajectory length can be off by about +5% (always on the positive side)
This error is due to the trajectory script estimating every other factor than the shape of the trajectory itself (shape is determined by the config params)
Despite the estimation, the process is fully deterministic - you will generate the same trajectory for the same input params
Each trajectory generation scripts outputs a modified datacollection.types.GeoLocation object. Here, the script adds a list of datacollection.types.Waypoint objects to the
trajectory
param of thegeo-location
. So, if you want to add your own trajectory gen script, make sure its output is in the correct format