Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 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
151 changes: 79 additions & 72 deletions controller/src/robot_vision/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,96 +2,103 @@
# SPDX-License-Identifier: Apache-2.0
# This file is licensed under Apache 2.0 License.

cmake_minimum_required(VERSION 3.8)
cmake_minimum_required(VERSION 3.21)

#####################################################################
# Project
#####################################################################

project(RobotVision VERSION 1.1.0 LANGUAGES CXX)

include(FindPkgConfig)
include(GNUInstallDirs)
include(ExternalProject)
include(FetchContent)
include(CMakePackageConfigHelpers)

project(RobotVision VERSION 1.1.0)

set(CMAKE_CXX_STANDARD 14)
set(PROJECT_NAMESPACE rv)

# Security hardening flags (Intel Secure Coding Standards)
add_compile_options(
-fstack-protector-strong
-fstack-clash-protection
-U_FORTIFY_SOURCE
-D_FORTIFY_SOURCE=3
-Wformat
-Wformat-security
-fno-strict-overflow
-fno-delete-null-pointer-checks
)
include(cmake/security_options.cmake) # scene_define_security_options()
include(cmake/opencv_shim.cmake) # rv_ensure_opencv_target()

# Security hardening linker flags
add_link_options(
-Wl,-z,relro,-z,now
-Wl,-z,noexecstack
)
set(RV_CXX_STANDARD 17 CACHE STRING "C++ standard for RobotVision targets")

set(ROBOT_VISION_BUILD_INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/install)
option(BUILD_PYTHON_BINDINGS "Build Python bindings with pybind11" ON)
option(BUILD_TESTING "Build tests" OFF)
option(BUILD_BENCHMARKS "Build performance benchmarks" OFF)

option(BUILD_TESTING OFF)
set(PROJECT_BUILD_TESTING BUILD_TESTING)
# Shared security hardening flags (reused by tracker via rv::security_options).
scene_define_security_options(rv_security_options)
add_library(rv::security_options ALIAS rv_security_options)

# Required packages
find_package(OpenCV REQUIRED)
find_package(Eigen3 REQUIRED)
find_package(Python REQUIRED COMPONENTS Interpreter Development)
find_package(pybind11 CONFIG REQUIRED)
#####################################################################
# Dependencies
#####################################################################

find_package(OpenCV CONFIG REQUIRED)
find_package(Eigen3 CONFIG REQUIRED)
find_package(OpenMP REQUIRED)

message(STATUS ${Python_INCLUDE_DIRS} ${Python_VERSION} ${Python_LIBRARIES})
# Normalize OpenCV usage to the synthetic opencv::opencv imported target.
rv_ensure_opencv_target()

if(BUILD_PYTHON_BINDINGS)
find_package(Python REQUIRED COMPONENTS Interpreter Development)
find_package(pybind11 CONFIG REQUIRED)
message(STATUS "Python include dirs: ${Python_INCLUDE_DIRS} version: ${Python_VERSION} libs: ${Python_LIBRARIES}")
endif()

#####################################################################
# Library
#####################################################################

set(PROJECT_SOURCE_LIST
${CMAKE_SOURCE_DIR}/src/rv/tracking/TrackedObject.cpp
${CMAKE_SOURCE_DIR}/src/rv/tracking/CAModel.cpp
${CMAKE_SOURCE_DIR}/src/rv/tracking/CVModel.cpp
${CMAKE_SOURCE_DIR}/src/rv/tracking/CPModel.cpp
${CMAKE_SOURCE_DIR}/src/rv/tracking/CTRVModel.cpp
${CMAKE_SOURCE_DIR}/src/rv/tracking/UnscentedKalmanFilter.cpp
${CMAKE_SOURCE_DIR}/src/rv/tracking/ObjectMatching.cpp
${CMAKE_SOURCE_DIR}/src/rv/tracking/MultiModelKalmanEstimator.cpp
${CMAKE_SOURCE_DIR}/src/rv/tracking/TrackManager.cpp
${CMAKE_SOURCE_DIR}/src/rv/tracking/Classification.cpp
${CMAKE_SOURCE_DIR}/src/rv/tracking/MultipleObjectTracker.cpp
${CMAKE_SOURCE_DIR}/src/rv/tracking/TrackTracker.cpp
${CMAKE_SOURCE_DIR}/src/rv/tracking/CameraUtils.cpp
${CMAKE_SOURCE_DIR}/src/rv/apollo/connected_component_analysis.cpp
${CMAKE_SOURCE_DIR}/src/rv/apollo/multi_hm_bipartite_graph_matcher.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/rv/tracking/TrackedObject.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/rv/tracking/CAModel.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/rv/tracking/CVModel.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/rv/tracking/CPModel.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/rv/tracking/CTRVModel.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/rv/tracking/UnscentedKalmanFilter.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/rv/tracking/ObjectMatching.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/rv/tracking/MultiModelKalmanEstimator.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/rv/tracking/TrackManager.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/rv/tracking/Classification.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/rv/tracking/MultipleObjectTracker.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/rv/tracking/TrackTracker.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/rv/tracking/CameraUtils.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/rv/apollo/connected_component_analysis.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/rv/apollo/multi_hm_bipartite_graph_matcher.cpp
)

add_library(${PROJECT_NAME} SHARED ${PROJECT_SOURCE_LIST} )

target_include_directories(${PROJECT_NAME}
PUBLIC
${CMAKE_SOURCE_DIR}/include
${OpenCV_INCLUDE_DIRS}
${EIGEN3_INCLUDE_DIR}
${PYTHON_INCLUDE_DIRS}
${pybind11_INCLUDE_DIRS})
${CMAKE_CURRENT_SOURCE_DIR}/include
)

target_link_libraries(${PROJECT_NAME} PUBLIC ${OpenCV_LIBS} ${Python_LIBRARIES})
target_link_libraries(${PROJECT_NAME}
PUBLIC
Eigen3::Eigen
opencv::opencv
OpenMP::OpenMP_CXX
PRIVATE
rv::security_options
)

if(OpenMP_CXX_FOUND)
target_link_libraries(${PROJECT_NAME} PUBLIC OpenMP::OpenMP_CXX)
endif()
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD ${RV_CXX_STANDARD})
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)

set(TRACKING_MODULE_SOURCE_LIST
${CMAKE_SOURCE_DIR}/python/src/robot_vision/extensions/tracking.cpp
)
#####################################################################
# Python bindings
#####################################################################

if(BUILD_PYTHON_BINDINGS)
set(TRACKING_MODULE_SOURCE_LIST
${CMAKE_CURRENT_SOURCE_DIR}/python/src/robot_vision/extensions/tracking.cpp
)

pybind11_add_module(tracking MODULE ${TRACKING_MODULE_SOURCE_LIST})
target_link_libraries(tracking PUBLIC ${PROJECT_NAME})
pybind11_add_module(tracking MODULE ${TRACKING_MODULE_SOURCE_LIST})
target_link_libraries(tracking PUBLIC ${PROJECT_NAME} Python::Python)

pybind11_add_module(types MODULE ${CMAKE_CURRENT_SOURCE_DIR}/python/src/robot_vision/extensions/types.cpp)
target_link_libraries(types PUBLIC ${PROJECT_NAME} Python::Python)
endif()

pybind11_add_module(types MODULE ${CMAKE_SOURCE_DIR}/python/src/robot_vision/extensions/types.cpp)
target_link_libraries(types PUBLIC ${PROJECT_NAME})

set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14)

#####################################################################
# install
Expand All @@ -104,16 +111,16 @@ install(TARGETS ${PROJECT_NAME} DESTINATION lib)
#####################################################################

# Not working with ceres, ceres brings gtest as static lib gtest
if(PROJECT_BUILD_TESTING)
include(${CMAKE_SOURCE_DIR}/cmake/gtest.cmake)
if(BUILD_TESTING)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/gtest.cmake)
enable_testing()
add_subdirectory(test)
endif(PROJECT_BUILD_TESTING)
endif(BUILD_TESTING)

#####################################################################
# benchmarks
#####################################################################

option(BUILD_BENCHMARKS "Build performance benchmarks" OFF)
if(BUILD_BENCHMARKS)
add_subdirectory(benchmarks)
endif(BUILD_BENCHMARKS)
8 changes: 7 additions & 1 deletion controller/src/robot_vision/Makefile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# SPDX-FileCopyrightText: (C) 2025 Intel Corporation
# SPDX-License-Identifier: Apache-2.0

.PHONY: clean docs help install docserve test
.PHONY: clean docs help install docserve test cpp-tests
.DEFAULT_GOAL := test

clean:
Expand All @@ -13,6 +13,7 @@ clean:
rm -r docs/_build/ || true
rm -r docs/generated/ || true
find . -name __pycache__ | xargs rm -r || true
rm -r build-rv-tests || true

docshtml:
$(MAKE) -C docs html
Expand All @@ -23,5 +24,10 @@ docspdf:
test:
python3 setup.py test

cpp-tests:
cmake -S . -B build-rv-tests -DBUILD_TESTING=ON -DBUILD_PYTHON_BINDINGS=OFF
cmake --build build-rv-tests
cd build-rv-tests && ctest

docserve:
cd docs/_build/html && python3 -m http.server 8000
11 changes: 5 additions & 6 deletions controller/src/robot_vision/benchmarks/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,6 @@
#####################################################################
# robot vision benchmarks
#####################################################################

set(CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 14)

# Check if benchmark library is available
find_package(benchmark QUIET)

Expand All @@ -21,6 +17,9 @@ if(benchmark_FOUND)
)

add_executable(${BENCHMARK_EXEC_NAME} ${BENCHMARK_SOURCES})

set_property(TARGET ${BENCHMARK_EXEC_NAME} PROPERTY CXX_STANDARD ${RV_CXX_STANDARD})
set_property(TARGET ${BENCHMARK_EXEC_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)

target_compile_options(${BENCHMARK_EXEC_NAME} PRIVATE
-fno-access-control
Expand All @@ -30,13 +29,13 @@ if(benchmark_FOUND)

target_include_directories(${BENCHMARK_EXEC_NAME}
PRIVATE
${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/controller/src/robot_vision/include
${PROJECT_SOURCE_DIR}/include
)

target_link_libraries(${BENCHMARK_EXEC_NAME}
PRIVATE
${PROJECT_NAME}
rv::security_options
benchmark::benchmark
benchmark::benchmark_main
)
Expand Down
32 changes: 32 additions & 0 deletions controller/src/robot_vision/cmake/opencv_shim.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# SPDX-FileCopyrightText: 2025-2026 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
# This file is licensed under Apache 2.0 License.

# Ensure a unified OpenCV imported target exists.
#
# In our Ubuntu-based controller build we rely on system OpenCV
# (OpenCV_DIR is set to /usr/lib/x86_64-linux-gnu/cmake/opencv4).
# That config does not define a single opencv::opencv target, but
# instead exposes either opencv_world or an OpenCV_LIBS list. To keep
# RobotVision linking against a modern imported target everywhere,
# we synthesize opencv::opencv from those system-provided libraries.

function(rv_ensure_opencv_target)
if(TARGET opencv::opencv)
return()
endif()

if(TARGET opencv_world)
add_library(opencv::opencv INTERFACE IMPORTED)
set_target_properties(opencv::opencv PROPERTIES
INTERFACE_LINK_LIBRARIES opencv_world
)
elseif(DEFINED OpenCV_LIBS)
add_library(opencv::opencv INTERFACE IMPORTED)
set_target_properties(opencv::opencv PROPERTIES
INTERFACE_LINK_LIBRARIES "${OpenCV_LIBS}"
)
else()
message(FATAL_ERROR "OpenCV found but no opencv::opencv target or OpenCV_LIBS defined")
endif()
endfunction()
45 changes: 45 additions & 0 deletions controller/src/robot_vision/cmake/security_options.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# SPDX-FileCopyrightText: 2025-2026 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
# This file is licensed under Apache 2.0 License.

# RobotVision security options helpers.
#
# This module defines scene_define_security_options(), which creates an
# INTERFACE target with common security hardening flags. It replaces the
# previous implementation that lived under scene_common.
#
# Usage:
# scene_define_security_options(<target_name>)
#
# The caller is responsible for creating any ALIAS targets (for example
# rv::security_options or Tracker::security_options) that point at the
# created INTERFACE library.

function(scene_define_security_options target_name)
if(TARGET "${target_name}")
return()
endif()

add_library("${target_name}" INTERFACE)

# Security hardening flags (Intel Secure Coding Standards).
# Applied only for non-Debug builds so debugging stays easy.
if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
target_compile_options("${target_name}" INTERFACE
-fstack-protector-strong
-fstack-clash-protection
-U_FORTIFY_SOURCE
-D_FORTIFY_SOURCE=3
-Wformat
-Wformat-security
-fno-strict-overflow
-fno-delete-null-pointer-checks
)

target_link_options("${target_name}" INTERFACE
-Wl,-z,relro,-z,now
-Wl,-z,noexecstack
)
endif()
endfunction()

Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ template <typename T> void GatedHungarianMatcher<T>::MatchInit()
auto find_ret = compare_fun_map.find(opt_flag_);
CHECK(find_ret != compare_fun_map.end());
compare_fun_ = find_ret->second;
is_valid_cost_ = std::bind1st(compare_fun_, cost_thresh_);
is_valid_cost_ = [this](T value) { return compare_fun_(cost_thresh_, value); };

/* check the validity of bound_value */
CHECK(!is_valid_cost_(bound_value_));
Expand Down
9 changes: 5 additions & 4 deletions controller/src/robot_vision/test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,26 +7,27 @@
#####################################################################
set(EXEC_NAME RobotVisionTests)

set(CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 17)

set(TEST_SOURCES
main.cpp
TrackingTests.cpp
)

add_executable(${EXEC_NAME} ${TEST_SOURCES})

set_property(TARGET ${EXEC_NAME} PROPERTY CXX_STANDARD ${RV_CXX_STANDARD})
set_property(TARGET ${EXEC_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)

target_compile_options(${EXEC_NAME} PRIVATE -fno-access-control)

target_include_directories(${EXEC_NAME}
PRIVATE
${CMAKE_SOURCE_DIR}/include
${PROJECT_SOURCE_DIR}/include
)

target_link_libraries(${EXEC_NAME}
PRIVATE
${PROJECT_NAME}
rv::security_options
GTest::gtest_main
)
add_test(NAME ${EXEC_NAME} COMMAND ${EXEC_NAME})
Loading
Loading