From 13058602923af82c715a6808aa6990b43613ff0a Mon Sep 17 00:00:00 2001 From: ob-yalian Date: Mon, 14 Sep 2026 16:34:20 +0800 Subject: [PATCH 1/2] fix: validate color powerline frequency parameter and log warnings for invalid values --- orbbec_camera/src/ob_camera_node.cpp | 48 ++++++++++++++++++---------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/orbbec_camera/src/ob_camera_node.cpp b/orbbec_camera/src/ob_camera_node.cpp index 917ba861..bc2fddc7 100644 --- a/orbbec_camera/src/ob_camera_node.cpp +++ b/orbbec_camera/src/ob_camera_node.cpp @@ -1652,24 +1652,38 @@ void OBCameraNode::setupDevices() { "Current color anti-flicker to " << (device_->getBoolProperty(OB_PROP_COLOR_ANTI_FLICKER_BOOL) ? "ON" : "OFF"))); } - if (!color_powerline_freq_.empty() && - device_->isPropertySupported(OB_PROP_COLOR_POWER_LINE_FREQUENCY_INT, OB_PERMISSION_WRITE)) { - if (color_powerline_freq_ == "disable") { - TRY_TO_SET_PROPERTY(setIntProperty, OB_PROP_COLOR_POWER_LINE_FREQUENCY_INT, 0); - } else if (color_powerline_freq_ == "50hz") { - TRY_TO_SET_PROPERTY(setIntProperty, OB_PROP_COLOR_POWER_LINE_FREQUENCY_INT, 1); - } else if (color_powerline_freq_ == "60hz") { - TRY_TO_SET_PROPERTY(setIntProperty, OB_PROP_COLOR_POWER_LINE_FREQUENCY_INT, 2); - } else if (color_powerline_freq_ == "auto") { - TRY_TO_SET_PROPERTY(setIntProperty, OB_PROP_COLOR_POWER_LINE_FREQUENCY_INT, 3); + if (!color_powerline_freq_.empty()) { + const auto normalized_color_powerline_freq = lowerParameterValue(color_powerline_freq_); + int color_powerline_freq_value = -1; + if (normalized_color_powerline_freq == "disable") { + color_powerline_freq_value = 0; + } else if (normalized_color_powerline_freq == "50hz") { + color_powerline_freq_value = 1; + } else if (normalized_color_powerline_freq == "60hz") { + color_powerline_freq_value = 2; + } else if (normalized_color_powerline_freq == "auto") { + color_powerline_freq_value = 3; + } else { + RCLCPP_WARN_STREAM(logger_, + "Invalid parameter color_powerline_freq " + << formatParameterValue(color_powerline_freq_) << ". Valid values: " + << formatValidParameterValues({"disable", "50hz", "60hz", "auto"}) + << ". Skip setting."); + color_powerline_freq_.clear(); + } + if (color_powerline_freq_value >= 0 && + device_->isPropertySupported(OB_PROP_COLOR_POWER_LINE_FREQUENCY_INT, OB_PERMISSION_WRITE)) { + color_powerline_freq_ = normalized_color_powerline_freq; + TRY_TO_SET_PROPERTY(setIntProperty, OB_PROP_COLOR_POWER_LINE_FREQUENCY_INT, + color_powerline_freq_value); + TRY_EXECUTE_BLOCK({ + const auto current_color_powerline_freq = + device_->getIntProperty(OB_PROP_COLOR_POWER_LINE_FREQUENCY_INT); + RCLCPP_INFO_STREAM(logger_, + "Current color powerline freq: " + << colorPowerLineFrequencyToString(current_color_powerline_freq)); + }); } - TRY_EXECUTE_BLOCK({ - const auto current_color_powerline_freq = - device_->getIntProperty(OB_PROP_COLOR_POWER_LINE_FREQUENCY_INT); - RCLCPP_INFO_STREAM(logger_, - "Current color powerline freq: " - << colorPowerLineFrequencyToString(current_color_powerline_freq)); - }); } if (depth_exposure_ != -1 && device_->isPropertySupported(OB_PROP_DEPTH_EXPOSURE_INT, OB_PERMISSION_WRITE)) { From 52f32e75aa7c17bf2acf2cad50c86e12348294b7 Mon Sep 17 00:00:00 2001 From: ob-yalian Date: Tue, 15 Sep 2026 09:58:19 +0800 Subject: [PATCH 2/2] fix: unify auto exposure parameter for color and IR streams --- orbbec_camera/launch/gemini_301_series.launch.py | 4 ++-- orbbec_camera/src/ob_camera_node.cpp | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/orbbec_camera/launch/gemini_301_series.launch.py b/orbbec_camera/launch/gemini_301_series.launch.py index d78fc15a..37bb666d 100644 --- a/orbbec_camera/launch/gemini_301_series.launch.py +++ b/orbbec_camera/launch/gemini_301_series.launch.py @@ -142,7 +142,6 @@ def generate_launch_description(): DeclareLaunchArgument('color_gain', default_value='-1'), DeclareLaunchArgument('enable_color_auto_white_balance', default_value='true'), DeclareLaunchArgument('color_white_balance', default_value='-1'), - DeclareLaunchArgument('enable_color_auto_exposure', default_value='true'), DeclareLaunchArgument('color_ae_max_exposure', default_value='-1'), DeclareLaunchArgument('color_brightness', default_value='-1'), DeclareLaunchArgument('color_sharpness', default_value='-1'), @@ -208,7 +207,8 @@ def generate_launch_description(): DeclareLaunchArgument('right_ir_mirror', default_value='false'), DeclareLaunchArgument('enable_right_ir_sequence_id_filter', default_value='false'), DeclareLaunchArgument('right_ir_sequence_id_filter_id', default_value='-1'), - DeclareLaunchArgument('enable_ir_auto_exposure', default_value='true'), + # Gemini 301 color, depth, and IR streams share one auto-exposure switch. + DeclareLaunchArgument('enable_auto_exposure', default_value='true'), DeclareLaunchArgument('ir_exposure', default_value='-1'), DeclareLaunchArgument('ir_gain', default_value='-1'), DeclareLaunchArgument('ir_ae_max_exposure', default_value='-1'), diff --git a/orbbec_camera/src/ob_camera_node.cpp b/orbbec_camera/src/ob_camera_node.cpp index bc2fddc7..286c3b9b 100644 --- a/orbbec_camera/src/ob_camera_node.cpp +++ b/orbbec_camera/src/ob_camera_node.cpp @@ -1721,7 +1721,8 @@ void OBCameraNode::setupDevices() { "Current depth auto exposure priority: " << (device_->getIntProperty(OB_PROP_DEPTH_AUTO_EXPOSURE_PRIORITY_INT) ? "ON" : "OFF"))); } - if (should_apply_launch_config("enable_ir_auto_exposure") && + if ((should_apply_launch_config("enable_auto_exposure") || + should_apply_launch_config("enable_ir_auto_exposure")) && device_->isPropertySupported(OB_PROP_IR_AUTO_EXPOSURE_BOOL, OB_PERMISSION_WRITE)) { TRY_TO_SET_PROPERTY(setBoolProperty, OB_PROP_IR_AUTO_EXPOSURE_BOOL, enable_ir_auto_exposure_); TRY_EXECUTE_BLOCK(RCLCPP_INFO_STREAM( @@ -4772,7 +4773,11 @@ void OBCameraNode::getParameters() { setAndGetNodeParameter(mean_intensity_set_point_, "mean_intensity_set_point", depth_brightness_); setAndGetNodeParameter(depth_precision_str_, "depth_precision", ""); - setAndGetNodeParameter(enable_ir_auto_exposure_, "enable_ir_auto_exposure", true); + setAndGetNodeParameter(enable_ir_auto_exposure_, + isLaunchParamProvided("enable_auto_exposure") + ? "enable_auto_exposure" + : "enable_ir_auto_exposure", + true); setAndGetNodeParameter(ir_exposure_, "ir_exposure", -1); setAndGetNodeParameter(ir_gain_, "ir_gain", -1); setAndGetNodeParameter(ir_ae_max_exposure_, "ir_ae_max_exposure", -1);