diff --git a/orbbec_camera/include/orbbec_camera/ob_camera_node_driver.h b/orbbec_camera/include/orbbec_camera/ob_camera_node_driver.h index 89a89058..a1e957f1 100644 --- a/orbbec_camera/include/orbbec_camera/ob_camera_node_driver.h +++ b/orbbec_camera/include/orbbec_camera/ob_camera_node_driver.h @@ -28,7 +28,6 @@ #include #include - namespace orbbec_camera { class OBCameraNodeDriver : public rclcpp::Node { @@ -83,6 +82,7 @@ class OBCameraNodeDriver : public rclcpp::Node { std::string serial_number_; std::string device_unique_id_; std::string usb_port_; + std::string uvc_backend_; bool enumerate_net_device_ = false; // default false std::shared_ptr parameters_ = nullptr; std::shared_ptr query_thread_ = nullptr; diff --git a/orbbec_camera/launch/astra2.launch.py b/orbbec_camera/launch/astra2.launch.py index 961f674d..56e7c2fb 100644 --- a/orbbec_camera/launch/astra2.launch.py +++ b/orbbec_camera/launch/astra2.launch.py @@ -19,6 +19,7 @@ def generate_launch_description(): DeclareLaunchArgument('device_num', default_value='1'), DeclareLaunchArgument('vendor_id', default_value='0x2bc5'), DeclareLaunchArgument('product_id', default_value=''), + DeclareLaunchArgument('uvc_backend', default_value='auto'),#auto, libuvc or v4l2 DeclareLaunchArgument('enable_point_cloud', default_value='true'), DeclareLaunchArgument('enable_colored_point_cloud', default_value='false'), DeclareLaunchArgument('cloud_frame_id', default_value=''), diff --git a/orbbec_camera/launch/astra_embedded_s.launch.py b/orbbec_camera/launch/astra_embedded_s.launch.py index 2f45e16c..211a2bda 100644 --- a/orbbec_camera/launch/astra_embedded_s.launch.py +++ b/orbbec_camera/launch/astra_embedded_s.launch.py @@ -19,6 +19,7 @@ def generate_launch_description(): DeclareLaunchArgument('device_num', default_value='1'), DeclareLaunchArgument('vendor_id', default_value='0x2bc5'), DeclareLaunchArgument('product_id', default_value=''), + DeclareLaunchArgument('uvc_backend', default_value='auto'),#auto, libuvc or v4l2 DeclareLaunchArgument('enable_point_cloud', default_value='true'), DeclareLaunchArgument('enable_colored_point_cloud', default_value='false'), DeclareLaunchArgument('cloud_frame_id', default_value=''), diff --git a/orbbec_camera/launch/astra_stereo_u3.launch.py b/orbbec_camera/launch/astra_stereo_u3.launch.py index 036ce7f3..35e28ff7 100644 --- a/orbbec_camera/launch/astra_stereo_u3.launch.py +++ b/orbbec_camera/launch/astra_stereo_u3.launch.py @@ -19,6 +19,7 @@ def generate_launch_description(): DeclareLaunchArgument('device_num', default_value='1'), DeclareLaunchArgument('vendor_id', default_value='0x2bc5'), DeclareLaunchArgument('product_id', default_value=''), + DeclareLaunchArgument('uvc_backend', default_value='auto'),#auto, libuvc or v4l2 DeclareLaunchArgument('enable_point_cloud', default_value='true'), DeclareLaunchArgument('enable_colored_point_cloud', default_value='false'), DeclareLaunchArgument('cloud_frame_id', default_value=''), diff --git a/orbbec_camera/launch/dabai.launch.py b/orbbec_camera/launch/dabai.launch.py index 6213005b..187609dd 100644 --- a/orbbec_camera/launch/dabai.launch.py +++ b/orbbec_camera/launch/dabai.launch.py @@ -19,15 +19,16 @@ def generate_launch_description(): DeclareLaunchArgument('device_num', default_value='1'), DeclareLaunchArgument('vendor_id', default_value='0x2bc5'), DeclareLaunchArgument('product_id', default_value=''), + DeclareLaunchArgument('uvc_backend', default_value='auto'),#auto, libuvc or v4l2 DeclareLaunchArgument('enable_point_cloud', default_value='true'), DeclareLaunchArgument('enable_colored_point_cloud', default_value='false'), DeclareLaunchArgument('cloud_frame_id', default_value=''), DeclareLaunchArgument('point_cloud_qos', default_value='default'), DeclareLaunchArgument('connection_delay', default_value='100'), - DeclareLaunchArgument('color_width', default_value='640'), - DeclareLaunchArgument('color_height', default_value='480'), - DeclareLaunchArgument('color_fps', default_value='30'), - DeclareLaunchArgument('color_format', default_value='MJPG'), + DeclareLaunchArgument('color_width', default_value='0'), + DeclareLaunchArgument('color_height', default_value='0'), + DeclareLaunchArgument('color_fps', default_value='0'), + DeclareLaunchArgument('color_format', default_value='ANY'), DeclareLaunchArgument('enable_color', default_value='true'), DeclareLaunchArgument('flip_color', default_value='false'), DeclareLaunchArgument('color_qos', default_value='default'), @@ -38,18 +39,18 @@ 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('depth_width', default_value='640'), - DeclareLaunchArgument('depth_height', default_value='400'), - DeclareLaunchArgument('depth_fps', default_value='30'), - DeclareLaunchArgument('depth_format', default_value='Y11'), + DeclareLaunchArgument('depth_width', default_value='0'), + DeclareLaunchArgument('depth_height', default_value='0'), + DeclareLaunchArgument('depth_fps', default_value='0'), + DeclareLaunchArgument('depth_format', default_value='ANY'), DeclareLaunchArgument('enable_depth', default_value='true'), DeclareLaunchArgument('flip_depth', default_value='false'), DeclareLaunchArgument('depth_qos', default_value='default'), DeclareLaunchArgument('depth_camera_info_qos', default_value='default'), - DeclareLaunchArgument('ir_width', default_value='640'), - DeclareLaunchArgument('ir_height', default_value='400'), - DeclareLaunchArgument('ir_fps', default_value='30'), - DeclareLaunchArgument('ir_format', default_value='Y10'), + DeclareLaunchArgument('ir_width', default_value='0'), + DeclareLaunchArgument('ir_height', default_value='0'), + DeclareLaunchArgument('ir_fps', default_value='0'), + DeclareLaunchArgument('ir_format', default_value='ANY'), DeclareLaunchArgument('enable_ir', default_value='true'), DeclareLaunchArgument('flip_ir', default_value='false'), DeclareLaunchArgument('ir_qos', default_value='default'), diff --git a/orbbec_camera/launch/dabai_dcl.py b/orbbec_camera/launch/dabai_dcl.py index f1224426..66d4c292 100644 --- a/orbbec_camera/launch/dabai_dcl.py +++ b/orbbec_camera/launch/dabai_dcl.py @@ -19,6 +19,7 @@ def generate_launch_description(): DeclareLaunchArgument('device_num', default_value='1'), DeclareLaunchArgument('vendor_id', default_value='0x2bc5'), DeclareLaunchArgument('product_id', default_value=''), + DeclareLaunchArgument('uvc_backend', default_value='auto'),#auto, libuvc or v4l2 DeclareLaunchArgument('enable_point_cloud', default_value='true'), DeclareLaunchArgument('enable_colored_point_cloud', default_value='true'), DeclareLaunchArgument('cloud_frame_id', default_value=''), diff --git a/orbbec_camera/launch/dabai_dcw.launch.py b/orbbec_camera/launch/dabai_dcw.launch.py index 9a3b9515..5e1d55f2 100644 --- a/orbbec_camera/launch/dabai_dcw.launch.py +++ b/orbbec_camera/launch/dabai_dcw.launch.py @@ -19,6 +19,7 @@ def generate_launch_description(): DeclareLaunchArgument('device_num', default_value='1'), DeclareLaunchArgument('vendor_id', default_value='0x2bc5'), DeclareLaunchArgument('product_id', default_value=''), + DeclareLaunchArgument('uvc_backend', default_value='auto'),#auto, libuvc or v4l2 DeclareLaunchArgument('enable_point_cloud', default_value='true'), DeclareLaunchArgument('enable_colored_point_cloud', default_value='false'), DeclareLaunchArgument('cloud_frame_id', default_value=''), diff --git a/orbbec_camera/launch/dabai_dcw2.launch.py b/orbbec_camera/launch/dabai_dcw2.launch.py index af357e93..f6e11a62 100644 --- a/orbbec_camera/launch/dabai_dcw2.launch.py +++ b/orbbec_camera/launch/dabai_dcw2.launch.py @@ -60,6 +60,7 @@ def generate_launch_description(): DeclareLaunchArgument('device_num', default_value='1'), DeclareLaunchArgument('vendor_id', default_value='0x2bc5'), DeclareLaunchArgument('product_id', default_value=''), + DeclareLaunchArgument('uvc_backend', default_value='auto'),#auto, libuvc or v4l2 DeclareLaunchArgument('enable_point_cloud', default_value='true'), DeclareLaunchArgument('enable_colored_point_cloud', default_value='false'), DeclareLaunchArgument('cloud_frame_id', default_value=''), diff --git a/orbbec_camera/launch/dabai_max_pro.launch.py b/orbbec_camera/launch/dabai_max_pro.launch.py index c8c1d35d..e67fecb4 100644 --- a/orbbec_camera/launch/dabai_max_pro.launch.py +++ b/orbbec_camera/launch/dabai_max_pro.launch.py @@ -19,6 +19,7 @@ def generate_launch_description(): DeclareLaunchArgument('device_num', default_value='1'), DeclareLaunchArgument('vendor_id', default_value='0x2bc5'), DeclareLaunchArgument('product_id', default_value=''), + DeclareLaunchArgument('uvc_backend', default_value='auto'),#auto, libuvc or v4l2 DeclareLaunchArgument('enable_point_cloud', default_value='true'), DeclareLaunchArgument('enable_colored_point_cloud', default_value='false'), DeclareLaunchArgument('cloud_frame_id', default_value=''), diff --git a/orbbec_camera/launch/deeya.launch.py b/orbbec_camera/launch/deeya.launch.py index 6237b7b6..7ecc5aac 100644 --- a/orbbec_camera/launch/deeya.launch.py +++ b/orbbec_camera/launch/deeya.launch.py @@ -19,6 +19,7 @@ def generate_launch_description(): DeclareLaunchArgument('device_num', default_value='1'), DeclareLaunchArgument('vendor_id', default_value='0x2bc5'), DeclareLaunchArgument('product_id', default_value=''), + DeclareLaunchArgument('uvc_backend', default_value='auto'),#auto, libuvc or v4l2 DeclareLaunchArgument('enable_point_cloud', default_value='true'), DeclareLaunchArgument('enable_colored_point_cloud', default_value='false'), DeclareLaunchArgument('cloud_frame_id', default_value=''), diff --git a/orbbec_camera/launch/femto_bolt.launch.py b/orbbec_camera/launch/femto_bolt.launch.py index 41d5436e..6adbb008 100644 --- a/orbbec_camera/launch/femto_bolt.launch.py +++ b/orbbec_camera/launch/femto_bolt.launch.py @@ -19,6 +19,7 @@ def generate_launch_description(): DeclareLaunchArgument('device_num', default_value='1'), DeclareLaunchArgument('vendor_id', default_value='0x2bc5'), DeclareLaunchArgument('product_id', default_value=''), + DeclareLaunchArgument('uvc_backend', default_value='auto'),#auto, libuvc or v4l2 DeclareLaunchArgument('enable_point_cloud', default_value='true'), DeclareLaunchArgument('enable_colored_point_cloud', default_value='false'), DeclareLaunchArgument('cloud_frame_id', default_value=''), diff --git a/orbbec_camera/launch/gemini2.launch.py b/orbbec_camera/launch/gemini2.launch.py index a9df1e5b..4b3c558f 100644 --- a/orbbec_camera/launch/gemini2.launch.py +++ b/orbbec_camera/launch/gemini2.launch.py @@ -19,6 +19,7 @@ def generate_launch_description(): DeclareLaunchArgument('device_num', default_value='1'), DeclareLaunchArgument('vendor_id', default_value='0x2bc5'), DeclareLaunchArgument('product_id', default_value=''), + DeclareLaunchArgument('uvc_backend', default_value='auto'),#auto, libuvc or v4l2 DeclareLaunchArgument('enable_point_cloud', default_value='true'), DeclareLaunchArgument('enable_colored_point_cloud', default_value='true'), DeclareLaunchArgument('cloud_frame_id', default_value=''), diff --git a/orbbec_camera/launch/gemini2L.launch.py b/orbbec_camera/launch/gemini2L.launch.py index 6a637533..0a34243f 100644 --- a/orbbec_camera/launch/gemini2L.launch.py +++ b/orbbec_camera/launch/gemini2L.launch.py @@ -19,6 +19,7 @@ def generate_launch_description(): DeclareLaunchArgument('device_num', default_value='1'), DeclareLaunchArgument('vendor_id', default_value='0x2bc5'), DeclareLaunchArgument('product_id', default_value=''), + DeclareLaunchArgument('uvc_backend', default_value='auto'),#auto, libuvc or v4l2 DeclareLaunchArgument('enable_point_cloud', default_value='true'), DeclareLaunchArgument('enable_colored_point_cloud', default_value='false'), DeclareLaunchArgument('cloud_frame_id', default_value=''), diff --git a/orbbec_camera/launch/gemini2VL.launch.py b/orbbec_camera/launch/gemini2VL.launch.py index 3c9039c0..73c78e87 100644 --- a/orbbec_camera/launch/gemini2VL.launch.py +++ b/orbbec_camera/launch/gemini2VL.launch.py @@ -19,6 +19,7 @@ def generate_launch_description(): DeclareLaunchArgument('device_num', default_value='1'), DeclareLaunchArgument('vendor_id', default_value='0x2bc5'), DeclareLaunchArgument('product_id', default_value=''), + DeclareLaunchArgument('uvc_backend', default_value='auto'),#auto, libuvc or v4l2 DeclareLaunchArgument('point_cloud_qos', default_value='default'), DeclareLaunchArgument('cloud_frame_id', default_value=''), DeclareLaunchArgument('connection_delay', default_value='100'), diff --git a/orbbec_camera/launch/gemini2XL.launch.py b/orbbec_camera/launch/gemini2XL.launch.py index e38174c5..72cb7d7e 100644 --- a/orbbec_camera/launch/gemini2XL.launch.py +++ b/orbbec_camera/launch/gemini2XL.launch.py @@ -18,6 +18,7 @@ def generate_launch_description(): DeclareLaunchArgument('device_num', default_value='1'), DeclareLaunchArgument('vendor_id', default_value='0x2bc5'), DeclareLaunchArgument('product_id', default_value=''), + DeclareLaunchArgument('uvc_backend', default_value='auto'),#auto, libuvc or v4l2 DeclareLaunchArgument('enable_point_cloud', default_value='true'), DeclareLaunchArgument('enable_colored_point_cloud', default_value='true'), DeclareLaunchArgument('cloud_frame_id', default_value=''), diff --git a/orbbec_camera/launch/gemini_330_series.launch.py b/orbbec_camera/launch/gemini_330_series.launch.py index f95a2317..b490f326 100644 --- a/orbbec_camera/launch/gemini_330_series.launch.py +++ b/orbbec_camera/launch/gemini_330_series.launch.py @@ -83,6 +83,7 @@ def generate_launch_description(): DeclareLaunchArgument('color_height', default_value='0'), DeclareLaunchArgument('color_fps', default_value='0'), DeclareLaunchArgument('color_format', default_value='MJPG'), + DeclareLaunchArgument('uvc_backend', default_value='auto'),#auto, libuvc or v4l2 DeclareLaunchArgument('enable_color', default_value='true'), DeclareLaunchArgument('color_qos', default_value='default'), DeclareLaunchArgument('color_camera_info_qos', default_value='default'), diff --git a/orbbec_camera/launch/gemini_e.launch.py b/orbbec_camera/launch/gemini_e.launch.py index 73629cd3..5b5276a6 100644 --- a/orbbec_camera/launch/gemini_e.launch.py +++ b/orbbec_camera/launch/gemini_e.launch.py @@ -19,6 +19,7 @@ def generate_launch_description(): DeclareLaunchArgument('device_num', default_value='1'), DeclareLaunchArgument('vendor_id', default_value='0x2bc5'), DeclareLaunchArgument('product_id', default_value=''), + DeclareLaunchArgument('uvc_backend', default_value='auto'),#auto, libuvc or v4l2 DeclareLaunchArgument('enable_point_cloud', default_value='true'), DeclareLaunchArgument('enable_colored_point_cloud', default_value='false'), DeclareLaunchArgument('point_cloud_qos', default_value='default'), diff --git a/orbbec_camera/launch/gemini_ew.launch.py b/orbbec_camera/launch/gemini_ew.launch.py index 12b83a15..125ef860 100644 --- a/orbbec_camera/launch/gemini_ew.launch.py +++ b/orbbec_camera/launch/gemini_ew.launch.py @@ -19,6 +19,7 @@ def generate_launch_description(): DeclareLaunchArgument('device_num', default_value='1'), DeclareLaunchArgument('vendor_id', default_value='0x2bc5'), DeclareLaunchArgument('product_id', default_value=''), + DeclareLaunchArgument('uvc_backend', default_value='auto'),#auto, libuvc or v4l2 DeclareLaunchArgument('enable_point_cloud', default_value='true'), DeclareLaunchArgument('cloud_frame_id', default_value=''), DeclareLaunchArgument('enable_colored_point_cloud', default_value='false'), diff --git a/orbbec_camera/launch/gemini_uw.launch.py b/orbbec_camera/launch/gemini_uw.launch.py index c8c1d35d..e67fecb4 100644 --- a/orbbec_camera/launch/gemini_uw.launch.py +++ b/orbbec_camera/launch/gemini_uw.launch.py @@ -19,6 +19,7 @@ def generate_launch_description(): DeclareLaunchArgument('device_num', default_value='1'), DeclareLaunchArgument('vendor_id', default_value='0x2bc5'), DeclareLaunchArgument('product_id', default_value=''), + DeclareLaunchArgument('uvc_backend', default_value='auto'),#auto, libuvc or v4l2 DeclareLaunchArgument('enable_point_cloud', default_value='true'), DeclareLaunchArgument('enable_colored_point_cloud', default_value='false'), DeclareLaunchArgument('cloud_frame_id', default_value=''), diff --git a/orbbec_camera/src/ob_camera_node_driver.cpp b/orbbec_camera/src/ob_camera_node_driver.cpp index fbf29e0e..a3486a62 100644 --- a/orbbec_camera/src/ob_camera_node_driver.cpp +++ b/orbbec_camera/src/ob_camera_node_driver.cpp @@ -24,6 +24,8 @@ #include #include #include +#include +#include #include #include @@ -155,6 +157,23 @@ void OBCameraNodeDriver::init() { net_device_ip_ = declare_parameter("net_device_ip", ""); net_device_port_ = static_cast(declare_parameter("net_device_port", 0)); enumerate_net_device_ = declare_parameter("enumerate_net_device", false); + uvc_backend_ = declare_parameter("uvc_backend", "auto"); + std::string uvc_backend = uvc_backend_; + std::transform(uvc_backend.begin(), uvc_backend.end(), uvc_backend.begin(), + [](unsigned char c) { return std::tolower(c); }); + if (uvc_backend == "auto") { + RCLCPP_INFO_STREAM(logger_, "Use default UVC backend from SDK config"); + } else if (uvc_backend == "libuvc") { + ctx_->setUVCBackend(UVC_BACKEND_LIBUVC); + RCLCPP_INFO_STREAM(logger_, "Set UVC backend to " << uvc_backend_); + } else if (uvc_backend == "v4l2") { + ctx_->setUVCBackend(UVC_BACKEND_V4L2); + RCLCPP_INFO_STREAM(logger_, "Set UVC backend to " << uvc_backend_); + } else { + RCLCPP_WARN_STREAM(logger_, "Unsupported uvc_backend '" + << uvc_backend_ + << "', using default UVC backend from SDK config"); + } ctx_->enableNetDeviceEnumeration(enumerate_net_device_); ctx_->setDeviceChangedCallback([this](const std::shared_ptr &removed_list, const std::shared_ptr &added_list) {