add depth configuration parity with the reference driver
parse_depth_mode returned NEURAL for any unrecognised string, so a typo silently changed depth quality, and NEURAL_PLUS and NEURAL_LIGHT could not be selected at all. All six modes are now reachable and an unknown name exits non-zero listing the accepted values. Parsing moves into Config::from_env() and main reads the configuration before init_dora_node(), so a bad value fails with its own message instead of after the node has registered with the dataflow. Add ZED_CONFIDENCE_THRESHOLD (60) and ZED_TEXTURE_CONFIDENCE_THRESHOLD (100), which were never set, and change the defaults to 1080 / 200 mm / 600 mm to match the reference driver perception was tuned against. The resolved settings are logged at startup. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Y7g2cBJ5e3r15ZbJ9WZn8c
This commit is contained in:
+39
-10
@@ -2,10 +2,12 @@
|
||||
#include "util/env.h"
|
||||
|
||||
#include <chrono>
|
||||
#include <cstdlib>
|
||||
#include <iostream>
|
||||
#include <iterator>
|
||||
#include <string>
|
||||
#include <thread>
|
||||
#include <utility>
|
||||
|
||||
namespace {
|
||||
|
||||
@@ -21,17 +23,30 @@ sl::RESOLUTION parse_resolution(int resolution) {
|
||||
}
|
||||
}
|
||||
|
||||
const std::pair<const char*, sl::DEPTH_MODE> DEPTH_MODES[] = {
|
||||
{"NEURAL", sl::DEPTH_MODE::NEURAL},
|
||||
{"NEURAL_PLUS", sl::DEPTH_MODE::NEURAL_PLUS},
|
||||
{"NEURAL_LIGHT", sl::DEPTH_MODE::NEURAL_LIGHT},
|
||||
{"PERFORMANCE", sl::DEPTH_MODE::PERFORMANCE},
|
||||
{"QUALITY", sl::DEPTH_MODE::QUALITY},
|
||||
{"NONE", sl::DEPTH_MODE::NONE},
|
||||
};
|
||||
|
||||
// A typo here silently changes depth quality if it falls back to a default, and
|
||||
// the resulting depth is wrong in a way that only shows up downstream, so an
|
||||
// unrecognised name stops the node instead.
|
||||
sl::DEPTH_MODE parse_depth_mode(const std::string& mode) {
|
||||
if (mode == "PERFORMANCE") {
|
||||
return sl::DEPTH_MODE::PERFORMANCE;
|
||||
for (const auto& entry : DEPTH_MODES) {
|
||||
if (mode == entry.first) {
|
||||
return entry.second;
|
||||
}
|
||||
}
|
||||
if (mode == "QUALITY") {
|
||||
return sl::DEPTH_MODE::QUALITY;
|
||||
std::cerr << "Unknown ZED_DEPTH_MODE '" << mode << "'. Accepted values:";
|
||||
for (const auto& entry : DEPTH_MODES) {
|
||||
std::cerr << " " << entry.first;
|
||||
}
|
||||
if (mode == "NONE") {
|
||||
return sl::DEPTH_MODE::NONE;
|
||||
}
|
||||
return sl::DEPTH_MODE::NEURAL;
|
||||
std::cerr << std::endl;
|
||||
std::exit(1);
|
||||
}
|
||||
|
||||
sl::FLIP_MODE parse_flip(const std::string& mode) {
|
||||
@@ -59,10 +74,13 @@ Config Config::from_env() {
|
||||
Config c;
|
||||
c.resolution = util::get_env_int("ZED_RESOLUTION", c.resolution);
|
||||
c.fps = util::get_env_int("ZED_FPS", c.fps);
|
||||
c.depth_mode = util::get_env_str("ZED_DEPTH_MODE", c.depth_mode);
|
||||
c.depth_mode = parse_depth_mode(util::get_env_str("ZED_DEPTH_MODE", "NEURAL"));
|
||||
c.depth_min_mm = util::get_env_int("ZED_DEPTH_MIN_MM", c.depth_min_mm);
|
||||
c.depth_max_mm = util::get_env_int("ZED_DEPTH_MAX_MM", c.depth_max_mm);
|
||||
c.depth_fill = util::get_env_bool("ZED_DEPTH_FILL", c.depth_fill);
|
||||
c.confidence_threshold = util::get_env_int("ZED_CONFIDENCE_THRESHOLD", c.confidence_threshold);
|
||||
c.texture_confidence_threshold =
|
||||
util::get_env_int("ZED_TEXTURE_CONFIDENCE_THRESHOLD", c.texture_confidence_threshold);
|
||||
c.flip = util::get_env_str("ZED_FLIP", c.flip);
|
||||
c.warmup_frames = util::get_env_int("ZED_WARMUP_FRAMES", c.warmup_frames);
|
||||
int retry_seconds = util::get_env_int("ZED_RETRY_INTERVAL_SECONDS", 5);
|
||||
@@ -78,7 +96,7 @@ Camera::Camera(const Config& config) : config_(config) {
|
||||
|
||||
init_params_.camera_resolution = parse_resolution(config_.resolution);
|
||||
init_params_.camera_fps = config_.fps;
|
||||
init_params_.depth_mode = parse_depth_mode(config_.depth_mode);
|
||||
init_params_.depth_mode = config_.depth_mode;
|
||||
init_params_.coordinate_units = sl::UNIT::MILLIMETER;
|
||||
init_params_.camera_image_flip = parse_flip(config_.flip);
|
||||
init_params_.depth_minimum_distance = config_.depth_min_mm;
|
||||
@@ -86,6 +104,17 @@ Camera::Camera(const Config& config) : config_(config) {
|
||||
|
||||
runtime_params_.enable_depth = true;
|
||||
runtime_params_.enable_fill_mode = config_.depth_fill;
|
||||
// The two thresholds discard the depth the SDK is least certain of, which is
|
||||
// the depth at object edges: those pixels straddle the object and whatever is
|
||||
// behind it, and belong to neither.
|
||||
runtime_params_.confidence_threshold = config_.confidence_threshold;
|
||||
runtime_params_.texture_confidence_threshold = config_.texture_confidence_threshold;
|
||||
|
||||
std::cout << "ZED depth: mode=" << sl::toString(init_params_.depth_mode)
|
||||
<< ", range=" << config_.depth_min_mm << "-" << config_.depth_max_mm << " mm"
|
||||
<< ", confidence=" << config_.confidence_threshold
|
||||
<< ", texture_confidence=" << config_.texture_confidence_threshold
|
||||
<< ", fill=" << (config_.depth_fill ? "on" : "off") << std::endl;
|
||||
}
|
||||
|
||||
Camera::~Camera() {
|
||||
|
||||
Reference in New Issue
Block a user