Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
115 changes: 115 additions & 0 deletions .github/workflows/test-ego-software.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

name: Test EGO Software

on:
push:
branches: [main, 'release/*.*.x', feature/Orbbec-Ego-stereo-camera, feature/Orbbec-EgoPro-quad-camera]
paths: &ego_paths
- '.github/workflows/test-ego-software.yaml'
- 'CMakeLists.txt'
- 'pyproject.toml'
- 'cmake/**'
- 'src/plugins/CMakeLists.txt'
- 'src/plugins/ego/**'
- 'src/core/schema/**'
- 'src/core/codegen/**'
- 'src/core/mcap/**'
- 'src/core/deviceio_base/**'
- 'src/core/deviceio_session/**'
- 'src/core/deviceio_trackers/**'
- 'src/core/live_trackers/**'
- 'src/core/replay_trackers/**'
- 'src/core/plugin_manager/**'
- 'src/core/python/**'
- 'src/compat/**'
- 'src/python/isaaccapture/**'
- 'examples/camera_viz/**'
- 'examples/mcap_record_replay/**'
- 'tests/**'
pull_request:
paths: *ego_paths
workflow_dispatch:

concurrency:
group: ego-software-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

permissions:
contents: read

jobs:
test-ego-software:
# The SDK runner must never execute untrusted fork code.
if: >-
github.event_name != 'pull_request'
|| github.event.pull_request.head.repo.full_name == github.repository
# Verify repository/workflow access and an online runner with all labels.
# A blocked or unassigned job provides no build or test result.
runs-on: [self-hosted, linux, orbbec-sdk]
timeout-minutes: 45
env:
ORBBEC_SDK_ROOT: ${{ vars.ORBBEC_SDK_ROOT }}
UV_CACHE_DIR: /tmp/isaaccapture-ego-uv-cache

steps:
- uses: actions/checkout@v6
with:
persist-credentials: false

- name: Install pinned uv
uses: ./.github/actions/setup-uv

- name: Check runner SDK
shell: bash
run: |
set -euo pipefail
if [[ -z "${ORBBEC_SDK_ROOT}" ]]; then
echo "Set the protected ORBBEC_SDK_ROOT Actions variable for the orbbec-sdk runner."
exit 1
fi
for required in \
"${ORBBEC_SDK_ROOT}/include/libobsensor/ObSensor.hpp" \
"${ORBBEC_SDK_ROOT}/lib/OrbbecSDKConfig.cmake" \
"${ORBBEC_SDK_ROOT}/lib/libOrbbecSDK.so.2"; do
[[ -f "${required}" ]] || { echo "Missing Orbbec SDK file: ${required}"; exit 1; }
done
printf 'EGO_BUILD_DIR=%s\n' "${RUNNER_TEMP}/ego-software-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}" >> "${GITHUB_ENV}"

- name: Configure and build
shell: bash
run: |
set -euo pipefail
env -u PYTHONPATH -u AMENT_PREFIX_PATH -u COLCON_PREFIX_PATH \
cmake -S . -B "${EGO_BUILD_DIR}" \
-DISAAC_TELEOP_PYTHON_VERSION=3.11 \
-DBUILD_VIZ=OFF \
-DBUILD_TESTING=ON \
-DBUILD_PLUGIN_EGO_CAMERA=ON \
-DORBBEC_SDK_ROOT="${ORBBEC_SDK_ROOT}"
cmake --build "${EGO_BUILD_DIR}" --parallel 4

- name: Run hardware-free EGO tests
shell: bash
run: |
set -euo pipefail
env -u PYTHONPATH -u AMENT_PREFIX_PATH -u COLCON_PREFIX_PATH \
ctest --test-dir "${EGO_BUILD_DIR}" --output-on-failure --parallel 4 \
--no-tests=error -R '[Ee][Gg][Oo]'

- name: Run full software suite
shell: bash
run: |
set -euo pipefail
env -u PYTHONPATH -u AMENT_PREFIX_PATH -u COLCON_PREFIX_PATH \
ctest --test-dir "${EGO_BUILD_DIR}" --output-on-failure --parallel 4

- name: Upload CTest failure logs
if: failure()
uses: actions/upload-artifact@v6
with:
name: ego-software-ctest-logs
path: ${{ env.EGO_BUILD_DIR }}/Testing/Temporary
if-no-files-found: warn
retention-days: 14
15 changes: 15 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,17 @@
# macOS
.DS_Store

# Local editor state and runtime logs
/.vscode/
/Log/

# External Orbbec SDK downloads and extracts
OrbbecSDK*/
OrbbecSDK*.zip
OrbbecSDK*.tar.gz
OrbbecSDK*.tgz
OrbbecSDK*.7z

# Node.js
node_modules/
package-lock.json
Expand All @@ -25,6 +36,9 @@ __pycache__/
*.pyc
*.pyo
*.pyd
.ruff_cache/
.pytest_cache/
.mypy_cache/
# Python virtual environments
.venv/
venv/
Expand All @@ -37,6 +51,7 @@ uv.lock
# Compiled files
*.o
*.so
*.so.*
*.a
*.exe

Expand Down
2 changes: 2 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ endif()
option(BUILD_PLUGINS "Build plugins" ON)
option(BUILD_PYTHON_BINDINGS "Build Python bindings" ON)
option(BUILD_PLUGIN_OAK_CAMERA "Build OAK camera plugin (requires vcpkg for DepthAI v3.x)" OFF)
option(BUILD_PLUGIN_EGO_CAMERA "Build EGO camera plugin (requires Orbbec SDK v2)" OFF)
option(BUILD_EGO_MEDIA_TOOLS "Build SDK-free EGO MCAP media tools" OFF)
option(BUILD_PLUGIN_NOITOM_MOCAP "Build Noitom mocap plugin (downloads MocapApi SDK)" OFF)
option(BUILD_PLUGIN_OGLO "Build OGLO tactile glove plugin (BLE, Linux only; fetches SimpleBLE + nlohmann/json)" OFF)
option(BUILD_PLUGIN_WUJI_GLOVE "Build Wuji glove plugin (requires the wuji_sdk C SDK)" OFF)
Expand Down
1 change: 1 addition & 0 deletions docs/source/device/cameras/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@ camera feeds to clients, see :doc:`/references/camera_streaming`.
:titlesonly:

oak
../ego
Loading
Loading