Ensenso integration for Wandelbots Nova.
This application exposes Ensenso SDK functionalities through an OpenAPI interface.
- REST API for controlling and streaming Ensenso stereo cameras
- Full integration with Wandelbots Nova ecosystem
- Preset and calibration handling
- Docker/Podman containerized deployment
- Built and managed with Poetry
- Tested via pytest
ensenso_nova/– main application code (routes, models, helpers)config/– configuration filesassets/– assets including filecams (sample camera streams) and logosbuild.sh/build.ps1– build and publish container imagesDockerfile– container definitionpoetry.toml/pyproject.toml– dependency management (Poetry)tests/– Python tests
- Nova CLI
- Poetry for Python dependency management
- Podman or Docker for building and running containers
# Install dependencies
poetry install
# Run tests
poetry run pytestYou can build the container locally with:
./build.sh # Linux/macOS
./build.ps1 # Windows PowerShellThese scripts inject version and Git metadata automatically.
To build manually:
docker build -t ensenso-nova .When running the container with a real camera, the following is required:
docker run --network=host --shm-size=256M ensenso-nova--network=host: Ensures UDP GigE Vision broadcasts from cameras reach the container. Without this, cameras cannot be discovered.--shm-size=256M: Prevents memory issues when handling high-resolution images.
Additionally, GigE Vision UDP ports must be open on your system to allow camera communication.
The OpenAPI specification is provided in openapi.json.
The image’s entrypoint is:
poetry run serve # binds 0.0.0.0:8080 (FastAPI / Uvicorn)GigE Vision requires broadcast UDP. Use host networking.
docker run --rm -it \
--network=host \
--shm-size=256M \ -e LOG_LEVEL=info \ -e ENABLE_DEBUG_ENDPOINTS=false \ -e ENSENSO_INSTALL=/opt/ensenso \ -v $(pwd)/data:/data \ ensenso-nova:local--network=hostis mandatory for camera discovery & streaming (GVCP/GVSP over UDP broadcast/unicast).-v $(pwd)/data:/datapersists captures/config (matchesapp_description.jsonstorage mount).--shm-size=256Mavoids shared memory issues for large frames.
If host networking is not possible, at minimum open/forward GigE Vision ports:
- GVCP discovery/control: UDP 3956
- GVSP streaming: UDP 49152–65535 (device dependent) Exact ranges depend on camera/driver. Host networking is the recommended and simplest setup.
| Variable | Default | Purpose |
|---|---|---|
LOG_LEVEL |
info |
Uvicorn log level. |
ENABLE_DEBUG_ENDPOINTS |
false |
Enables extra debug routes (prints a one-time API key to logs). |
ENSENSO_INSTALL |
/opt/ensenso |
Path to Ensenso SDK inside container. |
RERUN_ADDR |
(empty) | Optional host:port for rerun.io telemetry; when set the service resolves to an IP and connects. |
APP_VERSION |
(build-injected) | Version string shown in /about. |
GIT_COMMIT / GIT_TAG / GIT_BRANCH |
(build-injected) | Git metadata shown in /about and UI. |
Avoid committing secrets. If you use private registries, pass credentials via your orchestrator’s secret store or
docker login.
The service serves a minimal UI with the API at the root:
- Home / Stoplight UI:
GET /(opens interactive docs based onopenapi.json) - Cameras:
GET /cameras - Calibrations: endpoints under
/calibrations/* - Icon:
GET /app_icon.webp
Example:
curl http://localhost:8080/cameras- Server logs stream to stdout/stderr; set
LOG_LEVEL=debugwhen diagnosing. - Internal fault logs:
/tmp/fault.log(inside the container).
This distribution archive (prepared for sharing) intentionally excludes certain large or proprietary assets:
- Filecams (sample/file-based camera streams)
- Logos / brand artwork
In a full development environment these assets are present under assets/.
If you need them, add your own filecam data or logos accordingly.
Licensed under the Apache License, Version 2.0 (the "License").
You may not use this project except in compliance with the License.
See LICENSE for details.
"Ensenso" and the Ensenso logos are trademarks or registered trademarks of Optonic GmbH.
For reliable operation, always include:
--network=host
--shm-size=256M