Hephaestus#
A high-performance C++ framework for production-ready robotics development.
Overview#
Hephaestus is a C++ framework designed for deploying robotic systems in production environments. It provides essential, performance-critical functionalities while abstracting away common C++ complexities, allowing developers to focus on their robotics-specific implementation.
Unlike other robotics frameworks that prioritize rapid prototyping, Hephaestus emphasizes production-ready code with a focus on performance, stability, and simplicity.
Design Philosophy#
Production-First: Features are added only if they improve production code quality through enhanced performance, stability, or simplicity
Focused Scope: Concentrates on common infrastructure needs across robotic platforms while avoiding use-case specific implementations
C++ Abstraction: Reduces cognitive load by handling complex C++ patterns and best practices automatically
Core Features#
Current Implementation#
Hephaestus provides robust abstractions for fundamental robotics infrastructure:
Memory Management - Automated memory handling - Memory pools for efficient allocation
Concurrency - Thread pools - Parallelism primitives - Thread-safe containers for cross-thread data sharing
System Communication - Inter-Process Communication (IPC) - Data serialization for communication and storage
Performance Optimization - Real-time execution capabilities - Telemetry for system monitoring
Project Status#
Note
Many features are currently under development. Please check the issue tracker or project boards for current status.
When should you use this over ROS? Click [here](doc/comparison_to_ros.md)!
Scope Limitations#
Hephaestus intentionally excludes the following to maintain focus and allow for use-case optimization:
Data type definitions (images, point clouds, etc.)
Visualization tools
Geometric operations
Autonomy algorithms
Use-case specific implementations
This deliberate limitation allows teams to implement these features optimally for their specific robotics applications while leveraging Hephaestus’s robust infrastructure.
Dev Env#
The best way to build Hephaestus is to do it inside the docker container provided in the docker
folder. You can build and start the container with make docker-up
.
If you use VS Code, run make configure-attach-container
and then Command Palette (Ctrl+Shift+P) Dev Containers: Attach to Running Container...
-> /hephaestus-dev
Bazel#
Bazel is the official tool to build Hephaestus.
Commands#
# Build:
bazel build //modules/...
# You can also build a specific module or library by providing the path:
``bazel build //modules/ipc/...``
``bazel build //modules/ipc:zenoh_topic_list``
# Build with clang-tidy:
bazel build //modules/... --config clang-tidy``
# Run tests
bazel test //modules/...
# Format the code:
bazel run :format # fixes the formatting errors
bazel run :format.check # fails on error
# Generate ``compile_commands.json``, for VS Code ``clangd`` tool:
bazel run :refresh_compile_commands
# Run binaries:
bazel run //modules/ipc:zenoh_topic_list
# or:
./bazel-bin/modules/ipc/zenoh_topic_list
Clang-tidy Profiling#
It is possible to run clang-tidy with profiling enabled to see how long each check takes. To do that:
* in clang_tidy.bzl
uncomment line # args.add("--enable-check-profile")
* in run_clang_tidy.sh
comment current trap
command and uncomment # trap 'head -n 15 "$logfile" 1>&2' EXIT
This will print stats for each files sorted by time.
Folders#
For more details see https://bazel.build/remote/output-directories
Bazel generates three folders in the workspace:
bazel-bin
: Contains the binaries and release artifacts like debians and packagesbazel-out
: Contains build artifacts, build and test logsbazel-hephaestus
: Can be ignored
CMake#
The following sections contains all the information needed to use Hephaestus with CMake
Compilation#
Hephaestus uses CMake to build, the build infrastructure is copied and adapted from [grape](cvilas/grape).
To build it:
cd hephaestus
mkdir build && cd build
cmake --preset default ..
ninja all examples
To compile and run the unit test
ninja check
> TODO: add section on the different flags and options.
Build system#
You can use the build system of hephaestus
in your own project by importing the CMake files and recreating the required folder structure.
Create the top level CMakeLists.txt
as:
cmake_minimum_required(VERSION 3.22.1)
project(my_project LANGUAGES CXX C)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
include(FetchContent)
FetchContent_Declare(
hephaestus
GIT_REPOSITORY "https://github.com/olympus-robotics/hephaestus.git"
GIT_TAG "main"
)
FetchContent_GetProperties(hephaestus)
if(NOT hephaestus_POPULATED)
FetchContent_Populate(hephaestus)
endif()
# If you want to use hephaestus toolchain add:
# set(CMAKE_TOOLCHAIN_FILE ${hephaestus_SOURCE_DIR}/cmake/toolchains/toolchain_clang.cmake)
# Include the Cmake functions.
include(${hephaestus_SOURCE_DIR}/cmake/build.cmake)
Create the modules
folder and add your modules. You can use the hephaestus script by calling:
.. code-block:: bash
cd modules python3 ../cmake/create_module.py my_module
Create the external
folder and add a CMakeLists.txt
file as:
cmake_minimum_required(VERSION 3.27.3)
project(my_project-external LANGUAGES C CXX)
include(${CMAKE_TEMPLATE_DIR}/external.cmake)
# Add your desired dependencies:
# add_cmake_dependency(
# NAME hephaestus
# GIT_REPOSITORY "https://github.com/olympus-robotics/hephaestus.git"
# GIT_TAG "main"
# CMAKE_ARGS -DBUILD_MODULES="utils"
# )
Using Hephaestus#
There are multiple ways to use Hephaestus in your repo.
Global installation#
Install hephaestus in a known folder, e.g. /install
. When you compile your project pass -DCMAKE_PREFIX_PATH=/install
and in your CMakeLists.txt:
find_package(hephaestus REQUIRED <component1> <component2>) # e.g. find_package(hephaestus REQUIRED ipc serdes)
add_library(my-lib ...)
target_link_libraries(my-lib
PUBLIC hephaestus::ipc hephaestus::serdes
)
Use Hephaestus CMake build system#
Using Hephaestus build system build hephaestus together with your project:
add_cmake_dependency(
NAME hephaestus
GIT_REPOSITORY "https://github.com/olympus-robotics/hephaestus.git"
GIT_TAG "main"
CMAKE_ARGS -DBUILD_MODULES="utils"
)
and in your library CMakeLists.txt:
find_package(hephaestus REQUIRED <component1> <component2>) # e.g. find_package(hephaestus REQUIRED ipc serdes)
add_library(my-lib ...)
target_link_libraries(my-lib
PUBLIC hephaestus::ipc hephaestus::serdes
)
Include Hephaestus as a submodule#
Add Hephaestus as a git submodule to your project (e.g. in third_party/hephaestus
) and in the root CMakeLists.txt before adding your libraries add:
set(BUILD_MODULES "ipc;serdes") # or ``all`` if you want to build all of it.
add_subdirectory(third_party/hephaestus)
if you are using Hephaestus build system for your project you need to backup the modules list to keep it separate between the Hephaestus ones and yours:
set(hephaestus_SOURCE_DIR ${CMAKE_SOURCE_DIR}/third_party/hephaestus)
set(BUILD_MODULES_BAK ${BUILD_MODULES})
set(BUILD_MODULES "utils")
add_subdirectory(${hephaestus_SOURCE_DIR})
set(BUILD_MODULES ${BUILD_MODULES_BAK})
include(${hephaestus_SOURCE_DIR}/cmake/build.cmake)
Linting#
We’ve added shell script linting using shellcheck and docker linting using hadolint. To use this locally, add the following to your pre-commit hook file. ``` git_root=$(git rev-parse –show-toplevel)
- if result=$(git status –porcelain | grep -E ‘^[MATRC]. docker/’); then
echo “Running Hadolint” “.github/scripts/hadolint.sh”
fi
- if result=$(git status –porcelain | grep -E ‘^[MATRC].*.sh’); then
echo “Running Shellcheck” “$git_root/.github/scripts/shellcheck.sh”
Spelling#
Spell checking on source code is done using [typos](crate-ci/typos). There is a make` target for spellcheck and spellfix.
Notes#
Initially this repo was supporting C++23, but to maximize compatibility we reverted back to C++20.
When switching again back to C++23 it will be possible to remove fmt
and ranges-v3
. The transition will be easy, just rename fmt::
-> std::
and remove fmt::formatter
.
TODO#
Hephaestus is under active development. The list of tasks to be carried out can be found under the Hephaestus Masterplan project.
Development
Modules
Reference