فهرست منبع

[feat]:完成10.6-10.7

sangxin 3 سال پیش
والد
کامیت
3e64ec050e

+ 2 - 0
docs/chapt10/10.2Gazebo仿真环境准备.md

@@ -72,6 +72,8 @@ Gazebo左上角->Edit->Building Editor
 
 我们选择默认的,100像素/米。点击OK(需要手动将100改变一下才能点击OK哦),之后就可以用图片画墙了。
 
+**注意:导入完图片不会直接出来墙,图片只是提供了墙的大概位置,需要你手动用墙再将边描一遍。**
+
 ![image-20220415204027598](10.2Gazebo仿真环境准备/imgs/image-20220415204027598.png)
 
 建完后点击File->Exit,在退出的弹框中选Exit。

+ 2 - 3
docs/chapt10/10.4Cartographer介绍与安装.md

@@ -21,9 +21,6 @@ Cartographer是Google开源的一个可跨多个平台和传感器配置以2D和
 > ![系统概述](10.4Cartographer介绍与安装/imgs/high_level_system_overview.png)
 
 
-
-
-
 ## 2.Carttographer安装
 
 ### 2.1 apt安装
@@ -60,6 +57,8 @@ wget http://fishros.com/install -O fishros && . fishros
 
 接着在fishbot_ws下运行下面这个命令进行依赖的安装。
 
+> rosdepc 是小鱼制作的国内版rosdep,是一个用于安装依赖的工具。该工具的安装可以采用[一键安装](https://fishros.org.cn/forum/topic/20)进行,选项编号为3。安装完成后运行一次rodepc update即可使用。
+
 ```shell
 rosdepc install -r --from-paths src --ignore-src --rosdistro $ROS_DISTRO -y
 ```

+ 3 - 1
docs/chapt10/10.5配置Fishbot进行建图.md

@@ -315,7 +315,9 @@ ros2 run nav2_map_server map_saver_cli -t map -f fishbot_map
 0 directories, 2 files
 ```
 
-这两个文件就是对当前地图保存下来的文件,下面的导航我们将要使用到这两个文件。
+这两个文件就是对当前地图保存下来的文件,其中.pgm是地图的数据文件,.yaml后缀的是地图的描述文件。
+
+下面的导航过程中我们将要使用到地图文件进行路径的搜索和规划。
 
 
 

+ 177 - 12
docs/chapt10/10.6导航地图概述.md

@@ -2,32 +2,34 @@
 
 地图是对环境建模的结果,拥有地图,我们就可以在不进行任何测量的情况下来了解环境,从而完成一些比如路径规划的操作。
 
-本节小鱼带你一起了解ROS2中地图的原理、常见格式及转换,加载方式、修改方式等基本操作。
+本节小鱼带你一起了解ROS2中地图的原理、常见格式及转换,加载方式、修改方式等基本操作。同时需要重点了解占据栅格地图(OccupancyGridMap)的概念。
 
-1.地图与占据栅格地图
+## 1.地图与占据栅格地图
 
 在日常生活中,我们会用到各种各样的地图,比如交通轨道图、城市地图、世界地图。
 
-1.1 地图分类
+### 1.1 地图分类
 
 我们根据地图所表达信息的不同可以将地图分为三类:
 
-1. 尺度地图(Metric Map)
+1. #### 尺度地图(Metric Map)
 
 尺度地图用于表示尺寸距离,可以理解为把真实世界按比例缩小,尺度地图中每个点都可以使用一个经纬值进行表示。
 
 > 因为尺度地图是按照真实世界按比例缩小,所以要有比例尺来表示缩小比例。
 
-2. 拓扑地图(Topological Map)
-拓扑地图用于表示点与点之间的连接信息,比如地铁轨道交通图。
+2. #### 拓扑地图(Topological Map)
 
-3. 语义地图(Semantic Map)
-语义地图可以理解为在上面两个地图上增加了语义,比如尺度地图中某处是红绿灯、斑马线。拓扑地图中某个点是深圳北站。
+  拓扑地图用于表示点与点之间的连接信息,比如地铁轨道交通图。
+
+3. #### 语义地图(Semantic Map)
+
+  语义地图可以理解为在上面两个地图上增加了语义,比如尺度地图中某处是红绿灯、斑马线。拓扑地图中某个点是深圳北站。
 
 
 在机器人领域,尺度地图常用于定位于地图构建(Mapping)、定位(Localization)和同时定位与地图构建(Simultaneous Localization And Mapping,SLAM),拓扑地图常用于路径规划(Path Planning),而语义地图常用于人机交互(Human Robot Interaction)。
 
-1.2 占据栅格地图
+### 1.2 占据栅格地图
 
 我们先了解下什么是栅格地图(Grid Map)。
 
@@ -46,15 +48,178 @@
 
 ![image-20220506134542099](10.6导航地图概述/imgs/image-20220506134542099.png)
 
+> 我们在做机器人的路径规划的时候,需要确定一个格子是有障碍物?没障碍物?还是未知呢?所以我们一般会设定两个阈值:
+>
+> - 占据阈值(occupied_thresh),比如0.65,则表示栅格占据率大于0.65的认为是有障碍物。
+> - 空闲阈值(free_thresh),比如0.25,则表示栅格占据率小于0.25的认为没有障碍物。
+>
+> 那在free_thresh和occupied_thresh之间的则认为是未知区域(未探索)。
+
+## 2.地图文件介绍
+
+### 2.1 地图数据文件.pgm介绍
+
+OccupancyGrid由一个`.yaml格式`的元数据文件,和.pgm图片格式的地图数据文件组成。从上节课建图后保存的文件也可以看出。
+
+```
+.
+├── fishbot_map.pgm
+└── fishbot_map.yaml
+
+0 directories, 2 files
+```
+
+
+
+![image-20220514115948139](10.6%E5%AF%BC%E8%88%AA%E5%9C%B0%E5%9B%BE%E6%A6%82%E8%BF%B0/imgs/image-20220514115948139.png)
+
+打开上节课建好的地图,观察下,你应该会有几点疑问:
+
+1. 不是说占据栅格地图每个栅格都有一个概率吗?为什么看不出来?
+2. 立方体内和圆柱体内和墙之外的区域为什么是灰色的?
+
+原因如下:
+
+1. 一个栅格对应到图片上其实是一个像素,每一个像素的值在0-255之间,所以将像素值和占据率之间的映射即可,而像素值反应到图像上就是颜色的深浅,1.2图对应的像素颜色如下:
+
 ![image-20220506141320374](10.6导航地图概述/imgs/image-20220506141320374.png)
 
-2.地图加载
+2. 建图的时候物体内和墙之外的区域机器人并没有探索到,没有数据参考就认为其值是未知的。
+
+### 2.2 地图描述文件.yaml介绍
+
+除了`fishbot_map.pgm`文件外,还有另外一个`fishbot_map.yaml`的文件,`fishbot_map.yaml`文件是地图的配置文件,该文件内容如下:
+
+```yaml
+image: fishbot_map.pgm
+mode: trinary
+resolution: 0.05
+origin: [-3.37, -2.88, 0]
+negate: 0
+occupied_thresh: 0.65
+free_thresh: 0.25
+```
+
+- image:图像名称
+
+- mode:图像模式,默认为trinary(三进制),还有另外两个可选项scale(缩放的)和raw(原本的值)。
+
+- resolution:分辨率,一个栅格对应的物理尺寸,单位为m。0.05则表示一个栅格为0.05m
+
+- origin:地图原点位置,单位是m。
+
+
+- negate:是否反转图像
+
+- cooupied_thresh:占据阈值
+
+- free_thresh:空闲阈值
+
+#### 如何在地图上找出机器人原点的像素位置?
+
+  1. 图像的像素原点在左下角
+
+  3. 借张图左边的0,0是地图原点,右边的图是图像的像素原点
+
+     ![img](https://img-blog.csdnimg.cn/20200228145404649.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3o4MjQwNzQ5ODl5,size_16,color_FFFFFF,t_70)
+
+3. 假如机器人地图原点是[-3.37m, -2.88m],除上分辨率则可得到像素原点[-67.4px,-57.6px]。`地图原点`在x和y轴分别偏移[-67.4px,-57.6px]就到了像素原点,反过来说,地图原点就在像素原点的[67.4px,57.6px]处。
+
+## 3.地图加载
+
+### 3.1 启动地图
+
+了解完地图的格式和描述文件,接着我们看看如何将地图加载到rviz2中进行显示。我们使用nav2_map_server进行地图的保存,也可以使用它来加载地图。
+
+打开终端,进入`src/map/`运行下面指令:
+
+```shell
+ros2 run nav2_map_server map_server --ros-args --param yaml_filename:=map/fishbot_map.yaml
+```
+
+其中`--ros-args --param yaml_filename:=map/fishbot_map.yaml`指定地图描述文件名称`.fishbot_map.yaml`。
+
+### 3.2 打开rviz2
+
+打开终端
+
+```
+rviz2
+```
+
+通过add->bytopic->选择map组件。此时你应该什么都看不到,没关系,这是正常的。
+
+### 3.3 配置并激活map_server
+
+`map_server`节点采用的是ROS2的生命周期进行编写的,除了启动节点,我们还需要手动的配置和激活节点才能使用。
+
+打开新的终端,使用下面指令进行配置:
+
+```
+ros2 lifecycle set /map_server configure
+```
+
+使用下面的指令进行激活:
+
+```
+ros2 lifecycle set /map_server activate
+```
+
+完成这一步,你应该就可以在`rviz2`中看到地图了。
+
+
+
+![image-20220514151400592](10.6%E5%AF%BC%E8%88%AA%E5%9C%B0%E5%9B%BE%E6%A6%82%E8%BF%B0/imgs/image-20220514151400592.png)
+
+
+
+将栅格数量改大,然后将Grid的cellsize改成0.05,你就可以看到我们之间建立的地图每一个栅格的占据情况了。
+
+
+
+![image-20220514193704671](10.6%E5%AF%BC%E8%88%AA%E5%9C%B0%E5%9B%BE%E6%A6%82%E8%BF%B0/imgs/image-20220514193704671.png)
+
+> 生命周期节点转换图如下:
+>
+> ![The proposed node life cycle state machine](https://design.ros2.org/img/node_lifecycle/life_cycle_sm.png)
+
+
+
+## 4.地图编辑
+
+最后我们来说一下如何对地图进行编辑,地图编辑的方法有很多,你可以手动改图片,也可以通过opencv等图像处理库进行图像的去除噪点等操作。
+
+这里小鱼介绍的是手动添加一个地图用PS进行编辑 。
+
+打开网址:https://www.gaituya.com/ps/
+
+接着点击文件打开选择我们的.pgm文件,即可看到下图。
+
+![image-20220514221803090](10.6%E5%AF%BC%E8%88%AA%E5%9C%B0%E5%9B%BE%E6%A6%82%E8%BF%B0/imgs/image-20220514221803090.png)
+
+接着小鱼将下面的正方形给补上。
+
+![edit_map](10.6%E5%AF%BC%E8%88%AA%E5%9C%B0%E5%9B%BE%E6%A6%82%E8%BF%B0/imgs/edit_map.gif)
+
+保存后在文件选择导出为`png`格式即可,因为PS并不支持`pgm`格式的导出,所以我们选择`png`格式,幸运的是`png`格式的地图也是被map_server所支持的。
+
+把导出的图片放到map文件夹下,接着我们需要修改下yaml配置文件中图片的后缀。
 
-OccupancyGrid由一个.yaml格式的元数据文件,和图片格式的地图数据文件组成。
+```
+image: fishbot_map.png
+mode: trinary
+resolution: 0.05
+origin: [-3.37, -2.88, 0]
+negate: 0
+occupied_thresh: 0.65
+free_thresh: 0.25
+```
 
+接着你可以重新运行下map_server(记得先关闭rviz2),然后看一下map是否发生了改变。
 
+## 5. 总结
 
-3.地图编辑
+本节我们主要学习了地图的相关概念以及加载和编辑的方式,下一节我们就开始正式学习Nav2导航框架。
 
 
 

BIN
docs/chapt10/10.6导航地图概述/imgs/edit_map.gif


BIN
docs/chapt10/10.6导航地图概述/imgs/image-20220514115948139.png


BIN
docs/chapt10/10.6导航地图概述/imgs/image-20220514151400592.png


BIN
docs/chapt10/10.6导航地图概述/imgs/image-20220514193704671.png


BIN
docs/chapt10/10.6导航地图概述/imgs/image-20220514221803090.png


BIN
docs/chapt10/10.6导航地图概述/imgs/life_cycle_sm-16525114060241.png


BIN
docs/chapt10/10.6导航地图概述/imgs/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3o4MjQwNzQ5ODl5,size_16,color_FFFFFF,t_70.png


+ 263 - 1
docs/chapt10/10.7Nav2导航框架介绍.md

@@ -1,4 +1,266 @@
-内容还在更新中,请关注公众号鱼香ROS,第一时间获取更新
+# 10.7 Nav2导航框架介绍
+
+上一节我们对机器人导航过程中所用到的2D地图进行了介绍,本节我们就来正式的学习下Nav2导航框架,关于Nav2相关的更多资料,请访问[Nav2中文网](https://nav2.fishros.com/)。
+
+1.Nav2是什么
+
+Nav2项目继承并发扬ROS导航栈的精神。该项目力求以安全的方式让移动机器人从A点移动到B点。Nav2也可以应用于其他应用,包括机器人导航,如下动态点跟踪,在这个过程中需要完成动态路径规划、计算电机的速度、避免障碍、恢复行为。
+
+2.Nav2如何做到的
+
+Nav2使用行为树调用模块化服务器来完成一个动作。动作可以是计算路径、控制力、恢复或任何其他与导航相关的操作。这些都是通过ROS Action服务器与行为树 (BT) 通信的独立节点。下图可以让你对Nav2的架构有一个很好的初步了解。
+
+![Navigation2框架图](10.7Nav2%E5%AF%BC%E8%88%AA%E6%A1%86%E6%9E%B6%E4%BB%8B%E7%BB%8D/imgs/architectural_diagram-16525447663514.png)
+
+小鱼再对上面的架构图进一步的进行解释,可以简单分为一大三小四个服务。
+
+一大:
+
+1. BT Navigator Server 导航行为树服务,通过这个大的服务来进行下面三个小服务组织和调用。
+
+三小:
+
+1. Planner Server,规划服务器,其任务是计算完成一些目标函数的路径。根据所选的命名法和算法,该路径也可以称为路线。说白了就是在地图上找路。
+2. Controller Server,控制服务器,在ROS 1中也被称为局部规划器,是我们跟随全局计算路径或完成局部任务的方法。说白了就是根据找的路控制机器人走路。
+3. Recovery Server,恢复服务器,恢复器是容错系统的支柱。恢复器的目标是处理系统的未知状况或故障状况并自主处理这些状况。说白了就是机器人可能出现意外的时候想办法让其正常,比如走着走着掉坑如何爬出来。
+
+通过`规划路径`、`控制机器人沿着路径运动`、`遇到问题自主恢复`三者进行不断切换完成机器人的自主导航(在这个过程还需要很多节点和数据的辅助,详建下面的组建部分)。
+
+## 3.Nav2导航相关概念
+
+该部分摘抄自Nav2中文网,中间删除了一些信息,全部文章请访问[原文页面](http://dev.nav2.fishros.com/doc/concepts/index.html)。
+
+### 3.1 动作服务器(Action Server)
+
+动作服务器在[第五章中](../chapt5/5.4ROS2_Action介绍.md)我们有简单介绍过,Nav2框架中大量的才用了这种通信方式,并将起分装成了行为树(关于行为树下面会介绍)的基础节点进行调用。
+
+通过动作服务器通信,来计算路径规划、控制机器人运动和恢复。每个动作服务器都有自己独特的 `nav2_msgs` 格式的 `.action` 类型,用于与服务器进行交互。 
+
+### 3.2 生命周期节点和绑定
+
+生命周期 (或被管理的,更正确的) 节点是ROS 2独有的。更多信息可以是 [在这里](https://design.ros2.org/articles/node_lifecycle.html) 。它们是包含状态机转换的用于加载和卸载ROS 2服务器的节点。这有助于确定ROS系统启动和关闭的状态是否正常。它还帮助用户根据实际用途(商业或调试)以合理的方式构建他们的程序。
+
+当一个节点启动时,它处于未配置状态,只处理节点的构造函数。通过启动系统或提供的生命周期管理器,需要通过配置将节点转换为非活动状态。之后,可以通过激活阶段的转换来激活节点。 
+
+要关闭(该节点)即过渡到停用需要清理、关闭,并以最终状态结束。网络接口分别在这些阶段被停用并停止处理、释放内存、干净地退出。 
+
+**生命周期节点框架在整个项目中被广泛使用,所有服务器都使用它。如果可能的话,所有ROS系统最好使用生命周期节点。** 
+
+上一节我们通过命令行来配置和激活map_server节点就是因为map_server节点采用了生命周期节点进行管理。
+
+### 3.3 行为树
+
+行为树 (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软件导航栈。 
+
+### 3.4 导航服务器
+
+规划器和控制器是导航任务的核心。恢复器用于使机器人摆脱不良状态或尝试处理各种形式的问题,以使系统具有容错能力。在本节中,将分析有关它们的一般概念及其在Nav2项目中的用途。 
+
+#### 3.4.1 规划器,控制器和恢复服务器 
+
+该项目中的三个动作服务器是规划器、恢复器和控制器服务器。这些动作服务器用于托管一个地图算法插件,以完成各种任务。它们还托管由该算法插件使用的环境表达,以计算其输出。 
+
+**规划器(Planners)**
+
+规划器的任务是计算完成一些目标函数的路径。根据所选的命名法和算法,该路径也可以称为路线。两个典型示例是计算一个到达目标位姿的规划(例如从当前位置到达一个目标位姿)或者完全覆盖(例如覆盖所有空闲空间的规划)。规划器可以访问全局环境表达和缓存在其中的传感器数据。规划器可以被编写为具有以下功能的工具: 
+
+* 计算最短路径
+* 计算完整覆盖路径 
+* 沿稀疏或预定义路线计算路径 
+
+*Nav2中规划器的一般任务是计算从当前位置到达目标位姿的一个有效且可能是最佳的路径。*
+
+**控制器 (Controllers)**
+
+控制器,在ROS 1中也被称为局部规划器,是我们跟随全局计算路径或完成局部任务的方法。控制器有权访问局部环境表达,以尝试计算要跟随的基准路径的可行控制工作。许多控制器会将机器人向前投射到空间中,并在每次更新迭代时计算局部可行路径。控制器可以被编写为具有以下功能的工具: 
+
+* 跟随路径 
+* 使用里程计坐标系中的检测器与充电站(桩)对接
+* 登上电梯
+* 与某个工具的接口 
+
+在Nav2中,控制器的一般任务是计算一个有效的控制工作以跟随全局规划路径。然而,有多个控制器类和局部规划器类。Nav2项目的目标就是所有控制器算法都可以作为此服务器中的插件,以用于一般研究和产业任务中。 
+
+**恢复器 (Recovery)**
+
+恢复器是容错系统的支柱。恢复器的目标是处理系统的未知状况或故障状况并自主处理这些状况。例子包括感知系统中会导致环境表达充满假障碍物的故障。这样就会触发清除成本地图恢复以允许机器人移动。 
+
+另一个例子就是机器人由于动态障碍物或控制不佳而卡住。在允许的情况下,倒退或原地旋转会允许机器人从卡住的位置移动到可以成功进行导航的自由空间中。 
+
+最后,在完全故障的情况下,可以实施恢复以引起操作员的注意以寻求帮助。这可以通过电子邮件、短信、Slack、Matrix等来完成。 
+
+#### 3.4.2 航点跟随 
+
+航点跟随是导航系统的基本功能之一。它会告知系统如何使用导航程序到达多个目的地。 
+
+`nav2_waypoint_follower` 软件包含一个航路点跟踪程序,该程序具有特定任务执行程序的插件接口。如果需要让机器人前往给定位姿并完成像拍照、捡起盒子或等待用户输入之类的特定任务,这会非常有用。 
+
+但是,该软件包不仅可以用于示例应用程序。关于机器人队管理器/调度器有两种思想流派:哑机器人+智能集中式调度器;智能机器人+哑集中式调度器。 
+
+在第一种思想中, `nav2_waypoint_follower` 软件包足以创造一个产品级的机器人解决方案。由于自主系统/调度器在分配任务时会考虑机器人的姿势、电池电量、当前任务等因素,机器人上的应用程序只需要关心手头的任务,而不用关心完成系统要求任务的其他复杂因素。在这种情况下,应该将发送至航点跟随者的请求视为1个工作单元(例如,仓库中的1次拣货、1个安全巡逻循环、1个过道等)来执行任务,然后返回给调度器以进行下一个任务或者要求充电。在这种思想流派中,航点跟随应用程序只是导航软件堆栈之上和系统自主应用程序之下的一个步骤。 
+
+在第二种思想中, `nav2_waypoint_follower` 软件包是一个不错的示例应用程序/概念证明,但确实需要机器人上的航点跟踪/自主系统来承担更多任务以制定健壮的解决方案。在这种情况下,应该使用 `nav2_behavior_tree` 软件包创建自定义应用程序级别的行为树,以使用导航来完成任务。这可以包含子树,例如在任务中检查充电状态以返回停泊坞,或者在更复杂的任务中处理1个以上的工作单元。很快,将会有一个 `nav2_bt_waypoint_follower` (名称有待调整),它将允许用户更容易地创建此应用程序。在这个思想流派中,航点跟随应用程序与自主系统的联系更加紧密,或者在很多情况下,航点跟随应用程序就是自主系统本身。 
+
+这两种思想流派并不能简单地说谁比谁更好,谁更好很大程度上取决于机器人正在完成何种任务、处于何种类型的环境中以及有何种可用的云资源。通常,对于既定的业务案例,这种区别非常明显。 
+
+### 3.5 状态估计
+
+根据ROS社区标准,在导航项目中,需要提供两个主要的坐标转换。 `map` 到 `odom` 的坐标变换由定位系统 (定位,建图,SLAM)提供, `odom` 到 `base_link` 的坐标转换由里程计系统提供。 
+
+注解:无需在机器人上使用LIDAR即可使用导航系统。不需要使用基于激光雷达的防撞、定位或SLAM系统。但是,Nav2确实可以提供说明和支持使用激光雷达对这些系统进行尝试和真实实现。使用基于视觉或深度传感器的定位系统和使用其他传感器来避免碰撞可以同样成功。唯一的要求就是在选择具体实现方式时遵循以下标准。 
+
+#### 标准
+
+[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 
+
+全局定位系统 (GPS、SLAM、运动捕捉) 的工作是至少提供 `map` -> `odom` 的坐标转换。Nav2项目提供的 `amcl` 是一种基于粒子过滤器的自适应蒙特卡罗定位技术,用于静态地图的定位。Nav2还提供用于定位和生成静态映射的SLAM工具箱作为默认的SLAM算法。 
+
+这些方法还可能产生其他输出,包括位置话题、地图或其他元数据,但它们必须提供该转换才能有效。使用机器人定位可以将多种定位方法融合在一起,下面将详细讨论。 
+
+### 3.7 里程计(Odometry)
+
+里程计系统的作用是提供 `odom` -> `base_link` 的坐标转换。里程计可以来自许多数据源,包括激光雷达、车轮编码器、VIO和IMU。里程计的目标是提供基于机器人运动的平滑和连续的局部坐标系。全局定位系统会相对全局坐标的坐标变换进行更新,以解决里程计的漂移问题。 
+
+这个 [Robot Localization](https://github.com/cra-ros-pkg/robot_localization/) 通常用于这种融合。它将采用各种类型的 `N` 个传感器,并为TF和话题提供连续平滑的里程计。一个典型的移动机器人装置可能有来自车轮编码器或IMU的里程计以及融合在这个工作区内的视觉。 
+
+这样平滑输出就可用于精确运动的航行位置推算和在全局位置更新之间准确地更新机器人的位置。 
+
+### 3.8 环境表达(建模)
+
+环境表征是机器人感知环境的方式。它还充当各种算法和数据源的中心定位工具,以将它们的信息组合到一个空间中。这样,控制器、规划器和恢复器就可以使用该空间来安全有效地计算它们的任务。 
+
+#### 成本地图和图层 
+
+当前的环境表达是一个成本地图。成本地图是包含来自未知、空闲、占用或膨胀成本的单元格的规则2D单元格网格。然后搜索该成本地图以计算全局计划或采样以计算局部控制工作。 
+
+各种成本地图图层被实现为pluginlib插件,以将信息缓冲到成本地图中。这包括来自LIDAR、RADAR、声纳、深度传感器、图像传感器等的信息。最好在传感器数据输入到层本地图之前进行处理,但这取决于开发人员。 
+
+可以使用相机或深度传感器创建代价地图层来检测和跟踪场景中的障碍物,以避免碰撞。此外,可以创建层来基于一些规则或启发式算法来改变基础成本图。最后,它们可用于将实时数据缓冲到2D或3D世界中,以进行障碍物的二值化标记。 
+
+#### 成本地图过滤器 
+
+想象一下,您正在注释地图文件 (或任何图像文件),以便根据注释地图中的位置执行特定操作。
+
+通过使用成本地图过滤器可以实现以下功能: 
+
+* 机器人永远不会进入的禁区/安全区。 
+* Speed restriction areas. Maximum speed of robots going inside those areas will be limited.
+* 机器人在工业环境和仓库中移动的首选通道。 
+
+#### 其他形式的环境表示
+
+存在各种其他形式的环境表征。包括: 
+
+* 梯度图,类似于成本地图,但梯度图会表达表面梯度以检查可穿越性 
+* 3D成本图,以3D形式表示空间,但这样就也需要3D规划和碰撞检测 
+* 网格图,类似于梯度图,但具有多个角度的表面网格 
+* "Vector space" ,接收传感器信息并使用机器学习算法来检测要跟踪的单个物品和位置,而不是对离散点进行缓冲区计算
+
+## 4.Nav2下载安装
+
+看完了第三节的是不是似懂非懂,接下来我们将通过实验进一步来对照着学习。
+
+Nav2的安装有两种方式,一种是通过二进制直接安装,另外一种是通过源码的方式进行安装,这里小鱼依然推荐源码的方式,毕竟我们还是要看一看Nav2的源码的。
+
+### 2.1 apt安装
+
+安装`nav2`
+
+```shell
+ sudo apt install ros-foxy-nav2-*
+```
+
+### 2.2 源码安装
+
+将下面的源码克隆到fishbot_ws的src目录下:
+
+```shell
+git clone https://ghproxy.com/https://github.com/ros-planning/navigation2.git -b foxy-devel
+```
+
+#### 安装依赖
+
+这里我们使用rosdepc进行依赖的安装,rosdepc指令找不到可以先运行下面的一键安装命令,选择一键配置rosdep即可。
+
+```shell
+wget http://fishros.com/install -O fishros && . fishros
+```
+
+接着在fishbot_ws下运行下面这个命令进行依赖的安装。
+
+```shell
+rosdepc install -r --from-paths src --ignore-src --rosdistro $ROS_DISTRO -y
+```
+
+#### 编译
+
+> 这里有一个新的命令--packages-up-to,意思是其所有依赖后再编译该包
+
+```shell
+colcon build --packages-up-to navigation2
+```
+
+### 2.3 测试是否安装成功
+
+如果是源码编译**请先source下工作空间后再使用下面指令查看**是否安装成功;
+
+```shell
+ros2 pkg list | grep navigation2
+```
+
+能看到下面的结果即可
+
+```shell
+navigation2
+```
+
+## 5.总结
+
+本节我们对Nav2进行了详细的介绍和安装,下一节我们就开始为FishBot配置Nav2,然后开始尝试让Nav2控制FIshbot自主的移动起来。
+
+
+
+--------------
+
+技术交流&&问题求助:
+
+- **微信公众号及交流群:鱼香ROS**
+- **小鱼微信:AiIotRobot**
+- **QQ交流群:139707339**
+
+- 版权保护:已加入“维权骑士”(rightknights.com)的版权保护计划
+
+3.Nav2组件及相关
+
+4.Nav2下载安装
+
+5.总结
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 
 --------------
 

BIN
docs/chapt10/10.7Nav2导航框架介绍/imgs/architectural_diagram-16525447663514.png


BIN
docs/chapt10/10.7Nav2导航框架介绍/imgs/architectural_diagram.png


+ 73 - 1
docs/chapt10/10.8为Fishbot配置Nav2.md

@@ -1,4 +1,76 @@
-内容还在更新中,请关注公众号鱼香ROS,第一时间获取更新
+# 10.8 为FishBot配置Nav2
+
+安装好了Nav2,我们开始针对我们的fishbot改变一些参数进行导航相关的参数配置。
+
+Nav2可配置的参数比起Cartographer更多,但是不要害怕,因为大多数参数我们可能不会改变。
+
+有关Nav2的更多参数介绍和详细的配置意义,可以参考**Nav2中文网配置指南**一节。
+
+## 1.创建fishbot_navigation2
+
+### 1.1创建功能包
+
+和前面在Cartographer中一样,我们需要创建一个文件夹放置配置文件、launch文件、rviz配置和地图等。
+
+进入到src目录下,使用下面指令创建功能包:
+
+```shell
+ros2 pkg create fishbot_navigation2 --dependencies nav2_bringup
+```
+
+这里我们添加了一个依赖`nav2_bringup`,后面写launch文件要用到,这里提前添加一下依赖。
+
+创建完成后的目录结构:
+
+```
+.
+├── CMakeLists.txt
+├── include
+│   └── fishbot_navigation2
+├── package.xml
+└── src
+
+3 directories, 2 files
+```
+
+### 1.2添加launch、config、map、param、rviz文件夹
+
+```
+cd src/fishbot_navigation2
+mkdir launch config maps param rviz
+```
+
+### 1.3复制地图文件
+
+将上一节的地图文件复制到map文件夹下。
+
+复制完成后`fishbot_navigation2`的文件结构如下
+
+```
+.
+├── CMakeLists.txt
+├── config
+├── launch
+├── maps
+│   ├── fishbot_map.png
+│   ├── fishbot_map.pgm
+│   ├── fishbot_map.yaml
+├── package.xml
+├── param
+└── rviz
+
+5 directories, 5 files
+```
+
+## 2.添加配置文件
+
+我们需要配置的文件是Nav2的参数文件,同样的,贴心的Nav2已经为我们准备好了参数模板:`src/navigation2/nav2_bringup/bringup/params/nav2_params.yaml`
+
+在`src/fishbot_navigation2/param/`目录下创建`fishbot_nav2.yaml`,然后将`src/navigation2/nav2_bringup/bringup/params/nav2_params.yaml`的内容复制粘贴到`fishbot_nav2.yaml`文件中。
+
+
+
+
 
 --------------
 

+ 3 - 1
docs/chapt10/10.9使用Fishbot进行自主导航.md

@@ -1,4 +1,6 @@
-内容还在更新中,请关注公众号鱼香ROS,第一时间获取更新
+# 10.9使用FishBot进行自主导航
+
+1.编写launch文件
 
 --------------