diff --git a/orbbec_camera/examples/README.MD b/orbbec_camera/examples/README.MD new file mode 100644 index 00000000..8457fef3 --- /dev/null +++ b/orbbec_camera/examples/README.MD @@ -0,0 +1,16 @@ +# Sample launch for OrbbecSDK_ROS2 + +These simple examples demonstrate how to easily use the camera with OrbbecSDK_ROS2 + +## List of Examples: + +| Name | Description | Experience Level | Document | +| :---------------------------------------------------------------------------: | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | ----------------------------------------------------------------------------- | +| [Lower_cpu_usage](./lower_cpu_usage) | How to reduce CPU usage for one or more cameras in a ROS 2 environment. | ⭐️ | [Lower_cpu_usage](https://orbbec.github.io/OrbbecSDK_ROS2/source/5_advanced_guide/performance/lower_cpu_usage.html) | +| [Net_camera](./net_camera) | How to use Net camera in OrbbecSDK_ROS2(Only Femto Mega nad Gemini 335Le) | ⭐️ | [Net_camera](https://orbbec.github.io/OrbbecSDK_ROS2/source/5_advanced_guide/configuration/net_camera.html) | +| [Gmsl_camera](./gmsl_camera) | How to use GMSL camera.(Only Gemini 335Lg) | ⭐️ | [Gmsl_camera](https://orbbec.github.io/OrbbecSDK_ROS2/source/5_advanced_guide/multi_camera/gmsl_camera.html) | +| [Benchmark](./benchmark) | The goal of this tool is to benchmark the performance of various OrbbecSDK_ROS2 camera configurations. | ⭐️⭐️ | [Benchmark](https://orbbec.github.io/OrbbecSDK_ROS2/source/5_advanced_guide/performance/benchmark.html) | +| [Multi_camera_synced_verification_tool](./multi_camera_synced_verification_tool) | How to verify the synchronization accuracy of multi-camera synchronization. | ⭐️⭐️⭐️ | [Multi_camera_synced_verification_tool](https://orbbec.github.io/OrbbecSDK_ROS2/source/5_advanced_guide/multi_camera/multi_camera_synced_verification_tool.html) | + + + diff --git a/orbbec_camera/examples/benchmark/ob_benchmark_0.launch.py b/orbbec_camera/examples/benchmark/ob_benchmark_0.launch.py new file mode 100644 index 00000000..03fe59fe --- /dev/null +++ b/orbbec_camera/examples/benchmark/ob_benchmark_0.launch.py @@ -0,0 +1,197 @@ +import os +from ament_index_python.packages import get_package_share_directory +from launch import LaunchDescription +from launch_ros.actions import Node,LoadComposableNodes +from launch.actions import IncludeLaunchDescription, GroupAction, TimerAction +from launch.launch_description_sources import PythonLaunchDescriptionSource +from launch.actions import DeclareLaunchArgument +from launch.conditions import UnlessCondition, IfCondition +from launch.substitutions import LaunchConfiguration +from launch.substitutions import TextSubstitution +from launch_ros.descriptions import ComposableNode + +def load_yaml(file_path): + with open(file_path, 'r') as f: + return yaml.safe_load(f) + + +def merge_params(default_params, yaml_params): + for key, value in yaml_params.items(): + if key in default_params: + default_params[key] = value + return default_params + + +def convert_value(value): + if isinstance(value, str): + try: + return int(value) + except ValueError: + pass + try: + return float(value) + except ValueError: + pass + if value.lower() == 'true': + return True + elif value.lower() == 'false': + return False + return value + + +def load_parameters(context, args): + default_params = {arg.name: LaunchConfiguration(arg.name).perform(context) for arg in args} + config_file_path = LaunchConfiguration('config_file_path').perform(context) + if config_file_path: + yaml_params = load_yaml(config_file_path) + default_params = merge_params(default_params, yaml_params) + skip_convert = {'config_file_path', 'usb_port', 'serial_number'} + return { + key: (value if key in skip_convert else convert_value(value)) + for key, value in default_params.items() + } +def generate_launch_description(): + # Include launch files + package_dir = get_package_share_directory("orbbec_camera") + launch_file_dir = os.path.join(package_dir, "examples/benchmark") + + attach_to_shared_component_container_arg = LaunchConfiguration('attach_to_shared_component_container', default=False) + component_container_name_arg = LaunchConfiguration('component_container_name', default='shared_orbbec_container') + + shared_orbbec_container = Node( + name=component_container_name_arg, + package="rclcpp_components", + executable="component_container_mt", + output="screen", + condition=UnlessCondition(attach_to_shared_component_container_arg), + ) + start_benchmark = LoadComposableNodes( + target_container=component_container_name_arg, + composable_node_descriptions=[ + ComposableNode( + namespace="start_benchmark", + name="start_benchmark", + package='orbbec_camera', + plugin='orbbec_camera::tools::StartBenchmark', + ) + ] + ) + + attach_to_shared_component_container_arg = TextSubstitution(text="true") + + args = [ + DeclareLaunchArgument('uvc_backend', default_value='libuvc'), + DeclareLaunchArgument('depth_registration', default_value='false'), + DeclareLaunchArgument('color_width', default_value='848'), + DeclareLaunchArgument('color_height', default_value='480'), + DeclareLaunchArgument('color_fps', default_value='30'), + DeclareLaunchArgument('color_format', default_value='MJPG'), + DeclareLaunchArgument('enable_color', default_value='true'), + DeclareLaunchArgument('depth_width', default_value='848'), + DeclareLaunchArgument('depth_height', default_value='480'), + DeclareLaunchArgument('depth_fps', default_value='30'), + DeclareLaunchArgument('depth_format', default_value='ANY'), + DeclareLaunchArgument('enable_depth', default_value='true'), + DeclareLaunchArgument('left_ir_width', default_value='848'), + DeclareLaunchArgument('left_ir_height', default_value='480'), + DeclareLaunchArgument('left_ir_fps', default_value='30'), + DeclareLaunchArgument('left_ir_format', default_value='ANY'), + DeclareLaunchArgument('enable_left_ir', default_value='true'), + DeclareLaunchArgument('right_ir_width', default_value='848'), + DeclareLaunchArgument('right_ir_height', default_value='480'), + DeclareLaunchArgument('right_ir_fps', default_value='30'), + DeclareLaunchArgument('right_ir_format', default_value='ANY'), + DeclareLaunchArgument('enable_right_ir', default_value='true'), + DeclareLaunchArgument('enable_point_cloud', default_value='false'), + DeclareLaunchArgument('enable_colored_point_cloud', default_value='false'), + DeclareLaunchArgument('enable_decimation_filter', default_value='false'), + DeclareLaunchArgument('enable_hdr_merge', default_value='false'), + DeclareLaunchArgument('enable_sequence_id_filter', default_value='false'), + DeclareLaunchArgument('enable_threshold_filter', default_value='false'), + DeclareLaunchArgument('enable_hardware_noise_removal_filter', default_value='false'), + DeclareLaunchArgument('enable_noise_removal_filter', default_value='false'), + DeclareLaunchArgument('enable_spatial_filter', default_value='false'), + DeclareLaunchArgument('enable_temporal_filter', default_value='false'), + DeclareLaunchArgument('enable_hole_filling_filter', default_value='false'), + ] + launch1_include = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + os.path.join(launch_file_dir, "gemini_330_series_benchmark.launch.py") + ), + launch_arguments={ + "camera_name": "camera_01", + "usb_port": "2-7", + "device_num": "4", + "sync_mode": "standalone", + "attach_to_shared_component_container": attach_to_shared_component_container_arg, + "component_container_name": component_container_name_arg, + }.items(), + ) + launch2_include = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + os.path.join(launch_file_dir, "gemini_330_series_benchmark.launch.py") + ), + launch_arguments={ + "camera_name": "camera_02", + "usb_port": "2-2", + "device_num": "4", + "sync_mode": "standalone", + "attach_to_shared_component_container": attach_to_shared_component_container_arg, + "component_container_name": component_container_name_arg, + }.items(), + ) + launch3_include = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + os.path.join(launch_file_dir, "gemini_330_series_benchmark.launch.py") + ), + launch_arguments={ + "camera_name": "camera_03", + "usb_port": "2-1", + "device_num": "4", + "sync_mode": "standalone", + "attach_to_shared_component_container": attach_to_shared_component_container_arg, + "component_container_name": component_container_name_arg, + }.items(), + ) + launch4_include = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + os.path.join(launch_file_dir, "gemini_330_series_benchmark.launch.py") + ), + launch_arguments={ + "camera_name": "camera_04", + "usb_port": "2-3", + "device_num": "4", + "sync_mode": "standalone", + "attach_to_shared_component_container": attach_to_shared_component_container_arg, + "component_container_name": component_container_name_arg, + }.items(), + ) + + delayed_left_camera = TimerAction( + period=2.0, + actions=args+[launch1_include], + ) + delayed_right_camera = TimerAction( + period=4.0, + actions=args+[launch2_include], + ) + delayed_rear_camera = TimerAction( + period=6.0, + actions=args+[launch3_include], + ) + delayed_front_camera = TimerAction( + period=8.0, + actions=args+[launch4_include], + ) + ld = LaunchDescription( + [ + shared_orbbec_container, + start_benchmark, + delayed_left_camera, + delayed_right_camera, + delayed_rear_camera, + delayed_front_camera, + ] + ) + + return ld diff --git a/orbbec_camera/examples/benchmark/ob_benchmark_1.launch.py b/orbbec_camera/examples/benchmark/ob_benchmark_1.launch.py new file mode 100644 index 00000000..d7de1068 --- /dev/null +++ b/orbbec_camera/examples/benchmark/ob_benchmark_1.launch.py @@ -0,0 +1,197 @@ +import os +from ament_index_python.packages import get_package_share_directory +from launch import LaunchDescription +from launch_ros.actions import Node,LoadComposableNodes +from launch.actions import IncludeLaunchDescription, GroupAction, TimerAction +from launch.launch_description_sources import PythonLaunchDescriptionSource +from launch.actions import DeclareLaunchArgument +from launch.conditions import UnlessCondition, IfCondition +from launch.substitutions import LaunchConfiguration +from launch.substitutions import TextSubstitution +from launch_ros.descriptions import ComposableNode + +def load_yaml(file_path): + with open(file_path, 'r') as f: + return yaml.safe_load(f) + + +def merge_params(default_params, yaml_params): + for key, value in yaml_params.items(): + if key in default_params: + default_params[key] = value + return default_params + + +def convert_value(value): + if isinstance(value, str): + try: + return int(value) + except ValueError: + pass + try: + return float(value) + except ValueError: + pass + if value.lower() == 'true': + return True + elif value.lower() == 'false': + return False + return value + + +def load_parameters(context, args): + default_params = {arg.name: LaunchConfiguration(arg.name).perform(context) for arg in args} + config_file_path = LaunchConfiguration('config_file_path').perform(context) + if config_file_path: + yaml_params = load_yaml(config_file_path) + default_params = merge_params(default_params, yaml_params) + skip_convert = {'config_file_path', 'usb_port', 'serial_number'} + return { + key: (value if key in skip_convert else convert_value(value)) + for key, value in default_params.items() + } +def generate_launch_description(): + # Include launch files + package_dir = get_package_share_directory("orbbec_camera") + launch_file_dir = os.path.join(package_dir, "examples/benchmark") + + attach_to_shared_component_container_arg = LaunchConfiguration('attach_to_shared_component_container', default=False) + component_container_name_arg = LaunchConfiguration('component_container_name', default='shared_orbbec_container') + + shared_orbbec_container = Node( + name=component_container_name_arg, + package="rclcpp_components", + executable="component_container_mt", + output="screen", + condition=UnlessCondition(attach_to_shared_component_container_arg), + ) + start_benchmark = LoadComposableNodes( + target_container=component_container_name_arg, + composable_node_descriptions=[ + ComposableNode( + namespace="start_benchmark", + name="start_benchmark", + package='orbbec_camera', + plugin='orbbec_camera::tools::StartBenchmark', + ) + ] + ) + + attach_to_shared_component_container_arg = TextSubstitution(text="true") + + args = [ + DeclareLaunchArgument('uvc_backend', default_value='libuvc'), + DeclareLaunchArgument('depth_registration', default_value='false'), + DeclareLaunchArgument('color_width', default_value='848'), + DeclareLaunchArgument('color_height', default_value='480'), + DeclareLaunchArgument('color_fps', default_value='30'), + DeclareLaunchArgument('color_format', default_value='MJPG'), + DeclareLaunchArgument('enable_color', default_value='true'), + DeclareLaunchArgument('depth_width', default_value='848'), + DeclareLaunchArgument('depth_height', default_value='480'), + DeclareLaunchArgument('depth_fps', default_value='30'), + DeclareLaunchArgument('depth_format', default_value='ANY'), + DeclareLaunchArgument('enable_depth', default_value='true'), + DeclareLaunchArgument('left_ir_width', default_value='848'), + DeclareLaunchArgument('left_ir_height', default_value='480'), + DeclareLaunchArgument('left_ir_fps', default_value='30'), + DeclareLaunchArgument('left_ir_format', default_value='ANY'), + DeclareLaunchArgument('enable_left_ir', default_value='true'), + DeclareLaunchArgument('right_ir_width', default_value='848'), + DeclareLaunchArgument('right_ir_height', default_value='480'), + DeclareLaunchArgument('right_ir_fps', default_value='30'), + DeclareLaunchArgument('right_ir_format', default_value='ANY'), + DeclareLaunchArgument('enable_right_ir', default_value='true'), + DeclareLaunchArgument('enable_point_cloud', default_value='false'), + DeclareLaunchArgument('enable_colored_point_cloud', default_value='false'), + DeclareLaunchArgument('enable_decimation_filter', default_value='false'), + DeclareLaunchArgument('enable_hdr_merge', default_value='false'), + DeclareLaunchArgument('enable_sequence_id_filter', default_value='false'), + DeclareLaunchArgument('enable_threshold_filter', default_value='false'), + DeclareLaunchArgument('enable_hardware_noise_removal_filter', default_value='true'), + DeclareLaunchArgument('enable_noise_removal_filter', default_value='false'), + DeclareLaunchArgument('enable_spatial_filter', default_value='false'), + DeclareLaunchArgument('enable_temporal_filter', default_value='false'), + DeclareLaunchArgument('enable_hole_filling_filter', default_value='false'), + ] + launch1_include = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + os.path.join(launch_file_dir, "gemini_330_series_benchmark.launch.py") + ), + launch_arguments={ + "camera_name": "camera_01", + "usb_port": "2-7", + "device_num": "4", + "sync_mode": "standalone", + "attach_to_shared_component_container": attach_to_shared_component_container_arg, + "component_container_name": component_container_name_arg, + }.items(), + ) + launch2_include = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + os.path.join(launch_file_dir, "gemini_330_series_benchmark.launch.py") + ), + launch_arguments={ + "camera_name": "camera_02", + "usb_port": "2-2", + "device_num": "4", + "sync_mode": "standalone", + "attach_to_shared_component_container": attach_to_shared_component_container_arg, + "component_container_name": component_container_name_arg, + }.items(), + ) + launch3_include = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + os.path.join(launch_file_dir, "gemini_330_series_benchmark.launch.py") + ), + launch_arguments={ + "camera_name": "camera_03", + "usb_port": "2-1", + "device_num": "4", + "sync_mode": "standalone", + "attach_to_shared_component_container": attach_to_shared_component_container_arg, + "component_container_name": component_container_name_arg, + }.items(), + ) + launch4_include = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + os.path.join(launch_file_dir, "gemini_330_series_benchmark.launch.py") + ), + launch_arguments={ + "camera_name": "camera_04", + "usb_port": "2-3", + "device_num": "4", + "sync_mode": "standalone", + "attach_to_shared_component_container": attach_to_shared_component_container_arg, + "component_container_name": component_container_name_arg, + }.items(), + ) + + delayed_left_camera = TimerAction( + period=2.0, + actions=args+[launch1_include], + ) + delayed_right_camera = TimerAction( + period=4.0, + actions=args+[launch2_include], + ) + delayed_rear_camera = TimerAction( + period=6.0, + actions=args+[launch3_include], + ) + delayed_front_camera = TimerAction( + period=8.0, + actions=args+[launch4_include], + ) + ld = LaunchDescription( + [ + shared_orbbec_container, + start_benchmark, + delayed_left_camera, + delayed_right_camera, + delayed_rear_camera, + delayed_front_camera, + ] + ) + + return ld diff --git a/orbbec_camera/examples/gmsl_camera/multi_gmsl_camera_synced.launch.py b/orbbec_camera/examples/gmsl_camera/multi_gmsl_camera_synced.launch.py new file mode 100644 index 00000000..1404a8e0 --- /dev/null +++ b/orbbec_camera/examples/gmsl_camera/multi_gmsl_camera_synced.launch.py @@ -0,0 +1,110 @@ +import os +from ament_index_python.packages import get_package_share_directory +from launch import LaunchDescription +from launch_ros.actions import Node, LoadComposableNodes +from launch.actions import IncludeLaunchDescription, GroupAction, TimerAction +from launch.launch_description_sources import PythonLaunchDescriptionSource +from launch.actions import DeclareLaunchArgument +from launch.conditions import UnlessCondition, IfCondition +from launch.substitutions import LaunchConfiguration +from launch.substitutions import TextSubstitution +from launch_ros.descriptions import ComposableNode + + +def load_yaml(file_path): + with open(file_path, "r") as f: + return yaml.safe_load(f) + + +def merge_params(default_params, yaml_params): + for key, value in yaml_params.items(): + if key in default_params: + default_params[key] = value + return default_params + + +def convert_value(value): + if isinstance(value, str): + try: + return int(value) + except ValueError: + pass + try: + return float(value) + except ValueError: + pass + if value.lower() == "true": + return True + elif value.lower() == "false": + return False + return value + + +def generate_launch_description(): + # Include launch files + package_dir = get_package_share_directory("orbbec_camera") + launch_file_dir = os.path.join( + package_dir, "examples/gmsl_camera" + ) + config_file_dir = os.path.join(package_dir, "config") + secondary_config_file_path = os.path.join(config_file_dir, "camera_secondary_params.yaml") + + attach_to_shared_component_container_arg = LaunchConfiguration( + "attach_to_shared_component_container", default=False + ) + component_container_name_arg = LaunchConfiguration( + "component_container_name", default="shared_orbbec_container" + ) + + shared_orbbec_container = Node( + name=component_container_name_arg, + package="rclcpp_components", + executable="component_container_mt", + output="screen", + condition=UnlessCondition(attach_to_shared_component_container_arg), + ) + + attach_to_shared_component_container_arg = TextSubstitution(text="true") + + launch1_include = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + os.path.join(launch_file_dir, "gemini_330_gmsl.launch.py") + ), + launch_arguments={ + "camera_name": "camera_01", + "usb_port": "gmsl2-1", + "device_num": "2", + "sync_mode": "secondary_synced", + "gmsl_trigger_fps": "3000", + "enable_gmsl_trigger": "true", + "config_file_path": secondary_config_file_path, + "attach_to_shared_component_container": attach_to_shared_component_container_arg, + "component_container_name": component_container_name_arg, + }.items(), + ) + + launch2_include = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + os.path.join(launch_file_dir, "gemini_330_gmsl.launch.py") + ), + launch_arguments={ + "camera_name": "camera_02", + "usb_port": "gmsl2-3", + "device_num": "2", + "sync_mode": "secondary_synced", + "config_file_path": secondary_config_file_path, + "attach_to_shared_component_container": attach_to_shared_component_container_arg, + "component_container_name": component_container_name_arg, + }.items(), + ) + + # Launch description + ld = LaunchDescription( + [ + shared_orbbec_container, + TimerAction(period=0.0, actions=[GroupAction([launch2_include])]), + TimerAction(period=2.0, actions=[GroupAction([launch1_include])]), + ] + ) + + return ld diff --git a/orbbec_camera/examples/lower_cpu_usage/multi_camera_lower_cpu_usage.launch.py b/orbbec_camera/examples/lower_cpu_usage/multi_camera_lower_cpu_usage.launch.py new file mode 100644 index 00000000..d2135873 --- /dev/null +++ b/orbbec_camera/examples/lower_cpu_usage/multi_camera_lower_cpu_usage.launch.py @@ -0,0 +1,150 @@ +import os +from ament_index_python.packages import get_package_share_directory +from launch import LaunchDescription +from launch_ros.actions import Node,LoadComposableNodes +from launch.actions import IncludeLaunchDescription, GroupAction, TimerAction +from launch.launch_description_sources import PythonLaunchDescriptionSource +from launch.actions import DeclareLaunchArgument +from launch.conditions import UnlessCondition, IfCondition +from launch.substitutions import LaunchConfiguration +from launch.substitutions import TextSubstitution +from launch_ros.descriptions import ComposableNode + +def load_yaml(file_path): + with open(file_path, 'r') as f: + return yaml.safe_load(f) + + +def merge_params(default_params, yaml_params): + for key, value in yaml_params.items(): + if key in default_params: + default_params[key] = value + return default_params + + +def convert_value(value): + if isinstance(value, str): + try: + return int(value) + except ValueError: + pass + try: + return float(value) + except ValueError: + pass + if value.lower() == 'true': + return True + elif value.lower() == 'false': + return False + return value + + +def load_parameters(context, args): + default_params = {arg.name: LaunchConfiguration(arg.name).perform(context) for arg in args} + config_file_path = LaunchConfiguration('config_file_path').perform(context) + if config_file_path: + yaml_params = load_yaml(config_file_path) + default_params = merge_params(default_params, yaml_params) + skip_convert = {'config_file_path', 'usb_port', 'serial_number'} + return { + key: (value if key in skip_convert else convert_value(value)) + for key, value in default_params.items() + } +def generate_launch_description(): + # Include launch files + package_dir = get_package_share_directory("orbbec_camera") + launch_file_dir = os.path.join(package_dir, "examples/lower_cpu_usage") + + attach_to_shared_component_container_arg = LaunchConfiguration('attach_to_shared_component_container', default=False) + component_container_name_arg = LaunchConfiguration('component_container_name', default='shared_orbbec_container') + + shared_orbbec_container = Node( + name=component_container_name_arg, + package="rclcpp_components", + executable="component_container_mt", + output="screen", + condition=UnlessCondition(attach_to_shared_component_container_arg), + ) + + attach_to_shared_component_container_arg = TextSubstitution(text="true") + + launch1_include = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + os.path.join(launch_file_dir, "gemini_330_series_lower_cpu_usage.launch.py") + ), + launch_arguments={ + "camera_name": "camera_01", + "usb_port": "2-7", + "device_num": "4", + "sync_mode": "standalone", + "attach_to_shared_component_container": attach_to_shared_component_container_arg, + "component_container_name": component_container_name_arg, + }.items(), + ) + launch2_include = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + os.path.join(launch_file_dir, "gemini_330_series_lower_cpu_usage.launch.py") + ), + launch_arguments={ + "camera_name": "camera_02", + "usb_port": "2-2", + "device_num": "4", + "sync_mode": "standalone", + "attach_to_shared_component_container": attach_to_shared_component_container_arg, + "component_container_name": component_container_name_arg, + }.items(), + ) + launch3_include = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + os.path.join(launch_file_dir, "gemini_330_series_lower_cpu_usage.launch.py") + ), + launch_arguments={ + "camera_name": "camera_03", + "usb_port": "2-6", + "device_num": "4", + "sync_mode": "standalone", + "attach_to_shared_component_container": attach_to_shared_component_container_arg, + "component_container_name": component_container_name_arg, + }.items(), + ) + launch4_include = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + os.path.join(launch_file_dir, "gemini_330_series_lower_cpu_usage.launch.py") + ), + launch_arguments={ + "camera_name": "camera_04", + "usb_port": "2-3", + "device_num": "4", + "sync_mode": "standalone", + "attach_to_shared_component_container": attach_to_shared_component_container_arg, + "component_container_name": component_container_name_arg, + }.items(), + ) + + delayed_left_camera = TimerAction( + period=2.0, + actions=[launch1_include], + ) + delayed_right_camera = TimerAction( + period=4.0, + actions=[launch2_include], + ) + delayed_rear_camera = TimerAction( + period=6.0, + actions=[launch3_include], + ) + delayed_front_camera = TimerAction( + period=8.0, + actions=[launch4_include], + ) + ld = LaunchDescription( + [ + shared_orbbec_container, + TimerAction(period=0.0, actions=[GroupAction([delayed_left_camera])]), + TimerAction(period=2.0, actions=[GroupAction([delayed_right_camera])]), + TimerAction(period=4.0, actions=[GroupAction([delayed_rear_camera])]), + TimerAction(period=6.0, actions=[GroupAction([delayed_front_camera])]), + ] + ) + + return ld diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multi_camera_synced_verify.launch.py b/orbbec_camera/examples/multi_camera_synced_verification_tool/multi_camera_synced_verify.launch.py new file mode 100644 index 00000000..b81b8552 --- /dev/null +++ b/orbbec_camera/examples/multi_camera_synced_verification_tool/multi_camera_synced_verify.launch.py @@ -0,0 +1,126 @@ +import os +from ament_index_python.packages import get_package_share_directory +from launch import LaunchDescription +from launch_ros.actions import Node, LoadComposableNodes +from launch.actions import IncludeLaunchDescription, GroupAction, TimerAction +from launch.launch_description_sources import PythonLaunchDescriptionSource +from launch.actions import DeclareLaunchArgument +from launch.conditions import UnlessCondition, IfCondition +from launch.substitutions import LaunchConfiguration +from launch.substitutions import TextSubstitution +from launch_ros.descriptions import ComposableNode + + +def load_yaml(file_path): + with open(file_path, "r") as f: + return yaml.safe_load(f) + + +def merge_params(default_params, yaml_params): + for key, value in yaml_params.items(): + if key in default_params: + default_params[key] = value + return default_params + + +def convert_value(value): + if isinstance(value, str): + try: + return int(value) + except ValueError: + pass + try: + return float(value) + except ValueError: + pass + if value.lower() == "true": + return True + elif value.lower() == "false": + return False + return value + + +def generate_launch_description(): + # Include launch files + package_dir = get_package_share_directory("orbbec_camera") + launch_file_dir = os.path.join( + package_dir, "examples/multi_camera_synced_verification_tool" + ) + config_file_dir = os.path.join(package_dir, "config") + config_file_path = os.path.join(config_file_dir, "camera_params.yaml") + secondary_config_file_path = os.path.join(config_file_dir, "camera_secondary_params.yaml") + + attach_to_shared_component_container_arg = LaunchConfiguration( + "attach_to_shared_component_container", default=False + ) + component_container_name_arg = LaunchConfiguration( + "component_container_name", default="shared_orbbec_container" + ) + + shared_orbbec_container = Node( + name=component_container_name_arg, + package="rclcpp_components", + executable="component_container_mt", + output="screen", + condition=UnlessCondition(attach_to_shared_component_container_arg), + ) + + save_rgbir = LoadComposableNodes( + target_container=component_container_name_arg, + composable_node_descriptions=[ + ComposableNode( + namespace="save_rgbir", + name="save_rgbir", + package="orbbec_camera", + plugin="orbbec_camera::tools::MultiCameraSubscriber", + ) + ], + ) + + attach_to_shared_component_container_arg = TextSubstitution(text="true") + + launch1_include = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + os.path.join(launch_file_dir, "gemini_330_series_synced_verify.launch.py") + ), + launch_arguments={ + "camera_name": "camera_01", + "usb_port": "2-1", + "device_num": "2", + "sync_mode": "primary", + "config_file_path": config_file_path, + "trigger_out_enabled": "true", + "attach_to_shared_component_container": attach_to_shared_component_container_arg, + "component_container_name": component_container_name_arg, + }.items(), + ) + + launch2_include = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + os.path.join(launch_file_dir, "gemini_330_series_synced_verify.launch.py") + ), + launch_arguments={ + "camera_name": "camera_02", + "usb_port": "2-3", + "device_num": "2", + "sync_mode": "secondary_synced", + "config_file_path": secondary_config_file_path, + "trigger_out_enabled": "false", + "attach_to_shared_component_container": attach_to_shared_component_container_arg, + "component_container_name": component_container_name_arg, + }.items(), + ) + + # Launch description + ld = LaunchDescription( + [ + shared_orbbec_container, + TimerAction(period=0.0, actions=[GroupAction([launch2_include])]), + TimerAction(period=2.0, actions=[GroupAction([launch1_include])]), + # The primary camera should be launched at last + TimerAction(period=6.0, actions=[GroupAction([save_rgbir])]), + # save_rgbir is synced verification tool + ] + ) + + return ld diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/DevicesInfo.txt b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/DevicesInfo.txt new file mode 100644 index 00000000..34720dc6 --- /dev/null +++ b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/DevicesInfo.txt @@ -0,0 +1,42 @@ +{ + "deviceVid": "0x2BC5", + "devicePid": "0x0800", + "primarySerialNumber": "CP1E5420006D", + "devices": [{ + "index": 0, + "isPrimaryDevice": true, + "vid": "0x2BC5", + "pid": "0x0800", + "name": "Orbbec Gemini 335", + "firmwareVersion": "1.3.64", + "serialNumber": "CP1E5420006D", + "hardwareVersion": "0.1", + "ipAddress": "0.0.0.0", + "extensionInfo": { + "ExtensionInfo": { + "IspFwVer": "20240820", + "IspNeedVer": "20240820", + "HwType": "R1", + "HwVer": "V1.1" + } + } + }, { + "index": 1, + "isPrimaryDevice": false, + "vid": "0x2BC5", + "pid": "0x0800", + "name": "Orbbec Gemini 335", + "firmwareVersion": "1.3.64", + "serialNumber": "CP1L44P00051", + "hardwareVersion": "0.1", + "ipAddress": "0.0.0.0", + "extensionInfo": { + "ExtensionInfo": { + "IspFwVer": "20240820", + "IspNeedVer": "20240820", + "HwType": "R1", + "HwVer": "V1.0" + } + } + }] +} diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/StreamProfileInfo.txt b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/StreamProfileInfo.txt new file mode 100644 index 00000000..3b429448 --- /dev/null +++ b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/StreamProfileInfo.txt @@ -0,0 +1,16 @@ +{ + "D2CAlignMode": "ALIGN_D2C_SW_MODE", + "streamProfiles": [{ + "sensorType": "OB_SENSOR_COLOR", + "width": 1280, + "height": 720, + "fps": 30, + "format": "MJPEG" + }, { + "sensorType": "OB_SENSOR_IR_LEFT", + "width": 848, + "height": 480, + "fps": 30, + "format": "Y8" + }] +} diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543227_f0_s1739874543327_e50_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543227_f0_s1739874543327_e50_d16_.jpg new file mode 100644 index 00000000..d23c4234 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543227_f0_s1739874543327_e50_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543260_f1_s1739874543351_e50_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543260_f1_s1739874543351_e50_d16_.jpg new file mode 100644 index 00000000..282e7146 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543260_f1_s1739874543351_e50_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543294_f2_s1739874543359_e50_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543294_f2_s1739874543359_e50_d16_.jpg new file mode 100644 index 00000000..64a63647 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543294_f2_s1739874543359_e50_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543327_f3_s1739874543441_e50_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543327_f3_s1739874543441_e50_d16_.jpg new file mode 100644 index 00000000..f2ea0c1a Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543327_f3_s1739874543441_e50_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543360_f4_s1739874543442_e50_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543360_f4_s1739874543442_e50_d16_.jpg new file mode 100644 index 00000000..10e92691 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543360_f4_s1739874543442_e50_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543394_f5_s1739874543506_e50_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543394_f5_s1739874543506_e50_d16_.jpg new file mode 100644 index 00000000..f3e360b3 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543394_f5_s1739874543506_e50_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543427_f6_s1739874543518_e50_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543427_f6_s1739874543518_e50_d16_.jpg new file mode 100644 index 00000000..957764f1 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543427_f6_s1739874543518_e50_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543461_f7_s1739874543520_e50_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543461_f7_s1739874543520_e50_d16_.jpg new file mode 100644 index 00000000..f64ff4a8 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543461_f7_s1739874543520_e50_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543494_f8_s1739874543548_e50_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543494_f8_s1739874543548_e50_d16_.jpg new file mode 100644 index 00000000..8723b74e Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543494_f8_s1739874543548_e50_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543527_f9_s1739874543603_e50_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543527_f9_s1739874543603_e50_d16_.jpg new file mode 100644 index 00000000..69af14a7 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543527_f9_s1739874543603_e50_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543561_f10_s1739874543648_e50_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543561_f10_s1739874543648_e50_d16_.jpg new file mode 100644 index 00000000..649260c6 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543561_f10_s1739874543648_e50_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543227_f0_s1739874543250_e5000_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543227_f0_s1739874543250_e5000_d16_.jpg new file mode 100644 index 00000000..9566365e Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543227_f0_s1739874543250_e5000_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543260_f1_s1739874543310_e5000_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543260_f1_s1739874543310_e5000_d16_.jpg new file mode 100644 index 00000000..932ed1dc Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543260_f1_s1739874543310_e5000_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543294_f2_s1739874543329_e5000_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543294_f2_s1739874543329_e5000_d16_.jpg new file mode 100644 index 00000000..9cc8a52c Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543294_f2_s1739874543329_e5000_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543327_f3_s1739874543393_e5000_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543327_f3_s1739874543393_e5000_d16_.jpg new file mode 100644 index 00000000..9bb1b8f5 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543327_f3_s1739874543393_e5000_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543361_f4_s1739874543405_e5000_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543361_f4_s1739874543405_e5000_d16_.jpg new file mode 100644 index 00000000..af38a76a Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543361_f4_s1739874543405_e5000_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543394_f5_s1739874543473_e5000_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543394_f5_s1739874543473_e5000_d16_.jpg new file mode 100644 index 00000000..c3191c3a Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543394_f5_s1739874543473_e5000_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543427_f6_s1739874543474_e5000_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543427_f6_s1739874543474_e5000_d16_.jpg new file mode 100644 index 00000000..b37ba3e9 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543427_f6_s1739874543474_e5000_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543461_f7_s1739874543493_e5000_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543461_f7_s1739874543493_e5000_d16_.jpg new file mode 100644 index 00000000..bd5a7334 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543461_f7_s1739874543493_e5000_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543494_f8_s1739874543528_e5000_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543494_f8_s1739874543528_e5000_d16_.jpg new file mode 100644 index 00000000..275fde7b Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543494_f8_s1739874543528_e5000_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543527_f9_s1739874543627_e5000_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543527_f9_s1739874543627_e5000_d16_.jpg new file mode 100644 index 00000000..15015355 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543527_f9_s1739874543627_e5000_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543561_f10_s1739874543628_e5000_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543561_f10_s1739874543628_e5000_d16_.jpg new file mode 100644 index 00000000..3cebc97b Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543561_f10_s1739874543628_e5000_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543227_f0_s1739874543304_e50_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543227_f0_s1739874543304_e50_d16_.jpg new file mode 100644 index 00000000..f1474f06 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543227_f0_s1739874543304_e50_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543260_f1_s1739874543345_e50_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543260_f1_s1739874543345_e50_d16_.jpg new file mode 100644 index 00000000..63748dbf Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543260_f1_s1739874543345_e50_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543293_f2_s1739874543446_e50_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543293_f2_s1739874543446_e50_d16_.jpg new file mode 100644 index 00000000..1790bc25 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543293_f2_s1739874543446_e50_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543327_f3_s1739874543458_e50_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543327_f3_s1739874543458_e50_d16_.jpg new file mode 100644 index 00000000..c63c5709 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543327_f3_s1739874543458_e50_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543360_f4_s1739874543468_e50_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543360_f4_s1739874543468_e50_d16_.jpg new file mode 100644 index 00000000..4e37f8c3 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543360_f4_s1739874543468_e50_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543393_f5_s1739874543470_e50_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543393_f5_s1739874543470_e50_d16_.jpg new file mode 100644 index 00000000..aa3f22e4 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543393_f5_s1739874543470_e50_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543427_f6_s1739874543485_e50_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543427_f6_s1739874543485_e50_d16_.jpg new file mode 100644 index 00000000..fc6cb679 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543427_f6_s1739874543485_e50_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543460_f7_s1739874543505_e50_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543460_f7_s1739874543505_e50_d16_.jpg new file mode 100644 index 00000000..99589916 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543460_f7_s1739874543505_e50_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543494_f8_s1739874543540_e50_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543494_f8_s1739874543540_e50_d16_.jpg new file mode 100644 index 00000000..9a08b658 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543494_f8_s1739874543540_e50_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543527_f9_s1739874543616_e50_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543527_f9_s1739874543616_e50_d16_.jpg new file mode 100644 index 00000000..74baac0f Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543527_f9_s1739874543616_e50_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543560_f10_s1739874543618_e50_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543560_f10_s1739874543618_e50_d16_.jpg new file mode 100644 index 00000000..fdc044c6 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543560_f10_s1739874543618_e50_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543227_f0_s1739874543250_e5000_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543227_f0_s1739874543250_e5000_d16_.jpg new file mode 100644 index 00000000..5c25b961 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543227_f0_s1739874543250_e5000_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543260_f1_s1739874543294_e5000_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543260_f1_s1739874543294_e5000_d16_.jpg new file mode 100644 index 00000000..804332fb Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543260_f1_s1739874543294_e5000_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543294_f2_s1739874543319_e5000_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543294_f2_s1739874543319_e5000_d16_.jpg new file mode 100644 index 00000000..4d595537 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543294_f2_s1739874543319_e5000_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543327_f3_s1739874543460_e5000_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543327_f3_s1739874543460_e5000_d16_.jpg new file mode 100644 index 00000000..c83afa05 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543327_f3_s1739874543460_e5000_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543360_f4_s1739874543460_e5000_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543360_f4_s1739874543460_e5000_d16_.jpg new file mode 100644 index 00000000..07cb6df5 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543360_f4_s1739874543460_e5000_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543394_f5_s1739874543661_e5000_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543394_f5_s1739874543661_e5000_d16_.jpg new file mode 100644 index 00000000..1f3870d3 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543394_f5_s1739874543661_e5000_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543427_f6_s1739874543684_e5000_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543427_f6_s1739874543684_e5000_d16_.jpg new file mode 100644 index 00000000..d0053e65 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543427_f6_s1739874543684_e5000_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543460_f7_s1739874543685_e5000_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543460_f7_s1739874543685_e5000_d16_.jpg new file mode 100644 index 00000000..bb9b8c9a Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543460_f7_s1739874543685_e5000_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543494_f8_s1739874543687_e5000_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543494_f8_s1739874543687_e5000_d16_.jpg new file mode 100644 index 00000000..dd9c916d Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543494_f8_s1739874543687_e5000_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543527_f10_s1739874543687_e5000_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543527_f10_s1739874543687_e5000_d16_.jpg new file mode 100644 index 00000000..688f316b Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543527_f10_s1739874543687_e5000_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543560_f11_s1739874543687_e5000_d16_.jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543560_f11_s1739874543687_e5000_d16_.jpg new file mode 100644 index 00000000..6264293c Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543560_f11_s1739874543687_e5000_d16_.jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/frameMatchLog.txt b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/frameMatchLog.txt new file mode 100644 index 00000000..691842e2 --- /dev/null +++ b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/frameMatchLog.txt @@ -0,0 +1,55 @@ +===================result key:0 +=====================result value : deviceId:0 sensorType:ir_left syncTimeStamp:1739874543527 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543527_f9_s1739874543627_e5000_d16_.jpg +=====================result value : deviceId:1 sensorType:color syncTimeStamp:1739874543527 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543527_f9_s1739874543616_e50_d16_.jpg +=====================result value : deviceId:1 sensorType:ir_left syncTimeStamp:1739874543527 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543527_f10_s1739874543687_e5000_d16_.jpg +=====================result value : deviceId:0 sensorType:color syncTimeStamp:1739874543527 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543527_f9_s1739874543603_e50_d16_.jpg +===================result key:1 +=====================result value : deviceId:0 sensorType:ir_left syncTimeStamp:1739874543494 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543494_f8_s1739874543528_e5000_d16_.jpg +=====================result value : deviceId:1 sensorType:color syncTimeStamp:1739874543494 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543494_f8_s1739874543540_e50_d16_.jpg +=====================result value : deviceId:1 sensorType:ir_left syncTimeStamp:1739874543494 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543494_f8_s1739874543687_e5000_d16_.jpg +=====================result value : deviceId:0 sensorType:color syncTimeStamp:1739874543494 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543494_f8_s1739874543548_e50_d16_.jpg +===================result key:2 +=====================result value : deviceId:0 sensorType:ir_left syncTimeStamp:1739874543461 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543461_f7_s1739874543493_e5000_d16_.jpg +=====================result value : deviceId:1 sensorType:color syncTimeStamp:1739874543460 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543460_f7_s1739874543505_e50_d16_.jpg +=====================result value : deviceId:1 sensorType:ir_left syncTimeStamp:1739874543460 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543460_f7_s1739874543685_e5000_d16_.jpg +=====================result value : deviceId:0 sensorType:color syncTimeStamp:1739874543461 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543461_f7_s1739874543520_e50_d16_.jpg +===================result key:3 +=====================result value : deviceId:0 sensorType:ir_left syncTimeStamp:1739874543260 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543260_f1_s1739874543310_e5000_d16_.jpg +=====================result value : deviceId:1 sensorType:color syncTimeStamp:1739874543260 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543260_f1_s1739874543345_e50_d16_.jpg +=====================result value : deviceId:1 sensorType:ir_left syncTimeStamp:1739874543260 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543260_f1_s1739874543294_e5000_d16_.jpg +=====================result value : deviceId:0 sensorType:color syncTimeStamp:1739874543260 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543260_f1_s1739874543351_e50_d16_.jpg +===================result key:4 +=====================result value : deviceId:0 sensorType:ir_left syncTimeStamp:1739874543361 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543361_f4_s1739874543405_e5000_d16_.jpg +=====================result value : deviceId:1 sensorType:color syncTimeStamp:1739874543360 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543360_f4_s1739874543468_e50_d16_.jpg +=====================result value : deviceId:1 sensorType:ir_left syncTimeStamp:1739874543360 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543360_f4_s1739874543460_e5000_d16_.jpg +=====================result value : deviceId:0 sensorType:color syncTimeStamp:1739874543360 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543360_f4_s1739874543442_e50_d16_.jpg +===================result key:5 +=====================result value : deviceId:0 sensorType:ir_left syncTimeStamp:1739874543327 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543327_f3_s1739874543393_e5000_d16_.jpg +=====================result value : deviceId:1 sensorType:color syncTimeStamp:1739874543327 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543327_f3_s1739874543458_e50_d16_.jpg +=====================result value : deviceId:1 sensorType:ir_left syncTimeStamp:1739874543327 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543327_f3_s1739874543460_e5000_d16_.jpg +=====================result value : deviceId:0 sensorType:color syncTimeStamp:1739874543327 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543327_f3_s1739874543441_e50_d16_.jpg +===================result key:6 +=====================result value : deviceId:0 sensorType:ir_left syncTimeStamp:1739874543561 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543561_f10_s1739874543628_e5000_d16_.jpg +=====================result value : deviceId:1 sensorType:color syncTimeStamp:1739874543560 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543560_f10_s1739874543618_e50_d16_.jpg +=====================result value : deviceId:1 sensorType:ir_left syncTimeStamp:1739874543560 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543560_f11_s1739874543687_e5000_d16_.jpg +=====================result value : deviceId:0 sensorType:color syncTimeStamp:1739874543561 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543561_f10_s1739874543648_e50_d16_.jpg +===================result key:7 +=====================result value : deviceId:0 sensorType:ir_left syncTimeStamp:1739874543427 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543427_f6_s1739874543474_e5000_d16_.jpg +=====================result value : deviceId:1 sensorType:color syncTimeStamp:1739874543427 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543427_f6_s1739874543485_e50_d16_.jpg +=====================result value : deviceId:1 sensorType:ir_left syncTimeStamp:1739874543427 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543427_f6_s1739874543684_e5000_d16_.jpg +=====================result value : deviceId:0 sensorType:color syncTimeStamp:1739874543427 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543427_f6_s1739874543518_e50_d16_.jpg +===================result key:8 +=====================result value : deviceId:0 sensorType:ir_left syncTimeStamp:1739874543294 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543294_f2_s1739874543329_e5000_d16_.jpg +=====================result value : deviceId:1 sensorType:color syncTimeStamp:1739874543293 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543293_f2_s1739874543446_e50_d16_.jpg +=====================result value : deviceId:1 sensorType:ir_left syncTimeStamp:1739874543294 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543294_f2_s1739874543319_e5000_d16_.jpg +=====================result value : deviceId:0 sensorType:color syncTimeStamp:1739874543294 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543294_f2_s1739874543359_e50_d16_.jpg +===================result key:9 +=====================result value : deviceId:0 sensorType:ir_left syncTimeStamp:1739874543394 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543394_f5_s1739874543473_e5000_d16_.jpg +=====================result value : deviceId:1 sensorType:color syncTimeStamp:1739874543393 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543393_f5_s1739874543470_e50_d16_.jpg +=====================result value : deviceId:1 sensorType:ir_left syncTimeStamp:1739874543394 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543394_f5_s1739874543661_e5000_d16_.jpg +=====================result value : deviceId:0 sensorType:color syncTimeStamp:1739874543394 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543394_f5_s1739874543506_e50_d16_.jpg +===================result key:10 +=====================result value : deviceId:0 sensorType:ir_left syncTimeStamp:1739874543227 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/ir#left_SNCP1E5420006D_Index0_g1739874543227_f0_s1739874543250_e5000_d16_.jpg +=====================result value : deviceId:1 sensorType:color syncTimeStamp:1739874543227 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/color_SNCP1L44P00051_Index1_g1739874543227_f0_s1739874543304_e50_d16_.jpg +=====================result value : deviceId:1 sensorType:ir_left syncTimeStamp:1739874543227 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1L44P00051_Index1/ir#left_SNCP1L44P00051_Index1_g1739874543227_f0_s1739874543250_e5000_d16_.jpg +=====================result value : deviceId:0 sensorType:color syncTimeStamp:1739874543227 picturePath:/home/jj/openSDK/opensdk_ros2/src/OrbbecSDK_ROS2/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543227_f0_s1739874543327_e50_d16_.jpg diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/0_color_SNCP1E5420006D_Index0_1739874543527_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/0_color_SNCP1E5420006D_Index0_1739874543527_[0].jpg new file mode 100644 index 00000000..69af14a7 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/0_color_SNCP1E5420006D_Index0_1739874543527_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/0_color_SNCP1L44P00051_Index1_1739874543527_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/0_color_SNCP1L44P00051_Index1_1739874543527_[0].jpg new file mode 100644 index 00000000..74baac0f Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/0_color_SNCP1L44P00051_Index1_1739874543527_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/0_ir_left_SNCP1E5420006D_Index0_1739874543527_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/0_ir_left_SNCP1E5420006D_Index0_1739874543527_[0].jpg new file mode 100644 index 00000000..15015355 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/0_ir_left_SNCP1E5420006D_Index0_1739874543527_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/0_ir_left_SNCP1L44P00051_Index1_1739874543527_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/0_ir_left_SNCP1L44P00051_Index1_1739874543527_[0].jpg new file mode 100644 index 00000000..688f316b Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/0_ir_left_SNCP1L44P00051_Index1_1739874543527_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/10_color_SNCP1E5420006D_Index0_1739874543227_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/10_color_SNCP1E5420006D_Index0_1739874543227_[0].jpg new file mode 100644 index 00000000..d23c4234 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/10_color_SNCP1E5420006D_Index0_1739874543227_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/10_color_SNCP1L44P00051_Index1_1739874543227_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/10_color_SNCP1L44P00051_Index1_1739874543227_[0].jpg new file mode 100644 index 00000000..f1474f06 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/10_color_SNCP1L44P00051_Index1_1739874543227_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/10_ir_left_SNCP1E5420006D_Index0_1739874543227_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/10_ir_left_SNCP1E5420006D_Index0_1739874543227_[0].jpg new file mode 100644 index 00000000..9566365e Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/10_ir_left_SNCP1E5420006D_Index0_1739874543227_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/10_ir_left_SNCP1L44P00051_Index1_1739874543227_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/10_ir_left_SNCP1L44P00051_Index1_1739874543227_[0].jpg new file mode 100644 index 00000000..5c25b961 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/10_ir_left_SNCP1L44P00051_Index1_1739874543227_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/1_color_SNCP1E5420006D_Index0_1739874543494_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/1_color_SNCP1E5420006D_Index0_1739874543494_[0].jpg new file mode 100644 index 00000000..8723b74e Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/1_color_SNCP1E5420006D_Index0_1739874543494_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/1_color_SNCP1L44P00051_Index1_1739874543494_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/1_color_SNCP1L44P00051_Index1_1739874543494_[0].jpg new file mode 100644 index 00000000..9a08b658 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/1_color_SNCP1L44P00051_Index1_1739874543494_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/1_ir_left_SNCP1E5420006D_Index0_1739874543494_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/1_ir_left_SNCP1E5420006D_Index0_1739874543494_[0].jpg new file mode 100644 index 00000000..275fde7b Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/1_ir_left_SNCP1E5420006D_Index0_1739874543494_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/1_ir_left_SNCP1L44P00051_Index1_1739874543494_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/1_ir_left_SNCP1L44P00051_Index1_1739874543494_[0].jpg new file mode 100644 index 00000000..dd9c916d Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/1_ir_left_SNCP1L44P00051_Index1_1739874543494_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/2_color_SNCP1E5420006D_Index0_1739874543461_[1].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/2_color_SNCP1E5420006D_Index0_1739874543461_[1].jpg new file mode 100644 index 00000000..f64ff4a8 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/2_color_SNCP1E5420006D_Index0_1739874543461_[1].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/2_color_SNCP1L44P00051_Index1_1739874543460_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/2_color_SNCP1L44P00051_Index1_1739874543460_[0].jpg new file mode 100644 index 00000000..99589916 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/2_color_SNCP1L44P00051_Index1_1739874543460_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/2_ir_left_SNCP1E5420006D_Index0_1739874543461_[1].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/2_ir_left_SNCP1E5420006D_Index0_1739874543461_[1].jpg new file mode 100644 index 00000000..bd5a7334 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/2_ir_left_SNCP1E5420006D_Index0_1739874543461_[1].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/2_ir_left_SNCP1L44P00051_Index1_1739874543460_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/2_ir_left_SNCP1L44P00051_Index1_1739874543460_[0].jpg new file mode 100644 index 00000000..bb9b8c9a Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/2_ir_left_SNCP1L44P00051_Index1_1739874543460_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/3_color_SNCP1E5420006D_Index0_1739874543260_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/3_color_SNCP1E5420006D_Index0_1739874543260_[0].jpg new file mode 100644 index 00000000..282e7146 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/3_color_SNCP1E5420006D_Index0_1739874543260_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/3_color_SNCP1L44P00051_Index1_1739874543260_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/3_color_SNCP1L44P00051_Index1_1739874543260_[0].jpg new file mode 100644 index 00000000..63748dbf Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/3_color_SNCP1L44P00051_Index1_1739874543260_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/3_ir_left_SNCP1E5420006D_Index0_1739874543260_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/3_ir_left_SNCP1E5420006D_Index0_1739874543260_[0].jpg new file mode 100644 index 00000000..932ed1dc Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/3_ir_left_SNCP1E5420006D_Index0_1739874543260_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/3_ir_left_SNCP1L44P00051_Index1_1739874543260_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/3_ir_left_SNCP1L44P00051_Index1_1739874543260_[0].jpg new file mode 100644 index 00000000..804332fb Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/3_ir_left_SNCP1L44P00051_Index1_1739874543260_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/4_color_SNCP1E5420006D_Index0_1739874543360_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/4_color_SNCP1E5420006D_Index0_1739874543360_[0].jpg new file mode 100644 index 00000000..10e92691 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/4_color_SNCP1E5420006D_Index0_1739874543360_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/4_color_SNCP1L44P00051_Index1_1739874543360_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/4_color_SNCP1L44P00051_Index1_1739874543360_[0].jpg new file mode 100644 index 00000000..4e37f8c3 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/4_color_SNCP1L44P00051_Index1_1739874543360_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/4_ir_left_SNCP1E5420006D_Index0_1739874543361_[1].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/4_ir_left_SNCP1E5420006D_Index0_1739874543361_[1].jpg new file mode 100644 index 00000000..af38a76a Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/4_ir_left_SNCP1E5420006D_Index0_1739874543361_[1].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/4_ir_left_SNCP1L44P00051_Index1_1739874543360_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/4_ir_left_SNCP1L44P00051_Index1_1739874543360_[0].jpg new file mode 100644 index 00000000..07cb6df5 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/4_ir_left_SNCP1L44P00051_Index1_1739874543360_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/5_color_SNCP1E5420006D_Index0_1739874543327_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/5_color_SNCP1E5420006D_Index0_1739874543327_[0].jpg new file mode 100644 index 00000000..f2ea0c1a Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/5_color_SNCP1E5420006D_Index0_1739874543327_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/5_color_SNCP1L44P00051_Index1_1739874543327_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/5_color_SNCP1L44P00051_Index1_1739874543327_[0].jpg new file mode 100644 index 00000000..c63c5709 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/5_color_SNCP1L44P00051_Index1_1739874543327_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/5_ir_left_SNCP1E5420006D_Index0_1739874543327_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/5_ir_left_SNCP1E5420006D_Index0_1739874543327_[0].jpg new file mode 100644 index 00000000..9bb1b8f5 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/5_ir_left_SNCP1E5420006D_Index0_1739874543327_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/5_ir_left_SNCP1L44P00051_Index1_1739874543327_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/5_ir_left_SNCP1L44P00051_Index1_1739874543327_[0].jpg new file mode 100644 index 00000000..c83afa05 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/5_ir_left_SNCP1L44P00051_Index1_1739874543327_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/6_color_SNCP1E5420006D_Index0_1739874543561_[1].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/6_color_SNCP1E5420006D_Index0_1739874543561_[1].jpg new file mode 100644 index 00000000..649260c6 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/6_color_SNCP1E5420006D_Index0_1739874543561_[1].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/6_color_SNCP1L44P00051_Index1_1739874543560_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/6_color_SNCP1L44P00051_Index1_1739874543560_[0].jpg new file mode 100644 index 00000000..fdc044c6 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/6_color_SNCP1L44P00051_Index1_1739874543560_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/6_ir_left_SNCP1E5420006D_Index0_1739874543561_[1].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/6_ir_left_SNCP1E5420006D_Index0_1739874543561_[1].jpg new file mode 100644 index 00000000..3cebc97b Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/6_ir_left_SNCP1E5420006D_Index0_1739874543561_[1].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/6_ir_left_SNCP1L44P00051_Index1_1739874543560_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/6_ir_left_SNCP1L44P00051_Index1_1739874543560_[0].jpg new file mode 100644 index 00000000..6264293c Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/6_ir_left_SNCP1L44P00051_Index1_1739874543560_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/7_color_SNCP1E5420006D_Index0_1739874543427_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/7_color_SNCP1E5420006D_Index0_1739874543427_[0].jpg new file mode 100644 index 00000000..957764f1 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/7_color_SNCP1E5420006D_Index0_1739874543427_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/7_color_SNCP1L44P00051_Index1_1739874543427_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/7_color_SNCP1L44P00051_Index1_1739874543427_[0].jpg new file mode 100644 index 00000000..fc6cb679 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/7_color_SNCP1L44P00051_Index1_1739874543427_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/7_ir_left_SNCP1E5420006D_Index0_1739874543427_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/7_ir_left_SNCP1E5420006D_Index0_1739874543427_[0].jpg new file mode 100644 index 00000000..b37ba3e9 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/7_ir_left_SNCP1E5420006D_Index0_1739874543427_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/7_ir_left_SNCP1L44P00051_Index1_1739874543427_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/7_ir_left_SNCP1L44P00051_Index1_1739874543427_[0].jpg new file mode 100644 index 00000000..d0053e65 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/7_ir_left_SNCP1L44P00051_Index1_1739874543427_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/8_color_SNCP1E5420006D_Index0_1739874543294_[1].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/8_color_SNCP1E5420006D_Index0_1739874543294_[1].jpg new file mode 100644 index 00000000..64a63647 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/8_color_SNCP1E5420006D_Index0_1739874543294_[1].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/8_color_SNCP1L44P00051_Index1_1739874543293_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/8_color_SNCP1L44P00051_Index1_1739874543293_[0].jpg new file mode 100644 index 00000000..1790bc25 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/8_color_SNCP1L44P00051_Index1_1739874543293_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/8_ir_left_SNCP1E5420006D_Index0_1739874543294_[1].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/8_ir_left_SNCP1E5420006D_Index0_1739874543294_[1].jpg new file mode 100644 index 00000000..9cc8a52c Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/8_ir_left_SNCP1E5420006D_Index0_1739874543294_[1].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/8_ir_left_SNCP1L44P00051_Index1_1739874543294_[1].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/8_ir_left_SNCP1L44P00051_Index1_1739874543294_[1].jpg new file mode 100644 index 00000000..4d595537 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/8_ir_left_SNCP1L44P00051_Index1_1739874543294_[1].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/9_color_SNCP1E5420006D_Index0_1739874543394_[1].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/9_color_SNCP1E5420006D_Index0_1739874543394_[1].jpg new file mode 100644 index 00000000..f3e360b3 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/9_color_SNCP1E5420006D_Index0_1739874543394_[1].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/9_color_SNCP1L44P00051_Index1_1739874543393_[0].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/9_color_SNCP1L44P00051_Index1_1739874543393_[0].jpg new file mode 100644 index 00000000..aa3f22e4 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/9_color_SNCP1L44P00051_Index1_1739874543393_[0].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/9_ir_left_SNCP1E5420006D_Index0_1739874543394_[1].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/9_ir_left_SNCP1E5420006D_Index0_1739874543394_[1].jpg new file mode 100644 index 00000000..c3191c3a Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/9_ir_left_SNCP1E5420006D_Index0_1739874543394_[1].jpg differ diff --git a/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/9_ir_left_SNCP1L44P00051_Index1_1739874543394_[1].jpg b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/9_ir_left_SNCP1L44P00051_Index1_1739874543394_[1].jpg new file mode 100644 index 00000000..1f3870d3 Binary files /dev/null and b/orbbec_camera/examples/multi_camera_synced_verification_tool/multicamera_sync/output/20250218102900/results-2025-02-25_163648/matchFrames/9_ir_left_SNCP1L44P00051_Index1_1739874543394_[1].jpg differ diff --git a/orbbec_camera/examples/net_camera/multi_net_camera.launch.py b/orbbec_camera/examples/net_camera/multi_net_camera.launch.py new file mode 100644 index 00000000..5804fc3d --- /dev/null +++ b/orbbec_camera/examples/net_camera/multi_net_camera.launch.py @@ -0,0 +1,47 @@ +from launch import LaunchDescription +from launch.actions import IncludeLaunchDescription, GroupAction, TimerAction +from launch.launch_description_sources import PythonLaunchDescriptionSource +from launch_ros.actions import Node +from ament_index_python.packages import get_package_share_directory +import os + + +def generate_launch_description(): + # Include launch files + package_dir = get_package_share_directory("orbbec_camera") + launch_file_dir = os.path.join(package_dir, "launch") + launch1_include = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + os.path.join(launch_file_dir, "femto_mega.launch.py") # If you are using Gemini 335Le, replace femto_mega.launch.py ​​with gemini_330_series.launch.py + ), + launch_arguments={ + "camera_name": "camera_01", + "net_device_ip": "192.168.1.10", + "net_device_port": "8090", + "sync_mode": "standalone", + }.items(), + ) + + launch2_include = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + os.path.join(launch_file_dir, "femto_mega.launch.py") # If you are using Gemini 335Le, replace femto_mega.launch.py ​​with gemini_330_series.launch.py + ), + launch_arguments={ + "camera_name": "camera_02", + "net_device_ip": "192.168.1.11", + "net_device_port": "8090", + "sync_mode": "standalone", + }.items(), + ) + + # If you need more cameras, just add more launch_include here, and change the usb_port and device_num + + # Launch description + ld = LaunchDescription( + [ + TimerAction(period=0.0, actions=[GroupAction([launch1_include])]), + TimerAction(period=2.0, actions=[GroupAction([launch2_include])]), + ] + ) + + return ld diff --git a/orbbec_camera/launch/orbbec_camera.launch.py b/orbbec_camera/launch/orbbec_camera.launch.py new file mode 100644 index 00000000..8d354ed0 --- /dev/null +++ b/orbbec_camera/launch/orbbec_camera.launch.py @@ -0,0 +1,185 @@ +import os +import yaml +import logging +from launch import LaunchDescription +from launch.actions import DeclareLaunchArgument, OpaqueFunction +from launch.substitutions import LaunchConfiguration +from launch_ros.actions import Node +from launch_ros.descriptions import ComposableNode +from launch.conditions import UnlessCondition +from launch_ros.actions import LoadComposableNodes +from ament_index_python.packages import get_package_share_directory +import sys +sys.path.append(os.path.dirname(os.path.realpath(__file__))) +from utils_yaml import * + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +default_package_name = 'orbbec_camera' +default_camera_model = 'gemini330_series' +default_common_yaml = 'common.yaml' +default_component_container_name = 'orbbec_container' + +def generate_launch_arguments(): + launch_arguments = [ + #general config + DeclareLaunchArgument('camera_model', default_value=default_camera_model), + DeclareLaunchArgument('config_file_path', default_value=''), + #multi-device sync param + DeclareLaunchArgument('camera_name', default_value='camera'), + DeclareLaunchArgument('usb_port', default_value=''), + DeclareLaunchArgument('device_num', default_value='1'), + DeclareLaunchArgument('sync_mode', default_value='standalone'), + DeclareLaunchArgument('trigger_out_enabled', default_value='true'), + #instra-process demo set + DeclareLaunchArgument('use_intra_process_comms', default_value='false'), + DeclareLaunchArgument('attach_component_container_enable', default_value='false'), + DeclareLaunchArgument('attach_component_container_name', default_value=default_component_container_name), + ] + return launch_arguments + + +def load_common_yaml_params(): + common_yaml_path = os.path.join( + get_package_share_directory(default_package_name), 'config', default_common_yaml + ) + common_yaml_path = get_absolute_path(common_yaml_path, package_name=default_package_name) + logger.info(f"load convert Absolute path: {common_yaml_path}") + return load_and_parse_yaml(common_yaml_path) + + +def load_config_yaml_params(config_file_path, camera_model): + config_yaml_path = config_file_path or os.path.join( + get_package_share_directory(default_package_name), 'config', f"{camera_model}.yaml" + ) + config_yaml_path = get_absolute_path(config_yaml_path, package_name=default_package_name) + print(f"load convert Absolute config_yaml_path: {config_yaml_path}") + return load_and_parse_yaml(config_yaml_path) + + +def load_parameters(context, args): + camera_model = LaunchConfiguration("camera_model").perform(context) + config_file_path = LaunchConfiguration("config_file_path").perform(context) + usb_port = LaunchConfiguration("usb_port").perform(context) + print(f"camera_model: {camera_model}", f"config_file_path: {config_file_path}", f"usb_port: {usb_port}") + + try: + #1.load ymal params + yaml_common_params = load_common_yaml_params() + yaml_params = load_config_yaml_params(config_file_path,camera_model) + #print_params(yaml_common_params) + #print_params(yaml_params) + yaml_params = update_params(yaml_common_params,yaml_params) + #print_params(yaml_params) + + #2.load args params + args_params = {arg.name: LaunchConfiguration(arg.name).perform(context) for arg in args} + #print_params(args_params) + + #3.meger params args + if usb_port is None or usb_port == "": #meger yaml->args params + print("usb_port param null") + default_params = update_params(args_params, yaml_params) + else: + print("usb_port param not null value:", usb_port) #meger args->yaml params + default_params = update_params(yaml_params, args_params) + #print_params(default_params) + + #4.load cmd params & meger params cmd->yaml + cmd_params = dict([a for a in [a.split(':=') for a in sys.argv] if len(a) == 2]) + default_params = update_params(default_params,cmd_params) + #print_params(args_params) + + except (FileNotFoundError, yaml.YAMLError) as e: + logger.error(f"Error loading YAML file: {e}") + return {} + + #5.Skip conversion for specific parameters + SKIP_CONVERT = {'config_file_path', 'usb_port', 'serial_number', 'attach_component_container_name'} + return { + key: (value if key in SKIP_CONVERT else convert_value(value)) + for key, value in default_params.items() + } + + +def find_camera_name(params): + return find_param(params, 'camera_name', 'camera') + +def find_use_intra_process_comms(params): + return find_param(params, 'use_intra_process_comms', False) + + +def generate_launch_description(): + args = generate_launch_arguments() + def get_params(context, args): + return [load_parameters(context, args)] + + def create_composable_node(camera_name, params, use_intra_process): + common_arguments = [{'use_intra_process_comms': use_intra_process}] + composable_node = ComposableNode( + namespace=camera_name, + name=camera_name, + package=default_package_name, + plugin='orbbec_camera::OBCameraNodeDriver', + parameters=params, + #extra_arguments=[{'use_intra_process_comms': LaunchConfiguration("use_intra_process_comms")}], + extra_arguments=common_arguments, + ) + return composable_node + + + def create_orbbec_container(attach_component_container_name, attach_component_container_enable): + orbbec_container = Node( + name=attach_component_container_name, + package='rclcpp_components', + executable='component_container_mt', + output='screen', + condition=UnlessCondition(attach_component_container_enable) + ) + return orbbec_container + + + def create_node_action(context, args): + params = get_params(context, args) + camera_name = find_camera_name(params) + + use_intra_process = find_use_intra_process_comms(params) + #use_intra_process = LaunchConfiguration("use_intra_process_comms", default=False).perform(context) + print(f"camera_name: {camera_name}", f"use_intra_process: {use_intra_process}") + + attach_enable_condition = LaunchConfiguration("attach_component_container_enable", default=False).perform(context) + attach_component_container_name = LaunchConfiguration("attach_component_container_name", default='orbbec_container').perform(context) + print(f"attach_enable_condition: {attach_enable_condition}", f"attach_component_container_name: {attach_component_container_name}") + + ros_distro = os.environ.get("ROS_DISTRO", "humble") + if ros_distro == "foxy": + return [ + Node( + package=default_package_name, + executable="orbbec_camera_node", + name="ob_camera_node", + namespace=camera_name, + parameters=params, + output="screen", + #condition=UnlessCondition(attach_enable_condition) + #prefix=['xterm -e gdb -ex run --args'], + ), + ] + else: + composable_node = create_composable_node(camera_name, params, use_intra_process) + orbbec_container= create_orbbec_container(attach_component_container_name, attach_enable_condition) + return [ + orbbec_container, + LoadComposableNodes( + target_container=attach_component_container_name, + composable_node_descriptions=[composable_node] + ), + ] + + return LaunchDescription( + args + [ + OpaqueFunction(function=lambda context: create_node_action(context, args)) + ] + ) \ No newline at end of file diff --git a/orbbec_camera/launch/orbbec_multicamera.launch.py b/orbbec_camera/launch/orbbec_multicamera.launch.py new file mode 100644 index 00000000..3018201d --- /dev/null +++ b/orbbec_camera/launch/orbbec_multicamera.launch.py @@ -0,0 +1,86 @@ +import os +from ament_index_python.packages import get_package_share_directory +from launch import LaunchDescription +from launch_ros.actions import Node +from launch.actions import IncludeLaunchDescription, GroupAction, TimerAction +from launch.launch_description_sources import PythonLaunchDescriptionSource + + +def generate_launch_description(): + # Include launch files + package_dir = get_package_share_directory('orbbec_camera') + launch_file_dir = os.path.join(package_dir, 'launch') + + G330_0 = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + os.path.join(launch_file_dir, 'orbbec_camera.launch.py') + ), + launch_arguments={ + 'camera_model': 'gemini330_series', + 'attach_component_container_enable': 'true', + 'camera_name': 'G330_0', + 'usb_port': '2-1', + 'device_num': '4', + # 'sync_mode': 'primary', + }.items() + ) + + G330_1 = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + os.path.join(launch_file_dir, 'orbbec_camera.launch.py') + ), + launch_arguments={ + 'camera_model': 'gemini330_series', + 'attach_component_container_enable': 'false', + 'camera_name': 'G330_1', + 'usb_port': '2-4', + 'device_num': '4', + # 'sync_mode': 'secondary_synced', + # 'trigger_out_enabled': 'false', + }.items() + ) + + G330_2 = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + os.path.join(launch_file_dir, 'orbbec_camera.launch.py') + ), + launch_arguments={ + 'camera_model': 'gemini330_series', + 'attach_component_container_enable': 'true', + 'camera_name': 'G330_2', + 'usb_port': '2-7', + 'device_num': '4', + # 'sync_mode': 'secondary_synced', + # 'trigger_out_enabled': 'false', + }.items() + ) + + G330_3 = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + os.path.join(launch_file_dir, 'orbbec_camera.launch.py') + ), + launch_arguments={ + 'camera_model': 'gemini330_series', + 'attach_component_container_enable': 'true', + 'camera_name': 'G330_3', + 'usb_port': '2-3', + 'device_num': '4', + # 'sync_mode': 'secondary_synced', + # 'trigger_out_enabled': 'false', + }.items() + ) + + # If you need more cameras, just add more launch_include here, and change the usb_port and device_num + + # Launch description + ld = LaunchDescription( + [ + TimerAction(period=0.0, actions=[GroupAction([G330_1])]), + TimerAction(period=2.0, actions=[GroupAction([G330_2])]), + TimerAction(period=4.0, actions=[GroupAction([G330_3])]), + TimerAction(period=6.0, actions=[GroupAction([G330_0])]), + # The primary camera should be launched at last + ] + ) + + return ld \ No newline at end of file diff --git a/orbbec_camera/launch/utils_yaml.py b/orbbec_camera/launch/utils_yaml.py new file mode 100644 index 00000000..cbd1a2d1 --- /dev/null +++ b/orbbec_camera/launch/utils_yaml.py @@ -0,0 +1,86 @@ +import os +import yaml +import logging +from ament_index_python.packages import get_package_share_directory + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +def load_yaml(file_path): + try: + with open(file_path, 'r') as f: + return yaml.safe_load(f) + except FileNotFoundError: + logger.error(f"File {file_path} not found.") + return {} + except yaml.YAMLError as e: + logger.error(f"Error parsing YAML file {file_path}: {e}") + return {} + + +def parse_yaml(data, prefix='', params=None): + if params is None: + params = {} + if isinstance(data, dict): + for key, value in data.items(): + new_prefix = f'{key}.' if prefix else key + '.' + params = parse_yaml(value, prefix=new_prefix, params=params) + elif isinstance(data, list): + for index, item in enumerate(data): + params = parse_yaml(item, prefix=f'[{index}].', params=params) + else: + params[prefix[:-1]] = data + #print(f'{prefix}: {data}') + return params + + +def load_and_parse_yaml(file_path): + data = load_yaml(file_path) + return parse_yaml(data) if data else {} + + +def update_params(default_params, yaml_params): + default_params.update(yaml_params) + return default_params + + +def find_param(params, key, default_value=None): + if isinstance(params, dict): + return params.get(key, default_value) + elif isinstance(params, list): + for param_dict in params: + if isinstance(param_dict, dict) and key in param_dict: + return param_dict[key] + return default_value + + +def get_absolute_path(config_file_path, package_name): + if not os.path.isabs(config_file_path): + logger.info(f"not Absolute path: {config_file_path}") + return os.path.join(get_package_share_directory(package_name), 'config', config_file_path) + logger.info(f"Absolute path: {config_file_path}") + return config_file_path + + +def convert_value(value): + if isinstance(value, str): + try: + return int(value) + except ValueError: + pass + try: + return float(value) + except ValueError: + pass + if value.lower() == 'true': + return True + elif value.lower() == 'false': + return False + return value + +def print_params(default_params): + print(f"\n----------------------------------------") + for key, value in default_params.items(): + print(f"Key: {key}, Value: {value}") + print(f"----------------------------------------\n") \ No newline at end of file