diff --git a/orbbec_camera/config/multicamera_test/gemini330_series_sync_left_camera.yaml b/orbbec_camera/config/multicamera_test/gemini330_series_sync_left_camera.yaml index 42ffe503..eded31bd 100644 --- a/orbbec_camera/config/multicamera_test/gemini330_series_sync_left_camera.yaml +++ b/orbbec_camera/config/multicamera_test/gemini330_series_sync_left_camera.yaml @@ -101,7 +101,7 @@ orbbec_ros: depth_delay_us: 0 color_delay_us: 0 trigger2image_delay_us: 0 - trigger_out_enabled: false + trigger_out_enabled: true trigger_out_delay_us: 0 frames_per_trigger: 2 software_trigger_period: 33 diff --git a/orbbec_camera/config/multicamera_test/gemini330_series_sync_rear_camera.yaml b/orbbec_camera/config/multicamera_test/gemini330_series_sync_rear_camera.yaml index 48aef88e..fe16d214 100644 --- a/orbbec_camera/config/multicamera_test/gemini330_series_sync_rear_camera.yaml +++ b/orbbec_camera/config/multicamera_test/gemini330_series_sync_rear_camera.yaml @@ -101,7 +101,7 @@ orbbec_ros: depth_delay_us: 0 color_delay_us: 0 trigger2image_delay_us: 0 - trigger_out_enabled: false + trigger_out_enabled: true trigger_out_delay_us: 0 frames_per_trigger: 2 software_trigger_period: 33 diff --git a/orbbec_camera/config/multicamera_test/gemini330_series_sync_right_camera.yaml b/orbbec_camera/config/multicamera_test/gemini330_series_sync_right_camera.yaml index d86a2ccb..67dc020a 100644 --- a/orbbec_camera/config/multicamera_test/gemini330_series_sync_right_camera.yaml +++ b/orbbec_camera/config/multicamera_test/gemini330_series_sync_right_camera.yaml @@ -101,7 +101,7 @@ orbbec_ros: depth_delay_us: 0 color_delay_us: 0 trigger2image_delay_us: 0 - trigger_out_enabled: false + trigger_out_enabled: true trigger_out_delay_us: 0 frames_per_trigger: 2 software_trigger_period: 33 diff --git a/orbbec_camera/config/tools/multisavergbir/multi_save_rgbir_params.json b/orbbec_camera/config/tools/multisavergbir/multi_save_rgbir_params.json index 764bd46d..423c6732 100644 --- a/orbbec_camera/config/tools/multisavergbir/multi_save_rgbir_params.json +++ b/orbbec_camera/config/tools/multisavergbir/multi_save_rgbir_params.json @@ -1,13 +1,17 @@ { - "save_rgbir_params": { - "time_domain": "device", - "usb_ports": [ - "2-3", - "2-1" - ], - "camera_name": [ - "G330_0", - "G330_1" - ] - } + "save_rgbir_params": { + "time_domain": "device", + "usb_ports": [ + "2-1", + "2-4", + "2-7", + "2-3" + ], + "camera_name": [ + "G330_0", + "G330_1", + "G330_2", + "G330_3" + ] + } } \ No newline at end of file diff --git a/orbbec_camera/launch/orbbec_camera.launch.py b/orbbec_camera/launch/orbbec_camera.launch.py index 35d917dd..8d354ed0 100644 --- a/orbbec_camera/launch/orbbec_camera.launch.py +++ b/orbbec_camera/launch/orbbec_camera.launch.py @@ -32,6 +32,7 @@ def generate_launch_arguments(): 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'), diff --git a/orbbec_camera/launch/orbbec_multi_synced.launch.py b/orbbec_camera/launch/orbbec_multi_synced.launch.py deleted file mode 100644 index 49a5c102..00000000 --- a/orbbec_camera/launch/orbbec_multi_synced.launch.py +++ /dev/null @@ -1,65 +0,0 @@ -from launch import LaunchDescription -from launch.actions import IncludeLaunchDescription, GroupAction, TimerAction -from launch.launch_description_sources import PythonLaunchDescriptionSource -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, 'orbbec_camera.launch.py') - ), - launch_arguments={ - "camera_model": "gemini330_series", - 'camera_name': 'camera_01', - "usb_port": "4-1", - "device_num": "3", - "sync_mode": "primary", - }.items() - ) - - launch2_include = 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': 'camera_02', - 'usb_port': '4-2', - 'device_num': '3', - "sync_mode": "secondary_synced", - }.items() - ) - - launch3_include = 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': 'camera_03', - 'usb_port': '4-3', - 'device_num': '3', - "sync_mode": "secondary_synced", - }.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=3.0, actions=[GroupAction([launch1_include])]), - TimerAction(period=0.0, actions=[GroupAction([launch2_include])]), - TimerAction(period=1.0, actions=[GroupAction([launch3_include])]), - # The primary camera should be launched at last - ] - ) - - return ld \ No newline at end of file diff --git a/orbbec_camera/launch/orbbec_multicamera.launch.py b/orbbec_camera/launch/orbbec_multicamera.launch.py index 14ae65ae..ab4a413a 100644 --- a/orbbec_camera/launch/orbbec_multicamera.launch.py +++ b/orbbec_camera/launch/orbbec_multicamera.launch.py @@ -1,112 +1,86 @@ import os -import yaml -from launch import LaunchDescription -from launch.actions import IncludeLaunchDescription, TimerAction -from launch.launch_description_sources import PythonLaunchDescriptionSource from ament_index_python.packages import get_package_share_directory -from launch.substitutions import LaunchConfiguration -from launch.conditions import IfCondition +from launch import LaunchDescription from launch_ros.actions import Node -from launch.actions import DeclareLaunchArgument -from launch.actions import DeclareLaunchArgument, OpaqueFunction -import sys -sys.path.append(os.path.dirname(os.path.realpath(__file__))) -from utils_yaml import * - - -default_package_name = 'orbbec_camera' -default_launch_file = 'orbbec_camera.launch.py' -default_multi_camera_config_file = 'multicamera.yaml' #'multicamera_synced.yaml' -default_shared_container_name = 'shared_orbbec_container' - - -def generate_launch_arguments(): - launch_arguments = [ - #general config - DeclareLaunchArgument('config_file_path', default_value=default_multi_camera_config_file), - #instra-process demo set - DeclareLaunchArgument('use_intra_process_comms', default_value='false'), #false - DeclareLaunchArgument('attach_component_container_enable', default_value='false'), #false - DeclareLaunchArgument('attach_component_container_name', default_value=default_shared_container_name), - ] - return launch_arguments - - -def generate_camera_node(args, launch_file_dir, camera_params, launch_file=default_launch_file): - config_params = {key: value for key, value in camera_params.items()} - #load launch_arguments and meger to yaml params - args_params = {arg.name: arg.default_value for arg in args} - #print_params(args_params) - default_params = update_params(args_params, config_params) - #print_params(default_params) - return IncludeLaunchDescription( - PythonLaunchDescriptionSource( - os.path.join(launch_file_dir, launch_file) - ), - launch_arguments=default_params.items() - ) - - -def load_yaml_params(config_file_path): - config_yaml_path = config_file_path or os.path.join(get_package_share_directory(default_package_name), 'config', config_file_path) - 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_yaml(config_yaml_path) +from launch.actions import IncludeLaunchDescription, GroupAction, TimerAction +from launch.launch_description_sources import PythonLaunchDescriptionSource def generate_launch_description(): - args=generate_launch_arguments() - package_dir = get_package_share_directory(default_package_name) - launch_file_dir = os.path.join(package_dir, "launch") + # 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() + ) - def create_share_container(attach_component_container_name, attach_enable_condition): - shared_container = Node( - name=attach_component_container_name, - package='rclcpp_components', - executable='component_container_mt', - output='screen', - condition=IfCondition(attach_enable_condition) - ) - return shared_container + 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() + ) - def create_node_action(context, args): - attach_enable_condition = LaunchConfiguration("attach_component_container_enable", default=False).perform(context) - attach_component_container_name = LaunchConfiguration("attach_component_container_name", default=default_shared_container_name).perform(context) - use_intra_process_comms = LaunchConfiguration("use_intra_process_comms", default=False).perform(context) - print(f"attach_enable_condition: {attach_enable_condition}", f"attach_component_container_name: {attach_component_container_name}") - print(f"use_intra_process_comms: {use_intra_process_comms}") - shared_container_node = create_share_container(attach_component_container_name, attach_enable_condition) + 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() + ) - config_file_path = LaunchConfiguration("config_file_path", default=default_multi_camera_config_file).perform(context) - print(f"config_file_path: {config_file_path}") - #camera_config_file = os.path.join(package_dir, "config", config_file_path) - config_params = load_yaml_params(config_file_path) - if not config_params: - raise Exception("Failed to load multi-camera configuration.") + # If you need more cameras, just add more launch_include here, and change the usb_port and device_num - camera_params = config_params['orbbec_ros']['multi_camera_parameters'] - camera_actions = [] - for camera_key in camera_params: - if camera_key.startswith('launch_device_camera'): - camera_config = camera_params[camera_key] - #print_params(camera_config) - period_value = float(camera_config.pop('period', '0.0')) - print(f"period_value: {period_value}", f"camera_config: {camera_config}") - - camera_node = generate_camera_node(args, launch_file_dir, camera_config) - camera_action = TimerAction(period=period_value, actions=[camera_node]) - camera_actions.append(camera_action) - - nodes = [ - shared_container_node, - *camera_actions, - ] - return nodes - - return LaunchDescription( - args + [ - OpaqueFunction(function=lambda context: create_node_action(context, args)) + # 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 ] - ) \ No newline at end of file + ) + + return ld \ No newline at end of file