Some scripts are provided for building and testing CarlaServer on Linux
$ ./Setup.sh $ make $ make check
The setup script downloads and compiles all the required dependencies. The Makefile calls CMake to build CarlaServer and installs it under "Util/Install".
All the messages are prepended by a 32 bits unsigned integer (little-endian) indicating the size of the coming message.
Three consecutive ports are used,
- world-port (default 2000)
- measurements-port = world-port + 1
- control-port = world-port + 2
each of these ports has an associated thread that sends/reads data asynchronuosly.
Server reads one, writes one. Always protobuf messages.
[client] RequestNewEpisode [server] SceneDescription [client] EpisodeStart [server] EpisodeReady ...repeat...
Server only writes, first measurements message then the bulk of raw images.
[server] Measurements [server] raw images ...repeat...
Every image is an array of uint32's
[width, height, type, color, color,...]
where each color is an FColor (BGRA) as stored in Unreal Engine, and the possible types of images are
type = 0 None (RGB without any post-processing) type = 1 SceneFinal (RGB with post-processing present at the scene) type = 2 Depth (Depth Map) type = 3 SemanticSegmentation (Semantic Segmentation)
The measurements message is explained in detail here.
Server only reads, client sends Control message every frame.
[client] Control ...repeat...
In the synchronous mode, the server halts execution each frame until the Control message is received.
The library is encapsulated behind a single include file in C, "carla/carla_server.h".
This file contains the basic interface for reading and writing messages to the client, hiding the networking and multi-threading part. Most of the functions have a time-out parameter and block until the corresponding asynchronous operation is completed or the time-out is met. Set a time-out of 0 to get a non-blocking call.
A CarlaServer instance is created with
carla_make_server() and should be
destroyed after use with
The C API takes care of dispatching the request to the corresponding server. There are three asynchronous servers each of them running on its own thread.
Conceptually there are two servers, the World Server and the Agent Server. The World Server controls the initialization of episodes. A new episode is started every time it is requested to the World Server by a RequestNewEpisode message. Once the episode is ready, the World Server launches the Agent Server. The Agent Server has two threads, one for sending the streaming of the measurements and another for receiving the control. Both agent threads communicate with the main thread through a lock-free double-buffer to speed up the streaming of messages and images.
The encoding of the messages (protobuf) and the networking operations are executed asynchronously.