import os import xacro from ament_index_python.packages import get_package_share_directory from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, OpaqueFunction, IncludeLaunchDescription, RegisterEventHandler from launch.launch_description_sources import PythonLaunchDescriptionSource from launch.substitutions import PathJoinSubstitution from launch.event_handlers import OnProcessExit from launch_ros.actions import Node from launch_ros.substitutions import FindPackageShare package_description = "cyberdog_description" def process_xacro(context): robot_type_value = context.launch_configurations['robot_type'] pkg_path = os.path.join(get_package_share_directory(package_description)) xacro_file = os.path.join(pkg_path, 'xacro', 'robot.xacro') robot_description_config = xacro.process_file(xacro_file, mappings={'robot_type': robot_type_value}) return (robot_description_config.toxml(), robot_type_value) def launch_setup(context, *args, **kwargs): (robot_description, robot_type) = process_xacro(context) gz_spawn_entity = Node( package='ros_gz_sim', executable='create', output='screen', arguments=['-topic', 'robot_description', '-name', robot_type, '-allow_renaming', 'true', '-z', '0.5'], ) robot_state_publisher = Node( package='robot_state_publisher', executable='robot_state_publisher', name='robot_state_publisher', parameters=[ { 'publish_frequency': 20.0, 'use_tf_static': True, 'robot_description': robot_description, 'ignore_timestamp': True } ], ) joint_state_publisher = Node( package="controller_manager", executable="spawner", arguments=["joint_state_broadcaster", "--controller-manager", "/controller_manager"], ) imu_sensor_broadcaster = Node( package="controller_manager", executable="spawner", arguments=["imu_sensor_broadcaster", "--controller-manager", "/controller_manager"], ) leg_pd_controller = Node( package="controller_manager", executable="spawner", arguments=["leg_pd_controller", "--controller-manager", "/controller_manager"], ) unitree_guide_controller = Node( package="controller_manager", executable="spawner", arguments=["unitree_guide_controller", "--controller-manager", "/controller_manager"], ) return [ robot_state_publisher, gz_spawn_entity, joint_state_publisher, RegisterEventHandler( event_handler=OnProcessExit( target_action=joint_state_publisher, on_exit=[imu_sensor_broadcaster], ) ), RegisterEventHandler( event_handler=OnProcessExit( target_action=imu_sensor_broadcaster, on_exit=[leg_pd_controller], ) ), RegisterEventHandler( event_handler=OnProcessExit( target_action=leg_pd_controller, on_exit=[unitree_guide_controller], ) ), ] def generate_launch_description(): robot_type_arg = DeclareLaunchArgument( 'robot_type', default_value='cyber_dog', description='Type of the robot' ) rviz_config_file = os.path.join(get_package_share_directory(package_description), "config", "cyberdog.rviz") return LaunchDescription([ robot_type_arg, Node( package='ros_gz_bridge', executable='parameter_bridge', arguments=['/clock@rosgraph_msgs/msg/Clock[gz.msgs.Clock'], output='screen' ), IncludeLaunchDescription( PythonLaunchDescriptionSource( [PathJoinSubstitution([FindPackageShare('ros_gz_sim'), 'launch', 'gz_sim.launch.py'])]), launch_arguments=[('gz_args', [' -r -v 4 empty.sdf'])]), OpaqueFunction(function=launch_setup), Node( package='rviz2', executable='rviz2', name='rviz_ocs2', output='screen', arguments=["-d", rviz_config_file] ) ])