feat: add support for enhanced depth features in LingBot and Dabai A series

This commit is contained in:
ob-yalian
2026-09-21 17:19:33 +08:00
parent 1dfbb72a50
commit af5e6d0e8a
6 changed files with 36 additions and 9 deletions
@@ -681,6 +681,7 @@ class OBCameraNode {
static bool isGemini435LePID(uint32_t pid); static bool isGemini435LePID(uint32_t pid);
static bool isPublishMetaData(uint32_t pid); static bool isPublishMetaData(uint32_t pid);
static bool isDabaiASeriesForHwD2C(uint32_t pid); static bool isDabaiASeriesForHwD2C(uint32_t pid);
static bool isLingBotSupportedPID(uint32_t pid);
static bool isDepthWorkModeDevices(uint32_t pid); static bool isDepthWorkModeDevices(uint32_t pid);
static bool isnotLaserDevices(uint32_t pid); static bool isnotLaserDevices(uint32_t pid);
+5 -1
View File
@@ -43,7 +43,7 @@ def load_parameters(context, args):
yaml_params = load_yaml(config_file_path) yaml_params = load_yaml(config_file_path)
default_params = merge_params(default_params, yaml_params) default_params = merge_params(default_params, yaml_params)
skip_convert = {'config_file_path', 'usb_port', 'serial_number', 'bag_record_filename', 'bag_filename', skip_convert = {'config_file_path', 'usb_port', 'serial_number', 'bag_record_filename', 'bag_filename',
'depth_colorizer_mode'} 'enhanced_depth_model_path', 'depth_colorizer_mode'}
result = {} result = {}
for key, value in default_params.items(): for key, value in default_params.items():
@@ -193,6 +193,9 @@ def generate_launch_description():
DeclareLaunchArgument('enable_disparity_to_depth', default_value='true'), DeclareLaunchArgument('enable_disparity_to_depth', default_value='true'),
DeclareLaunchArgument('enable_hole_filling_filter', default_value='false'), DeclareLaunchArgument('enable_hole_filling_filter', default_value='false'),
DeclareLaunchArgument('enable_false_positive_filter', default_value='false'), DeclareLaunchArgument('enable_false_positive_filter', default_value='false'),
DeclareLaunchArgument('enable_enhanced_depth', default_value='false'),
DeclareLaunchArgument('enhanced_depth_model_path', default_value=''),
DeclareLaunchArgument('enhanced_depth_confidence_threshold', default_value='51'),
DeclareLaunchArgument('decimation_filter_scale', default_value='-1'), DeclareLaunchArgument('decimation_filter_scale', default_value='-1'),
DeclareLaunchArgument('sequence_id_filter_id', default_value='-1'), DeclareLaunchArgument('sequence_id_filter_id', default_value='-1'),
DeclareLaunchArgument('threshold_filter_max', default_value='-1'), DeclareLaunchArgument('threshold_filter_max', default_value='-1'),
@@ -213,6 +216,7 @@ def generate_launch_description():
DeclareLaunchArgument('hdr_merge_gain_2', default_value='-1'), DeclareLaunchArgument('hdr_merge_gain_2', default_value='-1'),
DeclareLaunchArgument('align_mode', default_value='HW'), DeclareLaunchArgument('align_mode', default_value='HW'),
DeclareLaunchArgument('align_target_stream', default_value='COLOR'),# COLOR or DEPTH DeclareLaunchArgument('align_target_stream', default_value='COLOR'),# COLOR or DEPTH
DeclareLaunchArgument('frame_aggregate_mode', default_value='ANY'), # full_frame, color_frame, ANY or disable
DeclareLaunchArgument('diagnostic_period', default_value='1.0'), DeclareLaunchArgument('diagnostic_period', default_value='1.0'),
DeclareLaunchArgument('depth_precision', default_value=''), DeclareLaunchArgument('depth_precision', default_value=''),
DeclareLaunchArgument('device_preset', default_value='Standard'), DeclareLaunchArgument('device_preset', default_value='Standard'),
+5 -1
View File
@@ -43,7 +43,7 @@ def load_parameters(context, args):
yaml_params = load_yaml(config_file_path) yaml_params = load_yaml(config_file_path)
default_params = merge_params(default_params, yaml_params) default_params = merge_params(default_params, yaml_params)
skip_convert = {'config_file_path', 'usb_port', 'serial_number', 'bag_record_filename', 'bag_filename', skip_convert = {'config_file_path', 'usb_port', 'serial_number', 'bag_record_filename', 'bag_filename',
'depth_colorizer_mode'} 'enhanced_depth_model_path', 'depth_colorizer_mode'}
result = {} result = {}
for key, value in default_params.items(): for key, value in default_params.items():
@@ -193,6 +193,9 @@ def generate_launch_description():
DeclareLaunchArgument('enable_disparity_to_depth', default_value='true'), DeclareLaunchArgument('enable_disparity_to_depth', default_value='true'),
DeclareLaunchArgument('enable_hole_filling_filter', default_value='false'), DeclareLaunchArgument('enable_hole_filling_filter', default_value='false'),
DeclareLaunchArgument('enable_false_positive_filter', default_value='false'), DeclareLaunchArgument('enable_false_positive_filter', default_value='false'),
DeclareLaunchArgument('enable_enhanced_depth', default_value='false'),
DeclareLaunchArgument('enhanced_depth_model_path', default_value=''),
DeclareLaunchArgument('enhanced_depth_confidence_threshold', default_value='51'),
DeclareLaunchArgument('decimation_filter_scale', default_value='-1'), DeclareLaunchArgument('decimation_filter_scale', default_value='-1'),
DeclareLaunchArgument('sequence_id_filter_id', default_value='-1'), DeclareLaunchArgument('sequence_id_filter_id', default_value='-1'),
DeclareLaunchArgument('threshold_filter_max', default_value='-1'), DeclareLaunchArgument('threshold_filter_max', default_value='-1'),
@@ -213,6 +216,7 @@ def generate_launch_description():
DeclareLaunchArgument('hdr_merge_gain_2', default_value='-1'), DeclareLaunchArgument('hdr_merge_gain_2', default_value='-1'),
DeclareLaunchArgument('align_mode', default_value='HW'), DeclareLaunchArgument('align_mode', default_value='HW'),
DeclareLaunchArgument('align_target_stream', default_value='COLOR'),# COLOR or DEPTH DeclareLaunchArgument('align_target_stream', default_value='COLOR'),# COLOR or DEPTH
DeclareLaunchArgument('frame_aggregate_mode', default_value='ANY'), # full_frame, color_frame, ANY or disable
DeclareLaunchArgument('diagnostic_period', default_value='1.0'), DeclareLaunchArgument('diagnostic_period', default_value='1.0'),
DeclareLaunchArgument('enable_laser', default_value='true'), DeclareLaunchArgument('enable_laser', default_value='true'),
DeclareLaunchArgument('depth_precision', default_value=''), DeclareLaunchArgument('depth_precision', default_value=''),
+5 -1
View File
@@ -43,7 +43,7 @@ def load_parameters(context, args):
yaml_params = load_yaml(config_file_path) yaml_params = load_yaml(config_file_path)
default_params = merge_params(default_params, yaml_params) default_params = merge_params(default_params, yaml_params)
skip_convert = {'config_file_path', 'usb_port', 'serial_number', 'bag_record_filename', 'bag_filename', skip_convert = {'config_file_path', 'usb_port', 'serial_number', 'bag_record_filename', 'bag_filename',
'depth_colorizer_mode'} 'enhanced_depth_model_path', 'depth_colorizer_mode'}
result = {} result = {}
for key, value in default_params.items(): for key, value in default_params.items():
@@ -192,6 +192,9 @@ def generate_launch_description():
DeclareLaunchArgument('enable_disparity_to_depth', default_value='true'), DeclareLaunchArgument('enable_disparity_to_depth', default_value='true'),
DeclareLaunchArgument('enable_hole_filling_filter', default_value='false'), DeclareLaunchArgument('enable_hole_filling_filter', default_value='false'),
DeclareLaunchArgument('enable_false_positive_filter', default_value='true'), DeclareLaunchArgument('enable_false_positive_filter', default_value='true'),
DeclareLaunchArgument('enable_enhanced_depth', default_value='false'),
DeclareLaunchArgument('enhanced_depth_model_path', default_value=''),
DeclareLaunchArgument('enhanced_depth_confidence_threshold', default_value='51'),
DeclareLaunchArgument('decimation_filter_scale', default_value='-1'), DeclareLaunchArgument('decimation_filter_scale', default_value='-1'),
DeclareLaunchArgument('sequence_id_filter_id', default_value='-1'), DeclareLaunchArgument('sequence_id_filter_id', default_value='-1'),
DeclareLaunchArgument('threshold_filter_max', default_value='-1'), DeclareLaunchArgument('threshold_filter_max', default_value='-1'),
@@ -212,6 +215,7 @@ def generate_launch_description():
DeclareLaunchArgument('hdr_merge_gain_2', default_value='-1'), DeclareLaunchArgument('hdr_merge_gain_2', default_value='-1'),
DeclareLaunchArgument('align_mode', default_value='HW'), DeclareLaunchArgument('align_mode', default_value='HW'),
DeclareLaunchArgument('align_target_stream', default_value='COLOR'),# COLOR or DEPTH DeclareLaunchArgument('align_target_stream', default_value='COLOR'),# COLOR or DEPTH
DeclareLaunchArgument('frame_aggregate_mode', default_value='ANY'), # full_frame, color_frame, ANY or disable
DeclareLaunchArgument('diagnostic_period', default_value='1.0'), DeclareLaunchArgument('diagnostic_period', default_value='1.0'),
DeclareLaunchArgument('depth_precision', default_value=''), DeclareLaunchArgument('depth_precision', default_value=''),
DeclareLaunchArgument('device_preset', default_value=''), DeclareLaunchArgument('device_preset', default_value=''),
+5 -1
View File
@@ -43,7 +43,7 @@ def load_parameters(context, args):
yaml_params = load_yaml(config_file_path) yaml_params = load_yaml(config_file_path)
default_params = merge_params(default_params, yaml_params) default_params = merge_params(default_params, yaml_params)
skip_convert = {'config_file_path', 'usb_port', 'serial_number', 'bag_record_filename', 'bag_filename', skip_convert = {'config_file_path', 'usb_port', 'serial_number', 'bag_record_filename', 'bag_filename',
'depth_colorizer_mode'} 'enhanced_depth_model_path', 'depth_colorizer_mode'}
result = {} result = {}
for key, value in default_params.items(): for key, value in default_params.items():
@@ -193,6 +193,9 @@ def generate_launch_description():
DeclareLaunchArgument('enable_disparity_to_depth', default_value='true'), DeclareLaunchArgument('enable_disparity_to_depth', default_value='true'),
DeclareLaunchArgument('enable_hole_filling_filter', default_value='false'), DeclareLaunchArgument('enable_hole_filling_filter', default_value='false'),
DeclareLaunchArgument('enable_false_positive_filter', default_value='true'), DeclareLaunchArgument('enable_false_positive_filter', default_value='true'),
DeclareLaunchArgument('enable_enhanced_depth', default_value='false'),
DeclareLaunchArgument('enhanced_depth_model_path', default_value=''),
DeclareLaunchArgument('enhanced_depth_confidence_threshold', default_value='51'),
DeclareLaunchArgument('decimation_filter_scale', default_value='-1'), DeclareLaunchArgument('decimation_filter_scale', default_value='-1'),
DeclareLaunchArgument('sequence_id_filter_id', default_value='-1'), DeclareLaunchArgument('sequence_id_filter_id', default_value='-1'),
DeclareLaunchArgument('threshold_filter_max', default_value='-1'), DeclareLaunchArgument('threshold_filter_max', default_value='-1'),
@@ -213,6 +216,7 @@ def generate_launch_description():
DeclareLaunchArgument('hdr_merge_gain_2', default_value='-1'), DeclareLaunchArgument('hdr_merge_gain_2', default_value='-1'),
DeclareLaunchArgument('align_mode', default_value='HW'), DeclareLaunchArgument('align_mode', default_value='HW'),
DeclareLaunchArgument('align_target_stream', default_value='COLOR'),# COLOR or DEPTH DeclareLaunchArgument('align_target_stream', default_value='COLOR'),# COLOR or DEPTH
DeclareLaunchArgument('frame_aggregate_mode', default_value='ANY'), # full_frame, color_frame, ANY or disable
DeclareLaunchArgument('diagnostic_period', default_value='1.0'), DeclareLaunchArgument('diagnostic_period', default_value='1.0'),
DeclareLaunchArgument('enable_laser', default_value='true'), DeclareLaunchArgument('enable_laser', default_value='true'),
DeclareLaunchArgument('depth_precision', default_value=''), DeclareLaunchArgument('depth_precision', default_value=''),
+15 -5
View File
@@ -650,7 +650,7 @@ void OBCameraNode::publishDepthFiltersStatus() {
if (disp_outliers_filter_supported) { if (disp_outliers_filter_supported) {
append_unique_filter_name("DispOutliersFilter"); append_unique_filter_name("DispOutliersFilter");
} }
if (isGemini330SeriesPID(pid_)) { if (isLingBotSupportedPID(pid_)) {
append_unique_filter_name("EnhancedDepthFilter"); append_unique_filter_name("EnhancedDepthFilter");
} }
@@ -3130,6 +3130,12 @@ void OBCameraNode::setupIrPostProcessFilter() {
} }
void OBCameraNode::setupUndistortionFilters() { void OBCameraNode::setupUndistortionFilters() {
// LingBot requires color undistortion before D2C alignment on Dabai A series devices.
if (enable_enhanced_depth_.load() && isDabaiASeriesForHwD2C(pid_)) {
enable_undistortion_[COLOR] = true;
RCLCPP_INFO(logger_, "Enable color undistortion for LingBot enhanced depth filter");
}
auto remove_undistortion_filter = [](std::vector<std::shared_ptr<ob::Filter>> &filters) { auto remove_undistortion_filter = [](std::vector<std::shared_ptr<ob::Filter>> &filters) {
filters.erase(std::remove_if(filters.begin(), filters.end(), filters.erase(std::remove_if(filters.begin(), filters.end(),
[](const std::shared_ptr<ob::Filter> &filter) { [](const std::shared_ptr<ob::Filter> &filter) {
@@ -5391,8 +5397,8 @@ bool OBCameraNode::validateEnhancedDepthFilterConfig(std::string &message) const
constexpr char kEnhancedDepthSupportedTargetResolutions[] = "640x480/1280x720/1280x800"; constexpr char kEnhancedDepthSupportedTargetResolutions[] = "640x480/1280x720/1280x800";
constexpr char kEnhancedDepthSupportedDepthFormats[] = "Y10/Y11/Y12/Y14/Y16/Z16"; constexpr char kEnhancedDepthSupportedDepthFormats[] = "Y10/Y11/Y12/Y14/Y16/Z16";
if (!isGemini330SeriesPID(pid_)) { if (!isLingBotSupportedPID(pid_)) {
message = "Enhanced depth filter is only supported by Gemini 330 series devices"; message = "Enhanced depth filter is only supported by Gemini 330 and Dabai A series devices";
return false; return false;
} }
@@ -8196,6 +8202,10 @@ bool OBCameraNode::isDabaiASeriesForHwD2C(uint32_t pid) {
pid == GEMINI_345LG_PID; pid == GEMINI_345LG_PID;
} }
bool OBCameraNode::isLingBotSupportedPID(uint32_t pid) {
return isGemini330SeriesPID(pid) || isDabaiASeriesForHwD2C(pid);
}
bool OBCameraNode::isDepthWorkModeDevices(uint32_t pid) { return pid == GEMINI_435Le_PID; } bool OBCameraNode::isDepthWorkModeDevices(uint32_t pid) { return pid == GEMINI_435Le_PID; }
bool OBCameraNode::isnotLaserDevices(uint32_t pid) { return isGemini301SeriesPID(pid); } bool OBCameraNode::isnotLaserDevices(uint32_t pid) { return isGemini301SeriesPID(pid); }
@@ -8525,8 +8535,8 @@ bool OBCameraNode::applyEnhancedDepthFilterConfig(
bool enabled, const std::vector<float> &positional_params, bool enabled, const std::vector<float> &positional_params,
const std::vector<orbbec_camera_msgs::msg::DepthFilterParam> &named_params, const std::vector<orbbec_camera_msgs::msg::DepthFilterParam> &named_params,
std::string &message) { std::string &message) {
if (!isGemini330SeriesPID(pid_)) { if (!isLingBotSupportedPID(pid_)) {
message = "Enhanced depth filter is only supported by Gemini 330 series devices"; message = "Enhanced depth filter is only supported by Gemini 330 and Dabai A series devices";
return false; return false;
} }