libOpenDRIVE is a lightweight, dependency-free, fast C++ library providing OpenDRIVE file parsing and 3D model generation.
It's small and can be easily integrated in other projects. It can be compiled to a WebAssembly library and includes JavaScript bindings. A core function is the parsing of OpenDRIVE files and the generation of 3D models. The library targets OpenDRIVE version 1.4.
Here's an example of how code using libOpenDRIVE looks. For a complete example refer to test.cpp.
// load map
odr::OpenDriveMap odr_map("data.xodr");
// iterate roads
for (std::shared_ptr<odr::Road> road : odr_map.get_roads())
printf("road: %s, length: %.2f\n", road->id.c_str(), road->length);
// get xyz point for road coordinates
std::shared_ptr<odr::Road> odr_road = odr_map.roads.at("515");
odr::Vec3D pt_xyz = odr_road->get_xyz(0.1 /*s*/, 1.0 /*t*/, 0.0 /*h*/);
// access road network attributes
std::string lane_type = odr_road->get_lanesection(0.0)->id_to_lane.at(-1)->type;
// get routing graph
odr::RoutingGraph routing_graph = odr_map.get_routing_graph();
To use the included viewer first build the WebAssembly library and then run a webserver in the Viewer/ directory (e.g. python3 -m http.server
). Or you can test the viewer online.
Also check out the viewer at odrviewer.io which uses this library.
To build the library simply run:
mkdir build && cd build
cmake ..
make
This also builds an executable to test the library:
./build/test-xodr Viewer/data.xodr
Install emsdk and run the following commands to build the WebAssembly library:
mkdir build && cd build
emcmake cmake ..
emmake make
This will create the files ModuleOpenDrive.js/.wasm. To run the viewer copy them to the Viewer/ directory.
cp ModuleOpenDrive.* ../Viewer
Refer to the code in main.js for a full example.
odr_map = new Module.OpenDriveMap("./data.xodr", odr_map_config);
const odr_road = odr_map.roads.get("515");
const lane_type = odr_road.s_to_lanesection.get(0.0).id_to_lane.get(-1).type;