【ROS2】【机器人导航navigation2】启动文件分析
【代码】【ROS2】【机器人导航navigation2】启动文件分析。
·
零、总览
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_simulator
和headless
,默认值均为True
- 启动了Gazebo 仿真环境。
- 源代码如下
- gzserver的启动条件为
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.01R、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
- robot_state_publisher节点
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.py
和bringup_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
- namespace: 指定机器人在ROS中的命名空间。默认值为
- 启动了
rviz2
功能包中的rviz2
节点,但根据不同条件会附带不同的启动参数- 如果
use_namespace
为True
,即使用命名空间。此时,传递的参数为rviz_config_file
,默认值为/opt/ros/humble/share/nav2_bringup/rviz/ nav2_default_view.rviz
- 如果
use_namespace
为False
,即不用命名空间。此时,传递的参数为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函数。
- namespace用于指定命名空间;默认值为
- 创建了一个动作群组,里面包含
- 命名空间指定:如果
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秒。
- respawn:指定了节点是否自动重启,默认值为
- arguments:指定了节点的命令行参数,包括’–ros-args’和’–log-level’,以及log_level的值
info
。 - nav2_lifecycle_manager功能包下的lifecycle_manager节点。参数为
- use_sim_time,默认值为
true
。 - autostart,默认值为
true
- node_names,默认值为
map_saver
- use_sim_time,默认值为
- nav2_map_server功能包下的map_saver_server节点,传递的参数为
- 启动了其他功能包的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
文件内解析的值

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