Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
229 commits
Select commit Hold shift + click to select a range
a3e6b58
optional pybindings & migration to CMAKE_CURRENT_SOURCE_DIR
jdanieck Dec 29, 2025
fec2fe3
refactor C++ standard, switch to C++17 by default
jdanieck Dec 29, 2025
52a0be6
Replace deprecated std::bind1st in the Apollo matcher with an equival…
jdanieck Dec 29, 2025
1318ac8
introduce security_options INTERFACE
jdanieck Dec 29, 2025
7eb41d4
use project-local include paths in RobotVision tests and benchmarks
jdanieck Dec 29, 2025
4c75c41
Disable security hardening flags in Debug builds
jdanieck Dec 29, 2025
4261f36
Consume Eigen, OpenCV, OpenMP, Python via imported targets (with Open…
jdanieck Dec 29, 2025
c0e209a
general refactoring for readability
jdanieck Dec 29, 2025
25f08ed
fix cpp tests discovery
jdanieck Dec 29, 2025
ee60c7b
add tracker service cmakelists
jdanieck Dec 29, 2025
fd1c20f
add license headers
jdanieck Dec 29, 2025
b2cf311
fix trivy issues
jdanieck Dec 29, 2025
943f2fc
Merge branch 'main' into rv-cmake-refactor
jdanieck Dec 29, 2025
73b18db
copy only necessary sources
jdanieck Dec 29, 2025
7ce0ff6
refactor opencv handling
jdanieck Dec 30, 2025
cc5e55d
refactor security options handling
jdanieck Dec 30, 2025
0b6bc4e
minor cleanup
jdanieck Dec 30, 2025
f6bfe3a
add Tracker Service design documents
jdanieck Dec 30, 2025
33c0830
add build system foundation with Conan integration
jdanieck Jan 2, 2026
9515533
add code formatting with clang-format
jdanieck Jan 2, 2026
3a4d753
tracker: fix cmake preset usage and simplify clean target
jdanieck Jan 2, 2026
011c829
add debugging capability
jdanieck Jan 2, 2026
0107c5c
Logging skeleton (singleton Logger, LogEntry, structured JSON, versio…
jdanieck Jan 2, 2026
dd95a1f
debugger settings
jdanieck Jan 5, 2026
00a97ad
add basic ci
jdanieck Jan 5, 2026
c6641c0
run docker build in paralel in tracker ci
jdanieck Jan 5, 2026
fa8e078
fix docker build
jdanieck Jan 5, 2026
6af76c1
use gha cache
jdanieck Jan 5, 2026
503cfc0
empty
jdanieck Jan 5, 2026
fc0b3d8
use docker buildx to build
jdanieck Jan 5, 2026
dfdc391
empty
jdanieck Jan 5, 2026
8faa112
integrate with main compose file
jdanieck Jan 5, 2026
63fe9b3
add service tests
jdanieck Jan 5, 2026
f72abcf
split natvie build and tests
jdanieck Jan 5, 2026
ac8fae1
simplify test
jdanieck Jan 5, 2026
8e7e1b9
simplifications
jdanieck Jan 5, 2026
aafb9e1
fix ut target
jdanieck Jan 5, 2026
ab94882
new linters
jdanieck Jan 5, 2026
8903f3b
format python code
jdanieck Jan 5, 2026
7b5d7db
better reporting
jdanieck Jan 5, 2026
c3a8adb
fix docker warnings
jdanieck Jan 5, 2026
cbba1b5
better ci jobs names
jdanieck Jan 5, 2026
c4784f0
add code coverage and more tets
jdanieck Jan 5, 2026
090ef11
improve coverage report
jdanieck Jan 5, 2026
85374ab
improve coverage in ci
jdanieck Jan 5, 2026
bf4a7d1
add readme
jdanieck Jan 5, 2026
f14bcfa
add python to github hooks
jdanieck Jan 5, 2026
706768c
docs: remove ADR-0008, update references to PR #841
jdanieck Jan 5, 2026
fc7906f
Make tracker service cpu & mem limit configurable via env.
jdanieck Jan 14, 2026
5fe8ba9
Move tracker to experimental images alongside mapping and cluster_ana…
jdanieck Jan 14, 2026
f7f6557
Merge branch 'main' into tracker-service-design
jdanieck Jan 14, 2026
4b86845
Merge branch 'tracker-service-design' into tracker-service-v0.1
jdanieck Jan 14, 2026
1321e17
Parametrized Tracker image by build type.
jdanieck Jan 14, 2026
47201f5
added pipx to install-deps
jdanieck Jan 14, 2026
95aaec7
deleted docs from design branch
jdanieck Jan 14, 2026
6d9acac
fix prettier style issues
jdanieck Jan 14, 2026
3247c63
fix indent check
jdanieck Jan 14, 2026
f0d411f
fix gha linter issues
jdanieck Jan 14, 2026
00e7f05
fix scorecard warnings
jdanieck Jan 14, 2026
2231000
different approach for pip pinning by hash
jdanieck Jan 14, 2026
178acd1
add hashes to tracker service requirements.txt
jdanieck Jan 14, 2026
883509c
Revert "add hashes to tracker service requirements.txt"
jdanieck Jan 14, 2026
bae3042
Revert "different approach for pip pinning by hash"
jdanieck Jan 14, 2026
6e514e4
Revert "fix scorecard warnings"
jdanieck Jan 14, 2026
b7b305b
Merge branch 'main' into tracker-service-v0.1
jdanieck Jan 14, 2026
9ba6b82
put apt in quiet mode in Dockerfile
jdanieck Jan 14, 2026
7509310
more apt silenece
jdanieck Jan 14, 2026
af12c2f
empty (for testing)
jdanieck Jan 14, 2026
bc97297
add scope to build cache in CI
jdanieck Jan 14, 2026
5256fcb
empty (for testing)
jdanieck Jan 14, 2026
3c25ff0
empty
jdanieck Jan 15, 2026
52b0fa6
Merge branch 'main' into tracker-service-v0.1
tdorauintc Jan 15, 2026
31a8d3a
empty
jdanieck Jan 15, 2026
1906f2c
another regular layer caching instead of builtkit
jdanieck Jan 15, 2026
1be476a
empty
jdanieck Jan 15, 2026
6af9462
empty
jdanieck Jan 15, 2026
ad093db
set gha cache envs
jdanieck Jan 15, 2026
2756795
use docker/build-push-action to manage docker build and caching
jdanieck Jan 15, 2026
6f5ee58
empty
jdanieck Jan 15, 2026
759acdb
split cmake configure & build in two layers
jdanieck Jan 15, 2026
6fde5b8
Merge branch 'main' into tracker-service-v0.1
jdanieck Jan 15, 2026
3b42eea
empty
jdanieck Jan 15, 2026
14b2c97
increase code coverage
jdanieck Jan 15, 2026
a92364c
add gracefull shutdown test
jdanieck Jan 15, 2026
d4fb148
fix tests formatting
jdanieck Jan 15, 2026
1dcbdeb
Merge branch 'main' into tracker-service-v0.1
jdanieck Jan 19, 2026
3a4f780
add build dependencies on run targets
jdanieck Jan 19, 2026
c519b1b
simplify run_healthcheck_command() implementation
jdanieck Jan 19, 2026
6934bcc
remove reduntant DifferentPorts unit test
jdanieck Jan 19, 2026
912650c
validate inputs in healthcheck command
jdanieck Jan 19, 2026
74cbbc7
small refactoring in healtcheck command
jdanieck Jan 19, 2026
a1e6d5d
refactor logging test to use custom sink
jdanieck Jan 19, 2026
1737830
prettier fixes
jdanieck Jan 19, 2026
183ca17
reduce ut count from 70 to 40
jdanieck Jan 19, 2026
0e183f9
rename healthcheck to healthcheck_server
jdanieck Jan 19, 2026
3a2d3a8
build opencv from source
jdanieck Jan 19, 2026
e51f1ad
link in robotvision
jdanieck Jan 19, 2026
9913af1
link in robotvision (for image size comparision)
jdanieck Jan 19, 2026
4a8f558
Merge branch 'tracker-service-v0.1' into tracker-service-v0.1.2
jdanieck Jan 19, 2026
3a43a8b
add config file support with env overlay
jdanieck Jan 19, 2026
a04dfda
reduce tests count
jdanieck Jan 19, 2026
590c9dc
Update tracker/Dockerfile
jdanieck Jan 19, 2026
8950fe5
Update tracker/test/unit/config_loader_test.cpp
jdanieck Jan 19, 2026
9dfdf6c
minor fixes
jdanieck Jan 19, 2026
1ce6367
Merge branch 'tracker-service-v0.1.2' into tracker-service-v0.1.3
jdanieck Jan 19, 2026
4dbc96f
Merge branch 'main' into tracker-service-v0.1.2
jdanieck Jan 19, 2026
00bfc99
Merge branch 'tracker-service-v0.1.2' into tracker-service-v0.1.3
jdanieck Jan 19, 2026
68ecfb5
Merge branch 'main' into tracker-service-v0.1.2
tdorauintc Jan 20, 2026
80ea1d4
Merge branch 'main' into tracker-service-v0.1.2
tdorauintc Jan 21, 2026
7164b2b
Merge branch 'main' into tracker-service-v0.1.2
jdanieck Jan 21, 2026
df6e4f3
fix README
jdanieck Jan 21, 2026
aa307d4
update cli section in readme
jdanieck Jan 21, 2026
0f07fc3
Merge branch 'tracker-service-v0.1.2' into tracker-service-v0.1.3
jdanieck Jan 21, 2026
87c5597
Merge branch 'main' into tracker-service-v0.1.2
tdorauintc Jan 21, 2026
c8dbd44
Update tracker/README.md
jdanieck Jan 22, 2026
c7e006a
Merge branch 'main' into tracker-service-v0.1.2
jdanieck Jan 22, 2026
331819d
Merge branch 'tracker-service-v0.1.2' into tracker-service-v0.1.3
jdanieck Jan 22, 2026
f9c1c9a
Merge branch 'main' into tracker-service-v0.1.2
tdorauintc Jan 23, 2026
76bae41
Merge branch 'tracker-service-v0.1.2' into tracker-service-v0.1.3
jdanieck Jan 23, 2026
3738e2a
fix image builds in the Makefile
jdanieck Jan 23, 2026
14f1846
Merge branch 'tracker-service-v0.1.2' into tracker-service-v0.1.3
jdanieck Jan 23, 2026
9425c1c
better schema cli description
jdanieck Jan 23, 2026
ba05176
move env vars to seperate header
jdanieck Jan 23, 2026
b0b2f35
update schema & align implementation
jdanieck Jan 23, 2026
80fb06c
fix linter issues
jdanieck Jan 23, 2026
360f2fe
remove -release suffix
jdanieck Jan 23, 2026
0d8253b
Merge branch 'main' into tracker-service-v0.1.2
jdanieck Jan 23, 2026
eaa8dc6
fix ci build
jdanieck Jan 23, 2026
d544f0e
Merge branch 'tracker-service-v0.1.2' into tracker-service-v0.1.3
jdanieck Jan 23, 2026
e097c84
add debugging & profiling into README
jdanieck Jan 23, 2026
fe0f1c0
fix & improve native debugging
jdanieck Jan 23, 2026
35a1c06
fix & improve container debugging
jdanieck Jan 23, 2026
85ecff6
fix & improve profiling
jdanieck Jan 23, 2026
83fc75d
Merge branch 'main' into tracker-service-v0.1.3
jdanieck Jan 23, 2026
8256990
add mqtt connection handling
jdanieck Jan 22, 2026
d5572ad
Merge branch 'main' into tracker-service-v0.1.3
scenescapecicd Jan 23, 2026
b1ad7d4
Merge branch 'main' into tracker-service-v0.1.3
jdanieck Jan 26, 2026
e3b2f1f
fix readme
jdanieck Jan 26, 2026
f48b216
update README to the current codebase
jdanieck Jan 26, 2026
3e8a5b3
Merge branch 'tracker-service-v0.1.3' into tracker-service-v0.2.0
jdanieck Jan 26, 2026
155af01
add mqtt helper targets to the makefile
jdanieck Jan 26, 2026
d97c171
more env overrides, simplify tests
jdanieck Jan 26, 2026
e875554
add broker targets for manual validation
jdanieck Jan 26, 2026
b51bbdc
Merge branch 'main' into tracker-service-v0.1.3
tdorauintc Jan 26, 2026
9860553
git commit rename ssl to tls
jdanieck Jan 26, 2026
d007517
prettier fixes
jdanieck Jan 26, 2026
d4e1c98
Merge branch 'main' into tracker-service-v0.1.3
tdorauintc Jan 26, 2026
4e3ac7d
shorten service tests
jdanieck Jan 27, 2026
b80965e
fix hadolint warnings
jdanieck Jan 27, 2026
3fa7ba2
simplify ScopedEnv implementation
jdanieck Jan 27, 2026
81cab58
simplify config loader by using JSON paths
jdanieck Jan 27, 2026
e271150
Merge branch 'main' into tracker-service-v0.1.3
jdanieck Jan 27, 2026
f07700a
Merge branch 'tracker-service-v0.1.3' into tracker-service-v0.2.0
jdanieck Jan 27, 2026
910f38e
add ssl tests
jdanieck Jan 27, 2026
026aeca
simplify tests
jdanieck Jan 27, 2026
95c6a0f
test cleanup
jdanieck Jan 27, 2026
0d00d1c
Merge branch 'main' into tracker-service-v0.2.0
jdanieck Jan 27, 2026
c352dfc
remove simdjson
jdanieck Jan 27, 2026
2954661
Merge branch 'main' into tracker-service-v0.2.0
jdanieck Jan 28, 2026
ec6f467
improve coverage
jdanieck Jan 28, 2026
df3ee95
treat empty vars as unset
jdanieck Jan 28, 2026
2bed405
exclude mqtt client from ut coverage
jdanieck Jan 28, 2026
16144c1
reduce ut count
jdanieck Jan 28, 2026
c903d47
configure Tracker Service in docker compose
jdanieck Jan 28, 2026
bbb44b0
remove dead code
jdanieck Jan 28, 2026
b5d077d
fix default schema dir
jdanieck Jan 28, 2026
6836f92
remove hardcoded number
jdanieck Jan 28, 2026
2a65b86
remove redundant file
jdanieck Jan 28, 2026
06b1b70
fix broker-start target
jdanieck Jan 28, 2026
d43e929
use json ptr in message handler
jdanieck Jan 28, 2026
27ddbae
fix multiple topics subscription on down broker
jdanieck Jan 28, 2026
eddcb1d
unset proxy contidionally
jdanieck Jan 28, 2026
75d7246
use dynamic broker ports in service tests
jdanieck Jan 28, 2026
08f2c63
fix uts
jdanieck Jan 28, 2026
572ee77
Merge branch 'main' into tracker-service-v0.2.0
jdanieck Jan 29, 2026
24f2f09
add scenes handling
jdanieck Jan 29, 2026
4fef31b
subscribe only to configured camers
jdanieck Jan 29, 2026
d171440
simplify config loader
jdanieck Jan 29, 2026
1c3cd04
fix formatting
jdanieck Jan 29, 2026
a61bc32
fix tracker configuration in compose sample
jdanieck Jan 29, 2026
0b47732
Merge branch 'tracker-service-v0.2.0' into tracker-service-v0.3.0
jdanieck Jan 29, 2026
ac63461
better logs
jdanieck Jan 29, 2026
4505cba
Merge branch 'main' into tracker-service-v0.2.0
tdorauintc Jan 29, 2026
3a05800
Merge branch 'tracker-service-v0.2.0' into tracker-service-v0.3.0
jdanieck Jan 30, 2026
4689a26
improve logs
jdanieck Jan 30, 2026
df36e44
fix missing git commit in container logs
jdanieck Jan 30, 2026
9f2f094
clarify comment
jdanieck Jan 30, 2026
9dd5463
more tests
jdanieck Jan 30, 2026
f209c9c
optimize hot path
jdanieck Jan 30, 2026
bd58c54
unsubscribe from topic on mqtt handler stop
jdanieck Jan 30, 2026
e78ac29
optimize handleCameraMessage
jdanieck Jan 30, 2026
d9eeee9
optimize extractCameraId
jdanieck Jan 30, 2026
bf53951
optimize parseCameraMessage()
jdanieck Feb 2, 2026
40e2574
remove redundant comments
jdanieck Feb 2, 2026
01b7543
remove reduntant comment
jdanieck Feb 2, 2026
7057175
refactor proxy handling
jdanieck Feb 2, 2026
63cd848
fix mqtt client race
jdanieck Feb 2, 2026
6447c03
fix exponential backoff precission
jdanieck Feb 2, 2026
cad2658
fix backoff ut
jdanieck Feb 2, 2026
ed4cedd
Merge branch 'tracker-service-v0.2.0' into tracker-service-v0.3.0
jdanieck Feb 2, 2026
601e3af
fix the build
jdanieck Feb 2, 2026
6038bdd
Merge branch 'main' into tracker-service-v0.2.0
dmytroye Feb 2, 2026
aa1e880
fix mqtt reconnect
jdanieck Feb 2, 2026
da774dc
Merge branch 'tracker-service-v0.2.0' into tracker-service-v0.3.0
jdanieck Feb 2, 2026
d3ba96b
Merge branch 'main' into tracker-service-v0.3.0
jdanieck Feb 3, 2026
b329f22
Merge branch 'main' into tracker-service-v0.3.0
jdanieck Feb 3, 2026
ac5e73e
Merge branch 'main' into tracker-service-v0.3.0
jdanieck Feb 3, 2026
120969e
Merge branch 'main' into tracker-service-v0.3.0
saratpoluri Feb 3, 2026
653fc22
Merge branch 'main' into tracker-service-v0.3.0
saratpoluri Feb 3, 2026
9f06f3c
add extrinsics to the scene schema
jdanieck Feb 4, 2026
e4ba5b2
scene config in seperate file
jdanieck Feb 4, 2026
033d5b7
require scene source config
jdanieck Feb 4, 2026
e78c97c
extract scenes config loading to separate class
jdanieck Feb 4, 2026
9bcb2b7
Merge branch 'main' into tracker-service-v0.3.0
jdanieck Feb 5, 2026
7852c65
validate topics for restricted characters
jdanieck Feb 5, 2026
5eee1f5
validate categories for restricted characters
jdanieck Feb 5, 2026
ef7292a
Merge branch 'main' into tracker-service-v0.3.0
jdanieck Feb 5, 2026
d769660
remove duplicate log
jdanieck Feb 5, 2026
1b806db
extract json helper
jdanieck Feb 5, 2026
6926723
catch generic exception
jdanieck Feb 5, 2026
efa2bdb
revert WAs in .gitignore
jdanieck Feb 5, 2026
0e50eb4
fix testscase description
jdanieck Feb 5, 2026
789afcd
optimize message handler
jdanieck Feb 5, 2026
34e13e1
improve logs
jdanieck Feb 5, 2026
c687b2b
fix service test
jdanieck Feb 5, 2026
841c676
Merge branch 'main' into tracker-service-v0.3.0
jdanieck Feb 5, 2026
262d412
make categories validation thread safe
jdanieck Feb 5, 2026
39c4674
Merge branch 'main' into tracker-service-v0.3.0
scenescapecicd Feb 5, 2026
bcc9f05
Merge branch 'main' into tracker-service-v0.3.0
scenescapecicd Feb 5, 2026
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
16 changes: 7 additions & 9 deletions tracker/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,9 @@ string(STRIP "${VERSION_CONTENT}" SCENESCAPE_VERSION)
# Extract major.minor.patch (strip any suffix like -dev)
string(REGEX MATCH "^[0-9]+\\.[0-9]+\\.[0-9]+" VERSION_SEMVER "${SCENESCAPE_VERSION}")

# Git commit hash: can be passed via -DGIT_COMMIT or GIT_COMMIT env var at build time
set(GIT_COMMIT "" CACHE STRING "Git commit hash (optional at configure, can use GIT_COMMIT env var at build)")
if(GIT_COMMIT)
message(STATUS "Tracker version: ${SCENESCAPE_VERSION} (${GIT_COMMIT})")
else()
message(STATUS "Tracker version: ${SCENESCAPE_VERSION} (GIT_COMMIT will be read from env at build time)")
endif()
# Git commit hash: passed via -DGIT_COMMIT at configure time
set(GIT_COMMIT "" CACHE STRING "Git commit hash")
message(STATUS "Tracker version: ${SCENESCAPE_VERSION} (commit: ${GIT_COMMIT})")

#####################################################################
# Project
Expand Down Expand Up @@ -73,11 +69,14 @@ set(PROJECT_SOURCE_LIST
${CMAKE_CURRENT_SOURCE_DIR}/src/logger.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/cli.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/config_loader.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/scene_loader.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/healthcheck_server.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/healthcheck_command.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/mqtt_client.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/message_handler.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/scene_registry.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/proxy_utils.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/topic_utils.cpp
)

add_executable(${PROJECT_NAME}
Expand All @@ -94,12 +93,11 @@ target_include_directories(${PROJECT_NAME}
)

# Inject version info as compile definitions
# GIT_COMMIT: use CMake variable if set, otherwise read from environment at build time
target_compile_definitions(${PROJECT_NAME}
PRIVATE
TRACKER_SERVICE_NAME="${PROJECT_NAME}"
TRACKER_SERVICE_VERSION="${SCENESCAPE_VERSION}"
$<IF:$<BOOL:${GIT_COMMIT}>,TRACKER_GIT_COMMIT="${GIT_COMMIT}",TRACKER_GIT_COMMIT="$ENV{GIT_COMMIT}">
TRACKER_GIT_COMMIT="${GIT_COMMIT}"
)

target_link_libraries(${PROJECT_NAME}
Expand Down
8 changes: 4 additions & 4 deletions tracker/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -47,15 +47,15 @@ COPY tracker/src tracker/src
COPY tracker/inc tracker/inc
COPY controller/src/robot_vision controller/src/robot_vision

# Configure (cacheable - no GIT_COMMIT dependency)
# Configure and build
ARG GIT_COMMIT=unknown
RUN cmake -S tracker -B build -G Ninja \
-DCMAKE_TOOLCHAIN_FILE=/scenescape/build/conan_toolchain.cmake \
-DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
-DGIT_COMMIT=${GIT_COMMIT} \
-DBUILD_TESTS=OFF

# Build (GIT_COMMIT passed via env var, only recompiles version-dependent files)
ARG GIT_COMMIT=unknown
RUN GIT_COMMIT=${GIT_COMMIT} cmake --build build -j
RUN cmake --build build -j

# Collect all runtime library dependencies for the tracker binary
WORKDIR /scenescape/runtime-libs
Expand Down
94 changes: 94 additions & 0 deletions tracker/config/scenes.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
[
{
"uid": "302cf49a-97ec-402d-a324-c5077b280b7b",
"name": "Queuing",
"cameras": [
{
"uid": "atag-qcam1",
"name": "atag-qcam1",
"intrinsics": {
"fx": 905.0,
"fy": 905.0,
"cx": 640.0,
"cy": 360.0,
"distortion": { "k1": 0.0, "k2": 0.0, "p1": 0.0, "p2": 0.0 }
},
"extrinsics": {
"translation": [
2.985857104493509, 0.2054078898442529, 2.7150546825598902
],
"rotation": [
-135.08718965001765, 12.682032394455131, 19.24508172546946
],
"scale": [1.0, 1.0, 1.0]
}
},
{
"uid": "atag-qcam2",
"name": "atag-qcam2",
"intrinsics": {
"fx": 905.0,
"fy": 905.0,
"cx": 640.0,
"cy": 360.0,
"distortion": { "k1": 0.0, "k2": 0.0, "p1": 0.0, "p2": 0.0 }
},
"extrinsics": {
"translation": [
-0.6544951215349519, 2.8628274940885503, 2.894955006060443
],
"rotation": [
-150.5988934259539, 42.35138027480063, 52.29263795544898
],
"scale": [1.0, 1.0, 1.0]
}
}
]
},
{
"uid": "3bc091c7-e449-46a0-9540-29c499bca18c",
"name": "Retail",
"cameras": [
{
"uid": "camera1",
"name": "camera1",
"intrinsics": {
"fx": 571.2592026968458,
"fy": 571.2592026968458,
"cx": 320.0,
"cy": 240.0,
"distortion": { "k1": 0.0, "k2": 0.0, "p1": 0.0, "p2": 0.0 }
},
"extrinsics": {
"translation": [
2.6651330996559883, 1.0075648853123316, 2.603863333755973
],
"rotation": [
-137.85924651441334, -19.441505783168942, -15.384890268257454
],
"scale": [1.0, 1.0, 1.0]
}
},
{
"uid": "camera2",
"name": "camera2",
"intrinsics": {
"fx": 571.2592026968458,
"fy": 571.2592026968458,
"cx": 320.0,
"cy": 240.0,
"distortion": { "k1": 0.0, "k2": 0.0, "p1": 0.0, "p2": 0.0 }
},
"extrinsics": {
"translation": [
4.034863921795162, 2.2777663107089894, 2.9551143733918663
],
"rotation": [
-132.15360745910087, -8.172752500708558, -5.298590495090165
],
"scale": [1.0, 1.0, 1.0]
}
}
]
}
]
4 changes: 4 additions & 0 deletions tracker/config/tracker.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,9 @@
"logging": {
"level": "info"
}
},
"scenes": {
"source": "file",
"file_path": "scenes.json"
}
}
8 changes: 8 additions & 0 deletions tracker/inc/config_loader.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,12 @@

#pragma once

#include "scene_loader.hpp"

#include <filesystem>
#include <optional>
#include <string>
#include <vector>

namespace tracker {

Expand Down Expand Up @@ -74,6 +77,7 @@ struct ObservabilityConfig {
struct ServiceConfig {
InfrastructureConfig infrastructure;
ObservabilityConfig observability;
ScenesConfig scenes;
};

/// JSON Pointer paths (RFC6901) for extracting ServiceConfig values
Expand All @@ -93,6 +97,10 @@ constexpr char INFRASTRUCTURE_MQTT_TLS_CLIENT_CERT_PATH[] =
constexpr char INFRASTRUCTURE_MQTT_TLS_CLIENT_KEY_PATH[] =
"/infrastructure/mqtt/tls/client_key_path";
constexpr char INFRASTRUCTURE_MQTT_TLS_VERIFY_SERVER[] = "/infrastructure/mqtt/tls/verify_server";

// Scenes
constexpr char SCENES_SOURCE[] = "/scenes/source";
constexpr char SCENES_FILE_PATH[] = "/scenes/file_path";
} // namespace json

/**
Expand Down
58 changes: 58 additions & 0 deletions tracker/inc/json_utils.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
// SPDX-FileCopyrightText: 2026 Intel Corporation
// SPDX-License-Identifier: Apache-2.0

#pragma once

#include <optional>
#include <stdexcept>
#include <string>

#include <rapidjson/pointer.h>
#include <rapidjson/rapidjson.h>

namespace tracker::detail {

/**
* @brief Get optional value from JSON using pointer path.
* @tparam T Expected value type (std::string or double)
* @param doc The JSON value to query
* @param pointer JSON pointer path (e.g., "/intrinsics/fx")
* @return Optional containing value if found and correct type, nullopt otherwise
*/
template <typename T>
std::optional<T> get_value(const rapidjson::Value& doc, const char* pointer) {
rapidjson::Pointer ptr(pointer);
if (auto* val = ptr.Get(doc)) {
if constexpr (std::is_same_v<T, std::string>) {
if (val->IsString()) {
return std::string(val->GetString());
}
} else if constexpr (std::is_same_v<T, double>) {
if (val->IsNumber()) {
return val->GetDouble();
}
}
}
return std::nullopt;
}

/**
* @brief Get required value from JSON using pointer path.
* @tparam T Expected value type (std::string or double)
* @param doc The JSON value to query
* @param pointer JSON pointer path (e.g., "/uid")
* @param context Context string for error messages (e.g., "scene", "camera")
* @return Value if found and correct type
* @throws std::runtime_error if value missing or wrong type
*/
template <typename T>
T require_value(const rapidjson::Value& doc, const char* pointer, const char* context) {
auto result = get_value<T>(doc, pointer);
if (!result.has_value()) {
throw std::runtime_error(std::string(context) + " missing required '" + (pointer + 1) +
"' field");
}
return result.value();
}

} // namespace tracker::detail
35 changes: 22 additions & 13 deletions tracker/inc/message_handler.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,16 @@

#include "config_loader.hpp"
#include "mqtt_client.hpp"
#include "scene_registry.hpp"

#include <atomic>
#include <filesystem>
#include <map>
#include <memory>
#include <mutex>
#include <optional>
#include <string>
#include <unordered_set>
#include <vector>

#include <rapidjson/document.h>
Expand Down Expand Up @@ -60,29 +63,28 @@ struct CameraMessage {
*/
class MessageHandler {
public:
/// Topic for camera detections (wildcard subscription)
static constexpr const char* TOPIC_CAMERA_DATA = "scenescape/data/camera/+";
/// Topic prefix for camera detections (used to build per-camera subscriptions)
static constexpr const char* TOPIC_CAMERA_PREFIX = "scenescape/data/camera/";

/// Topic pattern for camera subscriptions (format with camera_id)
static constexpr const char* TOPIC_CAMERA_SUBSCRIBE_PATTERN = "scenescape/data/camera/{}";

/// Topic pattern for scene output (format with scene_id and thing_type)
static constexpr const char* TOPIC_SCENE_DATA_PATTERN = "scenescape/data/scene/{}/{}";

/// Default scene ID for dummy output
static constexpr const char* DUMMY_SCENE_ID = "dummy-scene";

/// Default scene name for dummy output
static constexpr const char* DUMMY_SCENE_NAME = "Test Scene";

/// Default thing type for dummy output
static constexpr const char* DUMMY_THING_TYPE = "thing";
/// Default thing type for output (category from detection)
static constexpr const char* DEFAULT_THING_TYPE = "thing";

/**
* @brief Construct message handler with MQTT client.
* @brief Construct message handler with MQTT client and scene registry.
*
* @param mqtt_client Shared pointer to MQTT client interface
* @param scene_registry Reference to scene registry for camera-to-scene lookup
* @param schema_validation Enable JSON schema validation for messages
* @param schema_dir Directory containing schema files (for validation)
*/
explicit MessageHandler(std::shared_ptr<IMqttClient> mqtt_client, bool schema_validation = true,
explicit MessageHandler(std::shared_ptr<IMqttClient> mqtt_client,
const SceneRegistry& scene_registry, bool schema_validation = true,
const std::filesystem::path& schema_dir = "/scenescape/schema");

/**
Expand Down Expand Up @@ -138,10 +140,11 @@ class MessageHandler {
/**
* @brief Build dummy scene output message using rapidjson.
*
* @param scene Scene configuration
* @param timestamp ISO 8601 timestamp from input message
* @return JSON string conforming to scene-data.schema.json
*/
std::string buildDummySceneMessage(const std::string& timestamp);
std::string buildDummySceneMessage(const Scene& scene, const std::string& timestamp);

/**
* @brief Validate JSON against a schema.
Expand All @@ -163,13 +166,19 @@ class MessageHandler {
loadSchema(const std::filesystem::path& schema_path);

std::shared_ptr<IMqttClient> mqtt_client_;
const SceneRegistry& scene_registry_;
bool schema_validation_;
std::unique_ptr<rapidjson::SchemaDocument> camera_schema_;
std::unique_ptr<rapidjson::SchemaDocument> scene_schema_;

std::atomic<int> received_count_{0};
std::atomic<int> published_count_{0};
std::atomic<int> rejected_count_{0};

/// Cache of validated category names (validated once on first use)
/// Protected by categories_mutex_ for thread-safe access from MQTT callback
mutable std::mutex categories_mutex_;
std::unordered_set<std::string> validated_categories_;
};

} // namespace tracker
Loading
Loading