Skip to content

Commit 8f5b1f7

Browse files
author
Józef Daniecki
committed
Tracker Service v0.4.0: scene config dynamic loading
T_EDITOR="true" git rebase --continue t status
1 parent 2005584 commit 8f5b1f7

32 files changed

Lines changed: 2537 additions & 142 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

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

Lines changed: 10 additions & 0 deletions
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,6 +482,8 @@ 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

tracker/CMakeLists.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,13 @@ find_package(CLI11 REQUIRED)
4343
find_package(httplib REQUIRED)
4444
find_package(RapidJSON REQUIRED)
4545
find_package(PahoMqttCpp REQUIRED)
46+
find_package(OpenSSL REQUIRED)
47+
48+
#####################################################################
49+
# System-provided packages
50+
#####################################################################
51+
52+
find_package(OpenMP REQUIRED)
4653

4754
#####################################################################
4855
# System-provided packages
@@ -76,6 +83,8 @@ set(PROJECT_SOURCE_LIST
7683
${CMAKE_CURRENT_SOURCE_DIR}/src/cli.cpp
7784
${CMAKE_CURRENT_SOURCE_DIR}/src/config_loader.cpp
7885
${CMAKE_CURRENT_SOURCE_DIR}/src/scene_loader.cpp
86+
${CMAKE_CURRENT_SOURCE_DIR}/src/api_scene_loader.cpp
87+
${CMAKE_CURRENT_SOURCE_DIR}/src/manager_rest_client.cpp
7988
${CMAKE_CURRENT_SOURCE_DIR}/src/coordinate_transformer.cpp
8089
${CMAKE_CURRENT_SOURCE_DIR}/src/healthcheck_server.cpp
8190
${CMAKE_CURRENT_SOURCE_DIR}/src/healthcheck_command.cpp
@@ -122,6 +131,8 @@ target_link_libraries(${PROJECT_NAME}
122131
httplib::httplib
123132
rapidjson
124133
PahoMqttCpp::paho-mqttpp3-static
134+
OpenSSL::SSL
135+
OpenSSL::Crypto
125136
)
126137

127138
#####################################################################

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"
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// SPDX-FileCopyrightText: 2026 Intel Corporation
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#pragma once
5+
6+
#include <chrono>
7+
#include <optional>
8+
#include <string>
9+
10+
namespace tracker {
11+
12+
/**
13+
* @brief Abstract interface for Manager REST API operations.
14+
*
15+
* Enables dependency injection and mock-based testing of components
16+
* that depend on the Manager API (e.g., ApiSceneLoader).
17+
*/
18+
class IManagerRestClient {
19+
public:
20+
virtual ~IManagerRestClient() = default;
21+
22+
/**
23+
* @brief Authenticate with the Manager API.
24+
*
25+
* @param username API username
26+
* @param password API password
27+
* @throws std::runtime_error on connection failure, HTTP error, or auth rejection
28+
*/
29+
virtual void authenticate(const std::string& username, const std::string& password) = 0;
30+
31+
/**
32+
* @brief Fetch all scenes from the Manager API.
33+
*
34+
* @return Raw JSON response body string
35+
* @throws std::runtime_error if not authenticated, connection fails, or HTTP error
36+
*/
37+
virtual std::string fetchScenes() = 0;
38+
};
39+
40+
/**
41+
* @brief HTTP client for Manager REST API.
42+
*
43+
* Handles authentication and scene fetching from the SceneScape Manager.
44+
* Supports HTTPS with CA certificate verification.
45+
*/
46+
class ManagerRestClient : public IManagerRestClient {
47+
public:
48+
/**
49+
* @brief Construct a Manager REST API client.
50+
*
51+
* @param url Manager API base URL (e.g., "https://web.scenescape.intel.com")
52+
* @param ca_cert_path Optional CA certificate path for HTTPS verification
53+
* @param connect_timeout TCP connect timeout (default: 10s)
54+
* @param read_timeout HTTP read timeout (default: 30s)
55+
*/
56+
ManagerRestClient(std::string url, std::optional<std::string> ca_cert_path = std::nullopt,
57+
std::chrono::milliseconds connect_timeout = std::chrono::seconds(10),
58+
std::chrono::milliseconds read_timeout = std::chrono::seconds(30));
59+
60+
void authenticate(const std::string& username, const std::string& password) override;
61+
std::string fetchScenes() override;
62+
63+
private:
64+
std::string url_;
65+
std::optional<std::string> ca_cert_path_;
66+
std::string token_;
67+
std::chrono::milliseconds connect_timeout_;
68+
std::chrono::milliseconds read_timeout_;
69+
};
70+
71+
} // namespace tracker

0 commit comments

Comments
 (0)