Navigation2 算法流程

转自 https://zhuanlan.zhihu.com/p/405670882

此文仅作学习笔记

启动流程

在仿真环境中启动导航包的示例程序,执行nav2_bringup/bringup/launch/tb3_simulation_launch.py文件。ROS2的launch文件支持采用python语言来编写以支持更加复杂的功能,本文件的主要功能如下:

  • 声明各参数变量赋值
  • 启动gazebo
  • 并加载模型
  • 启动robot_state_publisher ros包,加载URDF文件发布静态机器人坐标变换关系
  • 启动rviz
  • 包含bringup_launch.py文件并传递参数

bringup_launch.py文件中包含了导航相关的算法启动内容。在文件中实现的主要功能为

  • 加载参数
  • 如果采用SLAM构建地图则启动SLAM算法文件slam_launch.py
  • 不使用SLAM算法,则运行定位算法启动文件 localization_launch.py
  • 运行导航算法启动文件navigation_launch.py

这里我们仅看导航和定位两个文件。

location_launch.py文件中启动两个节点,nav2_map_servernav2_amcl。在navigation_launch.py文件中则启动controller_serverplanner_serverrecoveries_serverbt_navigatornav2_waypoint_follower算法包。至于nav2_lifecycle_manager包则为其他所有包的节点管理功能,可以暂时不理会。

因此,Navigation2启动流程如下

定位部分

定位部分代码较为简单,具体功能主要是

  • 发布地图信息(nav2_map_server
  • 发布机器人位置信息(nav2_amcl

这一部分需要注意的仅仅是AMCL定位时的坐标变换关系,在单纯的里程计中发布的是/odom_frame\base_frame的坐标关系,而acml确定的是地图坐标系/map_frame/odom_frame的关系,即可以认为里程计

确定从起始位置出发的局部定位信息,而amcl算法确定局部定位信息和全局地图之间的坐标关系。

导航部分

调用接口流程

Action 机制

Navigation2 高度依赖于ROS的Action通信机制

,因此有必要对其有个大致了解。

基本的通信流程为

  • 客户端发布启动消息给服务端
  • 服务端响应启动消息,并执行动作
  • 服务端在执行动作时返回当前执行动作进度
  • 服务端执行动作结束,返回执行结果
  • 客户端响应执行结果

动图封面

根据action消息的特点,将导航节点分为两个部分,一是具体的算法实现作为服务端,二是算法调用逻辑控制

实现作为客户端

算法执行服务端

planner_server路径规划服务器,接受客户端的路径规划请求后计算路径并发布。

接收Action

  • compute_path_to_pose
  • compute_path_through_poses

发布消息

  • plan

controller_server机器人控制

服务器,接受客户端开始跟随当前路径的请求,然后发布控制机器人运动指令。
接收Action

  • follow_path

接收消息

  • odom (实际上是定位消息)
  • speed_limit

发布控制指令

  • cmd_vel

recoveries_server故障恢复服务器,在机器人运动异常时进行处理。
接收Action

  • spin
  • backup
  • wait

发布控制指令

  • cmd_vel

根据上述三个模块功能的描述,可以大致的想到导航功能的实现分为首先调用路径规划

算法得到一个可行路线,然后调用跟随路径接口,在跟随的同时监控机器人是否出现异常,若出现异常则打断机器人跟随路径并执行故障恢复,要么后退要么旋转或者等待动态障碍物走开。而Navigation2中的实现则更为具体和详细。

算法调用逻辑客户端

Navigation2 的导航控制逻辑采用行为树实现,该方法常被用在游戏开发中,类似于状态机

的功能但更为强大。

行为树

Navigation2中实现了四种行为树插件,分别为,动作,条件,控制,修饰。接下来简单介绍各自的功能,详细的行为树功能可参考BehaviorTree.CPP库的描述 。

动作行为树的叶子节点,调用一个动作就代表执行一段算法或者控制机器人运动。

条件判断子节点是否执行的条件

控制子节点执行的流程控制,顺序执行

,或循环执行

修饰修饰当前子节点,比如设置子节点循环执行5次,或者修改子节点

返回值

在Navigation2中实现许多的行为树插件,主要有

  • 动作:
  • 动作:

bt_navigator

将上述行为树

插件组合起来,便可以得到完整的导航控制逻辑,采用xml文件配置得到。
具体采用流程图

的形式表达如下

至此,我们便大致理清了导航包的逻辑。目前对于整体的导航框架,还剩下代价地图

功能没有进行描述。

代价地图

代价地图分为局部代价地图

和全局代价地图,分别在全局路径规划和局部路径规划中新建单独的线程进行计算。代价地图采用多图层的结构,用来确定可行区域以及手动设置限速区域,手动设置静止入内区域等。

<think>我们正在讨论的是ROS2中的Navigation2导航系统。根据用户的问题,他想了解在ROS2中使用Navigation2的具体流程和配置步骤。结合提供的引用内容,我将整理出一个详细的步骤指南。 引用内容分析: 引用[1]提到这是一个ROS 2 Navigation2学习教程,使用ROS 2 Jazzy版本,涵盖环境设置到实际部署。 引用[2]提供了编译navigation2功能包的步骤,但注意其中提到使用galactic分支,而用户可能使用的是其他版本(如Jazzy或Humble)。同时,引用中提到了安装一些依赖包。 引用[3]则给出了使用apt安装navigation2的方法(针对Humble版本)。 引用[4]介绍了代价地图的概念,这是Navigation2中的核心概念之一。 由于用户没有指定具体的ROS2版本,但引用中提到了Jazzy和Humble,我们将以最新稳定版(如Jazzy)为例,同时兼顾Humble版本(因为目前Humble是LTS版本,使用广泛)。 使用Navigation2流程和步骤: 1. 环境设置 安装ROS2:根据你的操作系统选择合适的ROS2版本(如Jazzy或Humble)进行安装。可以参考官方文档[^1]。 例如,在Ubuntu 22.04上安装ROS2 Jazzy: ```bash # 设置语言环境 sudo apt update && sudo apt install locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 export LANG=en_US.UTF-8 # 添加ROS2仓库 sudo apt install software-properties-common sudo add-apt-repository universe sudo apt update && sudo apt install curl -y sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null # 安装ROS2桌面版 sudo apt update sudo apt install ros-jazzy-desktop ``` 2. 安装Navigation2 有两种方式安装Navigation2:通过apt安装预编译包,或从源码编译安装。 方式一:使用apt安装(推荐,简单方便) - 对于Humble版本: ```bash sudo apt install ros-humble-navigation2 sudo apt install ros-humble-nav2-bringup ``` - 对于Jazzy版本(目前可能还在开发中,但可以尝试): ```bash sudo apt install ros-jazzy-navigation2 sudo apt install ros-jazzy-nav2-bringup ``` 方式二:从源码编译(适用于开发或特定版本需求) ```bash # 创建ROS2工作空间 mkdir -p ~/nav2_ws/src cd ~/nav2_ws/src # 克隆navigation2仓库(注意选择分支,例如jazzy) git clone https://github.com/ros-planning/navigation2.git -b jazzy # 安装依赖 cd ~/nav2_ws rosdep install -y --from-paths src --ignore-src --rosdistro jazzy # 编译 colcon build --symlink-install ``` 3. 配置机器人模型 要使用Navigation2,机器人需要提供正确的URDF模型,并且必须包含必要的传感器(如激光雷达、IMU等)和运动控制信息。 例如,在URDF中,需要设置: - 机器人基座(base_link)到传感器的坐标变换(如激光雷达的frame_id) - 发布机器人的关节状态(joint_state)和机器人状态(robot_state) 4. 配置导航参数 Navigation2通过参数文件(YAML)进行配置。主要配置文件包括: - 全局代价地图参数(global_costmap_params.yaml) - 局部代价地图参数(local_costmap_params.yaml) - 行为树参数(bt_navigator_params.yaml) - 控制器参数(controller_server.yaml) - 规划器参数(planner_server.yaml) - 恢复行为参数(recoveries_server.yaml) 这些文件通常放在机器人功能包的`config`目录下。配置内容涉及代价地图的层(如静态层、障碍层、膨胀层)、机器人半径、传感器话题等。 5. 启动导航节点 使用`nav2_bringup`包提供的launch文件启动导航系统。通常需要提供以下信息: - 地图文件(如PGM和YAML) - 机器人的URDF模型 - 导航参数文件 启动命令示例: ```bash ros2 launch nav2_bringup bringup_launch.py \ map:=/path/to/map.yaml \ params:=/path/to/nav2_params.yaml \ use_sim_time:=true # 如果使用Gazebo仿真,则设置为true ``` 6. 设置初始位姿 在RViz中,使用`2D Pose Estimate`按钮设置机器人的初始位姿(在地图上的位置和方向)。 7. 设置导航目标 在RViz中,使用`2D Goal Pose`按钮点击地图上的目标位置和方向,机器人将开始规划路径并自主导航。 8. 监控导航过程 通过RViz可以实时查看机器人的位置、传感器数据、代价地图、规划路径等。 9. 调试与优化 根据实际导航效果,调整导航参数(如代价地图参数、控制器参数等)以优化性能。 注意:以上步骤是一个概括性的流程,具体实施时可能会因机器人的硬件和软件环境而有所不同。建议参考官方教程和文档。 引用[4]中提到,代价地图是Navigation2的核心概念,它使用栅格地图表示空间,每个栅格有代价值(0-255),表示通过该栅格的代价(0可通过,255为障碍)。在配置代价地图时,需要设置以下层: - 静态地图层(static layer):加载的静态地图 - 障碍物层(obstacle layer):动态障碍物 - 膨胀层(inflation layer):在障碍物周围设置膨胀区,防止碰撞 因此,在配置代价地图参数时,需要仔细调整这些层的参数。 相关问题: §§相关问题§§ 1. 如何为Navigation2配置代价地图的膨胀半径? 2. 在Navigation2中如何添加自定义的规划算法? 3. 如何调整Navigation2的局部路径规划器参数?</think>### ROS 2 Navigation2 使用流程与配置步骤 以下流程基于ROS 2 Jazzy/Humble版本,以自动导航小车为例,结合引用内容整理: --- #### **1. 环境准备与安装** - **安装ROS 2** 根据系统选择版本(如Ubuntu 22.04安装Jazzy)[^1]: ```bash sudo apt update sudo apt install ros-jazzy-desktop # 或 ros-humble-desktop source /opt/ros/jazzy/setup.bash ``` - **安装Navigation2** **方式1:APT安装(推荐)** [^3]: ```bash sudo apt install ros-jazzy-navigation2 ros-jazzy-nav2-bringup # Jazzy sudo apt install ros-humble-navigation2 ros-humble-nav2-bringup # Humble ``` **方式2:源码编译** [^2]: ```bash git clone https://github.com/ros-planning/navigation2 -b jazzy # 选择分支 cd navigation2 rosdep install -y --from-paths src --ignore-src colcon build --symlink-install ``` - **安装依赖包** [^2]: ```bash sudo apt install ros-rolling-ompl ros-rolling-geographic-msgs \ ros-rolling-behaviortree-cpp libboost-all-dev ``` --- #### **2. 配置机器人模型** - **URDF模型**: 确保机器人URDF包含: - 正确的基座标系(如 `base_link`) - 传感器坐标系(如激光雷达 `laser_frame`) - 驱动控制接口(如差分驱动的 `cmd_vel` 订阅) - **传感器配置**: 在 `sensors.yaml` 中定义激光雷达/深度相机: ```yaml sensor_plugins: ["nav2_costmap_2d::ObstacleLayer"] laser: topic: /scan # 激光雷达话题 data_type: LaserScan ``` --- #### **3. 配置Navigation2参数** 关键配置文件(存放于 `config/` 目录): - **全局参数 (`nav2_params.yaml`)** 定义导航行为树和组件: ```yaml controller_server: ros__parameters: controller_frequency: 20.0 min_x_velocity_threshold: 0.001 progress_checker_plugin: "progress_checker" planner_server: ros__parameters: planner_plugins: ["GridBased"] # 规划器插件 ``` - **代价地图 (`global_costmap_params.yaml`)** [^4] 配置全局导航地图: ```yaml global_costmap: update_frequency: 1.0 resolution: 0.05 # 栅格分辨率 plugins: ["static_layer", "obstacle_layer", "inflation_layer"] static_layer: map_topic: /map # 静态地图话题 inflation_layer: inflation_radius: 0.55 # 膨胀半径 ``` - **局部代价地图 (`local_costmap_params.yaml`)** 配置实时避障: ```yaml local_costmap: update_frequency: 5.0 width: 3.0 # 局部地图宽度(m) plugins: ["obstacle_layer", "inflation_layer"] ``` --- #### **4. 启动导航系统** - **启动命令**: ```bash ros2 launch nav2_bringup bringup_launch.py \ use_sim_time:=false \ map:=/path/to/map.yaml \ # 预存地图 params_file:=/path/to/nav2_params.yaml ``` - **RViz可视化**: 加载导航面板: ```bash ros2 run rviz2 rviz2 -d $(ros2 pkg prefix nav2_bringup)/share/nav2_bringup/rviz/nav2_default_view.rviz ``` - 使用 `2D Pose Estimate` 设置初始位姿 - 使用 `Nav2 Goal` 设置目标点 --- #### **5. 核心功能调试** - **地图服务**: 确保地图服务器发布 `/map` 话题: ```bash ros2 run nav2_map_server map_server --ros-args -p yaml_filename:=/path/to/map.yaml ``` - **TF树验证**: 检查坐标系关系: ```bash ros2 run tf2_tools view_frames.py # 确保 base_link → laser_frame → map 链路完整 ``` - **行为树监控**: 使用 `nav2_bt_navigator` 查看任务状态: ```bash ros2 run nav2_bt_navigator bt_navigator --ros-args -r __node:=bt_navigator ``` --- #### **6. 高级配置** - **自定义规划器/控制器**: 在 `nav2_params.yaml` 添加插件: ```yaml planner_server: planner_plugins: ["GridBased", "CustomPlanner"] CustomPlanner: plugin: "nav2_custom/CustomPlanner" ``` - **多机器人避障**: 在代价地图中启用 `social_costmap_layer`,添加其他机器人位置话题。 --- **典型问题排查**: - **定位漂移**:检查AMCL参数或改用SLAM工具箱 - **路径规划失败**:调整代价地图膨胀半径或障碍物阈值 - **控制震荡**:降低控制器频率或增加路径平滑度权重
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值