From c0df0b3dd8235f6fd6511462b80fbff9b1c39a88 Mon Sep 17 00:00:00 2001 From: Alexander Mock Date: Thu, 21 Nov 2024 21:08:17 +0100 Subject: [PATCH] added simple logo. fixed links. fixed toc --- README.md | 2 +- docs/extra/data.md | 10 +++++----- docs/extra/tools.md | 4 ++-- docs/getting_started/installation.md | 5 ++--- docs/getting_started/maps.md | 6 +++--- docs/getting_started/noise.md | 10 +++++----- docs/getting_started/overview.md | 2 +- docs/getting_started/problem_modelling.md | 10 +++++----- docs/getting_started/sensors.md | 4 ++-- docs/getting_started/simulation.md | 2 +- docs/index.md | 19 ++++++++++++++++--- docs/library/concepts.md | 6 +++--- docs/resources/img/rmagine_icon.png | Bin 0 -> 6855 bytes docs/resources/img/rmagine_logo.png | Bin 0 -> 5124 bytes mkdocs.yml | 4 ++-- 15 files changed, 48 insertions(+), 36 deletions(-) create mode 100644 docs/resources/img/rmagine_icon.png create mode 100644 docs/resources/img/rmagine_logo.png diff --git a/README.md b/README.md index 6b9ea54..854307b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# rmagine +# Rmagine These docs are built with [MkDocs](https://mkdocs.org) and published to [uos.github.io/rmagine_docs](https://uos.github.io/rmagine_docs) diff --git a/docs/extra/data.md b/docs/extra/data.md index 3c55529..0436b60 100644 --- a/docs/extra/data.md +++ b/docs/extra/data.md @@ -5,7 +5,7 @@ For development and testing we include some meshes inside our repository in the ## sphere.ply -![sphere.ply](../resources/img/rmagine_dat_sphere.png) +![sphere.ply](/resources/img/rmagine_dat_sphere.png) ```bash user@pc:~/rmagine/build$ ./bin/rmagine_map_info ../dat/sphere.ply @@ -41,7 +41,7 @@ Scene Graph: ## triangle.ply -![triangle.ply](../resources/img/rmagine_dat_triangle.png) +![triangle.ply](/resources/img/rmagine_dat_triangle.png) ```bash user@pc:~/rmagine/build$ ./bin/rmagine_map_info ../dat/triangle.ply @@ -77,7 +77,7 @@ Scene Graph: ## box_rot_trans_scaled.dae -![box_rot_trans_scaled.dae](../resources/img/rmagine_dat_box_rot_trans_scaled.png) +![box_rot_trans_scaled.dae](/resources/img/rmagine_dat_box_rot_trans_scaled.png) ```bash user@pc:~/rmagine/build$ ./bin/rmagine_map_info ../dat/box_rot_trans_scaled.dae @@ -146,7 +146,7 @@ Scene Graph: ## two_cubes.dae -![two_cubes.dae](../resources/img/rmagine_dat_two_cubes.png) +![two_cubes.dae](/resources/img/rmagine_dat_two_cubes.png) ```bash user@pc:~/rmagine/build$ ./bin/rmagine_map_info ../dat/two_cubes.dae @@ -239,7 +239,7 @@ Scene Graph: ## many_objects.dae -![many_objects.dae](../resources/img/rmagine_dat_many_objects.png) +![many_objects.dae](/resources/img/rmagine_dat_many_objects.png) ```bash user@pc:~/rmagine/build$ ./bin/rmagine_map_info ../dat/many_objects.dae diff --git a/docs/extra/tools.md b/docs/extra/tools.md index 6a87c12..c2578d5 100644 --- a/docs/extra/tools.md +++ b/docs/extra/tools.md @@ -153,7 +153,7 @@ Usage: ./bin/rmagine_synthetic mesh_type mesh_file | | | |:----:|:----:| -| ![plane](../resources/img/rmagine_synthetic_plane.png) | ![cube](../resources/img/rmagine_synthetic_cube.png) | +| ![plane](/resources/img/rmagine_synthetic_plane.png) | ![cube](/resources/img/rmagine_synthetic_cube.png) | | `rmagine_synthetic plane plane.ply` | `rmagine_synthetic cube cube.ply` | -| ![sphere](../resources/img/rmagine_synthetic_sphere.png) | ![cylinder](../resources/img/rmagine_synthetic_cylinder.png) | +| ![sphere](/resources/img/rmagine_synthetic_sphere.png) | ![cylinder](/resources/img/rmagine_synthetic_cylinder.png) | | `rmagine_synthetic sphere sphere.ply` | `rmagine_synthetic cylinder cylinder.ply` | \ No newline at end of file diff --git a/docs/getting_started/installation.md b/docs/getting_started/installation.md index 62cdec4..957e1c7 100644 --- a/docs/getting_started/installation.md +++ b/docs/getting_started/installation.md @@ -14,7 +14,7 @@ user@pc:~$ sudo apt install libassimp-dev ## Backbones -![rmagine_backends](../resources/img/rmagine_backends.png) +![rmagine_backends](/resources/img/rmagine_backends.png) Rmagine provides an interface to integrate ray tracing libraries, we call backbones. All of these backbones are optional. So far we integrated Intel Embree and NVIDIA OptiX. @@ -30,8 +30,7 @@ user@pc:~/embree/build$ make -j`nproc` user@pc:~/embree/build$ sudo make install ``` - - +For older Embree versions we refer to [this](/extra/embree3). ### OptiX Backbone (optional) diff --git a/docs/getting_started/maps.md b/docs/getting_started/maps.md index e392b6b..e4872ff 100644 --- a/docs/getting_started/maps.md +++ b/docs/getting_started/maps.md @@ -1,6 +1,6 @@ # Maps -Triangle Meshes can be stored in various file formats. Rmagine utilizes the [Open Asset Import Library (assimp)](https://github.com/assimp/assimp) in order to support a wide range of well known file formats. After loading the raw scene graph buffers with Assimp it is converted into Rmagines internal scene graph structure. Dependend on the computation backend `Embree` or `OptiX` the scene graph is prepared for fast ray traversals by building the required acceleration structures. +Triangle Meshes can be stored in various file formats. Rmagine utilizes the [Open Asset Import Library (assimp)](https://github.com/assimp/assimp) in order to support a wide range of well known file formats. After loading the raw scene graph buffers with Assimp it is converted into Rmagines internal scene graph structure. Dependent on the computation backend `Embree` or `OptiX` the scene graph is prepared for fast ray traversals by building the required acceleration structures. ## Embree Map @@ -34,5 +34,5 @@ int main(int argc, char** argv) ## Properties -After loading, the map consists of a complete scene graph. It then usually passed to a simulator (see next gettingstarted-sections). -The advanced [Map](library/Map)-section describes how to modify or create the internal maps from scratch. \ No newline at end of file +After loading, the map consists of a complete scene graph. It then usually passed to a simulator (see next "Getting Started"-sections). +The advanced [Map](library/map)-section describes how to modify or create the internal maps from scratch. \ No newline at end of file diff --git a/docs/getting_started/noise.md b/docs/getting_started/noise.md index 70f1bf0..9a4b794 100644 --- a/docs/getting_started/noise.md +++ b/docs/getting_started/noise.md @@ -1,6 +1,6 @@ Currently noise models are implemented as postprocessing steps that modify the simulated ranges. Any of the following noise models can be chained to generate complex combined noise models. -The Noise models are implented equally both on GPU and CPU. -Thus the developer can manage to apply noise to the data without downloading or uploading the data from GPU to CPU or vice versa. +The Noise models are implemented equally both for GPU and CPU. +Thus the developer can apply noise to the data without downloading or uploading the data from GPU to CPU or vice versa. 1. Gaussian Noise @@ -13,7 +13,7 @@ Apply gaussian noise $N(\mu, \sigma)$ to simulated ranges. | `stddev` | standard deviation $\sigma$ of normal distributed noise | -![rmagine_noise_gaussian](../resources/img/rmagine_noise_gaussian.png) +![rmagine_noise_gaussian](/resources/img/rmagine_noise_gaussian.png) Example CPU: @@ -74,7 +74,7 @@ Apply gaussian noise $N(\mu, \sigma_r)$ to simulated ranges. Here, the standard | `stddev` | standard deviation $\sigma$ of normal distributed noise | | `range_exp` | range exponent $c$ to compute range based stddev: $ \sigma_r = \sigma \cdot r^{c} $ | -![rmagine_noise_rel_gaussian](../resources/img/rmagine_noise_rel_gaussian.png) +![rmagine_noise_rel_gaussian](/resources/img/rmagine_noise_rel_gaussian.png) Example CPU: @@ -137,7 +137,7 @@ Parameters: | `return_prob` | Probability of a ray hitting dust returns to sender depending on particle distance | -![rmagine_noise_dust](../resources/img/rmagine_noise_dust.png) +![rmagine_noise_dust](/resources/img/rmagine_noise_dust.png) Example CPU: diff --git a/docs/getting_started/overview.md b/docs/getting_started/overview.md index 990adbf..a891e22 100644 --- a/docs/getting_started/overview.md +++ b/docs/getting_started/overview.md @@ -20,7 +20,7 @@ In addition to the wiki, the following papers wrap up the library conceptually. ```latex @inproceedings{mock2023rmagine, - title={Rmagine: 3D Range Sensor Simulation in Polygonal Maps via Ray Tracing for Embedded Hardware on Mobile Robots}, + title={{Rmagine: 3D Range Sensor Simulation in Polygonal Maps via Ray Tracing for Embedded Hardware on Mobile Robots}}, author={Mock, Alexander and Wiemann, Thomas and Hertzberg, Joachim}, booktitle={IEEE International Conference on Robotics and Automation (ICRA)}, year={2023} diff --git a/docs/getting_started/problem_modelling.md b/docs/getting_started/problem_modelling.md index 3067136..aee68e2 100644 --- a/docs/getting_started/problem_modelling.md +++ b/docs/getting_started/problem_modelling.md @@ -2,9 +2,9 @@ The general computing flow is as follows. -![rmagine_example](../resources/img/rmagine.drawio.png) +![rmagine_example](/resources/img/rmagine.drawio.png) -Tsb is the transform from sensor to base frame. Or spoken: The sensor pose relative to the robot base. The map can be either a pointer to an `EmbreeMap` or `OptixMap`. The Prefix of the `Simulator` is either `Embree` for CPU computation or `Optix` for GPU computation. The suffix of the Simulator is dependend on which sensor model you want to simulate. A few examples: +Tsb is the transform from sensor to base frame. Or spoken: The sensor pose relative to the robot base. The map can be either a pointer to an `EmbreeMap` or `OptixMap`. The Prefix of the `Simulator` is either `Embree` for CPU computation or `Optix` for GPU computation. The suffix of the Simulator is dependent on which sensor model you want to simulate. A few examples: - `SphereSimulatorEmbree` - Simulate a velodyne on CPU - `PinholeSimulatorOptix`- Simulate a depth camera on GPU @@ -14,7 +14,7 @@ Tsb is the transform from sensor to base frame. Or spoken: The sensor pose relat Now we want to construct the following pipeline. -![rmagine_example_1](../resources/img/rmagine_example_1.drawio.png) +![rmagine_example_1](/resources/img/rmagine_example_1.drawio.png) ```cpp @@ -75,7 +75,7 @@ int main(int argc, char** argv) Now we want to construct the following pipeline. -![rmagine_example_1](../resources/img/rmagine_example_2.drawio.png) +![rmagine_example_1](/resources/img/rmagine_example_2.drawio.png) The green cells are memory objects on GPU as you see in the following code snippet. @@ -146,7 +146,7 @@ int main(int argc, char** argv) Now we want to construct the following pipeline. -![rmagine_example_1](../resources/img/rmagine_example_3.drawio.png) +![rmagine_example_1](/resources/img/rmagine_example_3.drawio.png) ```cpp diff --git a/docs/getting_started/sensors.md b/docs/getting_started/sensors.md index 7c46114..d8dd8eb 100644 --- a/docs/getting_started/sensors.md +++ b/docs/getting_started/sensors.md @@ -3,8 +3,8 @@ Rmagine supports several configurations of commonly used range sensors as Spherical, Pinhole or even fully customizable O1Dn and OnDn models. The following image shows how the results could look like using these different models. -![sensor_models_3d](../resources/img/sensor_models_3d.png) -![sensor_models_ortho](../resources/img/sensor_models_ortho.png) +![sensor_models_3d](/resources/img/sensor_models_3d.png) +![sensor_models_ortho](/resources/img/sensor_models_ortho.png) The next instructions show how to initialize each model individually. diff --git a/docs/getting_started/simulation.md b/docs/getting_started/simulation.md index a65332e..ca0bfec 100644 --- a/docs/getting_started/simulation.md +++ b/docs/getting_started/simulation.md @@ -1,6 +1,6 @@ # Simulation -![simulation_attributes](../resources/img/simulation_attributes.png) +![simulation_attributes](/resources/img/simulation_attributes.png) ## Requirements diff --git a/docs/index.md b/docs/index.md index 3aaed8c..b3e30ad 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,12 +1,13 @@ ![rmagine_teaser_image](resources/img/sensor_models_3d.png) -# Rmagine +# Rmagine -This library called Rmagine allows a robot to simulate sensor data for arbitrary range sensors directly on board via raytracing. Since robots typically only have limited computational resources, the Rmagine aims at being flexible and lightweight, while scaling well even to large environment maps. It runs on several platforms like Laptops or embedded computing boards like Nvidia Jetson by putting an unified API over the specific proprietary libraries provided by the hardware manufacturers. This work is designed to support the future development of robotic applications depending on simulation of range data that could previously not be computed in reasonable time on mobile systems. +Rmagine allows a robot to simulate sensor data for arbitrary range sensors directly on board via raytracing. Since robots typically only have limited computational resources, Rmagine aims at being flexible and lightweight, while scaling well even to large environment maps. It runs on several platforms like Laptops or embedded computing boards like Nvidia Jetson by putting an unified API over specific proprietary libraries provided by the hardware manufacturers. This work is designed to support the future development of robotic applications depending on simulation of range data that could previously not be computed in reasonable time on mobile systems. ## Table of Contents **Getting Started** + - [Overview](getting_started/overview) - [Installation](getting_started/installation) - [Integration](getting_started/integration) @@ -15,6 +16,18 @@ This library called Rmagine allows a robot to simulate sensor data for arbitrary - [Simulation](getting_started/simulation) - [Problem Modelling](getting_started/problem_modelling) - [Noise](getting_started/noise) -- [Tools](getting_started/tools) +**Library** + +- [Concepts](library/concepts) +- [Math](library/math) +- [Memory](library/memory) +- [Maps](library/maps) + +**Extra** + +- [Tools](extra/tools) +- [Data](extra/data) +- [News](extra/news) +- [Embree 3](extra/embree3) diff --git a/docs/library/concepts.md b/docs/library/concepts.md index 7f0a01c..1ef67a6 100644 --- a/docs/library/concepts.md +++ b/docs/library/concepts.md @@ -18,11 +18,11 @@ Rmagine has the following top-level structure of directories: Contains all math related types and functions. All math datatypes are completely CUDA compatible. See `rmagine/math/types.h` for all types. -See [Math](Library-Math) section for more details. +See [Math](/library/math) section for more details. ## Types -Fundamental types required for simulations, e.g. [sensor models](GettingStarted-Sensors). Depends on math types. +Fundamental types required for simulations, e.g. [sensor models](/getting_started/sensors). Depends on math types. ## Util @@ -73,7 +73,7 @@ int main(int argc, char* argv) # Map -All classes and functions that relate to map construction and map modifications. See [Getting Started - Maps](GettingStarted-Maps) for a introduction to map loading. Go to [Library - Maps](Library-Maps) for a more detailed descriptions of how to build Rmagine maps. +All classes and functions that relate to map construction and map modifications. See [Getting Started - Maps](/getting_started/maps) for a introduction to map loading. Go to [Library - Maps](/library/maps) for a more detailed descriptions of how to build Rmagine maps. # Simulation diff --git a/docs/resources/img/rmagine_icon.png b/docs/resources/img/rmagine_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ac5160a9c8699bc5b2f2a6b54c7de9aa8b9a6e1c GIT binary patch literal 6855 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 RZ2JkPqNu4*CubG)e*oP_3Bv#Y literal 0 HcmV?d00001 diff --git a/docs/resources/img/rmagine_logo.png b/docs/resources/img/rmagine_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..98fa01889de7cb39edde891989f72d7ddb69f1bf GIT binary patch literal 5124 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 nT)Dt^zAsEk{}10f9SKU8-}&41^EVt^