from ament_index_python.packages import get_package_share_path, get_package_share_directory
get_package_share_path(package_name): 返回指定包的共享目录的路径,使用 pathlib.Path 对象表示。get_package_share_directory(package_name): 返回指定包的共享目录的路径,使用字符串表示。
#这些函数用于获取 ROS 2 包的共享目录路径,通常用于查找配置文件、URDF 文件等
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription
from launch.conditions import IfCondition, UnlessCondition
from launch.substitutions import Command, LaunchConfiguration
LaunchDescription: 描述一组将被一起启动的动作和事件。DeclareLaunchArgument: 声明一个启动参数,允许用户在运行时指定参数值。IncludeLaunchDescription: 包含另一个启动文件的描述。IfCondition: 条件动作,如果条件为真,则执行某些动作。UnlessCondition: 条件动作,如果条件为假,则执行某些动作。Command: 运行一个命令并使用其输出作为参数值。LaunchConfiguration: 获取启动参数的值。
#这些库用于定义和控制 ROS 2 启动文件的行为和逻辑
from launch_ros.actions import Node
#这个库用于启动和配置 ROS 2 节点
from launch_ros.parameter_descriptions import ParameterValue
#这个库用于设置和传递 ROS 2 节点的参数
from launch.launch_description_sources import PythonLaunchDescriptionSource
# PythonLaunchDescriptionSource: 允许包含另一个 Python 启动文件的描述
#配置路径
urdf_tutorial_path = get_package_share_path('yahboomcar_description')
default_model_path = urdf_tutorial_path / 'urdf/yahboomcar_X3.urdf'
default_rviz_config_path = urdf_tutorial_path / 'rviz/yahboomcar.rviz'
#声明启动参数,这些路径指向机器人的 URDF 文件和 RViz 配置文件
#这些参数允许在运行时配置不同的选项,如是否启用 GUI、URDF 文件路径、RViz 配置路径和是否发布 odom 到 base_footprint 的 TF。
gui_arg = DeclareLaunchArgument(name='gui', default_value='false', choices=['true', 'false'], description='Flag to enable joint_state_publisher_gui')
model_arg = DeclareLaunchArgument(name='model', default_value=str(default_model_path), description='Absolute path to robot urdf file')
rviz_arg = DeclareLaunchArgument(name='rvizconfig', default_value=str(default_rviz_config_path), description='Absolute path to rviz config file')
pub_odom_tf_arg = DeclareLaunchArgument('pub_odom_tf', default_value='false', description='Whether to publish the tf from the original odom to the base_footprint')
#生成机器人的描述参数,使用 xacro 工具将 URDF 文件解析为 XML
robot_description = ParameterValue(Command(['xacro ', LaunchConfiguration('model')]), value_type=str)
定义节点
robot_state_publisher_node: 发布机器人的状态信息。joint_state_publisher_node: 发布关节状态信息(在未启用 GUI 时)。joint_state_publisher_gui_node: 发布关节状态信息(在启用 GUI 时)。rviz_node: 启动 RViz 以可视化机器人。driver_node: 启动机器人驱动节点。base_node: 启动机器人基础功能节点,并配置 pub_odom_tf 参数。imu_filter_node: 启动 IMU 滤波节点,使用指定的配置文件。ekf_node: 启动 EKF(扩展卡尔曼滤波)节点。yahboom_joy_node: 启动机器人控制节点。
robot_state_publisher_node = Node(
package='robot_state_publisher',
executable='robot_state_publisher',
parameters=[{'robot_description': robot_description}]
)
joint_state_publisher_node = Node(
package='joint_state_publisher',
executable='joint_state_publisher',
condition=UnlessCondition(LaunchConfiguration('gui'))
)
joint_state_publisher_gui_node = Node(
package='joint_state_publisher_gui',
executable='joint_state_publisher_gui',
condition=IfCondition(LaunchConfiguration('gui'))
)
rviz_node = Node(
package='rviz2',
executable='rviz2',
name='rviz2',
output='screen',
arguments=['-d', LaunchConfiguration('rvizconfig')],
)
imu_filter_config = os.path.join(
get_package_share_directory('yahboomcar_bringup'),
'param',
'imu_filter_param.yaml'
)
driver_node = Node(
package='yahboomcar_bringup',
executable='Mcnamu_driver_X3',
)
base_node = Node(
package='yahboomcar_base_node',
executable='base_node_X3',
parameters=[{'pub_odom_tf': LaunchConfiguration('pub_odom_tf')}]
)
imu_filter_node = Node(
package='imu_filter_madgwick',
executable='imu_filter_madgwick_node',
parameters=[imu_filter_config]
)
ekf_node = IncludeLaunchDescription(
PythonLaunchDescriptionSource([os.path.join(
get_package_share_directory('robot_localization'), 'launch'),
'/ekf_x1_x3_launch.py'])
)
yahboom_joy_node = Node(
package='yahboomcar_ctrl',
executable='yahboom_joy_X3',
)
#这个部分将所有声明的参数和节点加入到 LaunchDescription 对象中并返回,以便 ROS 2 在启动时使用。
return LaunchDescription([
gui_arg,
model_arg,
rviz_arg,
pub_odom_tf_arg,
joint_state_publisher_node,
joint_state_publisher_gui_node,
robot_state_publisher_node,
driver_node,
base_node,
imu_filter_node,
ekf_node,
yahboom_joy_node
])