datetime:2023/11/09 17:27
author:nzb

该项目来源于大佬的动手学ROS2

1. Navigation 2 介绍与安装

在正式介绍 Navigation 2 前,我们先来认识一个工具——行为树。BT (Behavior Tree)即行为树,起源于游戏设计中,用于控制游戏角色的行为,比如当僵尸出现时豌豆射手就会开始射击。对于一个移动机器人来说,需要知道什么时候要进行路径规划,什么时候要执行脱困,和游戏中的角色行为相似,所以使用行为树来描述和管理机器人的行再合适不过了,Navigation 2 就是使用它进行机器人行为调度的。

下图是 Navigation 2 的系统框架图,通过它可以让你对 Navigation 2 的架构有一个初步了解。

img

上图中最大的圆角矩形框内是 Navigation 2 的核心部分,向内的箭头是输入部分,向外的是输出部分。可以看到输入有 TF 变换、map 数据、雷达相机等传感器数据、行为树配置和目标位置。输出则只有一个即控制话题/cmd_vel ,就像我们使用键盘控制节点控制机器人移动一样,Navigation 2 最终会发布话题控制机器人移动。

接着我们来了解下 Navigation 2 的内部,首当其充的是 BT Navigator Server 即行为树导航服务,通过输入的 XML 格式的行为树描述文件,调用下面三个服务器中中对应的模块完成对机器人的行为控制。

接着是下面的三个服务模块。右边的是 Planner Server 即规划器服务器,它的任务就是负责全局路径规划。需要注意的是,这个模块叫规划器服务器,而不是具体某个规划器的原因是路径规划算法有很多,规划器服务器可以根据配置加载不同的规划器完成规划任务,这样就有了灵活性。这一点和上一章节 ros2_control 中控制器管理器相同,可以加载不同的控制器。

中间的模块是控制器服务器,该模块负责根据全局路径,结合实时障碍物和局部代价地图完成机器人的控制。需要注意的是,它同样只是一个服务器,可以加载多种不同的控制器完成这一任务。

左边的模块是恢复器服务器,可以加载不同的恢复行为完成机器人的脱困。从箭头可以看出,BT Navigation Server 收到目标点后,由规划器服务器进行 CP(ComputePathToPose)即计算路径 ,然后由控制器服务器进行 FP(FollowPath)即路径跟随,如果遇到卡住等困境则调用规划器服务器完成脱困。这三个模块协同工作,完成了整个 Navigation 2 的导航任务。

好了,关于 Navigation 2 理论的介绍就到这里,接着我们来安装并尝试使用它完成机器人导航。通过 apt 就可以完成 Navigation 2 的安装,命令如下:

sudo apt info ros-$ROS_DISTRO-navigation2

为了方便使用 Navigation 2 还提供了启动示例功能包 nav2_bringup,使用下面的指令可以安装该功能包。

sudo apt info ros-$ROS_DISTRO-nav2-bringup

接下来我们就可以配置 Navigation 2 进行导航测试了。

2. 配置 Navigation 2 参数

我们把 Navigation 2 当作一个模块,只要给它正确的数据输入,它就可以正常工作。所以在启动导航前,需要对一些参数进行调整,以适配我们的仿真机器人,这些参数主要有相关话题名称,坐标系名称和机器人描述等。

nav2_bringup 已经为我们提供了一个默认的参数,我们只需要在它的基础上进行修改即可。在功能包 fishbot_navigation2 下创建 config 目录,接着我们将 nav2_bringup 提供的默认参数复制到 config 目录下,命令如下:

cp /opt/ros/$ROS_DISTRO/share/nav2_bringup/params/nav2_params.yaml src/fishbot_navigation2/config

打开参数文件,可以看到有几百行的参数,不要害怕,这是因为将所有节点参数都放到同一个文件造成的,每一个节点的参数最多只有几十行。

参数名称中带有 topic 的基本都是关于话题的配置,比如 scan_topic 表示雷达数据话题名称,odom_topic 表示里程计话题名称。参数名称中带有 frame 的基本都是关于坐标系名称的配置,比如 odom_frame_id 表示里程计坐标系名称,robot_base_frame 表示机器人基础坐标系名称。仔细观察这些参数你会发现,它们默认值和我们上一章节机器人建模和仿真时,使用的值都是相同的,比如参数文件中默认里程计话题是 odom ,默认的雷达数据话题是 scan,默认的里程计坐标系是 odom,默认机器人基坐标系是 base_link。

除了修改话题和坐标系名称以保证数据的正确获取,在进行路径规划时还需要考虑机器人的大小即半径这一参数,如果半径设置的比真实的大,会造成窄的通道机器人过不去,如果过小则容易发生碰撞,因为是在基于地图做路径规划时才会考虑这一问题,所以机器人半径这一参数是在全局代价地图节点 global_costmap 和局部代价地图节点 local_costmap 进行配置的。分别修改两个代价地图节点robot_radius参数为建模时的半径,修改完成后对应参数值如下:

local_costmap:
  local_costmap:
    ros__parameters:
      ...
      robot_radius: 0.08

global_costmap:
  global_costmap:
    ros__parameters:
      ...
      robot_radius: 0.08

好了,关于导航相关的参数我们就暂时设置这么多,如果想更深入的修改参数以调整 Navigation 2 ,可以参考官方文档 中的参数修改指南。

results matching ""

    No results matching ""