零、总览

navigation2
tb3_simulation_launch.py
├── Gazebo 仿真环境
│	├── gzserver
│		└── 启动条件 use_simulator True
│	└── gzclient
│		└── 启动条件 headless and use_simulator True
│
├── robot_state_publisher 节点
│	├── 启动条件 use_robot_state_pub:True
│   └── 参数文件 /opt/ros/humble/share/nav2_bringup/urdf/turtlebot3_waffle.urdf
│ 
├── spawn_entity.py 节点
│	└── 启动参数 x、y、z、R、P、Y
│
├── rviz_launch.py 启动文件
│	├── rviz2 节点
│	└── 参数文件 /opt/ros/humble/share/nav2_bringup/rviz/ nav2_default_view.rviz
│
├── bringup_launch.py 启动文件
│	├── nav2_container 节点
│	│	└── 参数文件 params_file
│	│
│	├── navigation_launch.py 启动文件
│	│	├── controller_server 节点
│	│	│	└── 参数文件 params_file
│	│	│
│	│	├── smoother_server 节点
│	│	│	└── 参数文件 params_file
│	│	│
│	│	├── planner_server节点
│	│	│	└── 参数文件 params_file
│	│	│
│	│	├── behavior_server节点
│	│	│	└── 参数文件 params_file
│	│	│
│	│	├── bt_navigator节点
│	│	│	└── 参数文件 params_file
│	│	│
│	│	├── waypoint_follower 节点
│	│	│	└── 参数文件 params_file
│	│	│
│	│	├── velocity_smoother节点
│	│	│	└── 参数文件 params_file
│	│	│
│	│	└── lifecycle_manager节点
│	│		└── 参数文件 params_file
│	│	
│	├── slam_launch.py 启动文件
│	│	├── 启动条件 slam True
│	│	├── map_saver_server 节点
│	│	│	└── 参数文件 params_file
│	│	│
│	│	├── lifecycle_manager 节点
│	│	│	└── 参数文件 params_file
│	│	│
│	│	└── online_sync_launch.py 启动文件
│	└── localization_launch.py 启动文件
│		├── 启动条件 slam False
│		├── map_server 节点
│		│	└── 参数文件 params_file
│		│
│		├── amcl 节点
│		│	└── 参数文件 params_file
│		│
│		└── lifecycle_manager_localization.py 节点
│			└── 参数文件 params_file
└── 常用命令行bool参数
	├── use_namespace 是否使用命名空间 false
	├── slam 是否使用slam false
	├── use_sim_time 是否使用仿真时间 false
	├── autostart 是否自动启动节点 true
	├── use_composition 是否使用composition节点 true
	├── use_respawn 是否崩溃自动重启 false
	├── use_simulator 是否使用gz服务端 true
	├── headless 是否使用gz客户端 false
	├── use_robot_state_pub 发布机器人的位姿 true
	├── use_rviz 使用rviz界面 true
	├── use_respawn 是否崩溃自动重启 false
	├── use_respawn 是否崩溃自动重启 false
	
	

一、 功能包查找

  • 在官方文档中得知nav2的启动命令为:
ros2 launch nav2_bringup tb3_simulation_launch.py
  • 可知,nav2是由nav2_bringup功能包中的tb3_simulation_launch.py文件启动的,所以首先找到nav2_bringup功能包
  • 又知,通过sudo apt install ros-<ros2-distro>-navigation2安装的功能包会在共享文件夹下,所以cd到如下路径:
/opt/ros/humble/share
  • 其中即可找到nav2_bringup功能包。

二、父启动文件分析

  • /opt/ros/humble/share/nav2_bringup目录下,运行code.在vscode中查看nav2功能包
  • launch文件夹下,可以找到启动文件tb3_simulation_launch.py
  • 该启动文件启动了两个可执行文件:服务端gzserver和客户端gzclient
    • gzserver的启动条件为use_simulator,默认值为True
    • gzclient的启动条件为use_simulatorheadless,默认值均为True
    • 启动了Gazebo 仿真环境。
    • 源代码如下
   start_gazebo_server_cmd = ExecuteProcess(
        condition=IfCondition(use_simulator),
        cmd=['gzserver', '-s', 'libgazebo_ros_init.so',
             '-s', 'libgazebo_ros_factory.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')
  • 还启动了两个节点:一个是robot_state_publisher功能包下的robot_state_publisher节点;另一个是gazebo_ros功能包下的spawn_entity.py节点
    • robot_state_publisher节点
      • 启动条件:use_robot_state_pub,默认值为True
      • 节点介绍:robot_state_publisher 节点通过订阅机器人的关节状态话题,计算机器人各个关节的变换矩阵,并将这些变换矩阵发布到 ROS 的 tf 变换树中。其他节点可以通过查询 tf 变换树来获取机器人在三维空间中的位置和姿态信息。
      • 参数说明:
        • use_sim_time是一个布尔值,用于指定是否使用仿真时间;默认值为True
        • robot_description是一个字符串,表示机器人的URDF或SDF描述。默认值为:/opt/ros/humble/share/nav2_bringup/urdf/turtlebot3_waffle.urdf
    • spawn_entity.py节点
      • 节点介绍:spawn_entity.py 节点通过订阅 ROS 话题,接收待生成的模型或机器人实例的信息,然后调用 Gazebo 的 SpawnModel 或 SpawnRobot 功能,在 Gazebo 环境中动态生成模型或机器人实例。生成的模型或机器人实例可以包括其外观、运动学信息、物理特性等,可以用于仿真和测试。
      • 参数说明:
        • robot_name: 指定机器人在Gazebo中的名称。默认值为:turtlebot3_waffle
        • robot_sdf: 指定机器人在Gazebo中的SDF文件路径。默认值为:/opt/ros/humble/share/nav2_bringup/worlds/waffle.model
        • namespace: 指定机器人在ROS中的命名空间。默认值为空。
        • x、y、z: 指定机器人在Gazebo中的初始位置。默认值为-2,0.5,-0.01
        • R、P、Y: 指定机器人在Gazebo中的初始姿态(欧拉角)。默认值为0,0,0
        • 可以命令指定这些参数来启动:ros2 launch nav2_bringup tb3_simulation_launch.py robot_name:=my_robot robot_sdf:=/path/to/robot.sdf namespace:=my_namespace x:=0 y:=0 z:=0 R:=0 P:=0 Y:=0
    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,
                     'robot_description': robot_description}],
        remappings=remappings)

    start_gazebo_spawner_cmd = Node(
        package='gazebo_ros',
        executable='spawn_entity.py',
        output='screen',
        arguments=[
            '-entity', robot_name,
            '-file', robot_sdf,
            '-robot_namespace', namespace,
            '-x', pose['x'], '-y', pose['y'], '-z', pose['z'],
            '-R', pose['R'], '-P', pose['P'], '-Y', pose['Y']])
  • 还启动了两个子launch文件:rviz_launch.pybringup_launch.py。均在该launch文件夹下
    rviz_cmd = IncludeLaunchDescription(
        PythonLaunchDescriptionSource(
            os.path.join(launch_dir, 'rviz_launch.py')),
        condition=IfCondition(use_rviz),
        launch_arguments={'namespace': namespace,
                          'use_namespace': use_namespace,
                          '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,
                          'autostart': autostart,
                          'use_composition': use_composition,
                          'use_respawn': use_respawn}.items())

三、二级嵌套启动文件分析

1. rviz_launch.py
  • 父启动文件向其传递了如下参数:
    • namespace: 指定机器人在ROS中的命名空间。默认值为navigation
    • use_namespace:指定是否使用命名空间。如果该参数为True,则在RViz中所有的话题都会加上命名空间前缀,以便在多个机器人同时运行的情况下可以正确地显示。
      默认值为false
    • rviz_config:指定RViz配置文件的路径。RViz配置文件可以定义机器人模型的显示方式、传感器数据的显示方式等等。默认值为/opt/ros/humble/share/nav2_bringup/rviz/ nav2_default_view.rviz
  • 启动了rviz2功能包中的rviz2节点,但根据不同条件会附带不同的启动参数
    • 如果use_namespaceTrue,即使用命名空间。此时,传递的参数为rviz_config_file,默认值为/opt/ros/humble/share/nav2_bringup/rviz/ nav2_default_view.rviz
    • 如果use_namespaceFalse,即不用命名空间。此时,传递的参数为namespaced_rviz_config_file,将rviz_config_file中的’‘替换为’/'和namespace的值。
      • 并将节点中的话题进行重映射
        • /tf重映射为tf
        • /tf_static重映射为tf_static,
        • /goal_pose重映射为goal_pose,
        • /clicked_point重映射为clicked_point
        • /initialpose重映射为initialpose
  • 还创建了两个事件处理器,用于检测start_rviz_cmd是否已退出
1. bringup_launch.py
  • 父启动文件向其传递了如下参数:
    • namespace用于指定命名空间;默认值为
    • use_namespace用于指定是否使用命名空间;默认值为false
    • slam用于指定是否使用SLAM;默认值为false
    • map用于指定地图文件,默认值为/opt/ros/humble/share/nav2_bringup/maps/ turtlebot3_world.yaml
    • use_sim_time用于指定是否使用仿真时间,默认值为True
    • params_file用于指定参数文件,默认值为/opt/ros/humble/share/nav2_bringup/params/ nav2_params.yaml
    • autostart用于指定是否自动启动节点,默认值为true
    • use_composition用于指定是否使用组合启动节点;默认值为True
    • use_respawn用于指定是否在节点意外退出时重新启动节点。默认值为False
      .items()将字典转换为一个元组列表,这样它就可以作为参数传递给IncludeLaunchDescription函数。
  • 创建了一个动作群组,里面包含
    • 命名空间指定:如果use_namespace,指定命名空间为namespace
    • 节点启动:启动rclcpp_components功能包中的component_container_isolated可执行,并命名为nav2_container节点
      • 启动参数为configured_params,该参数是从父启动文件传递过来的params_file参数中读取到的
      • 并将节点中的话题进行重映射
        • /tf重映射为tf
        • /tf_static重映射为tf_static,
    • launch文件启动,启动了3个子launch文件:
      • slam_launch.py文件,启动条件为slam参数,默认为false
      • localization_launch.py文件,启动条件为slam参数为false时,即PythonExpression(['not ', slam])默认为true
      • navigation_launch.py文件

四、三级嵌套启动文件分析

1. navigation_launch.py
  • 父启动文件向其传递了如下参数:
    • namespace用于指定命名空间
    • use_sim_time用于指定是否使用仿真时间;
    • params_file用于指定参数文件,默认值为/opt/ros/humble/share/nav2_bringup/params/ nav2_params.yaml
    • autostart用于指定是否自动启动节点,默认值为true
    • use_composition用于指定是否使用组合启动节点;默认值为True
    • use_respawn用于指定是否在节点意外退出时重新启动节点;默认值为False
    • container_name用于指定运行容器的节点名称。默认值为nav2_container
  • 如果use_composition参数为false,即PythonExpression(['not ', use_composition]),则启动一个动作组
    • 启动了nav2_controller功能包下的controller_server节点
    • 启动了nav2_smoother功能包下的smoother_server节点
    • 启动了nav2_planner功能包下的planner_server节点
    • 启动了nav2_behaviors功能包下的behavior_server节点
    • 启动了nav2_bt_navigator功能包下的bt_navigator节点
    • 启动了nav2_waypoint_follower功能包下的waypoint_follower节点
    • 启动了nav2_velocity_smoother功能包下的velocity_smoother节点
    • 启动了nav2_lifecycle_manager功能包下的lifecycle_manager节点
    • 传递的参数均为configured_params,即从params_file文件内解析的值
  • 如果use_composition为true,则启动另外一个动作组
    • 该动作组和上面工作组一样,只不过是用ComposableNode节点进行启动的。
2.slam_launch.py
  • 父启动文件向其传递了如下参数:
    • namespace用于指定命名空间
    • use_sim_time用于指定是否使用仿真时间;
    • autostart用于指定是否自动启动节点,默认值为true
    • use_respawn用于指定是否在节点意外退出时重新启动节点;默认值为False
    • params_file用于指定参数文件,默认值为/opt/ros/humble/share/nav2_bringup/params/ nav2_params.yaml
  • 启动了两个节点
    • nav2_map_server功能包下的map_saver_server节点,传递的参数为 configured_params,即params_file参数文件的解析。
      • respawn:指定了节点是否自动重启,默认值为false
      • respawn_delay:指定了节点重启的时间间隔为2.0秒。
    • arguments:指定了节点的命令行参数,包括’–ros-args’和’–log-level’,以及log_level的值info
    • nav2_lifecycle_manager功能包下的lifecycle_manager节点。参数为
      • use_sim_time,默认值为true
      • autostart,默认值为true
      • node_names,默认值为map_saver
  • 启动了其他功能包的launch文件:opt/ros/humble/share/slam_toolbox/launch/online_sync_launch.py
3. localization_launch.py
  • 在slam没启用的时候启用
  • 启动了节点
    • nav2_map_server功能包下的map_server节点
    • nav2_amcl功能包下的amcl节点
    • nav2_lifecycle_manager功能包下的lifecycle_manager_localization节点
    • 传递的参数均为configured_params,即从params_file文件内解析的值
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐