Navigation2学习笔记--总揽nav2_bringup导航包launch文件

news/2024/11/17 23:47:40/

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 文档

 我也是在学习阶段,写的不一定都对,欢迎朋友们留言讨论,共同进步!


http://www.ppmy.cn/news/1094281.html

相关文章

Vue组件化

组件化 介绍 我们平时看见的 .vue 文件,其实就可以理解是一个组件。里面包含了 template 、script、style 三个部分。template 标签中主要编写 html 代码 vue 模板语法的代码,script 标签中主要编写 javascript 代码 vue 选项相关代码,st…

antd中在vue项目中自定义穿梭框

antd中在vue项目中自定义穿梭框 1、完成代码 <template><a-modaltitle"高危因素选择":width"1000":visible"riskVisible":confirm-loading"confirmLoading"ok"handleOk"cancel"handleCancel"okText&qu…

3dsMax软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 3dsMax是一款由Autodesk公司开发的著名的三维计算机图形软件&#xff0c;广泛应用于动画、游戏、建筑和产品设计等领域。它以强大的建模、动画、渲染和特效功能而闻名&#xff0c;为用户提供了一个完整的制作流程&#xff0c;从…

【已解决】钉钉审批流回调瞬间返回两次通知

【已解决】钉钉审批流回调瞬间返回两次通知 一、产生原因二、解决方案&#xff08;一&#xff09;理论方案参考啊&#xff08;二&#xff09;代码方案参考 三、参考链接 一、产生原因 钉钉审批流回调应该只发一次通知给开发者。但实际情况是&#xff0c;钉钉有时会瞬间返回两次…

【CUDA OUT OF MEMORY】【Pytorch】计算图与CUDA OOM

计算图与CUDA OOM 在实践过程中多次碰到了CUDA OOM的问题&#xff0c;有时候这个问题是很好解决的&#xff0c;有时候DEBUG一整天还是头皮发麻。 最近实践对由于计算图积累导致CUDA OOM有一点新的看法&#xff0c;写下来记录一下。包括对计算图的一些看法和一个由于计算图引发…

解决DCNv2不能使用高版本pytorch编译的问题

可变形卷积网络GitHub - CharlesShang/DCNv2: Deformable Convolutional Networks v2 with Pytorch代码已经出来好几年了&#xff0c;虽然声称"Now the master branch is for pytorch 1.x"&#xff0c;实际上由于pytorch自1.11版开始发生了很大变化&#xff0c;原来基…

设计模式8:代理模式-动态代理

上一篇&#xff1a;设计模式8&#xff1a;代理模式-静态代理 目录 如何理解“动态”这两个字&#xff1f;动态代理简单的代码实例一个InvocationHandler代理多个接口有动态代理&#xff0c;为什么还要用Cglib代理&#xff1f; 如何理解“动态”这两个字&#xff1f; “动态”…

数学建模圈养湖羊的空间利用率

数学建模圈养湖羊的空间利用率 问题&#xff1a;规模化的圈养养殖场通常根据牲畜的性别和生长阶段分群饲养&#xff0c;适应不同种类、不同阶段的牲畜对空间的不同要求&#xff0c;以保障牲畜安全和健康&#xff1b;与此同时&#xff0c;也要尽量减少空间闲置所造成的资源浪费…