Nav2 Logo
  • 入门指南
    • 安装步骤
    • 运行示例
    • 导航
  • 开发指南
    • 构建与安装
      • 安装
      • 构建
        • 已发布的分发二进制文件
        • 滚动开发源
        • Docker 容器镜像
      • 生成 Doxygen
      • 帮助
        • Build Troubleshooting Guide
    • 开发容器
      • Dev 容器指南
        • 创建 Dev 容器
        • 使用开发容器
      • 什么是、为什么和如何?
        • 什么是开发容器?
        • 为什么使用开发容器?
        • 开发容器是如何工作的?
      • 前提条件
      • 入门
      • 安全
    • 参与其中
      • 参与
      • 流程
      • 许可
      • 开发者原产地证书 (DCO)
  • 导航概念
    • ROS 2
      • Action Server
      • 生命周期节点和绑定
    • 行为树
    • 导航服务器
      • 规划器、控制器、平滑器和恢复服务器
      • 规划
      • 控制器
      • 行为
      • 平滑器
      • 机器人足迹
      • 航点跟踪
    • 状态估计
      • 标准
      • 全球定位:定位和 SLAM
      • 里程计
    • 环境表示
      • 成本图和图层
      • Costmap Filters
      • 其他形式
    • Nav2学术概况
  • 首次机器人设置指南
    • 设置转换
      • 变换简介
      • 静态变换发布器演示
      • Navigation2 中的变换
      • 结论
    • 设置 URDF
      • URDF 和机器人状态发布器
      • 设置环境
      • 编写 URDF
      • 构建和启动
      • 使用 RVIZ 进行可视化
      • 添加物理属性
      • 结论
    • 设置里程计
      • 里程表简介
      • 在您的机器人上设置里程计
      • 使用 Gazebo 模拟里程计系统
        • 设置和先决条件
        • 将 Gazebo 插件添加到 URDF
        • 启动和构建文件
        • 构建、运行和验证
      • 机器人定位演示
        • 配置机器人定位
        • 启动和构建文件
        • 构建、运行和验证
      • 结论
    • 设置传感器
      • 传感器介绍
        • 常见传感器消息
      • 使用 Gazebo 模拟传感器
        • 将 Gazebo 插件添加到 URDF
        • 启动和构建文件
        • 构建、运行和验证
      • 地图绘制和定位
      • Costmap 2D
        • Configuring nav2_costmap_2d
        • 构建、运行和验证
      • 结论
    • 设置机器人的足迹
      • 足迹介绍
      • 配置机器人的足迹
      • 构建、运行和验证
      • 在 RViz 中可视化足迹
      • 结论
    • 设置
      • 计划器和控制器服务器
      • 选择算法插件
        • 规划服务器
        • 控制服务器
      • 结论
  • 机器人使用
  • 常规教程
    • 使用物理 Turtlebot 3 进行导航
      • 概述
      • 要求
      • 教程步骤
        • 0- 设置环境变量
        • 1- 启动 Turtlebot 3
        • 2- 启动 Nav2
        • 3- 启动 RVIZ
        • 5- 发送目标姿势
    • (SLAM)边导航边建图
      • 概述
      • 要求
      • 教程步骤
        • 0- 启动机器人接口
        • 1- 启动 Navigation2
        • 2- 启动 SLAM
        • 3- 使用 SLAM
        • 4- 入门简化
    • (STVL)使用外部 Costmap 插件
      • 概述
      • Costmap2D and STVL
      • 教程步骤
        • 0- 设置
        • 1- 安装STVL
        • 1- 修改Navigation2参数
        • 2- 启动 Navigation2
        • 3- RVIZ
    • 使用 GPS 定位导航
      • 概述
      • 要求
      • GPS 定位概述
      • 教程步骤
        • 0- 设置 Gazebo World
        • 1- 设置 GPS 定位系统
        • 2- 设置导航系统
        • 3- 交互式 GPS 航点跟随器
        • 4- 记录 GPS 航点跟随器和航点记录
      • 结论
    • Groot - 与行为树交互
      • 概述
      • 可视化行为树
      • 编辑行为树
      • 添加自定义节点
    • 使用 VIO 增强机器人里程计
      • 概述
      • 设置 ZED X 相机
      • 设置 ZED ROS
      • 将 VIO 融合到本地状态估计中
        • 将 VSLAM 融合到全局状态估计中
      • 测试一下!
    • 动态物体跟踪
      • 概述
      • 教程步骤
        • 0- 创建行为树
        • 1- 设置Rviz点击点
        • 2- 在 Nav2 模拟中运行动态对象跟踪
    • 使用禁区导航
      • 概述
      • 要求
      • 教程步骤
        • 1. 准备过滤口罩
        • 2. 配置 Costmap 过滤器信息发布服务器
        • 3. 启用禁止访问过滤器
        • 4. 运行 Nav2 堆栈
    • 限速导航
      • 概述
      • 要求
      • 教程步骤
        • 1. 准备过滤面罩
        • 2. 配置 Costmap 过滤器信息发布服务器
        • 3. 启用速度过滤器
        • 4. 运行 Nav2 堆栈
    • 使用对接服务器
      • 概述
      • 要求
      • 充电底座插件
      • 码头数据库
      • 配置对接服务器
      • 添加对接服务器以启动
      • Docking Action API
      • 综合起来
    • 使用旋转垫片控制器
      • 概述
      • 什么是旋转垫片控制器?
      • 配置旋转垫片控制器
      • 配置主控制器
      • 演示执行
    • 为 BT 添加平滑器
      • 概述
      • 要求
      • 教程步骤
        • 0-熟悉 Smoother BT 节点
        • 1- 指定更平滑的插件
        • 2- 修改您的 BT XML
    • 使用碰撞监视器
      • 概述
      • 要求
      • 配置碰撞监视器
      • 使用速度多边形配置碰撞监视器
      • Preparing Nav2 stack
      • 演示执行
    • 添加新的 Nav2 任务服务器
      • 生命周期节点
      • 作品
      • 错误代码
      • 结论
    • 过滤噪声引起的障碍物
      • 概述
      • 要求
      • 教程步骤
        • 1. 启用降噪层
        • 2. 运行 Nav2 堆栈
      • 工作原理
    • 相机校准
      • 概述
      • 要求
      • 教程步骤
    • 在 ROS 2/Nav2 中获取 Backtrace
      • 概述
      • 预赛
      • From a Node
      • 从启动文件
      • 来自大型项目
      • 来自 Nav2 启动
      • 崩溃时自动回溯
    • ROS 2 / Nav2 中的分析
      • 概述
      • 预赛
      • 来自节点的配置文件
      • 来自启动文件的配置文件
      • 来自 Nav2 启动
      • 解释结果
    • Docker 开发:从零到英雄
      • 概述
      • 预赛
      • 重要的 Docker 命令
      • 探索你的第一个容器
      • 了解 ROS Docker 镜像
      • 对于基于 Docker 的开发
        • 树立发展形象
        • 来自 Docker 的可视化
      • 对于基于 Docker 的部署
      • 结论
      • 附录
        • Nav2 开发图像
        • Nav2 部署图像
  • 插件教程
    • 编写新的 Costmap2D 插件
      • 概述
      • 要求
      • 教程步骤
        • 1-编写一个新的 Costmap2D 插件
        • 2- 导出并制作 GradientLayer 插件
        • 3- 在 Costmap2D 中启用插件
        • 4- 运行 GradientLayer 插件
    • 编写新的 Planner 插件
      • 概述
      • 要求
      • 教程步骤
        • 1- 创建一个新的 Planner 插件
        • 2- 导出规划器插件
        • 3-通过 params 文件传递​​插件名称
        • 4- 运行 StraightLine 插件
    • 编写新的控制器插件
      • 概述
      • 要求
      • 教程步骤
        • 1- 创建一个新的控制器插件
        • 2- 导出控制器插件
        • 3- 通过 params 文件传递​​插件名称
        • 4- 运行 Pure Pursuit Controller 插件
    • 编写新的行为树插件
      • 概述
      • 要求
      • 教程步骤
        • 1- 创建新的 BT 插件
        • 2- 导出规划器插件
        • 3- 将插件库名称添加到配置中
        • 4- 运行您的自定义插件
    • 编写新的行为插件
      • 概述
      • 要求
      • 教程步骤
        • 1-创建一个新的行为插件
        • 2- 导出行为插件
        • 3-通过 params 文件传递​​插件名称
        • 4- 运行行为插件
    • 编写新的导航器插件
      • 概述
      • 要求
      • 教程步骤
        • 1- 创建一个新的导航器插件
        • 2- 导出导航器插件
        • 3-通过 params 文件传递​​插件名称
        • 4-运行插件
  • 配置指南
    • 行为树导航器
      • 参数
      • Example
    • 行为树 XML 节点
      • 动作插件
        • Wait
        • Spin
        • BackUp
        • DriveOnHeading
        • AssistedTeleop
        • ComputePathToPose
        • FollowPath
        • NavigateToPose
        • ClearEntireCostmap
        • ClearCostmapExceptRegion
        • ClearCostmapAroundRobot
        • ReinitializeGlobalLocalization
        • TruncatePath
        • TruncatePathLocal
        • PlannerSelector
        • ControllerSelector
        • SmootherSelector
        • GoalCheckerSelector
        • ProgressCheckerSelector
        • NavigateThroughPoses
        • ComputePathThroughPoses
        • ComputeCoveragePath
        • CancelCoverage
        • RemovePassedGoals
        • RemoveInCollisionGoals
        • CancelControl
        • CancelBackUp
        • CancelSpin
        • CancelWait
        • CancelDriveOnHeading
        • CancelAssistedTeleop
        • SmoothPath
        • GetPoseFromPath
        • DockRobot
        • UndockRobot
      • 条件插件
        • GoalReached
        • TransformAvailable
        • DistanceTraveled
        • GoalUpdated
        • GloballyUpdatedGoal
        • InitialPoseReceived
        • IsStuck
        • TimeExpired
        • IsBatteryLow
        • IsPathValid
        • PathExpiringTimer
        • AreErrorCodesPresent
        • WouldAControllerRecoveryHelp
        • WouldAPlannerRecoveryHelp
        • WouldASmootherRecoveryHelp
        • IsBatteryCharging
      • 控制插件
        • PipelineSequence
        • RoundRobin
        • RecoveryNode
      • 装饰器插件
        • RateController
        • DistanceController
        • SpeedController
        • GoalUpdater
        • PathLongerOnApproach
        • SingleTrigger
      • 例子
    • Costmap 2D
      • Costmap2D ROS参数
      • Default Plugins
      • 插件参数
        • Static Layer Parameters
        • Inflation Layer Parameters
        • Obstacle Layer Parameters
        • Voxel Layer Parameters
        • Range Sensor Parameters
        • Denoise Layer Parameters
      • 代价地图过滤器参数
        • Keepout Filter Parameters
        • Speed Filter Parameters
        • Binary Filter Parameters
      • 例子
    • 生命周期 Manager
      • 参数
      • Example
    • 规划服务器
      • 参数
      • Default Plugins
      • Example
    • Coverage Server
      • 参数
      • Example
    • NavFn Planner
      • Parameters
      • Example
    • Smac Planner
      • 提供的插件
        • Smac 2D Planner
        • Smac Hybrid-A* Planner
        • Smac State Lattice Planner
      • 描述
    • Theta Star Planner
      • 参数
      • Example
    • Controller Server
      • 参数
      • Provided Plugins
        • SimpleProgressChecker
        • PoseProgressChecker
        • SimpleGoalChecker
        • StoppedGoalChecker
      • Default Plugins
      • Example
    • DWB Controller
      • Controller
        • DWB Controller
        • XYTheta Iterator
        • Kinematic Parameters
        • Publisher
      • Plugins
        • LimitedAccelGenerator
        • StandardTrajectoryGenerator
      • Trajectory Critics
        • BaseObstacleCritic
        • GoalAlignCritic
        • GoalDistCritic
        • ObstacleFootprintCritic
        • OscillationCritic
        • PathAlignCritic
        • PathDistCritic
        • PreferForwardCritic
        • RotateToGoalCritic
        • TwirlingCritic
      • Example
    • Regulated Pure Pursuit
      • 受监管的纯追踪参数
      • Example
    • Model Predictive Path Integral Controller
      • MPPI 参数
        • 轨迹可视化
        • 路径处理器
        • 阿克曼运动模型
        • 限制性批评家
        • 目标角度评论家
        • Goal Critic
        • Obstacles Critic
        • Cost Critic
        • Path Align Critic
        • Path Angle Critic
        • Path Follow Critic
        • Prefer Forward Critic
        • Twirling Critic
        • Velocity Deadband Critic
      • Example
      • Notes to Users
        • General Words of Wisdom
        • Prediction Horizon, Costmap Sizing, and Offsets
        • Obstacle, Inflation Layer, and Path Following
    • Rotation Shim Controller
      • 旋转垫片控制器参数
      • Example
    • Graceful Controller
      • 优雅控制器参数
      • Example
    • Map Server / Saver
      • 地图保护程序参数
      • Map Server Parameters
      • Costmap Filter Info Server Parameters
      • Example
    • AMCL
      • Parameters
      • Example
    • Behavior Server
      • 行为服务器参数
      • Default Plugins
      • 自旋行为参数
      • 备份行为参数
      • DriveOnHeading Behavior Parameters
      • AssistedTeleop 行为参数
      • Example
    • 更流畅的服务器
      • 更平滑的服务器参数
      • Example
    • Simple Smoother
      • 简单平滑器参数
      • Example
    • Savitzky-Golay Smoother
      • Savitzky-Golay 平滑器参数
      • Example
    • Constrained smoother
      • 更平滑的服务器参数
      • Example
    • Velocity Smoother
      • 速度平滑器参数
      • Example
    • 碰撞监测
      • 提供的节点
        • Collision Monitor Node
        • Collision Detector Node
    • Waypoint Follower
      • 参数
      • 提供的插件
        • WaitAtWaypoint
        • PhotoAtWaypoint
        • InputAtWaypoint
      • 默认插件
      • Example
    • Loopback Simulator
      • 参数
      • Example
    • Docking Server
      • 参数
      • SimpleChargingDock 参数
      • Example
  • 调优指南
    • 通货膨胀势场
    • 机器人占地面积与半径
    • 原地旋转行为
    • 规划器插件选择
    • 控制器插件选择
    • 在 Smac 规划器中缓存障碍启发式方法
    • Costmap2D插件
    • Nav2 启动选项
    • 我们很乐意提供的其他页面
  • Nav2 行为树
    • 简介
      • 动作节点
      • 条件节点
      • 装饰节点
      • 控制:PipelineSequence
      • 控制:恢复
      • 控制:循环赛
    • 行为树详细演练
      • 概述
      • 先决条件
      • 通过重新规划和恢复导航至姿势
      • 导航子树
      • 恢复子树
    • 导航至目的地
    • Navigate Through Poses
    • 导航至姿势并在目标障碍附近暂停
    • 如果路径无效,则通过一致的重新规划导航到姿势
    • 跟随动态点
    • 里程校准
  • 导航插件
    • 行为树导航器
    • Costmap Layers
    • Costmap Filters
    • Controllers
    • Planners
    • Smoothers
    • Behaviors
    • Waypoint Task Executors
    • Goal Checkers
    • Progress Checkers
    • Behavior Tree Nodes
  • 迁移指南
    • Dashing to Eloquent
      • 新软件包
      • 新插件
      • Navigation2 架构变化
    • Eloquent 到 Foxy
      • 一般
      • 服务器更新
      • 新插件
      • 地图服务器重做
      • 新的粒子过滤消息
      • 在每个导航操作中选择行为树
      • FollowPoint 功能
      • 新的 Costmap 层
    • Foxy to Galactic
      • NavigateToPose 动作反馈更新
      • NavigateToPose BT-node 接口更改
      • 添加了 NavigateThroughPoses 和 ComputePathThroughPoses 操作
      • ComputePathToPose BT-node 接口更改
      • ComputePathToPose 操作接口更改
      • 备份 BT 节点接口更改
      • 备份恢复接口更改
      • Nav2 控制器和目标检查器插件接口更改
      • FollowPath goal_checker_id 属性
      • Groot 支持
      • 新插件
      • 成本地图过滤器
      • SmacPlanner
      • ThetaStarPlanner
      • RegulatedPurePursuitController
      • Costmap2D current_ 用法
      • 参数中的标准时间单位
      • 光线追踪参数
      • 障碍物标记参数
      • 恢复操作更改
      • 默认行为树更改
      • NavFn 规划器参数
      • 新的 ClearCostmapExceptRegion 和 ClearCostmapAroundRobot BT 节点
      • 新的行为树节点
      • sensor_msgs/PointCloud 更改为 sensor_msgs/PointCloud2
      • ControllerServer 新参数 Failure_tolerance
      • 删除了 BT XML 启动配置
      • Nav2 RViz 面板操作反馈信息
    • Galactic to Humble
      • Smac Planner 的重大改进
      • Simple (Python) Commander
      • Reduce Nodes and Executors
      • API Change for nav2_core
      • 扩展 BtServiceNode 来处理服务结果
      • 包括新的旋转垫片控制器插件
      • Spawning the robot in Gazebo
      • 恢复行为超时
      • 3 个 2D 规划器的新参数“use_final_approach_orientation”
      • SmacPlanner2D 和 Theta*:修复被忽略的目标方向
      • SmacPlanner2D、NavFn 和 Theta*:修复小路径角点情况
      • 更改并修复动态参数变化检测的行为
      • 动态参数
      • BT 动作节点异常更改
      • BT 导航器 Groot 多个导航器
      • 删除了 RPP 中的运动限制
      • 添加了更平滑的任务服务器
      • 删除了 RPP 中的使用接近速度缩放参数
      • 将 AMCL 运动模型重构为插件
      • 放弃对 Nav2 的实时 Groot 监控的支持
      • 仅当路径无效时才重新规划
      • 修复 CostmapLayer clearArea 反转参数逻辑
      • 动态组合
      • BT 取消节点
      • BT PathLongerOnApproach 节点
      • BT TruncatePathLocal 节点
      • 约束平滑器
      • 以恒定速率重新规划,如果路径无效
      • 欧几里得距离 2D
      • 恢复到行为
      • Launch 和 Lifecycle Manager 中的重生支持
      • 新的 Nav2 速度平滑器
      • 目标检查器 API 已更改
      • 添加了辅助遥操作
    • 从 Humble 到 Iron
      • 新的行为树导航器插件
      • 添加了碰撞监视器
      • 从 yaml 中删除了 use_sim_time
      • Smac Planner 的运行时加速
      • Smac 和简单平滑器的递归细化
      • 简单指挥官 Python API
      • Smac Planner 起始姿势包含在路径中
      • 扩展规划器基准测试
      • Smac Planner 路径公差
      • costmap_2d_node 默认构造函数
      • 导航失败的反馈
      • 成本图过滤器
      • Savitzky-Golay 平滑器
      • Launch 中 map_server 节点的 Map yaml 文件路径更改
      • SmootherSelector BT 节点
      • 发布 Costmap 图层
      • 授予行为服务器访问两个 Costmap 的权限
      • 新型模型预测路径积分控制器
      • 行为树使用错误代码
      • 从 RViz 中的 Nav2 面板加载、保存和循环航点
      • DWB 正向与反向修剪
      • 对长前瞻距离的曲线进行更稳定的调节
      • 发布碰撞监视器状态
      • 在碰撞监视器中重命名 ROS 参数
      • 碰撞监视器中的新安全行为模型“限制”
      • 速度平滑器在超时时应用减速
      • PoseProgressChecker 插件
      • 允许多个目标检查器并更改参数progress_checker_plugin的名称和类型
      • IsBatteryChargingCondition BT 节点
      • 行为服务器错误代码
      • 新的 Denoise Costmap Layer 插件
      • SmacPlannerHybrid viz_expansions 参数
    • Iron 到 Jazzy
      • BehaviorTree.CPP 升级到版本 4.5+
      • 为命令添加了 TwistStamped 选项
      • 在碰撞监视器中添加 VelocityPolygon
      • 在碰撞监视器中更改多边形点参数格式
      • 软实时操作服务器简介
      • “opennav_coverage”项目
      • opennav_docking 项目
      • 引入新的多机器人启动
      • 体素和障碍物层的新选项
      • use_interpolation RPP 参数已弃用
      • 对 MPPI 目标评论家的更改
      • MPPI 路径角度评价器的变化
      • MPPI 路径处理的方向性变化
      • 添加新的 MPPI 成本评论器
      • MPPI 加速
      • 移动错误代码枚举
      • 参数文件中的替换
      • 允许行为服务器插件访问操作结果
      • Smac Planner 调试参数名称更改
      • Smac Planner 接近目标捷径解决方案
      • 添加了 GPS 航点跟随器服务器
      • Smac Planner Hybrid-A* 新功能
      • nav2_collision_monitor 中的新节点:碰撞检测器
      • 在碰撞监视器/检测器中动态启用/禁用源/多边形
      • 公开操作服务器的结果超时
      • RewrittenYaml 可以向 YAML 添加新参数
      • 简单指挥官 API 允许多机器人命名空间
      • 更改 wait_action 节点中的持续时间类型
      • 当所需的转换不可用时,costmap 激活会失败
      • 子树获得共享资源
      • 碰撞监视器:添加了基于 source_timeout 参数的看门狗机制,具有默认阻止行为
      • BtActionServer:使用本机库 haltTree()
      • 从 2 个 BT 节点中删除全局框架
      • CostmapUpdate.msg 的介绍
      • 完整堆栈使用节点时钟
      • 新的优雅运动控制器
      • BT Navigator 中的插件库仅包含自定义节点
      • 用于选择规划器、控制器、目标检查器、进度检查器和平滑器的新 RViz 插件
      • RPP 新增可选的“interpolate_curvature_after_goal”行为,并修复“use_rotate_to_heading”和“allow_reversing”之间的冲突
      • GlobalPlanner 的取消检查器接口
      • 新的 BtActionServer/BtNavigator 参数
      • 新的碰撞监控参数
      • 控制器的新优雅取消 API
      • 使用双冒号 (::) 标准化插件命名
      • 碰撞监视器:圆形多边形的动态半径
      • 静态层:新参数“footprint_clearing_enabled”
      • 生命周期节点:添加了 bond_heartbeat_period 参数(并允许禁用债券机制)
      • 旋转垫片控制器:新参数“rotate_to_goal_heading”
      • MPPI 控制器:增加加速度约束
      • RegulatedPurePursuit 控制器 [RPP]:新参数 use_cancel_deceleration
    • Jazzy 到 K-Turtle
      • 新的 Nav2 环回模拟器
      • 使用静态基础设施或动态对接进行对接
      • 用于对接的新 RViz 面板
      • 新的 BT 节点
      • 用于成本图成本单元检查的新 RViz 工具
      • 修复闪烁可视化
      • 通过 DWB 轨迹限制速度的选项
      • 在目标退出时禁用零速度发布的选项
  • Simple Commander API
    • 概述
    • Commander API
    • Costmap API
    • Footprint Collision Checker API
    • 示例和演示
  • Roadmaps
    • Jazzy Roadmap
    • Iron Roadmap
    • Humble Roadmap
  • 关于和联系方式
    • Related Projects
    • 关于
    • 联系方式
Nav2
Edit
  • 常规教程
  • 使用禁区导航

使用禁区导航

  • 概述

  • 要求

  • 教程步骤

概述

本教程将介绍如何简单地利用机器人无法进入的禁区/安全区以及在工业环境和仓库中移动的机器人的首选车道。所有这些功能都包含在“KeepoutFilter”成本地图过滤器插件中,该插件将在本文档中启用和使用。

要求

假设 ROS 2、Gazebo 和 TurtleBot3 软件包已在本地安装或构建。请确保 Nav2 项目也在本地构建,因为它是在 构建与安装 中创建的。

教程步骤

1. 准备过滤口罩

正如在 导航概念 中所写,任何 Costmap Filter(包括 Keepout Filter)都在读取 Filter Mask 文件中标记的数据。Filter Mask - 是通过 PGM、PNG 或 BMP 栅格文件分发的常见 Nav2 2D 地图,其元数据包含在 YAML 文件中。以下步骤有助于理解如何制作新的 Filter Mask:

创建一个 PGM/PNG/BMP 格式的新图像:将 turtlebot3_world.pgm 主地图(将在世界模拟中使用)从 Nav2 存储库复制到新的 keepout_mask.pgm 文件。

在您最喜欢的栅格图形编辑器中打开 keepout_mask.pgm``(例如,可以使用 GIMP 编辑器)。掩码上每个像素的亮度表示您将要使用的特定成本图过滤器的编码信息。每个像素的颜色亮度属于 ``[0..255] 范围(或百分比比例中的 [0..100]),其中 0 表示黑色,255 表示白色。另一个术语“暗度”将被理解为亮度的完全相反。换句话说, color_darkness = 100% - color_lightness。

在 GIMP 中,亮度通过颜色分量值表示(例如百分比比例中的 R),可以通过移动颜色更改工具中的 L 滑块来设置:

../../_images/ligtness_in_GIMP.png

传入的掩码文件由地图服务器读取,并转换为 [0..100] 范围内的 OccupancyGrid 值(其中 0 ``表示空闲单元格, ``100 表示已占用,介于两者之间的任何值表示地图上占用的单元格较少或更多),或等于 -1 表示未知值。在 Nav2 堆栈中,每个地图都有 mode 属性,可以是 trinary 、 scale 或 raw 。根据所选的 mode ,PGM/PNG/BMP 的颜色亮度将通过以下原则之一转换为 OccupancyGrid :

  • trinary (default mode): Darkness >= occupied_thresh means that map occupied (100). Darkness <= free_thresh - map free (0). Anything in between - unknown status on map (-1).

  • scale: Alpha < 1.0 - unknown. Darkness >= occupied_thresh means that map occupied (100). Darkness <= free_thresh - map free (0). Anything in between - linearly interpolate to nearest integer from [0..100] range.

  • raw: Lightness = 0 (dark color) means that map is free (0). Lightness = 100 (in absolute value) - map is occupied (100). Anything in between - OccupancyGrid value = lightness. Lightness >= 101 - unknown (-1).

其中 free_thresh 和 occupied_thresh 阈值以最大亮度/暗度级别( 255 )的百分比表示。地图模式和阈值作为 mode 、 free_thresh 和 occupied_thresh 字段放置在 YAML 元数据文件(见下文)中。

Note

YAML 元数据文件中还有另一个参数,称为 negate。默认情况下,它设置为 false。当它设置为 true``时,较黑的像素将被视为空闲,较白的像素则被视为已占用。在这种情况下,对于 ``trinary 和 scale 模式,我们应该计算颜色亮度而不是暗度。 negate 对 raw 模式没有影响。

对于 Keepout Filter, OccupancyGrid``值与该单元格对应区域的通行能力成正比:值越高,不可通行区域越多。具有已占用值的单元格覆盖机器人永远不会进入或通过的禁入区。通过将 ``OccupancyGrid 设置为 [1-99] 之间的某个非占用值, KeepoutFilter 还可以充当 加权区域层 。机器人可以在这些区域内移动,但是它在那里出现是 不受欢迎的 (值越高,规划人员越早尝试将机器人移出该区域)。

禁止通行过滤器还涵盖首选车道的情况,在这种情况下,机器人只能在预定义的车道和允许区域内移动,例如在仓库中。要使用此功能,您需要准备遮罩图像,其中车道和允许区域将用自由值标记,而所有其他区域将被占用。在 三元 或 缩放 模式下绘制遮罩的提示:通常,属于车道的像素数量远少于覆盖其他区域的像素数量。在这种情况下,最初可以使用黑色铅笔在白色背景上绘制所有车道数据,然后(在保存 PGM 之前)可以使用图像光栅编辑器中的 颜色反转 工具。

为了简单起见,在示例中,用黑色填充要标记为禁区的区域(在 ``三元``模式下,这意味着占用地图):

image: turtlebot3_world.pgm
->
image: keepout_mask.pgm

由于过滤器掩码图像是作为主图的副本创建的,因此 YAML 文件的其他字段无需更改。保存 keepout_mask.yaml ,新的过滤器掩码即可使用。

Note

世界地图本身和过滤器蒙版可能具有不同的大小、原点和分辨率,这可能很有用,例如当过滤器蒙版覆盖地图上较小的区域或一个过滤器蒙版被重复使用多次时(例如注释酒店中相同形状房间的禁区)。对于这种情况,您还需要更正 YAML 中的 分辨率 和 ``原点``字段,以便过滤器蒙版正确地放置在原始地图之上。

Note

另一个重要的注意事项是,由于 Costmap2D 不支持方向, origin 向量的最后第三个“偏航”分量应等于零。例如: origin: [1.25, -5.18, 0.0] 。

2. 配置 Costmap 过滤器信息发布服务器

每个 costmap 过滤器都会在 nav2_msgs/CostmapFilterInfo 类型的消息中读取传入的元信息(例如过滤器类型或数据转换系数)。这些消息由 Costmap Filter Info Publisher Server 发布。该服务器作为生命周期节点运行。根据 设计文档,nav2_msgs/CostmapFilterInfo 消息与 OccupancyGrid 过滤器掩码主题成对出现。因此,除了 Costmap Filter Info Publisher Server 之外,还应启用一个配置为发布过滤器掩码的 Map Server 新实例。

为了在您的配置中启用 Keepout 过滤器,应在 Python 启动文件中将两个服务器启用为生命周期节点。 也可以将它们作为组合节点添加到导航组件容器中,如下所示:

import os

from ament_index_python.packages import get_package_share_directory

from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument, GroupAction
from launch.conditions import IfCondition
from launch.substitutions import LaunchConfiguration, PythonExpression
from launch.substitutions import NotEqualsSubstitution
from launch_ros.actions import Node, LoadComposableNodes
from launch_ros.actions import PushRosNamespace
from launch_ros.descriptions import ComposableNode
from nav2_common.launch import RewrittenYaml


def generate_launch_description():
    # Get the launch directory
    costmap_filters_demo_dir = get_package_share_directory('nav2_costmap_filters_demo')

    lifecycle_nodes = ['filter_mask_server', 'costmap_filter_info_server']

    # Parameters
    namespace = LaunchConfiguration('namespace')
    use_sim_time = LaunchConfiguration('use_sim_time')
    autostart = LaunchConfiguration('autostart')
    params_file = LaunchConfiguration('params_file')
    mask_yaml_file = LaunchConfiguration('mask')
    use_composition = LaunchConfiguration('use_composition')
    container_name = LaunchConfiguration('container_name')
    container_name_full = (namespace, '/', container_name)

    # Declare the launch arguments
    declare_namespace_cmd = DeclareLaunchArgument(
        'namespace',
        default_value='',
        description='Top-level namespace')

    declare_use_sim_time_cmd = DeclareLaunchArgument(
        'use_sim_time',
        default_value='true',
        description='Use simulation (Gazebo) clock if true')

    declare_autostart_cmd = DeclareLaunchArgument(
        'autostart', default_value='true',
        description='Automatically startup the nav2 stack')

    declare_params_file_cmd = DeclareLaunchArgument(
        'params_file',
        description='Full path to the ROS2 parameters file to use')

    declare_mask_yaml_file_cmd = DeclareLaunchArgument(
        'mask',
        description='Full path to filter mask yaml file to load')

    declare_use_composition_cmd = DeclareLaunchArgument(
        'use_composition', default_value='True',
        description='Use composed bringup if True')

    declare_container_name_cmd = DeclareLaunchArgument(
        'container_name', default_value='nav2_container',
        description='The name of container that nodes will load in if use composition')

    # Make re-written yaml
    param_substitutions = {
        'use_sim_time': use_sim_time,
        'yaml_filename': mask_yaml_file}

    configured_params = RewrittenYaml(
        source_file=params_file,
        root_key=namespace,
        param_rewrites=param_substitutions,
        convert_types=True)

    load_nodes = GroupAction(
        condition=IfCondition(PythonExpression(['not ', use_composition])),
        actions=[
            Node(
                package='nav2_map_server',
                executable='map_server',
                name='filter_mask_server',
                namespace=namespace,
                output='screen',
                emulate_tty=True,  # https://github.com/ros2/launch/issues/188
                parameters=[configured_params]),
            Node(
                package='nav2_map_server',
                executable='costmap_filter_info_server',
                name='costmap_filter_info_server',
                namespace=namespace,
                output='screen',
                emulate_tty=True,  # https://github.com/ros2/launch/issues/188
                parameters=[configured_params]),
            Node(
                package='nav2_lifecycle_manager',
                executable='lifecycle_manager',
                name='lifecycle_manager_costmap_filters',
                namespace=namespace,
                output='screen',
                emulate_tty=True,  # https://github.com/ros2/launch/issues/188
                parameters=[{'use_sim_time': use_sim_time},
                            {'autostart': autostart},
                            {'node_names': lifecycle_nodes}])
        ]
    )

    load_composable_nodes = GroupAction(
        condition=IfCondition(use_composition),
        actions=[
            PushRosNamespace(
                condition=IfCondition(NotEqualsSubstitution(LaunchConfiguration('namespace'), '')),
                namespace=namespace),
            LoadComposableNodes(
                target_container=container_name_full,
                composable_node_descriptions=[
                    ComposableNode(
                        package='nav2_map_server',
                        plugin='nav2_map_server::MapServer',
                        name='filter_mask_server',
                        parameters=[configured_params]),
                    ComposableNode(
                        package='nav2_map_server',
                        plugin='nav2_map_server::CostmapFilterInfoServer',
                        name='costmap_filter_info_server',
                        parameters=[configured_params]),
                    ComposableNode(
                        package='nav2_lifecycle_manager',
                        plugin='nav2_lifecycle_manager::LifecycleManager',
                        name='lifecycle_manager_costmap_filters',
                        parameters=[{'use_sim_time': use_sim_time},
                                    {'autostart': autostart},
                                    {'node_names': lifecycle_nodes}]),
                ]
            )
        ]
    )

    ld = LaunchDescription()

    ld.add_action(declare_namespace_cmd)
    ld.add_action(declare_use_sim_time_cmd)
    ld.add_action(declare_autostart_cmd)
    ld.add_action(declare_params_file_cmd)
    ld.add_action(declare_mask_yaml_file_cmd)

    ld.add_action(declare_use_composition_cmd)
    ld.add_action(declare_container_name_cmd)

    ld.add_action(load_nodes)
    ld.add_action(load_composable_nodes)

    return ld

其中, params_file 变量应设置为 YAML 文件,其中包含 Costmap Filter Info Publisher Server 和 Map Server 节点的 ROS 参数。这些参数及其含义列在 Map Server / Saver 页面中。请参阅该页面了解更多信息。params_file 的示例如下:

costmap_filter_info_server:
  ros__parameters:
    use_sim_time: true
    type: 0
    filter_info_topic: "/costmap_filter_info"
    mask_topic: "/keepout_filter_mask"
    base: 0.0
    multiplier: 1.0
filter_mask_server:
  ros__parameters:
    use_sim_time: true
    frame_id: "map"
    topic_name: "/keepout_filter_mask"
    yaml_filename: "keepout_mask.yaml"

请注意:

  • 对于 Keepout 过滤器,costmap 过滤器的 type 应设置为 0。

  • 过滤器掩码主题名称应等于 Costmap 过滤器信息发布服务器的 mask_topic 参数和 Map Server 的 topic_name 参数。

  • 根据 Costmap 过滤器的设计, OccupancyGrid 值被线性转换为过滤器空间中的特征图。对​​于 Keepout 过滤器,这些值直接作为过滤器空间值传递,而无需进行线性转换。即使 Keepout 过滤器中不使用 base 和 multiplier 系数,也应将它们分别设置为 0.0 和 1.0,以明确表明我们从 OccupancyGrid 值到过滤器值空间进行了一对一转换。

可以在 navigation2_tutorials 存储库的 nav2_costmap_filters_demo 目录中找到现成的独立 Python 启动脚本、带有 ROS 参数的 YAML 文件和 Keepout Filter 的过滤器掩码示例。要简单地运行在 入门指南 中编写的 Turtlebot3 标准模拟上调整的 Filter Info Publisher Server 和 Map Server,请构建演示并启动 costmap_filter_info.launch.py​​,如下所示:

$ mkdir -p ~/tutorials_ws/src
$ cd ~/tutorials_ws/src
$ git clone https://github.com/ros-planning/navigation2_tutorials.git
$ cd ~/tutorials_ws
$ colcon build --symlink-install --packages-select nav2_costmap_filters_demo
$ source ~/tutorials_ws/install/setup.bash
$ ros2 launch nav2_costmap_filters_demo costmap_filter_info.launch.py params_file:=`pwd`/src/navigation2_tutorials/nav2_costmap_filters_demo/params/keepout_params.yaml mask:=`pwd`/src/navigation2_tutorials/nav2_costmap_filters_demo/maps/keepout_mask.yaml use_composition:=True

3. 启用禁止访问过滤器

Costmap Filters 是 Costamp2D 插件。您可以通过将 keepout_filter 添加到 nav2_params.yaml 中的 plugins 参数来启用 Costmap2D 中的 KeepoutFilter 插件。您可以将其放置在 global_costmap 中,以便使用 keepouts 和 local_costmap 进行规划,以确保机器人不会尝试穿过禁区。KeepoutFilter 插件应定义以下参数:

  • plugin: 插件类型。在我们的例子中是 nav2_costmap_2d::KeepoutFilter.

  • filter_info_topic: 过滤信息topic名称。这需要等于上一章中 Costmap Filter Info Publisher Server的 ``filter_info_topic``参数。

KeepoutFilter 支持的参数完整列表列于:ref: keepout_filter 页面。

值得注意的是,仅为“global_costmap”启用“KeepoutFilter”将导致路径规划器构建绕过禁区规划。仅为“local_costmap”启用“KeepoutFilter”将导致机器人不会进入禁区,但路径仍可能穿过它们。因此,最佳做法是同时为全局和局部代价地图启用“KeepoutFilter”,方法是将其添加到“nav2_params.yaml”中的“global_costmap”和“local_costmap”中。但这并不总是正确的。在某些情况下,全局和局部代价地图的禁区不必相同,例如,如果机器人不允许故意进入禁区,但如果禁区在那里,机器人可以在碰到边缘或角落时快速进出。对于这种情况,不需要使用本地代价地图副本的额外资源。

要对全局和局部代价地图启用具有相同掩码的 KeepoutFilter ,请使用以下配置:

global_costmap:
  global_costmap:
    ros__parameters:
      ...
      plugins: ["static_layer", "obstacle_layer", "inflation_layer"]
      filters: ["keepout_filter"]
      ...
      keepout_filter:
        plugin: "nav2_costmap_2d::KeepoutFilter"
        enabled: True
        filter_info_topic: "/costmap_filter_info"
...
local_costmap:
  local_costmap:
    ros__parameters:
      ...
      plugins: ["voxel_layer", "inflation_layer"]
      filters: ["keepout_filter"]
      ...
      keepout_filter:
        plugin: "nav2_costmap_2d::KeepoutFilter"
        enabled: True
        filter_info_topic: "/costmap_filter_info"

Note

所有代价地图过滤器都应通过 filters 参数启用——尽管从技术上讲,可以将其包含在分层代价地图本身中。这与图层插件分开,以防止对图层(尤其是膨胀图层)的干扰。

4. 运行 Nav2 堆栈

启动 Costmap Filter Info Publisher Server 和 Map Server 并为全局/局部代价地图启用 Keepout Filter 后,按照:ref:getting_started 中的说明运行 Nav2 堆栈:

ros2 launch nav2_bringup tb3_simulation_launch.py

并检查过滤器是否正常工作,如下图所示(第一张图片显示为全局代价地图启用的keepout过滤器,第二张图片显示不同大小的 keepout_mask.pgm 过滤器掩码):

../../_images/keepout_global.gif ../../_images/keepout_mask.png

© Copyright 2023.