nav2源码阅读笔记

nav2源码阅读笔记

——————————————————localization.launch.py & navigation.launch.py

通过之前对bringup.launch.py的分析,可以知道nav2最最基本的启动流程:

  • 初始化参数,并去读用户输入的参数以及nav2的配置文件参数
  • 根据参数的选择启动相应的节点(localization节点 or slam节点 and navigation节点)

那么接下来我们就来看看localization.launch.py和navigation.launch.py这两个启动文件的具体内容。通过这个内容可以去学习nav2在定位与导航过程中到底使用了那些工具,接受了什么参数。

localization.launch.py

该文件位置在nav2_source/navigation2/nav2_bringup/launch的文件夹目录下,主要负责启动nav2的定位相关的节点。

开始依旧是初始化参数以及加载配置文件中的配置,如果你是通过bringup.launch.py启动的nav2,那么参数与配置内容将会是从该文件中传递过来的。

然后就是启动定位相关的节点,这些节点会根据之前加载的参数和配置进行初始化,并开始工作。

 load_nodes = GroupAction(
        condition=IfCondition(PythonExpression(['not ', use_composition])),
        actions=[
            SetParameter('use_sim_time', use_sim_time),
            Node(
                condition=IfCondition(
                    EqualsSubstitution(LaunchConfiguration('map'), '')
                ),
                package='nav2_map_server',
                executable='map_server',
                name='map_server',
                output='screen',
                respawn=use_respawn,
                respawn_delay=2.0,
                parameters=[configured_params],
                arguments=['--ros-args', '--log-level', log_level],
                remappings=remappings,
            ),
            Node(
                condition=IfCondition(
                    NotEqualsSubstitution(LaunchConfiguration('map'), '')
                ),
                package='nav2_map_server',
                executable='map_server',
                name='map_server',
                output='screen',
                respawn=use_respawn,
                respawn_delay=2.0,
                parameters=[configured_params, {'yaml_filename': map_yaml_file}],
                arguments=['--ros-args', '--log-level', log_level],
                remappings=remappings,
            ),
            Node(
                package='nav2_amcl',
                executable='amcl',
                name='amcl',
                output='screen',
                respawn=use_respawn,
                respawn_delay=2.0,
                parameters=[configured_params],
                arguments=['--ros-args', '--log-level', log_level],
                remappings=remappings,
            ),
            Node(
                package='nav2_lifecycle_manager',
                executable='lifecycle_manager',
                name='lifecycle_manager_localization',
                output='screen',
                arguments=['--ros-args', '--log-level', log_level],
                parameters=[{'autostart': autostart}, {'node_names': lifecycle_nodes}],
            ),
        ],
    )

从这部分代码可以知道,nav2的定位功能主要是由

  • map_server
  • amcl
  • lifecycle_manager_localization

这三个节点共同协作,完成了nav2的定位功能。其中,map_server负责读取地图文件,并将地图信息发布到ROS话题中;amcl节点通过订阅地图信息和传感器数据,进行粒子滤波定位;lifecycle_manager_localization则负责管理定位相关节点的生命周期,确保它们在正确的时机启动和停止。

在map_server节点中,作者使用条件判断来决定是否加载地图文件。

 condition=IfCondition(
                    EqualsSubstitution(LaunchConfiguration('map'), '')
                ),
# EqualsSubstitution(LaunchConfiguration('map'), '')
# 即判断 LaunchConfiguration('map') 加载的参数是否和空字符'' 相等
# 即 if LaunchConfiguration('map') == '',condition 为 True,执行对应的动作

当用户没有指定地图文件时,map_server节点会加载参数配置中的默认地图文件。

当上述语句的条件为 False,即用户指定了地图文件时,map_server节点会加载用户指定的地图文件。

  condition=IfCondition(
                    NotEqualsSubstitution(LaunchConfiguration('map'), '')
                ),
# 注意这里用的是NotEqualsSubstitution,即判断 LaunchConfiguration('map') 是否不等于空字符''

此时在参数设置中,会添加用户指定的地图文件路径,即 yaml_filename 参数:

parameters=[configured_params, {'yaml_filename': map_yaml_file}],

启用完毕map_server后,会去启动amcl节点,这个节点会在后续定位过程中负责根据地图信息和传感器数据进行粒子滤波定位。可以见代价地图与AMCL

最后,lifecycle_manager_localization节点会管理定位相关节点的生命周期,确保它们在正确的时机启动和停止,从而保证整个定位系统的稳定运行。

同时,该文件启动时依旧可以选择是否使用组合启动的方式。当使用组合启动时,节点会在load_composable_nodes中加载,并组合到bringup指定的容器中。而当不使用组合启动时,节点会作为独立的进程启动,会在load_nodes中加载。

Navigation.launch.py

在Navigation.launch.py文件中,主要定义了导航相关的节点启动逻辑,包括全局路径的规划器(planner),局部路径的控制器(controller),以及导航相关的其他必要节点。其运行流程与定位部分的节点启动流程类似,都是先接受参数,然后根据参数的不同以不同的策略启动相应的节点。

初始化的节点列表如下

节点 作用
controller_server 跟踪路径,计算速度指令,管理局部代价地图。
smoother_server 平滑规划路径,减少路径的急转和不连续。
planner_server 规划全局路径,管理全局代价地图。
route_server 基于预定义路线图规划路线。
behavior_server 执行旋转、后退、等待等行为。
bt_navigator 执行行为树,协调路径规划、控制和恢复行为。
waypoint_follower 按顺序执行多个航点的导航任务。
velocity_smoother 平滑速度指令,限制速度和加速度。
collision_monitor 根据障碍检测,对速度指令进行限制或停止处理。
docking_server 执行对接和脱离对接任务。
lifecycle_manager_navigation 按指定顺序配置、激活并监控导航节点。

在启动过程中,这些节点并不是运行即启动的,在nav2中,节点的生命周期是由lifecycle_manager_navigation进行管理的。这意味着节点会在特定的时机被配置、激活和监控,从而确保整个导航系统的稳定运行。对于一个生命周期节点,其运行的状态转移示意图如下:

alt text

可以看到,生命周期节点最主要的状态包括:

  • Unconfigured:节点尚未配置,处于初始状态。
  • Inactive:节点已配置但尚未激活,处于等待状态。
  • Active:节点已激活,正在执行其功能。
  • Finalized:节点已完成其生命周期,处于终止状态。

在这些主要状态之间,生命周期节点会有很多操作进入下一状态或者返回上一状态,同时使用反馈机制(SUCCESS, FAILURE)来通知状态变化的结果。

因此,上面的众多节点并非在启动时就会全部运行,而是由lifecycle_manager_navigation根据特定的生命周期状态进行配置、激活和监控,从而确保整个导航系统的稳定运行。

常见的导航数据流通方向如下:

RViz / 用户程序
    │ NavigateToPose action
    ▼
bt_navigator
    │ ComputePathToPose action
    ▼
planner_server
    │ 通过 action 返回路径
    ▼
bt_navigator
    │ FollowPath action,下发路径
    ▼
controller_server
    │ /cmd_vel_nav(即cmd_vel的重映射)
    ▼
velocity_smoother
    │ /cmd_vel_smoothed
    ▼
collision_monitor
    │ /cmd_vel
    ▼
底盘驱动
posted @ 2026-10-04 13:16  凪风sama  阅读(8)  评论(0)    收藏  举报