007 导航
导航
导航其实是个综合的任务,他包含了定位、全局路径规划、局部路径规划等工作
与SLAM的区别和联系
SLAM只负责建图和定位,而导航一般是在建图完毕的基础上进行的(建图完毕后有个.pgm
格式的地图,在构建全局代价地图时,需要这个地图)。在导航的过程中,其实也是离不开SLAM的(还需要使用SLAM的定位服务)
Navigation框架
ROS集成了开源的导航框架,其中比较常见的就是Navigation框架,它的架构如下:
Navigation2:
Navigation1:
从图中可以看到:
- 导航任务的输入包括:目标点、各种传感器的数据、地图、各种坐标系的TF变换关系、里程计
- 导航任务的输出包括:给电机的控制指令
关键组件
代价地图
代价地图是机器人导航和路径规划中的核心概念,主要用于表示环境中不同区域的”通行成本”或”危险程度”。它是将环境信息量化为数值网格的一种表示方法
特点:
- 网格结构:将环境划分为规则的网格单元(如5cm×5cm)
- 代价值:每个网格单元包含一个数值(通常0-255),表示通过该区域的代价
- 多层结构:通常包含静态层(固定障碍物)、动态层(移动物体)等
代价地图的分类:
- 全局代价地图:基于已知环境地图,用于全局路径规划
- 局部代价地图:基于传感器实时数据,用于局部路径中的规划避障和局部调整
代价地图的组成:
不管是全局还是局部的代价地图,都是由多个图层叠加出来的,不同图层负责处理不同类型的障碍物或代价信息
- 全局代价地图:
- Static Map Layer:静态地图层,加载预先构建的静态地图(如SLAM生成的栅格地图),表示环境中固定的障碍物(如墙壁、家具等),通常不会动态更新,除非手动重新加载地图
- Obstacle Map Layer:障碍地图层,基于实时传感器数据(如激光雷达、深度相机)检测动态或临时障碍物(如行人、移动物体),高频更新
- Inflation Layer:膨胀层,在以上两层地图上进行膨胀(向外扩张),以避免机器人的外壳会撞上障碍物
- 局部代价地图:
- Obstacle Map Layer:障碍地图层
- Inflation Layer:膨胀层
行为树
Nav2引入的组建,负责机器人各种功能的调度,比如什么时候执行全局规划,什么时候局部规划…
规划器
规划器模块主要负责的是全局路径规划,用于计算从当前位姿到达目标位姿的一个有效且可能是最佳的路径
它是基于静态地图和其实时刻传感器数据生成的从当前位置到目标位置的完整路线
控制器
控制器模块其实也是路径规划,不过负责的是局部路径规划。它没有全局地图信息,并将全局规划器输出的全局完整路线分成若干段,分别进行规划。并且在局部规划时,实时考虑当前时刻的传感器的数据,对动态的障碍进行规避。它的输出就是路径规划的真正输出:==对底盘的控制信号==
恢复器
恢复器的目标是处理系统的未知状况或故障状况并自主处理这些状况。例子包括感知系统中会导致环境表达充满假障碍物的故障。这样就会触发清除成本地图恢复以允许机器人移动
另一个例子就是机器人由于动态障碍物或控制不佳而卡住。在允许的情况下,倒退或原地旋转会允许机器人从卡住的位置移动到可以成功进行导航的自由空间中
全局定位
全局定位系统 (GPS、SLAM、运动捕捉) 的工作是至少提供 map
-> odom
的坐标转换。Nav2项目提供的 amcl
是一种基于粒子过滤器的自适应蒙特卡罗定位技术,用于静态地图的定位。Nav2还提供用于定位和生成静态映射的SLAM工具箱作为默认的SLAM算法
里程计
里程计系统的作用是提供 odom
-> base_link
的坐标转换。里程计可以来自许多数据源,包括激光雷达、车轮编码器、VIO和IMU。里程计的目标是提供基于机器人运动的平滑和连续的局部坐标系。全局定位系统会相对全局坐标的坐标变换进行更新,以解决里程计的漂移问题