diff --git a/orbbec_camera/config/common.yaml b/orbbec_camera/config/common.yaml index bf8a7fde..047c93f1 100644 --- a/orbbec_camera/config/common.yaml +++ b/orbbec_camera/config/common.yaml @@ -122,6 +122,8 @@ orbbec_ros: depth_flip: false # If false, the depth scale will not be enabled enable_depth_scale: true + # If true, the depth image will be undistorted + enable_depth_undistortion: false # Depth accuracy, the format should be 1mm. The default value is 1mm. depth_precision: "" @@ -260,6 +262,8 @@ orbbec_ros: left_ir_fps: 0 # Format of the left IR image. Supported formats are 'Y8' left_ir_format: "ANY" + # If true, the left IR image will be undistorted + enable_left_ir_undistortion: false rightir: # If false, the right IR image will not be enabled @@ -278,6 +282,8 @@ orbbec_ros: right_ir_fps: 0 # Format of the right IR image. Supported formats are 'Y8' right_ir_format: "ANY" + # If true, the right IR image will be undistorted + enable_right_ir_undistortion: false ir: # If false, the left IR image will not be enabled @@ -296,6 +302,8 @@ orbbec_ros: ir_fps: 0 # Format of the IR image. Supported formats are 'Y8' ir_format: "Y8" + # If true, the IR image will be undistorted + enable_ir_undistortion: false ir_parameters: # If false, the IR image auto exposure will not be enabled diff --git a/orbbec_camera/config/gemini305_dual_color.yaml b/orbbec_camera/config/gemini305_dual_color.yaml index e585d8ed..4a64aa08 100644 --- a/orbbec_camera/config/gemini305_dual_color.yaml +++ b/orbbec_camera/config/gemini305_dual_color.yaml @@ -74,6 +74,7 @@ left_color_flip: false left_color_mirror: false enable_left_color_decimation_filter: false left_color_decimation_filter_scale: -1 +enable_left_color_undistortion: false # right_color enable_right_color: true @@ -88,6 +89,7 @@ right_color_flip: false right_color_mirror: false enable_right_color_decimation_filter: false right_color_decimation_filter_scale: -1 +enable_right_color_undistortion: false # color_common enable_color_auto_exposure_priority: false @@ -111,6 +113,10 @@ color_backlight_compensation: -1 color_powerline_freq: "" color_denoising_level: -1 enable_color_undistortion: false +enable_depth_undistortion: false +enable_ir_undistortion: false +enable_left_ir_undistortion: false +enable_right_ir_undistortion: false # hdr_params hdr_index1_depth_exposure: 1 @@ -268,4 +274,3 @@ laser_index0_depth_exposure: 3000 laser_index0_depth_gain: 16 laser_index0_ir_brightness: 60 laser_index0_ir_ae_max_exposure: 30000 - diff --git a/orbbec_camera/examples/benchmark/gemini_330_series_benchmark.launch.py b/orbbec_camera/examples/benchmark/gemini_330_series_benchmark.launch.py index 20d02c16..b9305252 100644 --- a/orbbec_camera/examples/benchmark/gemini_330_series_benchmark.launch.py +++ b/orbbec_camera/examples/benchmark/gemini_330_series_benchmark.launch.py @@ -227,6 +227,9 @@ def generate_launch_description(): DeclareLaunchArgument('time_sync_period', default_value='6.0'), # seconds DeclareLaunchArgument('time_domain', default_value='global'),# global, device, system DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_left_ir_undistortion', default_value='false'), + DeclareLaunchArgument('enable_right_ir_undistortion', default_value='false'), DeclareLaunchArgument('config_file_path', default_value=''), DeclareLaunchArgument('enable_heartbeat', default_value='false'), DeclareLaunchArgument('enable_firmware_log', default_value='false'), diff --git a/orbbec_camera/examples/benchmark/ob_benchmark_0.launch.py b/orbbec_camera/examples/benchmark/ob_benchmark_0.launch.py index 80faff09..8e5ec255 100644 --- a/orbbec_camera/examples/benchmark/ob_benchmark_0.launch.py +++ b/orbbec_camera/examples/benchmark/ob_benchmark_0.launch.py @@ -102,6 +102,10 @@ def generate_launch_description(): DeclareLaunchArgument('right_ir_fps', default_value='30'), DeclareLaunchArgument('right_ir_format', default_value='ANY'), DeclareLaunchArgument('enable_right_ir', default_value='true'), + DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_left_ir_undistortion', default_value='false'), + DeclareLaunchArgument('enable_right_ir_undistortion', default_value='false'), DeclareLaunchArgument('enable_point_cloud', default_value='false'), DeclareLaunchArgument('enable_colored_point_cloud', default_value='false'), DeclareLaunchArgument('enable_decimation_filter', default_value='false'), diff --git a/orbbec_camera/examples/benchmark/ob_benchmark_1.launch.py b/orbbec_camera/examples/benchmark/ob_benchmark_1.launch.py index 81109556..7a8275ab 100644 --- a/orbbec_camera/examples/benchmark/ob_benchmark_1.launch.py +++ b/orbbec_camera/examples/benchmark/ob_benchmark_1.launch.py @@ -102,6 +102,10 @@ def generate_launch_description(): DeclareLaunchArgument('right_ir_fps', default_value='30'), DeclareLaunchArgument('right_ir_format', default_value='ANY'), DeclareLaunchArgument('enable_right_ir', default_value='true'), + DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_left_ir_undistortion', default_value='false'), + DeclareLaunchArgument('enable_right_ir_undistortion', default_value='false'), DeclareLaunchArgument('enable_point_cloud', default_value='false'), DeclareLaunchArgument('enable_colored_point_cloud', default_value='false'), DeclareLaunchArgument('enable_decimation_filter', default_value='false'), diff --git a/orbbec_camera/examples/gmsl_camera/gemini_330_gmsl.launch.py b/orbbec_camera/examples/gmsl_camera/gemini_330_gmsl.launch.py index 20d02c16..b9305252 100644 --- a/orbbec_camera/examples/gmsl_camera/gemini_330_gmsl.launch.py +++ b/orbbec_camera/examples/gmsl_camera/gemini_330_gmsl.launch.py @@ -227,6 +227,9 @@ def generate_launch_description(): DeclareLaunchArgument('time_sync_period', default_value='6.0'), # seconds DeclareLaunchArgument('time_domain', default_value='global'),# global, device, system DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_left_ir_undistortion', default_value='false'), + DeclareLaunchArgument('enable_right_ir_undistortion', default_value='false'), DeclareLaunchArgument('config_file_path', default_value=''), DeclareLaunchArgument('enable_heartbeat', default_value='false'), DeclareLaunchArgument('enable_firmware_log', default_value='false'), diff --git a/orbbec_camera/examples/lower_cpu_usage/gemini_330_series_lower_cpu_usage.launch.py b/orbbec_camera/examples/lower_cpu_usage/gemini_330_series_lower_cpu_usage.launch.py index 5af275bc..31d97274 100644 --- a/orbbec_camera/examples/lower_cpu_usage/gemini_330_series_lower_cpu_usage.launch.py +++ b/orbbec_camera/examples/lower_cpu_usage/gemini_330_series_lower_cpu_usage.launch.py @@ -171,6 +171,9 @@ def generate_launch_description(): DeclareLaunchArgument('time_sync_period', default_value='6.0'), # seconds DeclareLaunchArgument('time_domain', default_value='global'),# global, device, system DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_left_ir_undistortion', default_value='false'), + DeclareLaunchArgument('enable_right_ir_undistortion', default_value='false'), DeclareLaunchArgument('config_file_path', default_value=''), DeclareLaunchArgument('enable_heartbeat', default_value='false'), DeclareLaunchArgument('enable_firmware_log', default_value='false'), diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/gemini_330_series_synced_verify.launch.py b/orbbec_camera/examples/multi_camera_synced_verification_tool/gemini_330_series_synced_verify.launch.py index 20d02c16..b9305252 100644 --- a/orbbec_camera/examples/multi_camera_synced_verification_tool/gemini_330_series_synced_verify.launch.py +++ b/orbbec_camera/examples/multi_camera_synced_verification_tool/gemini_330_series_synced_verify.launch.py @@ -227,6 +227,9 @@ def generate_launch_description(): DeclareLaunchArgument('time_sync_period', default_value='6.0'), # seconds DeclareLaunchArgument('time_domain', default_value='global'),# global, device, system DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_left_ir_undistortion', default_value='false'), + DeclareLaunchArgument('enable_right_ir_undistortion', default_value='false'), DeclareLaunchArgument('config_file_path', default_value=''), DeclareLaunchArgument('enable_heartbeat', default_value='false'), DeclareLaunchArgument('enable_firmware_log', default_value='false'), diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/gemini_synced_verify.launch.py b/orbbec_camera/examples/multi_camera_synced_verification_tool/gemini_synced_verify.launch.py index cdc952a6..207fcd0c 100644 --- a/orbbec_camera/examples/multi_camera_synced_verification_tool/gemini_synced_verify.launch.py +++ b/orbbec_camera/examples/multi_camera_synced_verification_tool/gemini_synced_verify.launch.py @@ -109,6 +109,9 @@ def generate_launch_description(): DeclareLaunchArgument('ir_exposure', default_value='-1'), DeclareLaunchArgument('ir_gain', default_value='-1'), DeclareLaunchArgument('ir_brightness', default_value='-1'), + DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_ir_undistortion', default_value='false'), DeclareLaunchArgument('config_file_path', default_value=''), DeclareLaunchArgument('enable_sync_output_accel_gyro', default_value='true'), DeclareLaunchArgument('enable_accel', default_value='false'), diff --git a/orbbec_camera/include/orbbec_camera/constants.h b/orbbec_camera/include/orbbec_camera/constants.h index b504ae14..b2615132 100644 --- a/orbbec_camera/include/orbbec_camera/constants.h +++ b/orbbec_camera/include/orbbec_camera/constants.h @@ -134,6 +134,10 @@ const int32_t GEMINI_336LE_PID = 0x0810; // Gemini 335Le const int32_t CUSTOM_ADVANTECH_GEMINI_336_PID = 0x0816; // Custom Advantech Gemini 336 const int32_t CUSTOM_ADVANTECH_GEMINI_336L_PID = 0x0817; // Custom Advantech Gemini 336L const int32_t DABAI_MAX_PID = 0x069a; // dabai max +const int32_t DABAI_A_PID = 0x0A12; // DaBai A +const int32_t DABAI_AL_PID = 0x0A13; // DaBai AL +const int32_t GEMINI_345_PID = 0x0812; // Gemini 345 +const int32_t GEMINI_345LG_PID = 0x0813; // Gemini 345Lg const int32_t GEMINI_338_PID = 0x0818; // Gemini 338 const int32_t GEMINI_435Le_PID = 0x815; // Gemini 435Le const int32_t GEMINI_305_PID = 0x0840; // Gemini 305 diff --git a/orbbec_camera/include/orbbec_camera/ob_camera_node.h b/orbbec_camera/include/orbbec_camera/ob_camera_node.h index e2e79cb0..c9f4a87a 100644 --- a/orbbec_camera/include/orbbec_camera/ob_camera_node.h +++ b/orbbec_camera/include/orbbec_camera/ob_camera_node.h @@ -479,6 +479,8 @@ class OBCameraNode { std::shared_ptr processLeftIrFrameFilter(std::shared_ptr& frame); + std::shared_ptr processIrFrameFilter(std::shared_ptr& frame); + uint64_t getFrameTimestampUs(const std::shared_ptr& frame); void onNewFrameSetCallback(std::shared_ptr frame_set); @@ -538,14 +540,21 @@ class OBCameraNode { static bool isGemini435LePID(uint32_t pid); static bool isPublishMetaData(uint32_t pid); + static bool isDabaiASeriesForHwD2C(uint32_t pid); static bool isDepthWorkModeDevices(uint32_t pid); static bool isnotLaserDevices(uint32_t pid); void setupDepthPostProcessFilter(); void setupColorPostProcessFilter(); + void setupIrPostProcessFilter(); void setupRightIrPostProcessFilter(); void setupLeftIrPostProcessFilter(); + void setupUndistortionFilters(); + bool shouldUseHwD2CColorUndistortion() const; + void configureHwD2CColorUndistortion(const std::shared_ptr& depth_frame); + void applyHwD2CColorUndistortion(std::shared_ptr& frame_set, + const std::shared_ptr& depth_frame); // interleave AE int init_interleave_hdr_param(); @@ -919,10 +928,9 @@ class OBCameraNode { std::chrono::milliseconds software_trigger_period_{33}; bool enable_heartbeat_ = false; bool enable_firmware_log_ = false; - bool enable_color_undistortion_ = false; - std::shared_ptr color_undistortion_publisher_; - rclcpp::Publisher::SharedPtr - color_undistortion_camera_info_publisher_; + std::map enable_undistortion_; + std::shared_ptr hw_d2c_color_undistortion_filter_; + bool hw_d2c_color_undistortion_configured_ = false; bool has_first_color_frame_ = false; bool use_intra_process_ = false; std::string cloud_frame_id_; @@ -931,6 +939,7 @@ class OBCameraNode { std::vector> color_filter_list_; std::vector> left_color_filter_list_; std::vector> right_color_filter_list_; + std::vector> ir_filter_list_; std::vector> left_ir_filter_list_; std::vector> right_ir_filter_list_; diff --git a/orbbec_camera/launch/astra.launch.py b/orbbec_camera/launch/astra.launch.py index 497f8894..e9c8daeb 100644 --- a/orbbec_camera/launch/astra.launch.py +++ b/orbbec_camera/launch/astra.launch.py @@ -71,6 +71,9 @@ def generate_launch_description(): DeclareLaunchArgument('timestamp_clock_type', default_value=''), # realtime or monotonic, default is realtime. DeclareLaunchArgument('enable_frame_timestamp_csv', default_value='false'), DeclareLaunchArgument('frame_timestamp_csv_file', default_value=''), + DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_ir_undistortion', default_value='false'), DeclareLaunchArgument('enable_depth_scale', default_value='true'), DeclareLaunchArgument('align_mode', default_value='HW'), DeclareLaunchArgument('laser_energy_level', default_value='-1'), diff --git a/orbbec_camera/launch/astra2.launch.py b/orbbec_camera/launch/astra2.launch.py index 0df3756d..3829ddb5 100644 --- a/orbbec_camera/launch/astra2.launch.py +++ b/orbbec_camera/launch/astra2.launch.py @@ -108,6 +108,9 @@ def generate_launch_description(): DeclareLaunchArgument("timestamp_clock_type", default_value=""), # realtime or monotonic, default is realtime. DeclareLaunchArgument('enable_frame_timestamp_csv', default_value='false'), DeclareLaunchArgument('frame_timestamp_csv_file', default_value=''), + DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_ir_undistortion', default_value='false'), ] # Node configuration diff --git a/orbbec_camera/launch/dabai_a.launch.py b/orbbec_camera/launch/dabai_a.launch.py index b460c88d..bb18c411 100644 --- a/orbbec_camera/launch/dabai_a.launch.py +++ b/orbbec_camera/launch/dabai_a.launch.py @@ -211,6 +211,9 @@ def generate_launch_description(): DeclareLaunchArgument('enable_frame_timestamp_csv', default_value='false'), DeclareLaunchArgument('frame_timestamp_csv_file', default_value=''), DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_left_ir_undistortion', default_value='false'), + DeclareLaunchArgument('enable_right_ir_undistortion', default_value='false'), DeclareLaunchArgument('config_file_path', default_value=''), DeclareLaunchArgument('enable_heartbeat', default_value='false'), DeclareLaunchArgument('enable_firmware_log', default_value='false'), diff --git a/orbbec_camera/launch/dabai_al.launch.py b/orbbec_camera/launch/dabai_al.launch.py index e5f300d1..087ce682 100644 --- a/orbbec_camera/launch/dabai_al.launch.py +++ b/orbbec_camera/launch/dabai_al.launch.py @@ -213,6 +213,9 @@ def generate_launch_description(): DeclareLaunchArgument('enable_frame_timestamp_csv', default_value='false'), DeclareLaunchArgument('frame_timestamp_csv_file', default_value=''), DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_left_ir_undistortion', default_value='false'), + DeclareLaunchArgument('enable_right_ir_undistortion', default_value='false'), DeclareLaunchArgument('config_file_path', default_value=''), DeclareLaunchArgument('enable_heartbeat', default_value='false'), DeclareLaunchArgument('enable_firmware_log', default_value='false'), diff --git a/orbbec_camera/launch/dabai_dcw2.launch.py b/orbbec_camera/launch/dabai_dcw2.launch.py index c26fbc01..97a2b25e 100644 --- a/orbbec_camera/launch/dabai_dcw2.launch.py +++ b/orbbec_camera/launch/dabai_dcw2.launch.py @@ -85,6 +85,9 @@ def generate_launch_description(): DeclareLaunchArgument('timestamp_clock_type', default_value=''), # realtime or monotonic, default is realtime. DeclareLaunchArgument('enable_frame_timestamp_csv', default_value='false'), DeclareLaunchArgument('frame_timestamp_csv_file', default_value=''), + DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_ir_undistortion', default_value='false'), DeclareLaunchArgument('enable_depth_scale', default_value='true'), DeclareLaunchArgument('align_mode', default_value='HW'), DeclareLaunchArgument('laser_energy_level', default_value='-1'), diff --git a/orbbec_camera/launch/dabai_max_pro.launch.py b/orbbec_camera/launch/dabai_max_pro.launch.py index ae2d9bf2..a616dde9 100644 --- a/orbbec_camera/launch/dabai_max_pro.launch.py +++ b/orbbec_camera/launch/dabai_max_pro.launch.py @@ -79,6 +79,9 @@ def generate_launch_description(): DeclareLaunchArgument('timestamp_clock_type', default_value=''), # realtime or monotonic, default is realtime. DeclareLaunchArgument('enable_frame_timestamp_csv', default_value='false'), DeclareLaunchArgument('frame_timestamp_csv_file', default_value=''), + DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_ir_undistortion', default_value='false'), DeclareLaunchArgument('align_mode', default_value='HW'), DeclareLaunchArgument('laser_energy_level', default_value='-1'), DeclareLaunchArgument('enable_heartbeat', default_value='false'), diff --git a/orbbec_camera/launch/femto.launch.py b/orbbec_camera/launch/femto.launch.py index 8f8e7f3c..4b1bb8e9 100644 --- a/orbbec_camera/launch/femto.launch.py +++ b/orbbec_camera/launch/femto.launch.py @@ -86,6 +86,9 @@ def generate_launch_description(): DeclareLaunchArgument("timestamp_clock_type", default_value=""), # realtime or monotonic, default is realtime. DeclareLaunchArgument('enable_frame_timestamp_csv', default_value='false'), DeclareLaunchArgument('frame_timestamp_csv_file', default_value=''), + DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_ir_undistortion', default_value='false'), DeclareLaunchArgument('device_preset', default_value='Custom'), ] diff --git a/orbbec_camera/launch/femto_bolt.launch.py b/orbbec_camera/launch/femto_bolt.launch.py index a49a9c02..c2feb083 100644 --- a/orbbec_camera/launch/femto_bolt.launch.py +++ b/orbbec_camera/launch/femto_bolt.launch.py @@ -114,6 +114,9 @@ def generate_launch_description(): DeclareLaunchArgument("timestamp_clock_type", default_value=""), # realtime or monotonic, default is realtime. DeclareLaunchArgument('enable_frame_timestamp_csv', default_value='false'), DeclareLaunchArgument('frame_timestamp_csv_file', default_value=''), + DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_ir_undistortion', default_value='false'), DeclareLaunchArgument('device_preset', default_value='Custom'), ] diff --git a/orbbec_camera/launch/femto_mega.launch.py b/orbbec_camera/launch/femto_mega.launch.py index 39d5ee10..d25deeff 100644 --- a/orbbec_camera/launch/femto_mega.launch.py +++ b/orbbec_camera/launch/femto_mega.launch.py @@ -120,6 +120,9 @@ def generate_launch_description(): DeclareLaunchArgument("timestamp_clock_type", default_value=""), # realtime or monotonic, default is realtime. DeclareLaunchArgument('enable_frame_timestamp_csv', default_value='false'), DeclareLaunchArgument('frame_timestamp_csv_file', default_value=''), + DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_ir_undistortion', default_value='false'), DeclareLaunchArgument('device_preset', default_value='Custom'), # Force IP parameters diff --git a/orbbec_camera/launch/gemini2.launch.py b/orbbec_camera/launch/gemini2.launch.py index 887fabf8..19cf5e5b 100644 --- a/orbbec_camera/launch/gemini2.launch.py +++ b/orbbec_camera/launch/gemini2.launch.py @@ -136,6 +136,9 @@ def generate_launch_description(): DeclareLaunchArgument("timestamp_clock_type", default_value=""), # realtime or monotonic, default is realtime. DeclareLaunchArgument('enable_frame_timestamp_csv', default_value='false'), DeclareLaunchArgument('frame_timestamp_csv_file', default_value=''), + DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_ir_undistortion', default_value='false'), ] # Node configuration diff --git a/orbbec_camera/launch/gemini210.launch.py b/orbbec_camera/launch/gemini210.launch.py index d857146e..38763927 100644 --- a/orbbec_camera/launch/gemini210.launch.py +++ b/orbbec_camera/launch/gemini210.launch.py @@ -134,6 +134,9 @@ def generate_launch_description(): DeclareLaunchArgument("timestamp_clock_type", default_value=""), # realtime or monotonic, default is realtime. DeclareLaunchArgument('enable_frame_timestamp_csv', default_value='false'), DeclareLaunchArgument('frame_timestamp_csv_file', default_value=''), + DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_ir_undistortion', default_value='false'), ] # Node configuration diff --git a/orbbec_camera/launch/gemini2L.launch.py b/orbbec_camera/launch/gemini2L.launch.py index 009a965b..c54cbefc 100644 --- a/orbbec_camera/launch/gemini2L.launch.py +++ b/orbbec_camera/launch/gemini2L.launch.py @@ -187,6 +187,9 @@ def generate_launch_description(): DeclareLaunchArgument("timestamp_clock_type", default_value=""), # realtime or monotonic, default is realtime. DeclareLaunchArgument("enable_frame_timestamp_csv", default_value="false"), DeclareLaunchArgument("frame_timestamp_csv_file", default_value=""), + DeclareLaunchArgument("enable_color_undistortion", default_value="false"), + DeclareLaunchArgument("enable_depth_undistortion", default_value="false"), + DeclareLaunchArgument("enable_ir_undistortion", default_value="false"), DeclareLaunchArgument("config_file_path", default_value=""), ] diff --git a/orbbec_camera/launch/gemini305.launch.py b/orbbec_camera/launch/gemini305.launch.py index bc3ad82f..a202e09d 100644 --- a/orbbec_camera/launch/gemini305.launch.py +++ b/orbbec_camera/launch/gemini305.launch.py @@ -276,6 +276,9 @@ def generate_launch_description(): DeclareLaunchArgument('enable_frame_timestamp_csv', default_value='false'), DeclareLaunchArgument('frame_timestamp_csv_file', default_value=''), DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_left_ir_undistortion', default_value='false'), + DeclareLaunchArgument('enable_right_ir_undistortion', default_value='false'), DeclareLaunchArgument('config_file_path', default_value=''), DeclareLaunchArgument('enable_heartbeat', default_value='false'), DeclareLaunchArgument('enable_firmware_log', default_value='false'), diff --git a/orbbec_camera/launch/gemini305_g.launch.py b/orbbec_camera/launch/gemini305_g.launch.py index bc3ad82f..a202e09d 100644 --- a/orbbec_camera/launch/gemini305_g.launch.py +++ b/orbbec_camera/launch/gemini305_g.launch.py @@ -276,6 +276,9 @@ def generate_launch_description(): DeclareLaunchArgument('enable_frame_timestamp_csv', default_value='false'), DeclareLaunchArgument('frame_timestamp_csv_file', default_value=''), DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_left_ir_undistortion', default_value='false'), + DeclareLaunchArgument('enable_right_ir_undistortion', default_value='false'), DeclareLaunchArgument('config_file_path', default_value=''), DeclareLaunchArgument('enable_heartbeat', default_value='false'), DeclareLaunchArgument('enable_firmware_log', default_value='false'), diff --git a/orbbec_camera/launch/gemini345.launch.py b/orbbec_camera/launch/gemini345.launch.py index 64c8891a..e4d87fb6 100644 --- a/orbbec_camera/launch/gemini345.launch.py +++ b/orbbec_camera/launch/gemini345.launch.py @@ -210,6 +210,9 @@ def generate_launch_description(): DeclareLaunchArgument('enable_frame_timestamp_csv', default_value='false'), DeclareLaunchArgument('frame_timestamp_csv_file', default_value=''), DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_left_ir_undistortion', default_value='false'), + DeclareLaunchArgument('enable_right_ir_undistortion', default_value='false'), DeclareLaunchArgument('config_file_path', default_value=''), DeclareLaunchArgument('enable_heartbeat', default_value='false'), DeclareLaunchArgument('enable_firmware_log', default_value='false'), diff --git a/orbbec_camera/launch/gemini345_lg.launch.py b/orbbec_camera/launch/gemini345_lg.launch.py index e5f300d1..087ce682 100644 --- a/orbbec_camera/launch/gemini345_lg.launch.py +++ b/orbbec_camera/launch/gemini345_lg.launch.py @@ -213,6 +213,9 @@ def generate_launch_description(): DeclareLaunchArgument('enable_frame_timestamp_csv', default_value='false'), DeclareLaunchArgument('frame_timestamp_csv_file', default_value=''), DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_left_ir_undistortion', default_value='false'), + DeclareLaunchArgument('enable_right_ir_undistortion', default_value='false'), DeclareLaunchArgument('config_file_path', default_value=''), DeclareLaunchArgument('enable_heartbeat', default_value='false'), DeclareLaunchArgument('enable_firmware_log', default_value='false'), diff --git a/orbbec_camera/launch/gemini435_le.launch.py b/orbbec_camera/launch/gemini435_le.launch.py index 93c9b9a6..fb99fa5b 100644 --- a/orbbec_camera/launch/gemini435_le.launch.py +++ b/orbbec_camera/launch/gemini435_le.launch.py @@ -244,6 +244,9 @@ def generate_launch_description(): DeclareLaunchArgument('enable_frame_timestamp_csv', default_value='false'), DeclareLaunchArgument('frame_timestamp_csv_file', default_value=''), DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_left_ir_undistortion', default_value='false'), + DeclareLaunchArgument('enable_right_ir_undistortion', default_value='false'), DeclareLaunchArgument('config_file_path', default_value=''), DeclareLaunchArgument('enable_heartbeat', default_value='false'), DeclareLaunchArgument('enable_firmware_log', default_value='false'), diff --git a/orbbec_camera/launch/gemini_330_series.launch.py b/orbbec_camera/launch/gemini_330_series.launch.py index 91debc7e..b2483617 100644 --- a/orbbec_camera/launch/gemini_330_series.launch.py +++ b/orbbec_camera/launch/gemini_330_series.launch.py @@ -262,6 +262,9 @@ def generate_launch_description(): DeclareLaunchArgument('enable_frame_timestamp_csv', default_value='false'), DeclareLaunchArgument('frame_timestamp_csv_file', default_value=''), DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_left_ir_undistortion', default_value='false'), + DeclareLaunchArgument('enable_right_ir_undistortion', default_value='false'), DeclareLaunchArgument('config_file_path', default_value=''), DeclareLaunchArgument('enable_heartbeat', default_value='false'), DeclareLaunchArgument('enable_firmware_log', default_value='false'), diff --git a/orbbec_camera/launch/gemini_330_series_low_cpu.launch.py b/orbbec_camera/launch/gemini_330_series_low_cpu.launch.py index 833e8835..e909131f 100644 --- a/orbbec_camera/launch/gemini_330_series_low_cpu.launch.py +++ b/orbbec_camera/launch/gemini_330_series_low_cpu.launch.py @@ -261,6 +261,9 @@ def generate_launch_description(): DeclareLaunchArgument('enable_frame_timestamp_csv', default_value='false'), DeclareLaunchArgument('frame_timestamp_csv_file', default_value=''), DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_left_ir_undistortion', default_value='false'), + DeclareLaunchArgument('enable_right_ir_undistortion', default_value='false'), DeclareLaunchArgument('config_file_path', default_value=''), DeclareLaunchArgument('enable_heartbeat', default_value='false'), DeclareLaunchArgument('enable_firmware_log', default_value='false'), diff --git a/orbbec_camera/launch/gemini_330_series_sdk_json.launch.py b/orbbec_camera/launch/gemini_330_series_sdk_json.launch.py index 2ef42e7e..c2ccd937 100644 --- a/orbbec_camera/launch/gemini_330_series_sdk_json.launch.py +++ b/orbbec_camera/launch/gemini_330_series_sdk_json.launch.py @@ -143,6 +143,10 @@ def generate_launch_description(): DeclareLaunchArgument('time_domain', default_value='global'), DeclareLaunchArgument('enable_frame_timestamp_csv', default_value='false'), DeclareLaunchArgument('frame_timestamp_csv_file', default_value=''), + DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_left_ir_undistortion', default_value='false'), + DeclareLaunchArgument('enable_right_ir_undistortion', default_value='false'), DeclareLaunchArgument('enable_d2c_viewer', default_value='false'), DeclareLaunchArgument('show_fps_enable', default_value='false'), diff --git a/orbbec_camera/launch/gemini_intra_process_demo_launch.py b/orbbec_camera/launch/gemini_intra_process_demo_launch.py index fc269ef5..3f7a5a27 100644 --- a/orbbec_camera/launch/gemini_intra_process_demo_launch.py +++ b/orbbec_camera/launch/gemini_intra_process_demo_launch.py @@ -164,6 +164,9 @@ def generate_launch_description(): DeclareLaunchArgument('time_domain', default_value='device'), DeclareLaunchArgument('timestamp_clock_type', default_value=''),# realtime or monotonic, default is realtime. DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_left_ir_undistortion', default_value='false'), + DeclareLaunchArgument('enable_right_ir_undistortion', default_value='false'), DeclareLaunchArgument('config_file_path', default_value=''), DeclareLaunchArgument('enable_heartbeat', default_value='false'), DeclareLaunchArgument('enable_firmware_log', default_value='false'), diff --git a/orbbec_camera/launch/orbbec_camera.launch.py b/orbbec_camera/launch/orbbec_camera.launch.py index e8c9047a..053a720a 100644 --- a/orbbec_camera/launch/orbbec_camera.launch.py +++ b/orbbec_camera/launch/orbbec_camera.launch.py @@ -37,6 +37,11 @@ def generate_launch_arguments(): DeclareLaunchArgument('trigger_out_enabled', default_value='true'), DeclareLaunchArgument('enable_frame_timestamp_csv', default_value='false'), DeclareLaunchArgument('frame_timestamp_csv_file', default_value=''), + DeclareLaunchArgument('enable_color_undistortion', default_value='false'), + DeclareLaunchArgument('enable_depth_undistortion', default_value='false'), + DeclareLaunchArgument('enable_ir_undistortion', default_value='false'), + DeclareLaunchArgument('enable_left_ir_undistortion', default_value='false'), + DeclareLaunchArgument('enable_right_ir_undistortion', default_value='false'), #instra-process demo set DeclareLaunchArgument('use_intra_process_comms', default_value='false'), DeclareLaunchArgument('attach_component_container_enable', default_value='false'), diff --git a/orbbec_camera/src/ob_camera_node.cpp b/orbbec_camera/src/ob_camera_node.cpp index 1bac451b..b7f4bd9d 100644 --- a/orbbec_camera/src/ob_camera_node.cpp +++ b/orbbec_camera/src/ob_camera_node.cpp @@ -2409,6 +2409,136 @@ void OBCameraNode::setupColorPostProcessFilter() { } } } + +void OBCameraNode::setupIrPostProcessFilter() { + try { + auto ir_sensor = device_->getSensor(OB_SENSOR_IR); + ir_filter_list_ = ir_sensor->createRecommendedFilters(); + if (ir_filter_list_.empty()) { + RCLCPP_WARN_STREAM(logger_, "Failed to get ir sensor filter list"); + } + } catch (const ob::Error &e) { + RCLCPP_WARN_STREAM(logger_, "Failed to setup ir filters: " + << orbbec_camera::formatObErrorWithStatus(e)); + } +} + +void OBCameraNode::setupUndistortionFilters() { + auto remove_undistortion_filter = [](std::vector> &filters) { + filters.erase(std::remove_if(filters.begin(), filters.end(), + [](const std::shared_ptr &filter) { + return filter && std::string(filter->type()) == + "UnDistortionFilter"; + }), + filters.end()); + }; + + auto find_or_create_filter = + [&](std::vector> &filters, + OBStreamType stream_type) -> std::shared_ptr { + for (auto &filter : filters) { + if (filter && std::string(filter->type()) == "UnDistortionFilter") { + auto undistortion_filter = filter->as(); + undistortion_filter->setStreamType(stream_type); + undistortion_filter->enable(true); + return undistortion_filter; + } + } + auto undistortion_filter = std::make_shared(stream_type); + undistortion_filter->enable(true); + filters.push_back(undistortion_filter); + return undistortion_filter; + }; + + auto setup_stream_filter = [&](const stream_index_pair &stream_index, + std::vector> &filters) { + if (!enable_stream_[stream_index] || !enable_undistortion_[stream_index]) { + return; + } + if (stream_index == LIDAR) { + RCLCPP_WARN_STREAM(logger_, "Undistortion is not supported for lidar stream"); + return; + } + if (stream_index == COLOR && shouldUseHwD2CColorUndistortion()) { + remove_undistortion_filter(filters); + hw_d2c_color_undistortion_filter_ = + std::make_shared(OB_STREAM_COLOR); + hw_d2c_color_undistortion_filter_->enable(true); + RCLCPP_INFO_STREAM(logger_, + "Enable color undistortion with HW D2C depth intrinsic projection"); + return; + } + auto undistortion_filter = find_or_create_filter(filters, stream_index.first); + undistortion_filter->clearNewCameraMatrix(); + RCLCPP_INFO_STREAM(logger_, "Enable " << stream_name_[stream_index] << " undistortion"); + }; + + setup_stream_filter(COLOR, color_filter_list_); + setup_stream_filter(COLOR_LEFT, left_color_filter_list_); + setup_stream_filter(COLOR_RIGHT, right_color_filter_list_); + setup_stream_filter(DEPTH, depth_filter_list_); + setup_stream_filter(INFRA0, ir_filter_list_); + setup_stream_filter(INFRA1, left_ir_filter_list_); + setup_stream_filter(INFRA2, right_ir_filter_list_); +} + +bool OBCameraNode::shouldUseHwD2CColorUndistortion() const { + auto color_undistortion = enable_undistortion_.find(COLOR); + return color_undistortion != enable_undistortion_.end() && color_undistortion->second && + isDabaiASeriesForHwD2C(pid_) && depth_registration_ && align_mode_ == "HW" && + align_target_stream_ == OB_STREAM_COLOR && enable_stream_.at(COLOR) && + enable_stream_.at(DEPTH); +} + +void OBCameraNode::configureHwD2CColorUndistortion(const std::shared_ptr &depth_frame) { + if (!hw_d2c_color_undistortion_filter_ || hw_d2c_color_undistortion_configured_) { + return; + } + if (!depth_frame) { + RCLCPP_WARN_ONCE(logger_, + "Skip HW D2C color undistortion setup because depth frame is not available"); + return; + } + auto stream_profile = depth_frame->getStreamProfile(); + if (!stream_profile) { + RCLCPP_WARN_ONCE(logger_, + "Skip HW D2C color undistortion setup because depth stream profile is null"); + return; + } + auto video_profile = stream_profile->as(); + if (!video_profile) { + RCLCPP_WARN_ONCE(logger_, + "Skip HW D2C color undistortion setup because depth profile is not video"); + return; + } + hw_d2c_color_undistortion_filter_->setNewCameraMatrix(video_profile->getIntrinsic()); + hw_d2c_color_undistortion_configured_ = true; + RCLCPP_INFO_STREAM(logger_, + "Configured HW D2C color undistortion with depth camera intrinsic"); +} + +void OBCameraNode::applyHwD2CColorUndistortion(std::shared_ptr &frame_set, + const std::shared_ptr &depth_frame) { + if (!frame_set || !hw_d2c_color_undistortion_filter_) { + return; + } + configureHwD2CColorUndistortion(depth_frame); + if (!hw_d2c_color_undistortion_configured_) { + return; + } + auto undistorted_frame = hw_d2c_color_undistortion_filter_->process(frame_set); + if (!undistorted_frame) { + RCLCPP_WARN_STREAM(logger_, "HW D2C color undistortion filter returned null frame"); + return; + } + auto undistorted_frame_set = undistorted_frame->as(); + if (!undistorted_frame_set) { + RCLCPP_WARN_STREAM(logger_, "HW D2C color undistortion filter returned non-frameset output"); + return; + } + frame_set = undistorted_frame_set; +} + void OBCameraNode::setupLeftIrPostProcessFilter() { auto device_info = device_->getDeviceInfo(); CHECK_NOTNULL(device_info); @@ -3341,6 +3471,8 @@ void OBCameraNode::getParameters() { setAndGetNodeParameter(image_qos_[stream_index], param_name, "default"); param_name = stream_name_[stream_index] + "_camera_info_qos"; setAndGetNodeParameter(camera_info_qos_[stream_index], param_name, "default"); + param_name = "enable_" + stream_name_[stream_index] + "_undistortion"; + setAndGetNodeParameter(enable_undistortion_[stream_index], param_name, false); } for (auto stream_index : IMAGE_STREAMS) { @@ -3539,7 +3671,6 @@ void OBCameraNode::getParameters() { setAndGetNodeParameter(max_depth_limit_, "max_depth_limit", 0); setAndGetNodeParameter(enable_heartbeat_, "enable_heartbeat", false); setAndGetNodeParameter(enable_firmware_log_, "enable_firmware_log", false); - setAndGetNodeParameter(enable_color_undistortion_, "enable_color_undistortion", false); setAndGetNodeParameter(time_domain_, "time_domain", "global"); setAndGetNodeParameter(enable_frame_timestamp_csv_, "enable_frame_timestamp_csv", false); setAndGetNodeParameter(frame_timestamp_csv_file_, "frame_timestamp_csv_file", ""); @@ -3570,7 +3701,7 @@ void OBCameraNode::getParameters() { depth_registration_ = false; enable_d2c_viewer_ = false; enable_depth_filter_ = false; - enable_color_undistortion_ = false; + enable_undistortion_[COLOR] = false; } if (isOpenNIDevice(pid_)) { @@ -3672,12 +3803,16 @@ void OBCameraNode::setupTopics() { if (enable_stream_[COLOR] || enable_stream_[COLOR_LEFT] || enable_stream_[COLOR_RIGHT]) { setupColorPostProcessFilter(); } + if (enable_stream_[INFRA0]) { + setupIrPostProcessFilter(); + } if (enable_stream_[INFRA2]) { setupRightIrPostProcessFilter(); } if (enable_stream_[INFRA1]) { setupLeftIrPostProcessFilter(); } + setupUndistortionFilters(); syncConfigJsonDeviceSettings(); syncConfigJsonFilterSettings(depth_filter_list_, "depth"); syncConfigJsonFilterSettings(color_filter_list_, "color"); @@ -3963,19 +4098,6 @@ void OBCameraNode::setupPublishers() { rclcpp::QoS(rclcpp::QoSInitialization::from_rmw(camera_info_qos_profile), camera_info_qos_profile)); } - if (stream_index == COLOR && enable_color_undistortion_) { - color_undistortion_camera_info_publisher_ = node_->create_publisher( - "color/camera_info_undistorted", - rclcpp::QoS(rclcpp::QoSInitialization::from_rmw(camera_info_qos_profile), - camera_info_qos_profile)); - if (use_intra_process_) { - color_undistortion_publisher_ = std::make_shared( - *node_, "color/image_undistorted", image_qos_profile); - } else { - color_undistortion_publisher_ = std::make_shared( - *node_, "color/image_undistorted", image_qos_profile); - } - } } if (depth_registration_ && align_mode_ == "SW") { @@ -4370,6 +4492,24 @@ void OBCameraNode::publishColoredPointCloud(const std::shared_ptr depth_registration_cloud_pub_->publish(std::move(point_cloud_msg)); } +std::shared_ptr OBCameraNode::processIrFrameFilter(std::shared_ptr &frame) { + if (frame == nullptr || frame->getType() != OB_FRAME_IR) { + return nullptr; + } + for (size_t i = 0; i < ir_filter_list_.size(); i++) { + auto filter = ir_filter_list_[i]; + CHECK_NOTNULL(filter.get()); + if (filter->isEnabled() && frame != nullptr) { + frame = filter->process(frame); + if (frame == nullptr) { + RCLCPP_ERROR_STREAM(logger_, "Ir filter process failed"); + break; + } + } + } + return frame; +} + std::shared_ptr OBCameraNode::processRightIrFrameFilter( std::shared_ptr &frame) { if (frame == nullptr || frame->getType() != OB_FRAME_IR_RIGHT) { @@ -4644,6 +4784,7 @@ void OBCameraNode::onNewFrameSetCallback(std::shared_ptr frame_set auto left_color_frame = frame_set->getFrame(OB_FRAME_COLOR_LEFT); auto right_color_frame = frame_set->getFrame(OB_FRAME_COLOR_RIGHT); auto ir_frame = frame_set->getFrame(OB_FRAME_IR); + auto depth_frame_for_hw_d2c_undistortion = depth_frame; if (depth_frame) { setDisparitySearchOffset(); setDepthAutoExposureROI(); @@ -4653,6 +4794,11 @@ void OBCameraNode::onNewFrameSetCallback(std::shared_ptr frame_set fps_counter_depth_->tick(); } } + if (shouldUseHwD2CColorUndistortion() && color_frame) { + applyHwD2CColorUndistortion(frame_set, depth_frame_for_hw_d2c_undistortion); + depth_frame = frame_set->getFrame(OB_FRAME_DEPTH); + color_frame = frame_set->getFrame(OB_FRAME_COLOR); + } if (color_frame) { setColorAutoExposureROI(); color_frame = processColorFrameFilter(color_frame); @@ -4678,6 +4824,12 @@ void OBCameraNode::onNewFrameSetCallback(std::shared_ptr frame_set frame_set->pushFrame(right_ir_frame); fps_counter_right_ir_->tick(); } + if (ir_frame) { + ir_frame = processIrFrameFilter(ir_frame); + if (ir_frame) { + frame_set->pushFrame(ir_frame); + } + } if (depth_registration_ && align_filter_ && depth_frame) { publishRawDepthImage(depth_frame); if (auto new_frame = align_filter_->process(frame_set)) { @@ -4938,9 +5090,6 @@ bool OBCameraNode::decodeColorFrameToBuffer(const std::shared_ptr &fr if (image_publishers_.count(stream_index) && image_publishers_.at(stream_index)) { has_subscriber = image_publishers_.at(stream_index)->get_subscription_count() > 0; } - if (stream_index == COLOR && enable_color_undistortion_ && color_undistortion_publisher_) { - has_subscriber = true; - } if (save_images_[stream_index]) { has_subscriber = true; } @@ -5047,10 +5196,8 @@ void OBCameraNode::onNewFrameCallback(const std::shared_ptr &frame, const bool has_raw_image_subscriber = image_publishers_[stream_index]->get_subscription_count() > 0; const bool has_compressed_image_subscriber = hasCompressedImageSubscriber(stream_index); - const bool enable_undistortion_publish = - (stream_index == COLOR && enable_color_undistortion_ && color_undistortion_publisher_); bool has_subscriber = has_raw_image_subscriber || has_compressed_image_subscriber || - enable_undistortion_publish || save_images_[stream_index]; + save_images_[stream_index]; has_subscriber = has_subscriber || camera_info_publishers_[stream_index]->get_subscription_count() > 0; has_subscriber = @@ -5166,7 +5313,7 @@ void OBCameraNode::onNewFrameCallback(const std::shared_ptr &frame, } } - if (!has_raw_image_subscriber && !enable_undistortion_publish && !save_images_[stream_index]) { + if (!has_raw_image_subscriber && !save_images_[stream_index]) { CHECK(camera_info_publishers_.count(stream_index) > 0); camera_info_publishers_[stream_index]->publish(camera_info); publishMetadata(frame, stream_index, camera_info.header); @@ -5177,8 +5324,7 @@ void OBCameraNode::onNewFrameCallback(const std::shared_ptr &frame, if (image.empty() || image.cols != width || image.rows != height) { image.create(height, width, image_format_[stream_index]); } - if (isColorFrameDecodeRequired(frame) && - (has_raw_image_subscriber || enable_undistortion_publish || save_images_[stream_index])) { + if (isColorFrameDecodeRequired(frame) && (has_raw_image_subscriber || save_images_[stream_index])) { if (frame->getType() == OB_FRAME_COLOR && !is_color_frame_decoded_) { RCLCPP_ERROR(logger_, "color frame is not decoded"); return; @@ -5202,41 +5348,6 @@ void OBCameraNode::onNewFrameCallback(const std::shared_ptr &frame, memcpy(image.data, video_frame->getData(), video_frame->getDataSize()); } - if (enable_undistortion_publish) { - auto undistort_result = undistortImage(image, intrinsic, distortion); - sensor_msgs::msg::Image::UniquePtr undistorted_image_msg(new sensor_msgs::msg::Image()); - cv_bridge::CvImage(std_msgs::msg::Header(), encoding_[stream_index], undistort_result.image) - .toImageMsg(*undistorted_image_msg); - CHECK_NOTNULL(undistorted_image_msg.get()); - undistorted_image_msg->header.stamp = timestamp; - undistorted_image_msg->is_bigendian = false; - undistorted_image_msg->step = width * unit_step_size_[stream_index]; - undistorted_image_msg->header.frame_id = frame_id; - color_undistortion_publisher_->publish(std::move(undistorted_image_msg)); - - if (color_undistortion_camera_info_publisher_) { - auto undistorted_camera_info = camera_info; - const auto distortion_coeff_count = - undistorted_camera_info.d.empty() ? 5 : undistorted_camera_info.d.size(); - undistorted_camera_info.d.assign(distortion_coeff_count, 0.0); - undistorted_camera_info.distortion_model = sensor_msgs::distortion_models::PLUMB_BOB; - undistorted_camera_info.roi.do_rectify = false; - undistorted_camera_info.k.fill(0.0); - undistorted_camera_info.k.at(0) = undistort_result.new_intrinsic.fx; - undistorted_camera_info.k.at(4) = undistort_result.new_intrinsic.fy; - undistorted_camera_info.k.at(2) = undistort_result.new_intrinsic.cx; - undistorted_camera_info.k.at(5) = undistort_result.new_intrinsic.cy; - undistorted_camera_info.k.at(8) = 1.0; - undistorted_camera_info.p.fill(0.0); - undistorted_camera_info.p.at(0) = undistort_result.new_intrinsic.fx; - undistorted_camera_info.p.at(5) = undistort_result.new_intrinsic.fy; - undistorted_camera_info.p.at(2) = undistort_result.new_intrinsic.cx; - undistorted_camera_info.p.at(6) = undistort_result.new_intrinsic.cy; - undistorted_camera_info.p.at(10) = 1.0; - color_undistortion_camera_info_publisher_->publish(undistorted_camera_info); - } - } - CHECK(camera_info_publishers_.count(stream_index) > 0); camera_info_publishers_[stream_index]->publish(camera_info); publishMetadata(frame, stream_index, camera_info.header); @@ -5891,6 +6002,11 @@ bool OBCameraNode::isPublishMetaData(uint32_t pid) { return isGemini335PID(pid) || isGemini435LePID(pid) || isGemini305SeriesPID(pid); } +bool OBCameraNode::isDabaiASeriesForHwD2C(uint32_t pid) { + return pid == DABAI_A_PID || pid == DABAI_AL_PID || pid == GEMINI_345_PID || + pid == GEMINI_345LG_PID; +} + bool OBCameraNode::isDepthWorkModeDevices(uint32_t pid) { return pid == GEMINI_435Le_PID; } bool OBCameraNode::isnotLaserDevices(uint32_t pid) { return isGemini305SeriesPID(pid); }