Skip to content

Commit 61df3b2

Browse files
Józef Danieckitdorauintcltalarcz
authored
Tracker Service v0.4: scene config dynamic loading & update (#1009)
Co-authored-by: Tomasz Dorau <tomasz.dorau@intel.com> Co-authored-by: Lukasz Talarczyk <lukasz.talarczyk@intel.com>
1 parent 02ea78b commit 61df3b2

37 files changed

Lines changed: 2943 additions & 153 deletions

controller/src/robot_vision/src/rv/tracking/ObjectMatching.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111
#include "rv/apollo/secure_matrix.hpp"
1212
#include "rv/tracking/Classification.hpp"
1313

14-
#include <iostream>
15-
1614
namespace rv {
1715
namespace tracking {
1816

controller/src/robot_vision/src/rv/tracking/TrackManager.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
#include "rv/Utils.hpp"
55
#include "rv/tracking/TrackManager.hpp"
6-
#include <iostream>
76
#include <omp.h>
87

98
namespace rv {
@@ -354,10 +353,6 @@ void TrackManager::updateTrackerConfig(int camera_frame_rate)
354353
mConfig.mMaxNumberOfUnreliableFrames = std::ceil(camera_frame_rate*mConfig.mMaxUnreliableTime);
355354
mConfig.mNonMeasurementFramesDynamic = std::ceil(camera_frame_rate*mConfig.mNonMeasurementTimeDynamic);
356355
mConfig.mNonMeasurementFramesStatic = std::ceil(camera_frame_rate*mConfig.mNonMeasurementTimeStatic);
357-
std::cout << "Updated parameters for reference camera frame rate = " << camera_frame_rate << "fps" << std::endl;
358-
std::cout << "max_unreliable_frames = " << mConfig.mMaxNumberOfUnreliableFrames << std::endl;
359-
std::cout << "non_measurement_frames_dynamic = " << mConfig.mNonMeasurementFramesDynamic << std::endl;
360-
std::cout << "non_measurement_frames_static = " << mConfig.mNonMeasurementFramesStatic << std::endl;
361356
}
362357

363358
} // namespace tracking

docs/design/tracker-service.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,10 @@ graph LR
7171

7272
**Topics Subscribed:**
7373

74-
| Topic | Description |
75-
| ------------------------------- | ---------------------------------------------------------------------------- |
76-
| `scenescape/data/camera/+` | Detection messages from AI pipeline with bounding boxes in pixel coordinates |
77-
| `scenescape/cmd/scene/update/+` | Config change notifications from Manager API (dynamic mode only) |
74+
| Topic | Description |
75+
| -------------------------- | ---------------------------------------------------------------------------- |
76+
| `scenescape/data/camera/+` | Detection messages from AI pipeline with bounding boxes in pixel coordinates |
77+
| `scenescape/cmd/database` | Database change notifications from Manager API (dynamic mode only) |
7878

7979
**Detection Message:**
8080

@@ -179,8 +179,9 @@ Scenes fetched from Manager API at startup:
179179

180180
- Set `scenes.source: "api"` or omit `scenes` section (defaults to API mode)
181181
- Requires `infrastructure.manager` with API URL and credentials
182-
- Subscribes to `scenescape/cmd/scene/update/{scene_id}` for change notifications
182+
- Subscribes to `scenescape/cmd/database` for change notifications
183183
- On notification: logs change, exits gracefully (Docker restarts the service which loads new config at startup)
184+
- Fires on any database change: scene create/update/delete, camera changes, region edits, etc.
184185
- Suitable for multi-node deployments with centralized scene management
185186

186187
### Observability

sample_data/docker-compose-dl-streamer-example.yml

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ secrets:
2626
file: ${SECRETSDIR}/django
2727
controller.auth:
2828
environment: CONTROLLER_AUTH
29+
controller-auth-file:
30+
file: manager/secrets/controller.auth
2931
browser.auth:
3032
file: ${SECRETSDIR}/browser.auth
3133
calibration.auth:
@@ -458,13 +460,19 @@ services:
458460
depends_on:
459461
broker:
460462
condition: service_started
463+
web:
464+
condition: service_healthy
461465
environment:
462466
- TRACKER_LOG_LEVEL=info
463467
- TRACKER_MQTT_HOST=broker.scenescape.intel.com
464468
- TRACKER_MQTT_PORT=1883
465469
- TRACKER_MQTT_INSECURE=false
466470
- TRACKER_MQTT_TLS_CA_CERT=/run/secrets/certs/scenescape-ca.pem
467471
- TRACKER_MQTT_TLS_VERIFY_SERVER=true
472+
- TRACKER_MANAGER_URL=https://web.scenescape.intel.com
473+
- TRACKER_MANAGER_AUTH_PATH=/run/secrets/controller.auth
474+
- TRACKER_MANAGER_CA_CERT_PATH=/run/secrets/certs/scenescape-ca.pem
475+
- TRACKER_SCENES_SOURCE=api
468476
# Override host proxy settings - Paho MQTT dont respect no_proxy var, so as a WA
469477
# tracker code detects empty vars and unsets them (see mqtt_client.cpp clearEmptyProxyVars)
470478
- http_proxy=
@@ -474,12 +482,17 @@ services:
474482
secrets:
475483
- source: root-cert
476484
target: certs/scenescape-ca.pem
485+
- source: controller-auth-file
486+
target: /run/secrets/controller.auth
477487
read_only: true
478488
cap_drop:
479489
- ALL
480490
security_opt:
481491
- no-new-privileges:true
482-
restart: always
492+
# Exit 0: graceful stop or non-retryable error (bad auth) — stay stopped
493+
# Exit 1: retryable error (broker unavailable) — restart
494+
# Exit 99: scene update received — restart to reload config
495+
restart: on-failure
483496
mem_limit: ${TRACKER_MEM_LIMIT:-512m}
484497
# Scale: ~1 CPU per 100 tracked objects. Increase TRACKER_CPUS for larger deployments.
485498
cpus: ${TRACKER_CPUS:-2.0}

tracker/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ find_package(CLI11 REQUIRED)
4343
find_package(httplib REQUIRED)
4444
find_package(RapidJSON REQUIRED)
4545
find_package(PahoMqttCpp REQUIRED)
46+
find_package(OpenSSL REQUIRED)
4647

4748
#####################################################################
4849
# System-provided packages
@@ -76,6 +77,8 @@ set(PROJECT_SOURCE_LIST
7677
${CMAKE_CURRENT_SOURCE_DIR}/src/cli.cpp
7778
${CMAKE_CURRENT_SOURCE_DIR}/src/config_loader.cpp
7879
${CMAKE_CURRENT_SOURCE_DIR}/src/scene_loader.cpp
80+
${CMAKE_CURRENT_SOURCE_DIR}/src/api_scene_loader.cpp
81+
${CMAKE_CURRENT_SOURCE_DIR}/src/manager_rest_client.cpp
7982
${CMAKE_CURRENT_SOURCE_DIR}/src/coordinate_transformer.cpp
8083
${CMAKE_CURRENT_SOURCE_DIR}/src/healthcheck_server.cpp
8184
${CMAKE_CURRENT_SOURCE_DIR}/src/healthcheck_command.cpp
@@ -122,6 +125,8 @@ target_link_libraries(${PROJECT_NAME}
122125
httplib::httplib
123126
rapidjson
124127
PahoMqttCpp::paho-mqttpp3-static
128+
OpenSSL::SSL
129+
OpenSSL::Crypto
125130
)
126131

127132
#####################################################################

tracker/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ format-python:
7575
echo "autopep8 not found. Install: pip install autopep8"; \
7676
exit 1; \
7777
fi
78-
@cd test/service && autopep8 --in-place --indent-size=2 --max-line-length=120 *.py
78+
@cd test/service && autopep8 --in-place --indent-size=2 --max-line-length=120 *.py mocks/*.py
7979
@echo "✓ Python files formatted"
8080

8181
install-hooks:
@@ -111,7 +111,7 @@ lint-python:
111111
echo "autopep8 not found. Install: pip install autopep8"; \
112112
exit 1; \
113113
fi
114-
@cd test/service && autopep8 --diff --exit-code --indent-size=2 --max-line-length=120 *.py && echo "✓ Python lint passed"
114+
@cd test/service && autopep8 --diff --exit-code --indent-size=2 --max-line-length=120 *.py mocks/*.py && echo "✓ Python lint passed"
115115

116116
lint-trivy:
117117
@echo "Running Trivy security scan..."

tracker/conanfile.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ CMakeDeps
1717
CMakeToolchain
1818

1919
[options]
20-
cpp-httplib/*:with_openssl=False
20+
cpp-httplib/*:with_openssl=True
2121
opencv/*:shared=True
2222
opencv/*:tracking=True
2323
opencv/*:video=True

tracker/config/tracker.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
"healthcheck": {
1414
"port": 8080
1515
}
16+
},
17+
"manager": {
18+
"url": "https://web.scenescape.intel.com",
19+
"auth_path": "/run/secrets/controller.auth"
1620
}
1721
},
1822
"observability": {
@@ -29,7 +33,6 @@
2933
"non_measurement_time_static_s": 1.6
3034
},
3135
"scenes": {
32-
"source": "file",
33-
"file_path": "scenes.json"
36+
"source": "api"
3437
}
3538
}

tracker/inc/config_loader.hpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
#pragma once
55

6-
#include "scene_loader.hpp"
6+
#include "scenes_config.hpp"
77

88
#include <filesystem>
99
#include <optional>
@@ -47,12 +47,22 @@ struct TrackerConfig {
4747
bool schema_validation = true;
4848
};
4949

50+
/**
51+
* @brief Manager REST API connection settings.
52+
*/
53+
struct ManagerConfig {
54+
std::string url; ///< Manager API base URL
55+
std::string auth_path; ///< Path to JSON auth file {user, password}
56+
std::optional<std::string> ca_cert_path; ///< CA cert for HTTPS verification
57+
};
58+
5059
/**
5160
* @brief External service connections.
5261
*/
5362
struct InfrastructureConfig {
5463
MqttConfig mqtt;
5564
TrackerConfig tracker;
65+
std::optional<ManagerConfig> manager; ///< Required when scenes.source='api'
5666
};
5767

5868
/**
@@ -134,6 +144,12 @@ constexpr char TRACKING_NON_MEASUREMENT_TIME_DYNAMIC_S[] =
134144
"/tracking/non_measurement_time_dynamic_s";
135145
constexpr char TRACKING_NON_MEASUREMENT_TIME_STATIC_S[] = "/tracking/non_measurement_time_static_s";
136146

147+
// Manager
148+
constexpr char INFRASTRUCTURE_MANAGER[] = "/infrastructure/manager";
149+
constexpr char INFRASTRUCTURE_MANAGER_URL[] = "/infrastructure/manager/url";
150+
constexpr char INFRASTRUCTURE_MANAGER_AUTH_PATH[] = "/infrastructure/manager/auth_path";
151+
constexpr char INFRASTRUCTURE_MANAGER_CA_CERT_PATH[] = "/infrastructure/manager/ca_cert_path";
152+
137153
// Scenes
138154
constexpr char SCENES_SOURCE[] = "/scenes/source";
139155
constexpr char SCENES_FILE_PATH[] = "/scenes/file_path";

tracker/inc/env_vars.hpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,17 @@ constexpr const char* NON_MEASUREMENT_TIME_DYNAMIC_S = "TRACKER_NON_MEASUREMENT_
5858
/// seconds, >= 0 - RobotVision tracker parameter
5959
constexpr const char* NON_MEASUREMENT_TIME_STATIC_S = "TRACKER_NON_MEASUREMENT_TIME_STATIC_S";
6060

61+
// Manager API overrides
62+
63+
/// Manager API base URL
64+
constexpr const char* MANAGER_URL = "TRACKER_MANAGER_URL";
65+
66+
/// Path to JSON auth file {user, password}
67+
constexpr const char* MANAGER_AUTH_PATH = "TRACKER_MANAGER_AUTH_PATH";
68+
69+
/// Path to CA certificate for HTTPS verification
70+
constexpr const char* MANAGER_CA_CERT_PATH = "TRACKER_MANAGER_CA_CERT_PATH";
71+
6172
// Scenes overrides
6273

6374
/// "file"|"api"

0 commit comments

Comments
 (0)