Hardware testing showed the tick-driven recovery state machine did not work. async_grab_camera_recovery does not make grab() prompt on a disconnected ZED-M under SDK 5.3: grabs took ~3 s each while the link was down and then blocked indefinitely. The event loop stopped turning, so Stop went unanswered, the 30 s patience timer and the backoff were never reached, and replugging the camera did nothing. Measured: 122 s frozen, then dora stop needed 10 s and a forced kill. Move everything that can block onto a capture thread. zed::Capture owns the camera and runs open, warmup, grab, blank and stall detection, backoff and escalation; it packs each frame into owned buffers and hands the newest one to the reader by swapping under a mutex. The dora event loop now only drains that buffer and publishes, so it never calls into the SDK and stays responsive however long the SDK blocks. The newest frame wins and uncollected frames are dropped, which is what a consumer wants from a camera source. Swapping rather than assigning returns the previous frame's buffers to the capture thread, so steady state does not reallocate. The point cloud is now copied out of the SDK buffer rather than published in place, since the reader is another thread. On exit the loop waits 2 s for the thread and then _Exit()s if it is still inside the SDK, so Stop is always answered promptly. This also removes the blocking warmup from the event loop: it stays a blocking burst, which is harmless on the capture thread. Verified on a ZED-M: unplug leaves the node responsive and logs the backoff 1, 2, 5 then 10 s; replug gives "camera recovered after 13 attempt(s)" and publishing resumes without restarting the dataflow; dora stop with the camera unplugged returns in 0.70 s with the thread joining gracefully. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Y7g2cBJ5e3r15ZbJ9WZn8c
47 lines
1.2 KiB
CMake
47 lines
1.2 KiB
CMake
cmake_minimum_required(VERSION 3.21)
|
|
project(dora_zed VERSION 0.2.0 LANGUAGES C CXX)
|
|
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
set(CMAKE_CXX_FLAGS "-fPIC")
|
|
|
|
# DoraTargets.cmake picks the cargo profile from this, so an unset build type
|
|
# would link debug dora bindings into an otherwise unoptimized binary.
|
|
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
|
|
endif()
|
|
|
|
include(DoraTargets.cmake)
|
|
|
|
set(ZED_DIR "/usr/local/zed" CACHE PATH "Path to the ZED SDK")
|
|
set(ZED_PATH ${ZED_DIR})
|
|
find_package(CUDAToolkit REQUIRED)
|
|
find_package(zed REQUIRED)
|
|
|
|
find_package(OpenCV REQUIRED)
|
|
|
|
link_directories(${dora_link_dirs})
|
|
link_directories(${ZED_LIBRARY_DIR})
|
|
|
|
add_executable(dora_zed
|
|
src/main.cc
|
|
src/zed/camera.cc
|
|
src/zed/capture.cc
|
|
${node_bridge}
|
|
)
|
|
add_dependencies(dora_zed Dora_cxx)
|
|
|
|
target_include_directories(
|
|
dora_zed
|
|
PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
${dora_cxx_include_dir}
|
|
${dora_c_include_dir}
|
|
${ZED_INCLUDE_DIRS}
|
|
${OpenCV_INCLUDE_DIRS}
|
|
${CUDAToolkit_INCLUDE_DIRS}
|
|
)
|
|
|
|
target_link_libraries(dora_zed dora_node_api_cxx ${ZED_LIBRARIES} ${OpenCV_LIBS})
|
|
|
|
install(TARGETS dora_zed DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/bin)
|