Navigation 2 Logo
latest
  • 入门
    • 安装
    • 运行示例
    • 开始导航
  • 编译和安装
    • 安装
    • 编译
      • 编译已发行版本
        • 安装ROS2
        • 编译Nav2源码
      • 编译开发中的主分支
        • Build ROS 2 Main
        • 构建Nav2主程序 [校准@haisenzeng]
    • Docker
      • 通过Docker容器构建Nav2
      • 使用DockerHub已构建的容器
    • 生成Doxygen
    • 帮助
      • 构建故障排除指南 [待校准@1521]
        • 常见的Nav2依赖项构建失败 [待校准@1522]
        • 报告问题
  • 导航相关概念
    • ROS 2
      • 动作服务器(Action Server)
      • 生命周期节点和绑定
    • 行为树
    • 导航服务器
      • 规划器,控制器和恢复服务器 [校准@haisenzeng]
      • Planners
      • Controllers
      • 恢复器 [校准@haisenzeng]
      • 航点跟随 [校准@haisenzeng]
    • 状态估计
      • 标准
      • 全局定位: 定位与SLAM
      • 里程计
    • 环境表达
      • 成本地图和图层
      • 成本地图过滤器
      • Other Forms
    • Nav2学术概述
  • 首次机器人安装指南
    • Setting Up Transformations
      • 转换介绍 [待校准@1869]
      • 静态转换 Publisher(发布) 演示 [校准@songhuangong]
      • Navigation2 中的转换 [校准@songhuangong]
      • 小结 [校准@songhuangong]
    • 设置URDF
      • URDF 和 Robot State Publisher [校准@songhuangong]
      • 环境设置 [校准@songhuangong]
      • 编写URDF
      • Build 和 Launch [校准@songhuangong]
      • 使用 RVIZ 可视化 [校准@songhuangong]
      • 添加物理属性 [待校准@1951]
      • 小结 [校准@songhuangong]
    • 里程计设置
      • 里程计介绍 [校准@songhuangong]
      • 在机器人上设置里程计
      • 使用Gazebo仿真一个里程计系统 [校准@songhuangong]
        • 设置和先决条件 [校准@songhuangong]
        • 将 Gazebo 插件添加到 URDF [校准@songhuangong]
        • 启动和构建文件 [校准@songhuangong]
        • 构建、运行和验证
      • 机器人定位演示 [校准@songhuangong]
        • 配置Robot Localization [校准@songhuangong]
        • 启动和构建文件 [校准@songhuangong]
        • 构建、运行和验证
      • 小结 [校准@songhuangong]
    • 设置传感器 [待校准@1775]
      • 传感器介绍 [待校准@1778]
        • 常见传感器信息 [待校准@1784]
      • 使用Gazebo模拟传感器 [待校准@1795]
        • 将 Gazebo 插件添加到 URDF [校准@songhuangong]
        • 启动和构建文件 [校准@songhuangong]
        • 构建、运行和验证
      • 建图和定位 [待校准@1815]
      • 2D代价地图 [待校准@1822]
        • 配置nav2_costmap_2d [待校准@1826]
        • 构建、运行和验证
      • 小结 [校准@songhuangong]
    • 建立机器人的Footprint
      • Footprint介绍 [校准@songhuangong]
      • 配置机器人的Footprint [校准@songhuangong]
      • 构建、运行和验证
      • 在 RViz 可视化Footprint [校准@songhuangong]
      • 小结 [校准@songhuangong]
    • 设置导航插件
      • 规划器和控制器服务器 [待校准@1571]
      • 选择算法插件 [待校准@1577]
        • 规划服务器
        • 控制服务器
      • 小结 [校准@songhuangong]
    • 设置生命周期和组合节点
      • 生命周期
      • 组成
        • 手动合成 [校准@songhuangong]
        • 动态组合
      • 小结 [校准@songhuangong]
  • 普通教程
    • 相机标定
      • 概述
      • 要求
      • Tutorial Steps
    • 在ROS 2/Nav2中获取回溯信息 [校准@haisenzeng]
      • 概述
      • Preliminaries
      • 从一个节点进行回溯 [校准@haisenzeng]
      • 从启动文件进行回溯 [校准@haisenzeng]
      • 从Nav2 Bringup软件包中进行回溯 [校准@haisenzeng]
      • 基于系统崩溃时的自动错误回溯
    • 用实体Turtlebot3机器人导航 [待校准@1262]
      • 概述
      • 要求
      • Tutorial Steps
        • 0-设置环境变量
        • 1-运行 Turtlebot 3 [校准@小鱼]
        • 2-LaunchNav2 [待校准@1273]
        • 3-LaunchRVIZ [待校准@1283]
        • 4-初始化Turtlebot3位置 [待校准@1287]
        • 5-发送一个目标位姿 [校准@greg]
    • (SLAM) 建图时导航
      • 概述
      • 要求
      • Tutorial Steps
        • 0-启动机器人交互界面 [校准@混沌无形]
        • 1- Launch Navigation2
        • 2-启动 SLAM [校准@混沌无形]
        • 3-与SLAM合作 [待校准@1360]
        • 4-入门简化 [校准@混沌无形]
    • (STVL) 使用外部代价地图插件
      • 概述
      • 代价地图2D和STVL [待校准@1410]
      • Tutorial Steps
        • 0-设置
        • 1-安装STVL [待校准@1416]
        • 1- 修改Navigation2参数
        • 2-Launch Navigation2
        • 3- RVIZ
    • 动态对象追踪
      • 概述
      • Tutorial Steps
        • 0- Create the Behavior Tree
        • 1- 设置Rviz的点击点 [校准@混沌无形]
        • 2- 在Nav2模拟中运行动态对象跟踪 [校准@混沌无形]
    • 导航禁止区 [校准@mzebra]
      • 概述
      • 要求
      • Tutorial Steps
        • 1.准备过滤器掩码
        • 2.配置成本地图过滤器信息发布服务器 [校准@混沌无形]
        • 3.启用禁止区域过滤器 [校准@混沌无形]
        • 4.运行Nav2软件 [校准@混沌无形]
    • 导航速度限制
      • 概述
      • 要求
      • Tutorial Steps
        • 1.准备过滤器掩码
        • 2.配置成本地图过滤器信息发布服务器 [校准@混沌无形]
        • 3.启用速度过滤器 [待校准@1393]
        • 4.运行Nav2软件 [校准@混沌无形]
    • Groot与行为树互动 [待校准@1432]
      • 概述
      • 可视化行为树 [待校准@1440]
      • 编辑行为树 [待校准@1452]
      • 添加自定义节点 [待校准@1455]
    • 使用旋转微调控制器 [待校准@1463]
      • 概述
      • 什么是旋转微调控制器? [待校准@1470]
      • 配置旋转微调控制器 [待校准@1479]
      • 配置主控制器 [待校准@1488]
      • 演示执行 [待校准@1491]
  • 插件教程
    • 编写新的二维代价地图(Costmap2D)插件
      • 概述
      • 必要条件
      • 教程步骤
        • 1- 写一个新代价地图2D(Costmap2D)插件 [校准@小鱼]
        • 2-Export GradientLayer plugin [待校准@2074]
        • 3-在代价地图2D中启用插件 [待校准@2089]
        • 4-运行梯度层(GradientLayer )插件 [校准@小鱼]
    • 编写新的规划器插件
      • 概述
      • 必要条件
      • 教程步骤
        • 1创建新规划器插件
        • 2-导出planner插件
        • 3-通过params文件传递插件名称
        • 4-运行直线插件
    • 编写新的控制器插件 [待校准@2100]
      • 概述
      • 必要条件
      • 教程步骤
        • 1-创建一个新的控制器插件 [待校准@2105]
        • 2-导出控制器插件 [校准@混沌无形]
        • 3-通过params文件传递插件名称 [待校准@2142]
        • 4-运行纯追踪控制器插件 [校准@混沌无形]
    • 编写新的行为树插件 [待校准@1988]
      • 概述
      • 必要条件
      • 教程步骤
        • 1创建新BT插件 [待校准@2000]
        • 2-导出planner插件
        • 3-将插件库名称添加到配置 [待校准@2037]
        • 4运行定制插件 [待校准@2039]
    • 编写新的恢复插件 [待校准@2180]
      • 概述
      • 必要条件
      • 教程步骤
        • 1-创建一个新的恢复插件 [待校准@2182]
        • 2-导出恢复插件
        • 3-通过params文件传递插件名称
        • 4- 运行恢复插件 [校准@混沌无形]
  • 配置指南
    • 路点追踪
      • 参数
      • 提供的插件 [待校准@2604]
        • WaitAtWaypoint
        • PhotoAtWaypoint [待校准@3171]
        • InputAtWaypoint [待校准@3161]
      • 默认插件 [待校准@2885]
      • Example
    • 行为树导航器
      • 参数
      • Example
    • 行为树XML节点
      • Action插件
        • Wait [待校准@2347]
        • Spin [待校准@2331]
        • BackUp
        • ComputePathToPose [待校准@2269]
        • FollowPath [待校准@2283]
        • NavigateToPose [待校准@2300]
        • ClearEntireCostmap [待校准@2253]
        • ClearCostmapExceptRegion [待校准@2250]
        • ClearCostmapAroundRobot [待校准@2243]
        • ReinitializeGlobalLocalization [待校准@2312]
        • TruncatePath [待校准@2336]
        • PlannerSelector [待校准@2304]
        • ControllerSelector [待校准@2273]
        • GoalCheckerSelector [待校准@2290]
        • NavigateThroughPoses [待校准@2298]
        • ComputePathThroughPoses [待校准@2255]
        • RemovePassedGoals [待校准@2316]
        • CancelControl
      • 条件插件 [待校准@2569]
        • GoalReached [待校准@2357]
        • TransformAvailable [待校准@2376]
        • DistanceTraveled [待校准@2351]
        • GoalUpdated [待校准@2364]
        • GloballyUpdatedGoal
        • InitialPoseReceived [待校准@2366]
        • IsStuck [待校准@2370]
        • TimeExpired [待校准@2372]
        • IsBatteryLow [待校准@2368]
        • IsPathValid
      • 控制插件
        • PipelineSequence [待校准@2383]
        • RoundRobin [待校准@2390]
        • RecoveryNode [待校准@2385]
      • 装饰插件
        • RateController [待校准@2405]
        • DistanceController [待校准@2392]
        • SpeedController [待校准@2409]
        • GoalUpdater [待校准@2395]
      • Example
    • 2D代价地图
      • 2D代价地图的ROS参数 [待校准@2618]
      • 默认插件 [待校准@2606]
      • 插件参数 [待校准@2677]
        • 静态层参数 [待校准@2984]
        • 膨胀层参数
        • 障碍层参数 [待校准@2909]
        • 体素层参数 [待校准@2995]
        • 范围传感器参数 [待校准@2952]
      • 代价地图过滤器参数 [待校准@2678]
        • 保留过滤器参数 [待校准@2901]
        • 速度过滤器参数 [待校准@2976]
      • Example
    • 生命周期管理
      • 参数
      • Example
    • 规划器服务器
      • 参数
      • 默认插件 [待校准@2606]
      • Example
    • NavFn规划器
      • 参数
      • Example
    • Smac规划器
      • 提供的插件 [待校准@2604]
        • Smac 2D规划器 [待校准@3186]
        • Smac Hybrid-A*规划器 [待校准@3216]
        • Smac国家格规划器 [待校准@3247]
      • 描述
    • Theta星规划器
      • 参数
      • Example
    • 控制器服务器 [待校准@2573]
      • 参数
      • 提供的插件 [待校准@2604]
        • SimpleProgressChecker [待校准@3148]
        • SimpleGoalChecker [待校准@3139]
        • StoppedGoalChecker [待校准@3155]
      • 默认插件 [待校准@2606]
      • Example
    • DWB控制器
      • 控制器(Controller)
        • DWB控制器
        • XYTheta迭代器 [待校准@3073]
        • 运动学参数 [待校准@3080]
        • Publisher [待校准@3109]
      • 插件 [待校准@2682]
        • LimitedAccelGenerator [待校准@3124]
        • StandardTrajectoryGenerator [待校准@3128]
      • 轨迹评论家 [待校准@2684]
        • BaseObstacleCritic [待校准@3263]
        • GoalAlignCritic [待校准@3270]
        • GoalDistCritic [待校准@3279]
        • ObstacleFootprintCritic [待校准@3282]
        • OscillationCritic [待校准@3285]
        • PathAlignCritic [待校准@3297]
        • PathDistCritic [待校准@3300]
        • PreferForwardCritic [待校准@3302]
        • RotateToGoalCritic [待校准@3313]
        • TwirlingCritic [待校准@3322]
      • Example
    • Map Server / Saver
      • Map Saver 参数 [校准@songhuangong]
      • Map Server 参数 [校准@songhuangong]
      • 代价地图筛选器信息服务参数 [校准@songhuangong]
      • Example
    • AMCL(自适应蒙特卡洛定位)
      • 参数
      • Example
    • 恢复服务器
      • 恢复服务器参数 [待校准@2753]
      • 默认插件 [待校准@2606]
      • 自旋恢复参数 [待校准@2772]
      • 备份恢复参数 [待校准@2784]
      • Example
    • 纯追踪控制
      • 纯追踪控制参数 [待校准@2789]
      • Example
    • 旋转控制器
      • 旋转控制器参数 [待校准@2838]
      • Example
  • 调整指南
    • 膨胀潜在领域
    • 机器人Footprint与半径
    • 旋转到位行为
    • 规划器插件选择
    • 控制器插件选择 [待校准@1045]
    • Smac规划器中的缓存障碍启发式算法 [待校准@1064]
    • Nav2 Launch选项 [待校准@1068]
    • 我们希望提供的其他页面
  • Nav2行为树
    • Nav2特定节点介绍
      • 动作节点(Action)
      • Condition节点 [校准@混沌无形]
      • Decorator(装饰)节点
      • 控制(Control): 管道序列(PipelineSequence) [校准@混沌无形]
      • 控制(Control): 恢复(Recovery) [校准@混沌无形]
      • 控制(Control): 轮询(RoundRobin) [校准@混沌无形]
    • 详细的行为树演练
      • 概述
      • 前提条件
      • 通过重新规划和恢复导航到某个位姿
      • 导航子树
      • 恢复(Recovery)子树
    • 导航到点
    • 指定路点导航
    • Navigate To Pose and Replan Only if Path Invalid
    • 动态点跟随
  • 导航插件
    • 代价地图层(Costmap Layers)
    • 代价地图过滤器(Costmap Filters)
    • 控制器(Controllers)
    • 规划器(Planners)
    • 恢复(Recoveries)
    • 路点任务执行器(Waypoint Task Executors)
    • 目标检查器(Goal Checkers)
    • 进度检查器(Progress Checkers)
    • 行为树节点(Behavior Tree Nodes)
  • 迁移指南
    • Dashing到Eloquent [校准@haisenzeng]
      • 新软件包 [校准@haisenzeng]
      • New Plugins
      • 导航2架构变化 [待校准@724]
    • Eloquent到Foxy [校准@小鱼]
      • 综述 [待校准@731]
      • 服务器更新 [待校准@735]
      • New Plugins
      • 地图服务器重新工作 [待校准@765]
      • 新粒子滤波消息 [待校准@771]
      • 选择行为树每一个导航动作中 [待校准@775]
      • 后续功能 [待校准@778]
      • 新的代价地图层 [待校准@781]
    • Foxy转Galactic [待校准@783]
      • 导航Action反馈更新 [待校准@785]
      • NavigateToPose BT节点接口变化 [待校准@789]
      • NavigateThroughPoses和ComputePathThroughPosesActions添加 [待校准@792]
      • ComputePathToPose BT节点接口变化 [待校准@796]
      • ComputePathToPoseAction界面变化 [待校准@799]
      • 备份BT节点接口变化 [待校准@804]
      • 备份恢复界面变化 [待校准@806]
      • 这个Nav2控制器和目标检查插件接口变化 [待校准@808]
      • FollowPath goal_checker_id 属性 [待校准@811]
      • Groot支持 [待校准@817]
      • New Plugins
      • 代价地图过滤器 [待校准@827]
      • Smac规划器 [待校准@835]
      • ThetaStar规划器 [待校准@839]
      • 调节pureseek控制器 [待校准@842]
      • 代价地图2D current_ 的使用 [待校准@846]
      • 参数中的标准时间单位 [待校准@849]
      • 光线跟踪参数 [待校准@857]
      • 障碍标记参数 [待校准@863]
      • 恢复Action变化 [待校准@867]
      • 默认行为树变化 [待校准@869]
      • NavFn规划器参数 [待校准@871]
      • 新的清晰的代价地图异常和清晰的代价地图 [待校准@873]
      • 新行为树节点 [待校准@875]
      • 传感器 _ 消息/点云到传感器 _ 消息/点云2变化 [待校准@885]
      • 控制器服务器新参数failure_tolerance [待校准@891]
      • 已删除BT XML启动配置 [待校准@893]
      • 这个Nav2RViz面板Action反馈信息 [待校准@896]
    • Galactic到Humble [待校准@899]
      • Smac规划器的主要改进 [待校准@901]
      • 简单 (Python) 控制命令 [待校准@933]
      • 减少节点和执行程序 [待校准@936]
      • 延长BtServiceNode处理服务结果 [待校准@945]
      • 包括新旋转垫片控制器插件 [待校准@948]
      • 在Gazebo产生机器人 [待校准@954]
      • 恢复行为超时 [待校准@958]
      • 新参数 use_final_approach_orientation 3 2D规划器 [待校准@960]
      • Smac规划器2D和Theta*: 修复被忽略的目标方向 [待校准@962]
      • SmacPlanner2D、NavFn和Theta*: 修复小路径角案例 [待校准@964]
      • 动态参数变更检测的变更与修复行为 [待校准@966]
      • 动态参数 [待校准@968]
      • BTAction节点异常更改 [待校准@974]
      • BT Navigator Groot多重导航器 [待校准@976]
      • 删除运动学限制RPP [待校准@979]
      • 删除使用方法速度缩放参数在RPP [待校准@981]
      • 将AMCL运动模型重构为插件 [待校准@983]
      • 放弃对Nav2实时Groot监控的支持 [待校准@985]
      • Replanning Only if Path is Invalid
      • Fix CostmapLayer clearArea invert param logic [待校准@989]
      • Dynamic Composition [待校准@991]
      • BT Cancel Node
  • 简单控制命令API
    • 概述
    • 控制命令(Commander )API
    • 示例和演示
  • Humble工作计划
  • 参与其中
    • 参与其中
    • 流程
    • 许可
    • 开发者认证 (DCO)
  • 关于和联系
    • 相关项目 [待校准@267]
    • ROS到ROS2变化 [待校准@307]
    • 关于Nav2 [待校准@234]
    • 联系我们 [待校准@264]
  • 机器人使用
Navigation 2
Edit
  • »
  • 导航相关概念

导航相关概念

本节旨在帮助学习机器人的新手熟悉移动机器人导航的概念,尤其是了解和使用Nav2 项目所需的概念。 [校准@haisenzeng]

ROS 2

Nav2使用ROS2作为核心中间件。如果您对此不熟悉,请在继续阅读本文档前访问 ROS2文档 , 对于国内用户推荐看看小鱼的 动手学ROS2课程文档 。 [校准@小鱼]

动作服务器(Action Server)

动作服务器就像在ROS中一样是控制导航等长时间运行任务的常见方式。Nav2软件堆栈更广泛地使用动作(通信机制),并且在某些情况下会缺乏简单的话题接口。作为ROS 2的开发人员,了解动作服务器尤为重要。一些简单的机器人命令(CLI)示例可以在 ROS 2 documementation 中找到。 [校准@haisenzeng]

这个Action服务器类似于服务通信中的Service。客户端会要求服务端完成一些任务,但此任务可能需要很长时间。比如说:移动推土机的铲子或者让机器人向右移动10米。 [校准@小鱼]

在这种情况下,动作服务器和客户端允许我们在另一个进程或线程中调用长时间运行的任务,并为其结果返回一个future对象。此时允许阻塞线程直到动作完成,但是,用户可能希望偶尔检查动作是否完成并继续在客户端线程中处理工作。由于是长时间运行的,动作服务器也会向其客户端提供反馈。该反馈可以是任何东西,并且在ROS中使用具有请求和结果类型的.action文件定义。在推土机示例中,请求可以是一个角度,反馈可以是要移动的剩余角度,而结果则是以结束角度表示的成功或失败的布尔值。在导航示例中,请求可能是一个位姿,反馈可能是已导航的时间和到达目标位姿的距离,而结果则是以成功或失败表示的布尔值。 [校准@haisenzeng]

通过向Action客户端注册回调函数,可以同步的收到反馈和结果。它们也可以通过无意识地从shared future对象中的require信息来获取。两者都需要对客户端节点进行spin来处理回调组。 [校准@小鱼]

在Nav2软件堆栈中使用动作服务器通过 NavigateToPose 动作消息与最高级别的行为树BT导航仪(Navigator)进行通信。它们还用于行为树BT导航仪与后续较小的动作服务器通信,以计算路径规划、控制工作和恢复。每个动作服务器都有自己独特的 nav2_msgs 格式的 .action 类型,用于与服务器进行交互。 [校准@haisenzeng]

生命周期节点和绑定

生命周期 (或被管理的,更正确的) 节点是ROS 2独有的。更多信息可以是 在这里 。它们是包含状态机转换的用于加载和卸载ROS 2服务器的节点。这有助于确定ROS系统启动和关闭的状态是否正常。它还帮助用户根据实际用途(商业或调试)以合理的方式构建他们的程序, [校准@小鱼]

当一个节点启动时,它处于未配置状态,只处理节点的构造函数,该构造函数不应包含任何 ROS 网络设置或参数读取。通过启动系统或提供的生命周期管理器,需要通过配置将节点转换为非活动状态。之后,可以通过激活阶段的转换来激活节点。 [校准@haisenzeng]

这种状态将允许节点处理信息,并完全设置为运行状态。在配置阶段,触发 on_configure() 方法,将设置所有参数、ROS网络接口,以及安全系统,所有动态内存的分配。在激活阶段、触发 on_activate() 方法的将激活ROS网络接口,并设置程序中的任何状态以开始处理信息。 [校准@小鱼]

要关闭(该节点)即过渡到停用需要清理、关闭,并以最终状态结束。网络接口分别在这些阶段被停用并停止处理、释放内存、干净地退出。 [校准@haisenzeng]

生命周期节点框架在整个项目中被广泛使用,所有服务器都使用它。如果可能的话,所有ROS系统最好使用生命周期节点。 [校准@小鱼]

在Nav2中,我们使用 nav2_util LifecycleNode 的包装器。这种包装包装了典型应用的生命周期节点的许多复杂性。它还包括生命周期管理器的连接 bond ,以确保服务器转换后,它也保持活动状态。如果服务器崩溃,它会让生命周期管理器知道并向下过渡系统,以防止严重故障。详见 Eloquent到Foxy [校准@小鱼] 。 [校准@haisenzeng]

行为树

行为树 (BT) 在复杂的机器人任务中变得越来越普遍。它们是待完成任务的树形结构。行为树为定义多步或多状态应用程序创建了一个更具可扩展性和人类可理解性的框架。这与有限状态机 (FSM) 相反,后者可能有几十个状态和数百个状态过渡。一个例子就是踢足球机器人。将足球比赛的逻辑嵌入FSM将具有挑战性,且容易出错因为有许多可能的状态和规则。此外,像从左侧、右侧或中间射门这样的建模选择尤其不清楚。使用行为树则可以为许多行为创建和重用基本原语,像 "kick" "walk" "go to ball" 。更多信息可以在 这本书 找到。强烈建议阅读第1-3章,以更好地理解术语和工作流程。大约需要30分钟。 [校准@小鱼]

Nav2项目使用 BehaviorTree CPP V3 作为行为树库。在 BT Navigator 中,创建了可以构建为行为树的节点插件。将节点插件加载到BT中,并且在解析该行为树的XML文件时,将关联注册的名称。此时,我们可以通过该行为树进行导航。 [校准@haisenzeng]

使用此库的一个原因是它能够加载子树。这意味着可以将Nav2行为树加载到另一个更高级别的BT中,以将此项目用作节点插件。一个例子是在足球比赛中,使用Nav2行为树作为 "go to ball" 节点,将足球检测作为更大任务的一部分。此外,为BT提供了一个 NavigateToPoseAction 插件,因此可以从客户端应用程序通过通常的动作接口调用Nav2软件堆栈。 [校准@haisenzeng]

导航服务器

规划器和控制器是导航任务的核心。恢复器用于使机器人摆脱不良状态或尝试处理各种形式的问题,以使系统具有容错能力。在本节中,将分析有关它们的一般概念及其在Nav2项目中的用途。 [校准@haisenzeng]

规划器,控制器和恢复服务器 [校准@haisenzeng]

该项目中的三个动作服务器是规划器、恢复器和控制器服务器。这些动作服务器用于托管一个地图算法插件,以完成各种任务。它们还托管由该算法插件使用的环境表达,以计算其输出。 [校准@haisenzeng]

这个规划器和控制器服务器将在运行时配置名称 (别名) 和要使用的算法类型。这些类型是已注册的插件库名称,这些名称是任务的别名。一个例子是使用名称为 FollowPath 的DWB控制器,因为它遵循参考路径。在这种情况下,DWB的所有参数都将放置在该命名空间中,例如 FollowPath.<param> 。 [校准@haisenzeng]

然后,这两个服务器会公开与其任务相对应的操作接口。当行为树勾选相应的BT节点时,它将调用操作服务器来处理其任务。该服务器内部的动作服务器回调将通过映射到特定算法的名称 (例如 FollowPath ) 来调用所选算法。这允许用户将行为树中使用的算法抽象为算法类。例如,你可以让 N 插件控制器跟随路径,与充电器对接,避开动态障碍物,或与某个工具进行交互。在同一服务器中拥有所有这些插件允许用户使用单个环境表达对象,因为该对象的复制成本很高。 [校准@haisenzeng]

对于恢复服务器,每个恢复也包含自己的名称,但是,每个插件也将公开其自己的特殊操作服务器。这样做是因为可以创建的各种恢复动作无法共享单个简单的接口。恢复器服务器还包含一个订阅本地成本地图的成本地图订阅者节点,该节点会从控制器服务器接收实时更新以计算其任务。这样做是为了避免为本地成本地图创建多个实例,因为复制本地成本地图在计算上是昂贵的。 [校准@haisenzeng]

或者,由于BT节点是调用操作的简单插件,因此可以创建新的BT节点来调用具有其他操作类型的其他动作服务器。如果可能的话,建议始终使用提供的服务器。如果由于插件或动作接口的原因,需要一个新的服务器,则可以通过该框架来维持。类似于提供的服务器,新服务器应使用新类型和插件接口。需要创建一个新的BT节点插件来调用新的操作服务器 -- 然而,通过广泛使用服务器和插件,Nav2存储库本身不需要分叉或修改。 [校准@haisenzeng]

如果您发现需要一个新的插件库定义或动作类型接口,请提交工单,看看我们是否可以在相同的接口中纠正它。 [校准@haisenzeng]

Planners

规划器的任务是计算完成一些目标函数的路径。根据所选的命名法和算法,该路径也可以称为路线。两个典型示例是计算一个到达目标位姿的规划(例如从当前位置到达一个目标位姿)或者完全覆盖(例如覆盖所有空闲空间的规划)。规划器可以访问全局环境表达和缓存在其中的传感器数据。规划器可以被编写为具有以下功能的工具: [校准@haisenzeng]

  • 计算最短路径

  • 计算完整覆盖路径 [待校准@34]

  • 沿稀疏或预定义路线计算路径 [校准@haisenzeng]

Nav2中规划器的一般任务是计算从当前位置到达目标位姿的一个有效且可能是最佳的路径。但是,有许多受支持的规划类和路线类。 [校准@haisenzeng]

Controllers

控制器,在ROS 1中也被称为局部规划器,是我们跟随全局计算路径或完成局部任务的方法。控制器有权访问局部环境表达,以尝试计算要跟随的基准路径的可行控制工作。许多控制器会将机器人向前投射到空间中,并在每次更新迭代时计算局部可行路径。控制器可以被编写为具有以下功能的工具: [校准@haisenzeng]

  • 跟随路径 [校准@haisenzeng]

  • 使用里程作为与充电桩对接时的参考数据 [校准@小鱼]

  • 登上电梯

  • 与某个工具的接口 [校准@haisenzeng]

在Nav2中,控制器的一般任务是计算一个有效的控制工作以跟随全局规划路径。然而,有多个控制器类和局部规划器类。Nav2项目的目标就是所有控制器算法都可以作为此服务器中的插件,以用于一般研究和产业任务中。 [校准@haisenzeng]

恢复器 [校准@haisenzeng]

恢复器是容错系统的支柱。恢复器的目标是处理系统的未知状况或故障状况并自主处理这些状况。例子包括感知系统中会导致环境表达充满假障碍物的故障。这样就会触发清除成本地图恢复以允许机器人移动。 [校准@haisenzeng]

另一个例子就是机器人由于动态障碍物或控制不佳而卡住。在允许的情况下,倒退或原地旋转会允许机器人从卡住的位置移动到可以成功进行导航的自由空间中。 [校准@haisenzeng]

最后,在完全故障的情况下,可以实施恢复以引起操作员的注意以寻求帮助。这可以通过电子邮件、短信、Slack、Matrix等来完成。 [校准@小鱼]

航点跟随 [校准@haisenzeng]

航点跟随是导航系统的基本功能之一。它会告知系统如何使用导航程序到达多个目的地。 [校准@haisenzeng]

nav2_waypoint_follower 软件包含一个航路点跟踪程序,该程序具有特定任务执行程序的插件接口。如果需要让机器人前往给定位姿并完成像拍照、捡起盒子或等待用户输入之类的特定任务,这会非常有用。这是一个用于展示如何在示例应用程序中使用Nav2的不错的演示应用程序。 [校准@haisenzeng]

但是,该软件包不仅可以用于示例应用程序。关于机器人队管理器/调度器有两种思想流派:哑机器人+智能集中式调度器;智能机器人+哑集中式调度器。 [校准@haisenzeng]

在第一种思想中, nav2_waypoint_follower 软件包足以创造一个产品级的机器人解决方案。由于自主系统/调度器在分配任务时会考虑机器人的姿势、电池电量、当前任务等因素,机器人上的应用程序只需要关心手头的任务,而不用关心完成系统要求任务的其他复杂因素。在这种情况下,应该将发送至航点跟随者的请求视为1个工作单元(例如,仓库中的1次拣货、1个安全巡逻循环、1个过道等)来执行任务,然后返回给调度器以进行下一个任务或者要求充电。在这种思想流派中,航点跟随应用程序只是导航软件堆栈之上和系统自主应用程序之下的一个步骤。 [校准@haisenzeng]

在第二种思想中, nav2_waypoint_follower 软件包是一个不错的示例应用程序/概念证明,但确实需要机器人上的航点跟踪/自主系统来承担更多任务以制定健壮的解决方案。在这种情况下,应该使用 nav2_behavior_tree 软件包创建自定义应用程序级别的行为树,以使用导航来完成任务。这可以包含子树,例如在任务中检查充电状态以返回停泊坞,或者在更复杂的任务中处理1个以上的工作单元。很快,将会有一个 nav2_bt_waypoint_follower (名称有待调整),它将允许用户更容易地创建此应用程序。在这个思想流派中,航点跟随应用程序与自主系统的联系更加紧密,或者在很多情况下,航点跟随应用程序就是自主系统本身。 [校准@haisenzeng]

这两种思想流派并不能简单地说谁比谁更好,谁更好很大程度上取决于机器人正在完成何种任务、处于何种类型的环境中以及有何种可用的云资源。通常,对于既定的业务案例,这种区别非常明显。 [校准@haisenzeng]

状态估计

根据ROS社区标准,在导航项目中,需要提供两个主要的坐标转换。 map 到 odom 的坐标变换由定位系统 (定位,建图,SLAM)提供, odom 到 base_link 的坐标转换由里程计系统提供。 [校准@haisenzeng]

备注

无需在机器人上使用LIDAR即可使用导航系统。不需要使用基于激光雷达的防撞、定位或SLAM系统。但是,Nav2确实可以提供说明和支持使用激光雷达对这些系统进行尝试和真实实现。使用基于视觉或深度传感器的定位系统和使用其他传感器来避免碰撞可以同样成功。唯一的要求就是在选择具体实现方式时遵循以下标准。 [校准@haisenzeng]

标准

REP 105 定义了导航和更大的ROS生态系统所需的框架和约定。应始终遵循这些约定,以利用社区中丰富的定位、里程计和SLAM项目。 [校准@haisenzeng]

简而言之,REP-105至少必须为机器人建造一个包含``map`` -> odom -> base_link -> [sensor frames] 的完整 的TF树。TF2是 ROS 2中的时变坐标变换库,Nav2使用TF2来表达和获取时间同步的坐标变换。全球定位系统 (GPS、SLAM、动作捕捉Motion Capture) 的工作是至少要提供 map -> odom 的坐标转换。然后,里程计系统的作用是提供 odom -> base_link 的坐标转化。关于 base_link 的其余坐标转换应该是静态的,并应在 URDF 中定义。 [校准@haisenzeng]

全局定位: 定位与SLAM

全局定位系统 (GPS、SLAM、运动捕捉) 的工作是至少提供 map -> odom 的坐标转换。Nav2项目提供的 amcl 是一种基于粒子过滤器的自适应蒙特卡罗定位技术,用于静态地图的定位。Nav2还提供用于定位和生成静态映射的SLAM工具箱作为默认的SLAM算法。 [校准@haisenzeng]

这些方法还可能产生其他输出,包括位置话题、地图或其他元数据,但它们必须提供该转换才能有效。使用机器人定位可以将多种定位方法融合在一起,下面将详细讨论。 [校准@小鱼]

里程计

里程计系统的作用是提供 odom -> base_link 的坐标转换。里程计可以来自许多数据源,包括激光雷达、车轮编码器、VIO和IMUs。里程计的目标是提供基于机器人运动的平滑和连续的局部坐标系。全局定位系统会相对全局坐标的坐标变换进行更新,以解决里程计的漂移问题。 [校准@haisenzeng]

这个 Robot Localization 通常用于这种融合。它将采用各种类型的 N 个传感器,并为TF和话题提供连续平滑的里程计。一个典型的移动机器人装置可能有来自车轮编码器或IMUs的里程计以及融合在这个工作区内的视觉。 [校准@haisenzeng]

这样平滑输出就可用于精确运动的航行位置推算和在全局位置更新之间准确地更新机器人的位置。 [校准@haisenzeng]

环境表达

环境表征是机器人感知环境的方式。它还充当各种算法和数据源的中心定位工具,以将它们的信息组合到一个空间中。这样,控制器、规划器和恢复器就可以使用该空间来安全有效地计算它们的任务。 [校准@haisenzeng]

成本地图和图层

当前的环境表达是一个代价地图。代价地图是包含来自未知、空闲、占用或膨胀成本的单元格的规则2D单元格网格。然后该代价地图被寻找以计算全局计划或采样以计算局部控制工作。 [校准@BruceXing]

各种成本地图图层被实现为pluginlib插件,以将信息缓冲到成本地图中。这包括来自LIDAR、RADAR、声纳、深度传感器、图像传感器等的信息。最好在传感器数据输入到层本地图之前进行处理,但这取决于开发人员。 [校准@haisenzeng]

可以使用相机或深度传感器创建代价地图层来检测和跟踪场景中的障碍物,以避免碰撞。此外,可以创建层来基于一些规则或启发式算法来改变基础成本图。最后,它们可用于将实时数据缓冲到2D或3D世界中,以进行障碍物的二值化标记。 [校准@haisenzeng]

成本地图过滤器

想象一下,您正在注释地图文件 (或任何图像文件),以便根据注释地图中的位置执行特定操作。记/注释的示例可以是将某些区域排除在外以避免在这些区域内进行路径规划,或者让某些像素属于标记区域中的最大速度。这种带注释的地图被称为 "filter mask" 。就像覆盖在某个表面上的掩码一样,过滤器掩码的大小、位置和比例尺可以与主地图相同,也可以不同。过滤器掩码的主要目标是提供在地图上进行标记的能力,以标记具有某些附加功能或行为变化的区域。 [校准@haisenzeng]

代价地图过滤器是基于成本地图图层的方法,可以将过滤器掩码中注释的空间相关行为变化应用到Nav2软件堆栈中。代价地图过滤器是作为成本地图插件实现的。这些插件之所以被称为 "filters" ,是因为它们会通过过滤器掩码上标记的空间注释对代价地图进行过滤。为了制作过滤后的成本地图并改变机器人在注释区域的行为,过滤器插件会读取来自过滤器掩码的数据。该数据在过滤器空间中被线性变换为特征图。有了这个变换后的特征图以及地图/代价地图、任何传感器数据和机器人当前坐标,过滤器就可以更新底层代价地图,并根据机器人的位置改变机器人的行为。例如,通过使用代价地图过滤器可以实现以下功能: [校准@albert]

  • 机器人永远不会进入的禁区域/安全区域。 [校准@小鱼]

  • Speed restriction areas. Maximum speed of robots going inside those areas will be limited.

  • 机器人在工业环境和仓库中移动的首选通道。 [校准@haisenzeng]

Other Forms

存在各种其他形式的环境表征。包括: [校准@haisenzeng]

  • 梯度图,类似于成本地图,但梯度图会表达表面梯度以检查可穿越性 [校准@haisenzeng]

  • 3D代价地图,以3D形式表示空间,但这样就也需要3D规划和碰撞检测 [校准@小鱼]

  • 网格图,类似于梯度图,但具有多个角度的表面网格 [校准@haisenzeng]

  • "Vector space" ,接收传感器信息并使用机器学习算法来检测要跟踪的单个物品和位置,而不是对离散点进行缓冲区计算。。 [校准@haisenzeng]

Nav2学术概述


© 版权所有 2020.