What is ERDOS?

ERDOS is a platform for developing self-driving cars and robotics applications.

The system is built using techniques from streaming dataflow systems which is reflected by the API. Applications are modeled as directed graphs, in which data flows through streams and is processed by operators. Because applications often resemble a sequence of connected operators, an ERDOS application may also be referred to as a pipeline.

Example

The following example demonstrates a toy robotics application which uses semantic segmentation and the bounding boxes of detected objects to control a robot. The example consists of the driver part of the program, which is responsible for connecting operators via streams. For information on building operators, see operators.

# Create a camera operator which generates a stream of RGB images.
camera_frames = erdos.connect_source(CameraOp, erdos.OperatorConfig())
# Connect an object detection operator which uses the provided model to
# detect objects and compute bounding boxes.
bounding_boxes = erdos.connect_one_in_one_out(
    ObjectDetectorOp,
    erdos.OperatorConfig(),
    camera_frames,
    model="models/ssd_mobilenet_v1_coco")
# Connect semantic segmentation operator to the camera which computes the
# semantic segmentation for each image.
segmentation = erdos.connect_one_in_one_out(SegmentationOp,
                                            erdos.OperatorConfig(),
                                            camera_frames,
                                            model="models/drn_d_22_cityscapes")
# Connect an action operator to propose actions from provided features.
actions = erdos.connect_two_in_one_out(ActionOp, erdos.OperatorConfig(),
                                       bounding_boxes, segmentation)
# Create a robot operator which interfaces with the robot to apply actions.
erdos.connect_sink(RobotOp, erdos.OperatorConfig(), actions)

# Execute the application.
erdos.run()

Further examples are available on GitHub

Driver

The driver section of the program connects operators together using streams to build an ERDOS application which may then be executed. The driver is typically the main section of the program.

The driver may also interact with a running ERDOS application. Using the IngestStream, the driver can send data to operators on a stream. The ExtractStream allows the driver to read data sent from an operator.

Determinism

ERDOS provides mechanisms to enable the building of deterministic applications. For instance, processing sets of messages separated by watermarks using watermark callbacks can turn ERDOS pipelines into Kahn process networks.

Performance

ERDOS is designed for low latency. Self-driving car pipelines require end-to-end deadlines on the order of hundreds of milliseconds for safe driving. Similarly, self-driving cars typically process gigabytes per second of data on small clusters. Therefore, ERDOS is optimized to send small amounts of data (gigabytes as opposed to terabytes) as quickly as possible.

For performance-sensitive applications, it is recommended to use the Rust API as Python introduces significant overheads (e.g. serialization and reduced parallelism from the GIL).

View the codebase on GitHub.

You can export the dataflow graph as a DOT file by setting the graph_filename argument in erdos.run().

More Information

To read more about the ideas behind ERDOS, refer to our paper: *D3: A Dynamic Deadline-Driven Approach for Building Autonomous Vehicles*. If you find ERDOS useful to your work, please consider citing our paper:

@inproceedings{gog2022d3,
  title={D3: a dynamic deadline-driven approach for building autonomous vehicles},
  author={Gog, Ionel and Kalra, Sukrit and Schafhalter, Peter and Gonzalez, Joseph E and Stoica, Ion},
  booktitle={Proceedings of the Seventeenth European Conference on Computer Systems},
  pages={453--471},
  year={2022}
}