Hello, here's what I've got for this problem - it's a launch file which takes the path to a xacro file as an input argument.
On launch the xacro is converted to urdf (xml) and passed to the robot_state_publisher via the 'robot_description' parameter:
#!/usr/bin/env python3
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration, Command
from launch_ros.actions import Node
def generate_launch_description():
use_sim_time = LaunchConfiguration('use_sim_time', default='false')
xacro_path = LaunchConfiguration('xacro_path', default=None)
return LaunchDescription([
DeclareLaunchArgument(
'use_sim_time',
default_value='false',
description='Use simulation (Gazebo) clock if true'),
DeclareLaunchArgument(
'xacro_path',
default_value=None,
description='path to urdf.xacro file to publish'),
Node(
package='robot_state_publisher',
executable='robot_state_publisher',
name='robot_state_publisher',
output='screen',
parameters=[{
'use_sim_time': use_sim_time,
'robot_description':Command(['xacro',' ', xacro_path])
}]),
])