You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

124 lines
3.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/usr/bin/env python3
"""
步骤2SLAM 建图
功能:启动 Gazebo + SLAM Toolbox + RViz2
用途:手动控制机器人进行 SLAM 建图
配置:使用 Task_3 的 SLAM 配置(已验证稳定)
"""
import os
from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription, DeclareLaunchArgument
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch.substitutions import LaunchConfiguration, PathJoinSubstitution, Command
from launch_ros.actions import Node
from launch_ros.substitutions import FindPackageShare
from ament_index_python.packages import get_package_share_directory
def generate_launch_description():
# 包名和路径
pkg_name = 'final_navigation'
pkg_share = FindPackageShare(pkg_name).find(pkg_name)
# 文件路径
xacro_file = os.path.join(pkg_share, 'urdf', 'fusion_robot.urdf.xacro')
world_file = os.path.join(pkg_share, 'worlds', 'simple_house.world')
slam_params_file = os.path.join(pkg_share, 'config', 'slam_params.yaml')
rviz_config = os.path.join(pkg_share, 'rviz', 'slam_view.rviz')
# Launch 参数
use_sim_time = LaunchConfiguration('use_sim_time', default='true')
# 处理 xacro 文件
robot_description = Command(['xacro ', xacro_file])
# ========================================
# 1. Gazebo 仿真
# ========================================
gazebo = IncludeLaunchDescription(
PythonLaunchDescriptionSource([
PathJoinSubstitution([
FindPackageShare('gazebo_ros'),
'launch',
'gazebo.launch.py'
])
]),
launch_arguments={
'world': world_file,
'verbose': 'false'
}.items()
)
# ========================================
# 2. 机器人状态发布器
# ========================================
robot_state_publisher = Node(
package='robot_state_publisher',
executable='robot_state_publisher',
name='robot_state_publisher',
output='screen',
parameters=[{
'robot_description': robot_description,
'use_sim_time': use_sim_time
}]
)
# ========================================
# 3. 在 Gazebo 中生成机器人
# ========================================
spawn_entity = Node(
package='gazebo_ros',
executable='spawn_entity.py',
arguments=[
'-entity', 'fusion_robot',
'-topic', 'robot_description',
'-x', '0.0',
'-y', '0.0',
'-z', '0.1'
],
output='screen'
)
# ========================================
# 4. SLAM Toolbox使用 Task_3 的配置)
# ========================================
slam_toolbox = Node(
package='slam_toolbox',
executable='async_slam_toolbox_node',
name='slam_toolbox',
output='screen',
parameters=[
slam_params_file,
{'use_sim_time': use_sim_time}
]
)
# ========================================
# 5. RViz2 可视化
# ========================================
rviz2 = Node(
package='rviz2',
executable='rviz2',
name='rviz2',
arguments=['-d', rviz_config],
parameters=[{'use_sim_time': use_sim_time}],
output='screen'
)
return LaunchDescription([
DeclareLaunchArgument(
'use_sim_time',
default_value='true',
description='Use simulation time'
),
gazebo,
robot_state_publisher,
spawn_entity,
slam_toolbox,
rviz2,
])