launch文件是一个包的窗口,通过这个窗口我们可以知道一个软件包能干什么,具体调动了什么节点,需要加载什么参数,下面我们从总体看里面每个launch文件的作用。
环境:utuntu20.04 ros2 foxy nav2不同版本大同小异。
具体怎么安装nav2参考:入门 — Navigation 2 1.0.0 文档
一 nav2_bringup导航包 launch文件结构
二 所有的launch文件
1 localization_launch.py
2 slam_launch.py
3 navigation_launch.py
4 rviz_launch.py
5 bringup_launch.py
6 spawn_tb3_launch.py
7 tb3_simulation_launch.py
8 multi_tb3_simulation_launch.py
三 每个launch作用
我们按包含关系从简单到复杂说起,lifecycle_manager是一个控制节点启动的,不影响逻辑关系,我们先不考虑。
1 localization_launch.py
启动节点关键代码
Node(
package='nav2_map_server',
executable='map_server',
name='map_server',
output='screen',
parameters=[configured_params],
remappings=remappings),
Node(
package='nav2_amcl',
executable='amcl',
name='amcl',
output='screen',
parameters=[configured_params],
remappings=remappings),
executable='map_server', #地图服务
executable='amcl', #基于粒子过滤器的定位技术,用于静态地图的定位。
作用:启动地图服务,在地图上给机器人定位。
2 slam_launch.py
启动节点关键代码
slam_launch_file = os.path.join(slam_toolbox_dir, 'launch', 'online_sync_launch.py')
start_slam_toolbox_cmd = IncludeLaunchDescription(
PythonLaunchDescriptionSource(slam_launch_file),
launch_arguments={'use_sim_time': use_sim_time}.items())
start_map_saver_server_cmd = Node(
package='nav2_map_server',
executable='map_saver_server',
output='screen',
parameters=[configured_params])
start_slam_toolbox_cmd一级套娃,启动了online_sync_launch.py
online_sync_launch.py关键代码
start_sync_slam_toolbox_node = Node(
parameters=[
actual_params_file,
{'use_sim_time': use_sim_time}
],
package='slam_toolbox',
executable='sync_slam_toolbox_node',
name='slam_toolbox',
output='screen')
executable='sync_slam_toolbox_node', #启动了slam工具箱同步定位建图
executable='map_saver_server', #启动了地图储存服务节点
作用:slam同步定位建图,储存地图。
3 navigation_launch.py
启动节点关键代码
Node(
package='nav2_controller',
executable='controller_server',
output='screen',
parameters=[configured_params],
remappings=remappings),
Node(
package='nav2_planner',
executable='planner_server',
name='planner_server',
output='screen',
parameters=[configured_params],
remappings=remappings),
Node(
package='nav2_recoveries',
executable='recoveries_server',
name='recoveries_server',
output='screen',
parameters=[configured_params],
remappings=remappings),
Node(
package='nav2_bt_navigator',
executable='bt_navigator',
name='bt_navigator',
output='screen',
parameters=[configured_params],
remappings=remappings),
Node(
package='nav2_waypoint_follower',
executable='waypoint_follower',
name='waypoint_follower',
output='screen',
parameters=[configured_params],
remappings=remappings),
executable='controller_server', #启动机器人控制器
executable='planner_server', #启动机器人规划器
executable='recoveries_server', #启动机器人恢复服务器
executable='bt_navigator', #启动行为树
executable='waypoint_follower', #启动路点跟随
作用:启动导航核心节点,行为树 规划器 控制器 恢复器 路点跟随
4 rviz_launch.py
启动节点关键代码
start_rviz_cmd = Node(
condition=UnlessCondition(use_namespace),
package='rviz2',
executable='rviz2',
name='rviz2',
arguments=['-d', rviz_config_file],
output='screen')
executable='rviz2',
作用:启动rviz2可视化机器人及导航
5 bringup_launch.py
启动节点关键代码
IncludeLaunchDescription(
PythonLaunchDescriptionSource(os.path.join(launch_dir, 'slam_launch.py')),
condition=IfCondition(slam),
launch_arguments={'namespace': namespace,
'use_sim_time': use_sim_time,
'autostart': autostart,
'params_file': params_file}.items()),
IncludeLaunchDescription(
PythonLaunchDescriptionSource(os.path.join(launch_dir,
'localization_launch.py')),
condition=IfCondition(PythonExpression(['not ', slam])),
launch_arguments={'namespace': namespace,
'map': map_yaml_file,
'use_sim_time': use_sim_time,
'autostart': autostart,
'params_file': params_file,
'use_lifecycle_mgr': 'false'}.items()),
IncludeLaunchDescription(
PythonLaunchDescriptionSource(os.path.join(launch_dir, 'navigation_launch.py')),
launch_arguments={'namespace': namespace,
'use_sim_time': use_sim_time,
'autostart': autostart,
'params_file': params_file,
'default_bt_xml_filename': default_bt_xml_filename,
'use_lifecycle_mgr': 'false',
'map_subscribe_transient_local': 'true'}.items()),
通过条件选择condition=IfCondition(slam),二选一启动:
slam_launch.py
localization_launch.py
'slam',default_value='False 所以默认启动 localization_launch.py
启动 navigation_launch.py
作用:这是一个通过launch文件套娃集齐了nav2导航需要的所有节点,按默认设置启动地图服务,在地图上给机器人定位,启动导航行为树 规划器 控制器 恢复器 路点跟随。
如果没有实体机器人,开启gazebo仿真机器人+bringup_launch.py+rviz_launch.py
如果有实体机器人,启动机器人底盘程序+bringup_launch.py+rviz_launch.py nav2导航服务全部节点就都集齐了,可以开始自由导航了。
如果想同时建图并导航只需给launch文件加参数,启动 bringup_launch.py slam:=True 这时在陌生环境不需要提供地图,程序会一边建图,一边导航。
注意仿真机器人所有节点 use_sim_time=true (启用仿真时间),实体机器人所有节点use_sim_time=false (不启用仿真时间),时间设置错了会出现莫名其妙的问题。
6 spawn_tb3_launch.py
启动节点关键代码
package='nav2_gazebo_spawner',
executable='nav2_gazebo_spawner',
output='screen',
arguments=[
'--robot_name', launch.substitutions.LaunchConfiguration('robot_name'),
'--robot_namespace', launch.substitutions.LaunchConfiguration('robot_name'),
'--turtlebot_type', launch.substitutions.LaunchConfiguration('turtlebot_type'),
'-x', launch.substitutions.LaunchConfiguration('x_pose'),
'-y', launch.substitutions.LaunchConfiguration('y_pose'),
'-z', launch.substitutions.LaunchConfiguration('z_pose')]),
executable='nav2_gazebo_spawner',
作用:启动gazebo产卵节点,在gazebo规定位置生成机器人
7 tb3_simulation_launch.py
启动节点关键代码
start_gazebo_server_cmd = ExecuteProcess(
condition=IfCondition(use_simulator),
cmd=['gzserver', '-s', 'libgazebo_ros_init.so', world],
cwd=[launch_dir], output='screen')
start_gazebo_client_cmd = ExecuteProcess(
condition=IfCondition(PythonExpression([use_simulator, ' and not ', headless])),
cmd=['gzclient'],
cwd=[launch_dir], output='screen')
start_robot_state_publisher_cmd = Node(
condition=IfCondition(use_robot_state_pub),
package='robot_state_publisher',
executable='robot_state_publisher',
name='robot_state_publisher',
namespace=namespace,
output='screen',
parameters=[{'use_sim_time': use_sim_time}],
remappings=remappings,
arguments=[urdf])
rviz_cmd = IncludeLaunchDescription(
PythonLaunchDescriptionSource(os.path.join(launch_dir, 'rviz_launch.py')),
condition=IfCondition(use_rviz),
launch_arguments={'namespace': '',
'use_namespace': 'False',
'rviz_config': rviz_config_file}.items())
bringup_cmd = IncludeLaunchDescription(
PythonLaunchDescriptionSource(os.path.join(launch_dir, 'bringup_launch.py')),
launch_arguments={'namespace': namespace,
'use_namespace': use_namespace,
'slam': slam,
'map': map_yaml_file,
'use_sim_time': use_sim_time,
'params_file': params_file,
'default_bt_xml_filename': default_bt_xml_filename,
'autostart': autostart}.items())
start_gazebo_server_cmd #启动gazebo服务端,加载ros插件
start_gazebo_client_cmd #启动gazebo客户端
executable='robot_state_publisher', #启动机器人模型
PythonLaunchDescriptionSource(os.path.join(launch_dir, 'rviz_launch.py')), #启动rviz2显示机器人
PythonLaunchDescriptionSource(os.path.join(launch_dir, 'bringup_launch.py')), #启动导航
作用:生成gazebo仿真机器人,启动导航服务,rviz显示机器人导航
7 multi_tb3_simulation_launch.py
作用:这个我也没有仔细研究,总体来说是在gazebo仿真环境生成多个机器人并导航。
参考:Nav2 — Navigation 2 1.0.0 文档
我也是在学习阶段,写的不一定都对,欢迎朋友们留言讨论,共同进步!