|
@@ -12,6 +12,10 @@ Nav2使用行为树调用模块化服务器来完成一个动作。动作可以
|
|
|
|
|
|

|
|
|
|
|
|
+
|
|
|
+
|
|
|
+### 2.2 四个服务
|
|
|
+
|
|
|
小鱼再对上面的架构图进一步的进行解释,可以简单分为一大三小四个服务。
|
|
|
|
|
|
一大:
|
|
@@ -26,6 +30,31 @@ Nav2使用行为树调用模块化服务器来完成一个动作。动作可以
|
|
|
|
|
|
通过`规划路径`、`控制机器人沿着路径运动`、`遇到问题自主恢复`三者进行不断切换完成机器人的自主导航(在这个过程还需要很多节点和数据的辅助,详建下面的组建部分)。
|
|
|
|
|
|
+### 2.3 两大代价(成本)地图
|
|
|
+
|
|
|
+在机器人导航的时候,仅仅靠一张SLAM建立的原始地图是不够的,机器人在运动过程中可能会出现新的障碍物,也有可能发现原始地图中某一块的障碍物消失了,所以在机器人导航过程中维护的地图是一个动态的地图,根据更新频率方式和用途不同,可以分为下面两种。
|
|
|
+
|
|
|
+> 注意:不论是全局代价地图还是局部代价地图都是有很多个图层共同叠加而成的,你也可以自己定义图层。
|
|
|
+
|
|
|
+#### 2.3.1 全局代价地图 (Global Costmap)
|
|
|
+
|
|
|
+全局代价地图主要用于全局的路径规划器。从上面结构图中其在可以看到在Planner Server中。
|
|
|
+
|
|
|
+通常包含的图层有:
|
|
|
+
|
|
|
+- Static Map Layer:静态地图层,通常都是SLAM建立完成的静态地图。
|
|
|
+- Obstacle Map Layer:障碍地图层,用于动态的记录传感器感知到的障碍物信息。
|
|
|
+- Inflation Layer:膨胀层,在以上两层地图上进行膨胀(向外扩张),以避免机器人的外壳会撞上障碍物。
|
|
|
+
|
|
|
+#### 2.3.2 局部代价地图(Local Costmap)
|
|
|
+
|
|
|
+局部代价地图主要用于局部的路径规划器。从上面结构图中其在可以看到在Controller Server中。
|
|
|
+
|
|
|
+通常包含的图层有:
|
|
|
+
|
|
|
+- Obstacle Map Layer:障碍地图层,用于动态的记录传感器感知到的障碍物信息。
|
|
|
+- Inflation Layer:膨胀层,在障碍地图层上进行膨胀(向外扩张),以避免机器人的外壳会撞上障碍物。
|
|
|
+
|
|
|
## 3.Nav2导航相关概念
|
|
|
|
|
|
该部分摘抄自Nav2中文网,中间删除了一些信息,全部文章请访问[原文页面](http://dev.nav2.fishros.com/doc/concepts/index.html)。
|
|
@@ -38,11 +67,7 @@ Nav2使用行为树调用模块化服务器来完成一个动作。动作可以
|
|
|
|
|
|
### 3.2 生命周期节点和绑定
|
|
|
|
|
|
-生命周期 (或被管理的,更正确的) 节点是ROS 2独有的。更多信息可以是 [在这里](https://design.ros2.org/articles/node_lifecycle.html) 。它们是包含状态机转换的用于加载和卸载ROS 2服务器的节点。这有助于确定ROS系统启动和关闭的状态是否正常。它还帮助用户根据实际用途(商业或调试)以合理的方式构建他们的程序。
|
|
|
-
|
|
|
-当一个节点启动时,它处于未配置状态,只处理节点的构造函数。通过启动系统或提供的生命周期管理器,需要通过配置将节点转换为非活动状态。之后,可以通过激活阶段的转换来激活节点。
|
|
|
-
|
|
|
-要关闭(该节点)即过渡到停用需要清理、关闭,并以最终状态结束。网络接口分别在这些阶段被停用并停止处理、释放内存、干净地退出。
|
|
|
+生命周期 (或被管理的,更正确的) 节点是ROS 2独有的。更多信息可以是 [在这里](https://design.ros2.org/articles/node_lifecycle.html) 。它们是包含状态机转换的用于加载和卸载ROS 2服务器的节点。这有助于确定ROS系统启动和关闭的状态是否正常。
|
|
|
|
|
|
**生命周期节点框架在整个项目中被广泛使用,所有服务器都使用它。如果可能的话,所有ROS系统最好使用生命周期节点。**
|
|
|
|
|
@@ -50,11 +75,13 @@ Nav2使用行为树调用模块化服务器来完成一个动作。动作可以
|
|
|
|
|
|
### 3.3 行为树
|
|
|
|
|
|
-行为树 (BT) 在复杂的机器人任务中变得越来越普遍。它们是待完成任务的树形结构。行为树为定义多步或多状态应用程序创建了一个更具可扩展性和人类可理解性的框架。这与有限状态机 (FSM) 相反,后者可能有几十个状态和数百个状态过渡。一个例子就是踢足球机器人。将足球比赛的逻辑嵌入FSM将具有挑战性,且容易出错因为有许多可能的状态和规则。此外,像从左侧、右侧或中间射门这样的建模选择尤其不清楚。使用行为树则可以为许多行为创建和重用基本原语,像 "kick" "walk" "go to ball" 。更多信息可以在 [这本书](https://arxiv.org/abs/1709.00084) 找到。强烈建议阅读第1-3章,以更好地理解术语和工作流程。大约需要30分钟。
|
|
|
+行为树 (BT) 在复杂的机器人任务中变得越来越普遍。它们是待完成任务的树形结构。行为树为定义多步或多状态应用程序创建了一个更具可扩展性和人类可理解性的框架。这与有限状态机 (FSM) 相反,后者可能有几十个状态和数百个状态过渡。
|
|
|
+
|
|
|
+> 一个例子就是踢足球机器人。将足球比赛的逻辑嵌入FSM将具有挑战性,且容易出错因为有许多可能的状态和规则。此外,像从左侧、右侧或中间射门这样的建模选择尤其不清楚。使用行为树则可以为许多行为创建和重用基本原语,像 "kick" "walk" "go to ball" 。更多信息可以在 [这本书](https://arxiv.org/abs/1709.00084) 找到。强烈建议阅读第1-3章,以更好地理解术语和工作流程。大约需要30分钟。
|
|
|
|
|
|
Nav2项目使用 [BehaviorTree CPP V3](https://www.behaviortree.dev/) 作为行为树库。在 `BT Navigator` 中,创建了可以构建为行为树的节点插件。将节点插件加载到BT中,并且在解析该行为树的XML文件时,将关联注册的名称。此时,我们可以通过该行为树进行导航。
|
|
|
|
|
|
-使用此库的一个原因是它能够加载子树。这意味着可以将Nav2行为树可以进行套娃操作。举个例子是在足球比赛中,使用Nav2行为树作为 "go to ball" 节点,将足球检测作为更大任务的一部分。此外,为BT提供了一个 `NavigateToPoseAction` 插件,因此可以从客户端应用程序通过通常的动作接口调用Nav2软件导航栈。
|
|
|
+> 使用此库的一个原因是它能够加载子树。这意味着可以将Nav2行为树可以进行套娃操作。举个例子是在足球比赛中,使用Nav2行为树作为 "go to ball" 节点,将足球检测作为更大任务的一部分。此外,为BT提供了一个 `NavigateToPoseAction` 插件,因此可以从客户端应用程序通过通常的动作接口调用Nav2软件导航栈。
|
|
|
|
|
|
### 3.4 导航服务器
|
|
|
|
|
@@ -62,7 +89,7 @@ Nav2项目使用 [BehaviorTree CPP V3](https://www.behaviortree.dev/) 作为行
|
|
|
|
|
|
#### 3.4.1 规划器,控制器和恢复服务器
|
|
|
|
|
|
-该项目中的三个动作服务器是规划器、恢复器和控制器服务器。这些动作服务器用于托管一个地图算法插件,以完成各种任务。它们还托管由该算法插件使用的环境表达,以计算其输出。
|
|
|
+该项目中的三个Action Server是规划器、恢复器和控制器服务器。这些Action Server用于托管一个地图算法插件,以完成各种任务。它们还托管由该算法插件使用的环境表达,以计算其输出。
|
|
|
|
|
|
**规划器(Planners)**
|
|
|
|
|
@@ -99,25 +126,27 @@ Nav2项目使用 [BehaviorTree CPP V3](https://www.behaviortree.dev/) 作为行
|
|
|
|
|
|
`nav2_waypoint_follower` 软件包含一个航路点跟踪程序,该程序具有特定任务执行程序的插件接口。如果需要让机器人前往给定位姿并完成像拍照、捡起盒子或等待用户输入之类的特定任务,这会非常有用。
|
|
|
|
|
|
-但是,该软件包不仅可以用于示例应用程序。关于机器人队管理器/调度器有两种思想流派:哑机器人+智能集中式调度器;智能机器人+哑集中式调度器。
|
|
|
-
|
|
|
-在第一种思想中, `nav2_waypoint_follower` 软件包足以创造一个产品级的机器人解决方案。由于自主系统/调度器在分配任务时会考虑机器人的姿势、电池电量、当前任务等因素,机器人上的应用程序只需要关心手头的任务,而不用关心完成系统要求任务的其他复杂因素。在这种情况下,应该将发送至航点跟随者的请求视为1个工作单元(例如,仓库中的1次拣货、1个安全巡逻循环、1个过道等)来执行任务,然后返回给调度器以进行下一个任务或者要求充电。在这种思想流派中,航点跟随应用程序只是导航软件堆栈之上和系统自主应用程序之下的一个步骤。
|
|
|
-
|
|
|
-在第二种思想中, `nav2_waypoint_follower` 软件包是一个不错的示例应用程序/概念证明,但确实需要机器人上的航点跟踪/自主系统来承担更多任务以制定健壮的解决方案。在这种情况下,应该使用 `nav2_behavior_tree` 软件包创建自定义应用程序级别的行为树,以使用导航来完成任务。这可以包含子树,例如在任务中检查充电状态以返回停泊坞,或者在更复杂的任务中处理1个以上的工作单元。很快,将会有一个 `nav2_bt_waypoint_follower` (名称有待调整),它将允许用户更容易地创建此应用程序。在这个思想流派中,航点跟随应用程序与自主系统的联系更加紧密,或者在很多情况下,航点跟随应用程序就是自主系统本身。
|
|
|
+> 关于机器人队管理器/调度器有两种思想流派:哑机器人+智能集中式调度器;智能机器人+哑集中式调度器。
|
|
|
+>
|
|
|
+> 在第一种思想中, `nav2_waypoint_follower` 软件包足以创造一个产品级的机器人解决方案。由于自主系统/调度器在分配任务时会考虑机器人的姿势、电池电量、当前任务等因素,机器人上的应用程序只需要关心手头的任务,而不用关心完成系统要求任务的其他复杂因素。在这种情况下,应该将发送至航点跟随者的请求视为1个工作单元(例如,仓库中的1次拣货、1个安全巡逻循环、1个过道等)来执行任务,然后返回给调度器以进行下一个任务或者要求充电。在这种思想流派中,航点跟随应用程序只是导航软件堆栈之上和系统自主应用程序之下的一个步骤。
|
|
|
+>
|
|
|
+> 在第二种思想中, `nav2_waypoint_follower` 软件包是一个不错的示例应用程序/概念证明,但确实需要机器人上的航点跟踪/自主系统来承担更多任务以制定健壮的解决方案。在这种情况下,应该使用 `nav2_behavior_tree` 软件包创建自定义应用程序级别的行为树,以使用导航来完成任务。这可以包含子树,例如在任务中检查充电状态以返回停泊坞,或者在更复杂的任务中处理1个以上的工作单元。很快,将会有一个 `nav2_bt_waypoint_follower` (名称有待调整),它将允许用户更容易地创建此应用程序。在这个思想流派中,航点跟随应用程序与自主系统的联系更加紧密,或者在很多情况下,航点跟随应用程序就是自主系统本身。
|
|
|
+>
|
|
|
+> 这两种思想流派并不能简单地说谁比谁更好,谁更好很大程度上取决于机器人正在完成何种任务、处于何种类型的环境中以及有何种可用的云资源。通常,对于既定的业务案例,这种区别非常明显。
|
|
|
|
|
|
-这两种思想流派并不能简单地说谁比谁更好,谁更好很大程度上取决于机器人正在完成何种任务、处于何种类型的环境中以及有何种可用的云资源。通常,对于既定的业务案例,这种区别非常明显。
|
|
|
+### 3.5 状态估计(重要组件)
|
|
|
|
|
|
-### 3.5 状态估计
|
|
|
+> Nav2中,默认进行状态估计的组件是AMCL (Adaptive Monte Carlo Localization)自适应蒙特卡洛定位。nav2中对应的功能包是nav2_amcl。
|
|
|
|
|
|
根据ROS社区标准,在导航项目中,需要提供两个主要的坐标转换。 `map` 到 `odom` 的坐标变换由定位系统 (定位,建图,SLAM)提供, `odom` 到 `base_link` 的坐标转换由里程计系统提供。
|
|
|
|
|
|
-注解:无需在机器人上使用LIDAR即可使用导航系统。不需要使用基于激光雷达的防撞、定位或SLAM系统。但是,Nav2确实可以提供说明和支持使用激光雷达对这些系统进行尝试和真实实现。使用基于视觉或深度传感器的定位系统和使用其他传感器来避免碰撞可以同样成功。唯一的要求就是在选择具体实现方式时遵循以下标准。
|
|
|
-
|
|
|
-#### 标准
|
|
|
-
|
|
|
-[REP 105](https://www.ros.org/reps/rep-0105.html) 定义了导航和更大的ROS生态系统所需的框架和约定。应始终遵循这些约定,以利用社区中丰富的定位、里程计和SLAM项目。
|
|
|
+注解:无需在机器人上使用LIDAR即可使用导航系统。不需要使用基于激光雷达的防撞、定位或SLAM系统。但是,Nav2确实可以提供说明和支持使用激光雷达对这些系统进行尝试和真实实现。使用基于视觉或深度传感器的定位系统和使用其他传感器来避免碰撞可以同样成功。唯一的要求就是在选择具体实现方式时遵循REP-105标准。
|
|
|
|
|
|
-简而言之,REP-105至少必须为机器人建造一个包含``map`` -> `odom` -> `base_link` -> `[sensorframes]` 的完整 的TF树。TF2是 ROS 2中的时变坐标变换库,Nav2使用TF2来表达和获取时间同步的坐标变换。全球定位系统 (GPS、SLAM、动作捕捉Motion Capture) 的工作是至少要提供 `map-> odom` 的坐标转换。然后,里程计系统的作用是提供 `odom` -> `base_link` 的坐标转化。关于 `base_link` 的其余坐标转换应该是静态的,并应在 [URDF](http://wiki.ros.org/urdf) 中定义。
|
|
|
+> REP-105标准
|
|
|
+>
|
|
|
+> [REP 105](https://www.ros.org/reps/rep-0105.html) 定义了导航和更大的ROS生态系统所需的框架和约定。应始终遵循这些约定,以利用社区中丰富的定位、里程计和SLAM项目。
|
|
|
+>
|
|
|
+> 简而言之,REP-105至少必须为机器人构造一个包含``map`` -> `odom` -> `base_link` -> `[sensorframes]` 的完整 的TF树。TF2是 ROS 2中的时变坐标变换库,Nav2使用TF2来表达和获取时间同步的坐标变换。全球定位系统 (GPS、SLAM、动作捕捉Motion Capture) 的工作是至少要提供 `map-> odom` 的坐标转换。然后,里程计系统的作用是提供 `odom` -> `base_link` 的坐标转化。关于 `base_link` 的其余坐标转换应该是静态的,并应在 [URDF](http://wiki.ros.org/urdf) 中定义。
|
|
|
|
|
|
### 3.6 全局定位: 定位与SLAM
|
|
|
|
|
@@ -152,7 +181,7 @@ Nav2项目使用 [BehaviorTree CPP V3](https://www.behaviortree.dev/) 作为行
|
|
|
通过使用成本地图过滤器可以实现以下功能:
|
|
|
|
|
|
* 机器人永远不会进入的禁区/安全区。
|
|
|
-* Speed restriction areas. Maximum speed of robots going inside those areas will be limited.
|
|
|
+* 限速区,机器人进入这些区域的最大速度将受到限制。
|
|
|
* 机器人在工业环境和仓库中移动的首选通道。
|
|
|
|
|
|
#### 其他形式的环境表示
|
|
@@ -162,7 +191,7 @@ Nav2项目使用 [BehaviorTree CPP V3](https://www.behaviortree.dev/) 作为行
|
|
|
* 梯度图,类似于成本地图,但梯度图会表达表面梯度以检查可穿越性
|
|
|
* 3D成本图,以3D形式表示空间,但这样就也需要3D规划和碰撞检测
|
|
|
* 网格图,类似于梯度图,但具有多个角度的表面网格
|
|
|
-* "Vector space" ,接收传感器信息并使用机器学习算法来检测要跟踪的单个物品和位置,而不是对离散点进行缓冲区计算
|
|
|
+* Vector space ,接收传感器信息并使用机器学习算法来检测要跟踪的单个物品和位置,而不是对离散点进行缓冲区计算
|
|
|
|
|
|
## 4.Nav2下载安装
|
|
|
|