Update orbbec_multicamera.launch.py and orbbec_camera.launch.py

This commit is contained in:
zhuangzi
2025-01-12 12:50:54 +08:00
parent 76aa7d22de
commit 0317ba7652
7 changed files with 92 additions and 178 deletions
@@ -101,7 +101,7 @@ orbbec_ros:
depth_delay_us: 0 depth_delay_us: 0
color_delay_us: 0 color_delay_us: 0
trigger2image_delay_us: 0 trigger2image_delay_us: 0
trigger_out_enabled: false trigger_out_enabled: true
trigger_out_delay_us: 0 trigger_out_delay_us: 0
frames_per_trigger: 2 frames_per_trigger: 2
software_trigger_period: 33 software_trigger_period: 33
@@ -101,7 +101,7 @@ orbbec_ros:
depth_delay_us: 0 depth_delay_us: 0
color_delay_us: 0 color_delay_us: 0
trigger2image_delay_us: 0 trigger2image_delay_us: 0
trigger_out_enabled: false trigger_out_enabled: true
trigger_out_delay_us: 0 trigger_out_delay_us: 0
frames_per_trigger: 2 frames_per_trigger: 2
software_trigger_period: 33 software_trigger_period: 33
@@ -101,7 +101,7 @@ orbbec_ros:
depth_delay_us: 0 depth_delay_us: 0
color_delay_us: 0 color_delay_us: 0
trigger2image_delay_us: 0 trigger2image_delay_us: 0
trigger_out_enabled: false trigger_out_enabled: true
trigger_out_delay_us: 0 trigger_out_delay_us: 0
frames_per_trigger: 2 frames_per_trigger: 2
software_trigger_period: 33 software_trigger_period: 33
@@ -1,13 +1,17 @@
{ {
"save_rgbir_params": { "save_rgbir_params": {
"time_domain": "device", "time_domain": "device",
"usb_ports": [ "usb_ports": [
"2-3", "2-1",
"2-1" "2-4",
], "2-7",
"camera_name": [ "2-3"
"G330_0", ],
"G330_1" "camera_name": [
] "G330_0",
} "G330_1",
"G330_2",
"G330_3"
]
}
} }
@@ -32,6 +32,7 @@ def generate_launch_arguments():
DeclareLaunchArgument('usb_port', default_value=''), DeclareLaunchArgument('usb_port', default_value=''),
DeclareLaunchArgument('device_num', default_value='1'), DeclareLaunchArgument('device_num', default_value='1'),
DeclareLaunchArgument('sync_mode', default_value='standalone'), DeclareLaunchArgument('sync_mode', default_value='standalone'),
DeclareLaunchArgument('trigger_out_enabled', default_value='true'),
#instra-process demo set #instra-process demo set
DeclareLaunchArgument('use_intra_process_comms', default_value='false'), DeclareLaunchArgument('use_intra_process_comms', default_value='false'),
DeclareLaunchArgument('attach_component_container_enable', default_value='false'), DeclareLaunchArgument('attach_component_container_enable', default_value='false'),
@@ -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
@@ -1,112 +1,86 @@
import os 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 ament_index_python.packages import get_package_share_directory
from launch.substitutions import LaunchConfiguration from launch import LaunchDescription
from launch.conditions import IfCondition
from launch_ros.actions import Node from launch_ros.actions import Node
from launch.actions import DeclareLaunchArgument from launch.actions import IncludeLaunchDescription, GroupAction, TimerAction
from launch.actions import DeclareLaunchArgument, OpaqueFunction from launch.launch_description_sources import PythonLaunchDescriptionSource
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)
def generate_launch_description(): def generate_launch_description():
args=generate_launch_arguments() # Include launch files
package_dir = get_package_share_directory(default_package_name) package_dir = get_package_share_directory('orbbec_camera')
launch_file_dir = os.path.join(package_dir, "launch") 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): G330_1 = IncludeLaunchDescription(
shared_container = Node( PythonLaunchDescriptionSource(
name=attach_component_container_name, os.path.join(launch_file_dir, 'orbbec_camera.launch.py')
package='rclcpp_components', ),
executable='component_container_mt', launch_arguments={
output='screen', "camera_model": "gemini330_series",
condition=IfCondition(attach_enable_condition) "attach_component_container_enable": "false",
) "camera_name": 'G330_1',
return shared_container "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): G330_3 = IncludeLaunchDescription(
attach_enable_condition = LaunchConfiguration("attach_component_container_enable", default=False).perform(context) PythonLaunchDescriptionSource(
attach_component_container_name = LaunchConfiguration("attach_component_container_name", default=default_shared_container_name).perform(context) os.path.join(launch_file_dir, 'orbbec_camera.launch.py')
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}") launch_arguments={
print(f"use_intra_process_comms: {use_intra_process_comms}") "camera_model": "gemini330_series",
shared_container_node = create_share_container(attach_component_container_name, attach_enable_condition) "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) # If you need more cameras, just add more launch_include here, and change the usb_port and device_num
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.")
camera_params = config_params['orbbec_ros']['multi_camera_parameters'] # Launch description
camera_actions = [] ld = LaunchDescription(
for camera_key in camera_params: [
if camera_key.startswith('launch_device_camera'): TimerAction(period=0.0, actions=[GroupAction([G330_1])]),
camera_config = camera_params[camera_key] TimerAction(period=2.0, actions=[GroupAction([G330_2])]),
#print_params(camera_config) TimerAction(period=4.0, actions=[GroupAction([G330_3])]),
period_value = float(camera_config.pop('period', '0.0')) TimerAction(period=6.0, actions=[GroupAction([G330_0])]),
print(f"period_value: {period_value}", f"camera_config: {camera_config}") # The primary camera should be launched at last
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))
] ]
) )
return ld