版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章轮式机器人的建图与导航ROS2机器人操作系统与Gazebo机器人仿真提纲8.1Nav2概述8.1.1Nav2结构8.1.2Nav2核心功能8.2Nav2相关概念 8.2.1动作服务器 8.2.2生命周期节点8.2.3行为树8.2.4状态估计8.2.5环境表示8.3Nav2的安装8.4slam_toolbox建图8.4.1slam_toolbox简介8.4.2slam_toolbox建图流程8.4.3地图的保存8.4.4地图的发布8.5Cartographer建图8.5.1Cartographer简介 8.5.2Cartographer建图流程8.6路径规划 8.6.1路径规划简介 8.6.2路径规划算法8.6.3案例:A*路径规划算法8.7案例:自建地图的导航 8.8案例:自定义路径规划的导航 8.9本章小结 从本章开始将介绍ROS2和Gazebo在机器人仿真上的综合应用。轮式机器人,通常称为车辆,是一种在生活和生产中使用最广泛的一类机器人。对于轮式机器人来说,其最主要的功能是移动,特别是能够自主的移动,即自动驾驶。自主移动的轮式机器人在物流、自动驾驶和家居等场景具有广泛的应用场景。轮式机器人的自主移动通常依赖于建图和导航技术,而这两种技术经过多年的发展已经包含在ROS2的导航框架Nav2中。本章将通过Nav2在建图和导航中的应用,介绍轮式机器人自主移动的相关内容,并借助Gazebo仿真介绍使用Nav2进行轮式机器人建图和导航的方法。8.1Nav2概述8.1Nav2概述自主移动是当前轮式机器人开发和研究的最核心的技术,有巨大的市场需求。轮式机器人自主移动的实现主要包含建图、定位和导航三个部分。早期建图和定位被视为两个独立的问题进行研究,直到SLAM(SimultaneousLocalizationandMapping,同步定位与建图)的出现,将这一对“鸡生蛋,蛋生鸡”的问题彻底地进行了解决。自ROS1开始相关研究人员和工程师就将建图、定位和导航的相关技术进行整合,开发出了基于2D平面的激光SLAM的导航功能包Navigation。随着ROS2的成熟,开发者对建图、定位和导航相关的功能包Navigation进行重新优化形成了以新一代导航框架Nav2。Nav2框架包含了一系列与导航相关的功能,并提供了灵活的插件扩展功能和高级PythonAPI。目前,Nav2不仅仅是一个研究和实验性的产品,而且已成为一个可信赖的高质量导航框架,经过了全球100多家公司的检验,已经被部署到生产环境中。8.1Nav2概述8.1.1Nav2结构Nav2整体结构如图所示,显示了Nav2内部的构成,以及输入/输出信息。整个Nav2在运行时通过一个LifecycleManger的节点管理整个Nav2系统内各个节点的启动、停止、暂停和恢复等状态。导航作为一个长期的任务,Nav2引入了行为树(BehaviorTree,BT)进行导航时轮式机器人各种状态的切换和管理,支持自定义行为树从而定制导航状态的转换规则。行为树只提供了状态的转换规则,不执行具体的导航行为,只支持根据状态调用相关的服务器执行导航行为。导航中具体行为由控制器(ControllerServer)、规划器(PlannerServer)、行为服务器(BehaviorServer)和平滑服务器(SmootherServer)等部件提供,用于完成具体的导航行为。每个服务器除了接收来自行为树的命令外,还会将状态返回给行为树,以便行为树根据接收到的消息进行决策和状态的转换,确保导航完成。8.1Nav2概述8.1.1Nav2结构8.1Nav2概述8.1.1Nav2结构Nav2在导航时,需要订阅(接收)外部信息,主要来自轮式机器人的各种传感器,如里程计,激光雷达,IMU和相机等,以及定义行为树的XML文件,而发布(输出)的信息主要有速度控制指令,代价地图,以及轮式机器人的定位信息。Nav2目前支持对全向的、差动驱动的、腿式的和阿克曼(类似汽车)等类型的移动机器人的导航。Nav2通过SE2碰撞检查,支持外观为圆形和任意形状的机器人。8.1Nav2概述8.1.2Nav2核心功能Nav2提供了一系列功能,包括感知、规划、控制、定位和可视化,从而构建一个高度可靠的自主导航系统。它能够根据传感器数据和语义信息构建环境模型,进行动态路径规划,避开障碍物,计算电机速度,并支持在更高层次上定义机器人行为。Nav2使用行为树来协调多个独立的模块化任务服务器,以实现定制化和智能的导航行为。任务服务器被用于路径计算、电机控制、行为执行或其他与导航相关的任务。这些独立的任务服务器通过ROS接口(如话题或服务)与行为树进行通信。机器人可以利用多种行为树,使其执行各种独特而复杂的任务。8.1Nav2概述8.1.2Nav2核心功能具体来说,Nav2具有以下有关导航的功能: 加载、提供和存储地图; 在导航的过程中实时定位机器人在地图上的坐标; 规划适于不同形状和尺寸机器人的可行全局路径; 控制机器人沿路径行驶,并动态调整路径以避免碰撞; 优化路径,使其更连续、平滑和/或可行; 将传感器数据转化为环境模型; 基于行为树构建复杂和高度可定制的机器人行为; 在故障、人为干预或其他情况下执行预定义的行为; 按顺序完成多个路径点的移动;8.1Nav2概述8.1.2Nav2核心功能 管理系统的程序生命周期,并监控服务器状态; 动态加载插件,创建定制的算法和行为; 监视原始传感器数据,以检测潜在的碰撞或危险; 提供了Nav2的Python3API,提供了简化导航编程; 对输出速度进行平滑处理,确保命令的动态可行性。总体而言,Nav2中的各功能和部件以插件的形式按松散的方式在一定程度上可自由组合,从而适应不同的导航应用场景。Nav2包括了一组初始默认插件,以及一些额外的插件,所有可用插件都可在NavigationPlugins中找到。用户可以编写自定义插件,以扩展Nav2的功能。8.2Nav2相关概念8.2Nav2相关概念对于2D平面的移动机器人的导航来说,主要涉及到地图构建、机器人定位、路径规划、导航行为管理等主要功能。Nav2借助ROS2中的相关技术提供了上述功能,以下介绍Nav2在实现这些功能上的使用相关概念,以及概念背后的技术。8.2Nav2相关概念8.2.1动作服务器行为树定义了机器人行动的规则,而行动真正的实施需要动作的执行者。动作的执行一般需要较长的时间,ROS2中的动作通信机制就十分契合这种需求,因此,Nav2在导航中就广泛的使用了动作服务器节点来执行机器人的行动。动作服务器(ActionServer)是非常适于导航这种耗时长的任务,例如,将推土机上的铲子移上去,或者要求机器人向右移动10米等。这种长时间的任务使用服务会造成客户端长期得不到响应,从而很难判断任务是正在执行中,还是系统运行发生异常,从而影响系统整体的状态以及后续动作的执行。而动作服务器会在任务执行时实时的向客户端发送进度从而排除系统异常,保证任务的执行。8.2Nav2相关概念8.2.1动作服务器由于导航是长期运行,行为树负责整个导航的行为。行为树根据用户请求做出决策,发送命令到相应的动作服务器。动作服务器可以向行为树提供实时反馈,反馈消息可以是导航的时间或到目标的距离等,最终结果是一个布尔值表示导航成功或失败。行为树在接收到反馈和结果后,根据收到的消息进行决策,重新发送命令到不同的动作服务器接管导航。动作服务器在nav2_msgs功能包中定义了动作消息类型,作为信息交互的格式。Nav2在导航中最主要的有三种动作服务器,分别是规划器(PlanerServer)、恢复器(RecoveryServer)和控制器(ControllerServer)。每个动作服务器可以通过插件技术分别运行一个导航算法插件,以完成导航中的各种任务。8.2Nav2相关概念8.2.1动作服务器1.规划器规划器是一个动作服务器,接收来自行为树的命令,执行路径规划。规划器根据当前位置和目标位置,综合各种传感器信息,在全局地图或局部地图搜索一条机器人可达的最优路径。规划器可通过插件的形式定制个性化的规划器,例如设置路径的曲率,路径规划算法等。2.控制器控制器在ROS1中被称为局部规划器,用于控制机器人沿着规划器输出的路径移动或者完成局部的动作。控制器通过访问局部环境表达,以计算跟随基准路径的可行控制工作。大多数控制器会将机器人代入到局部环境中,并在每次更新迭代时计算局部可行路径。控制器主要的功能有使机器人跟随路径移动,进行充电操作,搭乘电梯,以及与工具(例如机器人上的机械臂)的接口。8.2Nav2相关概念8.2.1动作服务器控制器最常用的功能就是使机器人沿着规划的路径移动,同样可通过插件的方式,根据实际需要为机器人增加新的移动功能。3.恢复器恢复器提供Nav2导航系统的容错功能,其主要用途是自动处理系统的未知状况或故障状况。以下通过三个例子说明恢复器的应用场景:(1)当感知系统故障生成了许多假障碍物,恢复器就会触发清除代价地图的操作,重新构建新的代价地图,使得机器人重新移动。(2)机器人由于动态障碍物或控制不佳而无法继续行动时,在条件允许的情况下,恢复器通过倒退或原地旋转,将机器人移动到可以自由空间中,再恢复导航。(3)在机器人完全故障的情况下,通过使机器人发出音响、灯光、电子邮件、短信、电话等方式引起操作人员的注意,以寻求外部的帮助。8.2Nav2相关概念8.2.2生命周期节点生命周期(或者称为管理)节点是ROS2独有的,用于更好地控制ROS2系统的运行状态。与普通节点不同,生命周期节点包含多种状态的切换,从而可以针对节点状态更灵活的执行相关功能。生命周期节点拥有的4个主要的状态,分别是Unconfigured,Inactive,Active和Finalized,以及6个过渡状态,分别是Configuring,CleaningUp,ShuttingDown,Activating,Deactivating和ErrorProcessing,并且提供了7个用于状态间转换的动作,分别是create,configure,cleanup,activate,deactivate,shutdown,destroy。图展示了生命周期节点的状态及状态转换规则。8.2Nav2相关概念8.2.2生命周期节点8.2Nav2相关概念8.2.2生命周期节点Nav2广泛使用了ROS2中的生命周期节点用于内部的各种服务器,如规划器、控制器、地图服务器、定位功能,以及生命周期管理器。生命周期管理器nav2_lifeclycle_manager功能包中的节点lifecycle_manager提供了对Nav2中其他生命周期节点的管理接口,方便了Nav2中各生命周期节点状态的转换。图展示了Nav2中生命周期管理器的工作方式,提供了一个统一的管理其他生命周期节点的服务。从一定程度上可以说Nav2生命周期管理器就是整个Nav2导航系统的管理员。8.2Nav2相关概念8.2.3行为树行为树(BehaviorTree,BT)是一种结构化切换不同任务的方法,在机器人和游戏NPC上得到了广泛的应用。与有限状态机(FiniteStateMachine,SFM)关注状态以及状态间的切换不同,行为树以动作为中心,将任务分解为一系列的动作,并通过树结构管理动作的执行条件和执行顺序。相较于有限状态机的网状结构,行为树呈现树状结构,在定义、维护和修改上都具有较大的优势。Nav2使用行为树来管理机器人在导航中的移动策略,为导航提供决策。8.2Nav2相关概念8.2.3行为树行为树中的节点分为控制节点(ControlNode),装饰节点(DecoratorNode)和叶节点(LeafNode)三类。控制节点可以拥有1个或多个其他的孩子节点,装饰节点只能有1个孩子节点,叶节点没有孩子节点。右图展示了一棵行为树,根据行为树的定义,Sequence和Fallback都拥有超过1个孩子节点,因此是控制节点;Retry只有一个孩子节点,因此是装饰节点;IsDoorOpen,OpenDoor,EnterRoom和CloseDoor没有孩子节点,因此是叶节点。8.2Nav2相关概念8.2.3行为树Nav2的行为树使用了由BehaviorTree.CPP库提供的实现方案。BehaviorTree.CPP将行为树的三种节点分别进行了进一步划分,并支持扩展节点的具体行为。(1)控制节点:用于控制其孩子节点的执行顺序。在BehaviorTree.CPP中,提供了顺序节点(SequenceNode)和选择节点(Selector/FallbackNode)两种默认类型的控制节点。①顺序节点会依次执行每个孩子节点,如果全部孩子节点都成功,返回成功,如果其中的一个孩子节点失败,则立刻返回失败,不再执行后边的孩子节点,类似于带有短路的与运算。②选择节点会依次执行每个孩子节点,全部孩子节点都失败,则返回失败,只要有一个成功,则立即返回成功,不再执行后边的节点,类似于带有短路的或运算。8.2Nav2相关概念8.2.3行为树(2)装饰节点:用于对其孩子节点进行封装,改变子节点的执行方式或结果。常见的装饰节点有:①Inverter节点:反转子节点的结果,将子节点的成功变为失败,失败变为成功;②ForceSuccess节点:不论子节点成功或失败,都返回成功;③ForceFailure节点:不论子节点成功或失败,都返回失败;④Repeat节点:重复执行子节点多次,每次都成功,则返回成功,只要有一次失败,则返回失败;⑤KeepRunningUntilFailure节点:一直运行子节点,直到子节点失败,则返回失败;⑥Delay节点:接收到执行信号tick后延时一段时间后向子节点发送执行信号tick。8.2Nav2相关概念8.2.3行为树(3)叶节点:不包含任何子节点,用于执行具体的任务。根据可分为条件节点(ConditionNode)和(ActionNode)两类。①条件节点:检查特定条件是否满足,返回成功或失败,该节点的结果返回通常是立即的;②动作节点:执行具体的行为或动作,如移动、攻击等,根据动作执行结果,返回成功或失败。此外,动作节点通常耗时较长,在实现上可以使用同步或异步方式。行为树的执行是从树根发出信号tick,信号tick沿着树根一直传播到最末端的叶子节点。每个接收到信号tick的节点都会执行在该节点上定义的规则或动作,执行的结果必须是成功(SUCCESS)、失败(FAILURE)或运行(RUNNING)三种之一,其中当结果是运行时表明一个动作需要更多的时间来返回一个确定性的结果,即成功或失败。8.2Nav2相关概念8.2.3行为树例如,图8.4中的行为树中定义了一个进门的任务,其总体执行逻辑为开门,进门和关门三个顺序完成的动作,其中开门又分为门已经打开和门没有开两种情况,在门没有打开时执行打开门的动作。Nav2使用功能包nav2_behavior_tree提供了机器人导航时的行为树,并针对导航定义了多种导航行为树中的控制节点、装饰节点、叶节点(条件节点和动作节点)。下表列出了Nav2中针对机器人导航自定义的行为树节点。8.2Nav2相关概念8.2.3行为树8.2Nav2相关概念8.2.3行为树8.2Nav2相关概念8.2.3行为树创建Nav2导航的行为树只需要按照BehaviorTree.CPP库的规范编写行为树的配置文件即可。BehaviorTree.CPP库使用XML格式作为行为树的描述语言。通过编写XML格式的行为树可以实现多样的机器人导航任务。下面为一个在Nav2中定义行为树的XML格式文件,代码如下:<rootmain_tree_to_execute="MainTree"><BehaviorTreeID="MainTree"><RecoveryNodenumber_of_retries="6"name="NavigateRecovery"><PipelineSequencename="NavigateWithReplanning"><RateControllerhz="1.0"><RecoveryNodenumber_of_retries="1"name="ComputePathToPose"><ComputePathToPosegoal="{goal}"path="{path}"planner_id="GridBased"/><ReactiveFallbackname="ComputePathToPoseRecoveryFallback"><GoalUpdated/><ClearEntireCostmapname="ClearGlobalCostmap-Context"service_name="global_costmap/clear_entirely_global_costmap"/>8.2Nav2相关概念8.2.3行为树</ReactiveFallback></RecoveryNode></RateController><RecoveryNodenumber_of_retries="1"name="FollowPath"><FollowPathpath="{path}"controller_id="FollowPath"/><ReactiveFallbackname="FollowPathRecoveryFallback"><GoalUpdated/><ClearEntireCostmapname="ClearLocalCostmap-Context"service_name="local_costmap/clear_entirely_local_costmap"/></ReactiveFallback></RecoveryNode></PipelineSequence><ReactiveFallbackname="RecoveryFallback"><GoalUpdated/><RoundRobinname="RecoveryActions"><Sequencename="ClearingActions"><ClearEntireCostmapname="ClearLocalCostmap-Subtree"service_name="local_costmap/clear_entirely_local_costmap"/>8.2Nav2相关概念8.2.3行为树<ClearEntireCostmapname="ClearGlobalCostmap-Subtree"service_name="global_costmap/clear_entirely_global_costmap"/></Sequence><Spinspin_dist="1.57"/><Waitwait_duration="5"/><BackUpbackup_dist="0.15"backup_speed="0.025"/></RoundRobin></ReactiveFallback></RecoveryNode></BehaviorTree></root>总而言之,Nav2利用行为树定义了机器人的运动行为。行为树上的节点将与规划器、控制器和恢复器通信,调动各个动作服务器的功能,完成导航任务。例如单点导航功能,行为树上的相应节点会向规划器请求一条规划到目标点的路径,然后行为树上的另一个节点与控制器通信,将规划好的路径发给控制器去执行。8.2Nav2相关概念8.2.4状态估计机器人导航中最重要的状态就是机器人的位置,或者说对机器人进行定位。机器人定位有许多方法,Nav2框架使用激光SLAM技术对机器人进行定位。定位时需要使用坐标系,ROS在REP105的规范文件中定义了导航时机器人定位所需的坐标系及其之间的关系,如图所示。8.2Nav2相关概念8.2.4状态估计以下是图8.5中各坐标系的含义:(1)earth坐标系表示地球坐标,是导航中最顶级的坐标系,一般局部导航可不使用该坐标系;(2)map坐标系表示地图坐标,通常是导航中使用的最顶级坐标系,RViz2中默认该坐标系为顶级坐标系;(3)odom坐标系表示机器人里程计原点坐标系,需要由定位技术提供,也就是需要由SLAM技术提供map—>odom的坐标变换;(4)base_link坐标系表示机器人主连杆的坐标系,一般是由机器人携带的里程计传感器给定的;8.2Nav2相关概念8.2.4状态估计在Nav2中机器人定位时最关键的就是odom坐标系(即map—>odom的坐标系变换)和base_link坐标系(即odom—>base_link的坐标系变换)。其中base_link坐标系可以通过多种方式得到,如激光雷达、雷达、车轮编码器、VIO和IMU等,目的是为机器人的运动提供一个平滑、连续的局部框架。由于提供base_link坐标系的里程计传感器精度通常较差,需要通过odom坐标系进行补偿,因此,在有些定位方法里里程计传感器并不是必须的,例如Cartographer就可在不依赖里程计传感器的情况下直接计算map—>base_link的坐标变换,当然为了能够与ROS规定的坐标系相一致,会虚拟一个与map重合的odom坐标系。注意:使用导航系统不需要在机器人上安装激光雷达。也不要求使用基于激光雷达的防撞、定位或SLAM。使用基于视觉或深度的定位系统并使用其他传感器来避免碰撞,同样可以取得成功。本书主要介绍基于激光雷达的Nav2导航。8.2Nav2相关概念8.2.5环境表示环境表示是机器人将感知的环境进行综合形成的一种规范和全面的描述。机器人的决策和行动都依赖于环境表示。环境表示被用于导航过程中的控制器、规划器和恢复器中,使得导航安全和高效。具体来说,环境表示中最核心的内容就是基于地图的代价地图(Costmap)。代价地图反映了机器人当前环境的整体。代价地图是由单元格组成的规则二维网格,每个单元格具有未知、空闲、占用或膨胀等多种状态。机器人利用代价地图进行全局路径规划和控制机器人移动。8.2Nav2相关概念8.2.5环境表示以上就是Nav2导航的核心概念。在Navigation1中,导航功能通过move_base节点以流水线方式实现,该节点内嵌状态机协调全局和局部路径规划器这两个插件化组件。导航流程首先在一状态中调用全局路径规划器以确定路径,然后在另一状态中将路径传递给局部路径规划器执行。相较之下,Nav2设计了不同的组织方式,其全局路径规划功能由多个插件实现,并可通过服务器请求;局部路径规划器同样以插件形式存在,遵循统一接口,可通过服务器发送路径信息至控制器执行,从而实现更加灵活和模块化的导航控制。8.3Nav2的安装8.3Nav2的安装与其他ROS2功能包的安装方法类似,Nav2安装的具体步骤如下:(1)在安装前,进行系统更新,执行命令:sudoaptupdatesudoaptupgrade(2)安装Nav2的核心功能包,包括navigation2系列功能包和nav2-bringup功能包,执行命令:sudoaptinstallros-jazzy-navigation2sudoaptinstallros-jazzy-nav2-bringup(3)在Gazebo进行导航仿真时,需要安装加载SDF模型的sdformat-urdf功能包,执行命令:sudoaptinstallros-jazzy-sdformat-urdf8.3Nav2的安装(4)安装构建地图的功能包,slam-toolbox和cartographer功能包,其中slam-toolbox是Nav2默认的建图工具,cartographer是谷歌开发的另一款常用的建图工具,执行命令:sudoaptinstallros-jazzy-slam-toolboxsudoaptinstallros-jazzy-cartographersudoaptinstallros-jazzy-cartographer-ros通过上述4步,就完成了轮式机器人建图和导航所需要的功能包。在以下内容中,将介绍使用上述功能包完成轮式机器人的建图与导航的仿真。8.4slam_toolbox建图8.4slam_toolbox建图构建地图是导航的前提,slam_toolbox功能包提供了一个用于2D激光雷达SLAM(同步定位与建图)的工具集,主要用于机器人在未知环境中进行建图和定位。它提供了一系列功能,使得用户可以轻松地进行地图构建、保存、优化和长期维护。8.4slam_toolbox建图8.4.1slam_toolbox简介slam_toolbox是对ROS1中建图工具GMapping,Karto和Hector的彻底改进和优化,使用默认配置就能够完成2.4万平方米大小空间的建图,体现了良好的建图性能,是ROS2中默认的建图工具。slam_toolbox提供了三种主要的操作模式和功能:同步建图、异步建图和纯定位。同步建图能够在空间中进行地图构建和定位,同时保持测量数据的缓冲区,以便添加到SLAM。同步建图在地图质量特别重要或进行离线处理时非常有利。相对而言,异步模式仅在完成最后一次测量并满足新的更新条件时处理新的测量。因此,在运行复杂的回环闭合时,这种模式不会滞后于实时。然而,如果处理最后一次测量所需的时间过长,地图可能不会包含所有有效的测量数据。当实时定位的质量特别重要时,这种模式非常有利。这两种模式都可以用于多会话SLAM,即重新加载之前的会话并继续优化位姿图。8.4slam_toolbox建图8.4.1slam_toolbox简介纯定位模式不能用于持久化环境中的变化。相反,它使用当前会话中的测量数据滚动缓冲区,并将其与原始会话的测量数据和位姿图进行匹配。当前会话的测量数据将以新的约束和节点的形式添加到位姿图中。这使得环境中的变化能够被纳入考虑,从而基于新特征或移动的物体提高定位质量。随着时间的推移,滚动缓冲区中的测量数据将“过期”,并从位姿图和定位问题中移除,令位姿图恢复到该区域的原始状态。将这一过程称为弹性位姿图变形。slam_toolbox主要功能包括: 建图、保存地图pgm文件。 细化地图、重新建图或在已保存的地图上继续建图。 长期建图:加载已保存的地图继续建图,同时从新的激光点云中删除无关信息。8.4slam_toolbox建图8.4.1slam_toolbox简介 在已有的地图上优化定位模式。也可以使用“激光雷达里程计”模式在没有建图的情况下运行定位模式。 同步、异步建图。 动态地图合并。 基于插件的优化求解器,带有一个新的基于谷歌Ceres的优化插件。 交互的RVIZ插件,提供RVIZ图形操作工具,用于在建图期间操作节点和连接。 地图序列化和无损数据存储。8.4slam_toolbox建图8.4.1slam_toolbox简介slam_toolbox建图的过程如下:(1)以同步或异步模式运行,创建一个ROS2节点。该节点订阅激光扫描点云和里程计两个话题,并发布地图到里程计变换的TF话题和地图话题。(2)获取里程计和激光雷达数据,激光话题订阅的回调函数中,将生成一个位姿使用里程计数据)和与该节点相关联的激光扫描。这些带位姿的扫描对象PosedScan形成一个队列,供算法处理。(3)带位姿的扫描对象PosedScan队列用于构建位姿图,使用激光扫描匹配来完善里程计。该位姿图用于计算机器人位姿,并找到闭环。如果发现闭环,则优化位姿图,并更新姿态估计。位姿估计将用于计算并发布机器人到里程计变换的地图。(4)与位姿图中每个位姿相关联的激光扫描用于构建和发布地图。8.4slam_toolbox建图8.4.2slam_toolbox建图流程slam_toolbox提供了便捷的建图功能,配合仿真场景和相关节点,只需要简单配置就可以完成场景的建图。以下通过例子详细介绍利用slam_toolbox工具集进行建图的方法和步骤。使用slam_toolbox进行仿真场景的建图主要包括项目的创建,仿真场景构建,机器人构建,话题的桥接,slam_toolbox建图等步骤。为了直接体验slam_toolbox建图可直接编译和运行本书附赠第8章源代码ros2_ws8中的Launch文件build_map.launch.py,执行命令:colconbuild--symlink-installsourceinstall/setup.bashros2launchnav_carbuild_map.launch.py8.4slam_toolbox建图8.4.2slam_toolbox建图流程上述命令的效果如图所示。8.4slam_toolbox建图8.4.2slam_toolbox建图流程启动build_map.launch.py文件成功后,系统将会打开一个配置好的RViz2界面,如图所示,界面中会显示机器人的传感器数据和环境信息,特别是会在车辆四周形成一个局部地图。同时,还会启动一个Gazebo仿真环境界面,如图所示,提供了机器人在仿真环境中的动态模拟。RViz2和Gazebo两个界面的结合为后续的导航和建图提供了直观的可视化支持,方便后续监控和调试机器人行为。8.4slam_toolbox建图8.4.2slam_toolbox建图流程8.4slam_toolbox建图8.4.2slam_toolbox建图流程8.4slam_toolbox建图8.4.2slam_toolbox建图流程Launch文件build_map.launch.py的代码如下:importosfromament_index_python.packagesimportget_package_share_directoryfromlaunchimportLaunchDescriptionfromlaunch.actionsimportIncludeLaunchDescriptionfromlaunch.launch_description_sourcesimportPythonLaunchDescriptionSourcefromlaunch_ros.actionsimportNodepackagepath=get_package_share_directory('nav_car')print(packagepath)world_sdf=packagepath+'/sdf/nav_world.sdf'carmodel=packagepath+'/sdf/nav_car.sdf'robot_desc=open(carmodel).read()8.4slam_toolbox建图8.4.2slam_toolbox建图流程defgenerate_launch_description():gazebo_node=IncludeLaunchDescription(PythonLaunchDescriptionSource([os.path.join(get_package_share_directory('ros_gz_sim'),'launch'),'/gz_sim.launch.py']),launch_arguments=[('gz_args',f'{world_sdf}-r')])robot_to_gazebo=Node(package='ros_gz_sim',executable='create',arguments=['-string',robot_desc,'-x','1','-y','1','-z','0.05','-name','nav_car'])8.4slam_toolbox建图8.4.2slam_toolbox建图流程bridge_node=Node(package='ros_gz_bridge',executable='parameter_bridge',parameters=[{'config_file':packagepath+'/sdf/nav_bridge.yaml'},],)
image_bridge_node=Node(package='ros_gz_image',executable='image_bridge',arguments=['/camera'])
8.4slam_toolbox建图8.4.2slam_toolbox建图流程robot_desc_node=Node(package='robot_state_publisher',executable='robot_state_publisher',name='robot_state_publisher',parameters=[{'use_sim_time':True},{'robot_description':robot_desc},])rviz_node=Node(package='rviz2',executable='rviz2',name='rviz',arguments=['-d',packagepath+'/sdf/rviz.rviz',])
8.4slam_toolbox建图8.4.2slam_toolbox建图流程slam_node=IncludeLaunchDescription(PythonLaunchDescriptionSource([os.path.join(get_package_share_directory('slam_toolbox'),'launch'),'/online_async_launch.py']))
nav_node=IncludeLaunchDescription(PythonLaunchDescriptionSource([os.path.join(get_package_share_directory('nav2_bringup'),'launch'),'/bringup_launch.py']),launch_arguments=[('use_sim_time','true')])
8.4slam_toolbox建图8.4.2slam_toolbox建图流程returnLaunchDescription([gazebo_node,robot_to_gazebo,bridge_node,image_bridge_node,robot_desc_node,rviz_node,slam_node,nav_node,])
8.4slam_toolbox建图8.4.2slam_toolbox建图流程在上述进行建图的Launch文件中,在只使用了ROS2第三方功能包,而不使用任何自定义节点(除Launch文件外无需编程)的情况下,启动仿真环境并启动slam_toolbox建图。具体来说,上述Launch文件主要的功能有:(1)获取仿真环境的SDF文件路径;(2)读取轮式机器人SDF模型到字符串;(3)Gazebo加载仿真世界;(4)将机器人模型添加到仿真世界中;(5)配置ROS2和Gazebo间的里程计、关节状态和速度控制等话题的桥接;(6)设置ROS2和Gazebo间图像数据桥接;(7)发布机器人的状态信息;8.4slam_toolbox建图8.4.2slam_toolbox建图流程(8)启动可视化工具RViz2;(9)启动SLAM节点进行实时建图;(10)启动导航系统。当上述建图准备就绪后,就可以借助Nav2实现边建图边导航。在RViz2的工具栏中点击[2DGoalPose],在主窗体按下鼠标左键后会出现一个绿色箭头,如图所示。该绿色箭头用于指定机器人目标点,将此箭头移动到机器人的目的地(目的地设置不要距离机器人过远),然后拖动,以设置方向。机器人将根据创建的地图进行路径规划,躲避障碍物,移动到目的地。重复按照上述方法,使机器人探测完成整个地图的构建,如图所示。8.4slam_toolbox建图8.4.2slam_toolbox建图流程8.4slam_toolbox建图8.4.2slam_toolbox建图流程8.4slam_toolbox建图8.4.3地图的保存地图构建完成后,需要保存地图以供后续的导航使用。保存地图的方法主要包括两种:(1)使用RViz2中的slam_toolbox插件,可以通过图形界面轻松选择并保存当前的地图,操作直观且便捷;(2)使用第三方功能包nav2-map-server,在命令行中进行保存。掌握这两种方法后,可以灵活地管理地图数据,确保在后续的任务中利用已构建的环境地图。以下介绍两种保存地图的方法。(1)加载RViz2的slam_toolbox插件。首先,点击RViz2界面中的Panels菜单,选择“AddNewPanel”功能,如图(a)所示。然后,在打开的插件选择slam_toolbox文件夹下的SlamToolboxPlugin插件,如图(b)所示。8.4slam_toolbox建图8.4.3地图的保存8.4slam_toolbox建图8.4.3地图的保存选择完成后,在RViz2的左侧栏中出现了SlamToolboxPlugin插件,如图所示。SlamToolboxPlugin插件主要提供了手动闭环和在线/离线建图、控制在线和离线数据、序列化和反序列化服务和将序列化地图文件添加为RViz2中的子地图等功能。8.4slam_toolbox建图8.4.3地图的保存在地图构建完成后,可以通过点击插件中的“SaveMap”按钮来保存刚才扫描完成的地图。此时,若成功地保存地图,将在终端看到“Mapsaved”的提示信息,如图所示,这表明地图已经存储成功。8.4slam_toolbox建图8.4.3地图的保存地图的保存路径为运行当前Launch文件的终端所在位置,如图所示,在该目录下生成两个地图文件,可根据需要进行地图的管理和应用。保存的地图由两个文件组成:一个是.pgm文件,表示地图的图像,包含了障碍物和非障碍物等环境的可视化信息;另一个是.yaml文件,包含了地图的元数据,如分辨率、坐标原点和像素含义等内容。这两个文件共同构成了完整的地图数据,可供在后续的导航中加载和使用。8.4slam_toolbox建图8.4.3地图的保存下图为保存后的地图,地图是以.pgm文件格式保存为图像。8.4slam_toolbox建图8.4.3地图的保存地图图像文件.pgm是一种纯图像格式,无法存储地图的元数据。与.pgm图像同名的.yaml文件记录地图元数据,地图的.yaml文件内容如下:image:map_1725111373.pgmmode:trinaryresolution:0.05origin:[-5.66,-4.5,0]negate:0occupied_thresh:0.65free_thresh:0.258.4slam_toolbox建图8.4.3地图的保存以上各参数的含义为:①image:该.yaml文件所匹配的表示地图图像的.pgm文件路径,可以是绝对路径,也可以是相对于该.yaml文件位置的路径。②mode:可有三种值:三进制(Trinary)、比例(Scale)或原始值(Raw)。默认值为三进制。当mode为三进制时,整个地图图像的像素值由3种值构成,分别表示该像素代表的区域占用,未知和自由。③resolution:地图分辨率,单位是米/像素。④origin:地图左下角像素的二维姿态,以(x、y、yaw)表示,x表示横坐标,y表示纵坐标,yaw表示逆时针旋转角度(yaw=0表示不旋转)。8.4slam_toolbox建图8.4.3地图的保存⑤occupied_thresh:占用概率大于此阈值的像素被视为完全占用(障碍物)。⑥free_thresh:占用概率小于此阈值的像素被视为完全空闲(可通行)。⑦negate:是否要颠倒白色(自由)和黑色(占用)的语义(对阈值的解释不受影响)。(2)使用第三方功能包nav2-map-servernav2-map-server功能包是Nav2中的与地图有关的功能包,主要提供了处理和管理地图文件的必要工具,能够方便地加载、保存和发布地图数据。nav2-map-server功能包的map_saver_cli节点提供了一个保存地图的命令行工具,该节点功能是将当前的地图数据保存到指定的文件中。8.4slam_toolbox建图8.4.3地图的保存map_saver_cli命令的使用格式是:ros2runnav2_map_servermap_saver_cli[arguments]其中,arguments为保存地图时配置的参数,主要有:①-t<map_topic>:设置发布地图的话题,默认值是/map。②-f<mapname>:设置地图保存的路径和名称,不带后缀,不设置时会按时间戳生成。③--occ<threshold_occupied>:设置占用阈值,默认值是0.65。④--free<threshold_free>:设置自由阈值,默认值是0.25。⑤--fmt<image_format>:设置图像格式,默认值是pgm。⑥--modetrinary(default)/scale/raw:设置地图模型,默认值是三进制(trinary)。8.4slam_toolbox建图8.4.3地图的保存在使用slam_toolbox完成建图后,使用可以使用map_saver_cli保存地图,执行命令:ros2runnav2_map_servermap_saver_cli在上述命令中,使用了map_saver_cli的默认参数值。命令的运行效果如如图8.16所示,保存成功时,在终端输出保存的地图名map_1733881100.pgm,地图会保存在当前终端所在的文件夹下。8.4slam_toolbox建图8.4.3地图的保存注意:nav2-map-server功能包在安装Nav2时会自动安装,如果运行上述命令提示没有该功能包,则需单独安装,命令为:sudoaptinstallros-jazzy-nav2-map-server。8.4slam_toolbox建图8.4.4地图的发布在上一节中,介绍了两种保存地图的方法,地图在发布后就可用于机器人的导航。nav2_map_server的map_server节点提供了地图的发布功能。map_server节点是一种生命周期节点。与普通节点不同,生命周期节点在运行后,还需要进行状态的切换后才可正常运行。对于使用map_server发布地图来说,在启动节点后,还需要将其状态切换为活动(Active)才能发布地图话题/map。以下将将介绍三种发布地图的方法。(1)生命周期节点管理首先,创建map_server节点,并设置发布的地图。在地图所在的文件文件夹打开终端,执行命令:ros2runnav2_map_servermap_server--ros-args--paramyaml_filename:=map_1725111373.yaml8.4slam_toolbox建图8.4.4地图的发布其中yaml_filename:=map_1725009999.yaml表示地图的名称,运行成功后,结果如图所示。8.4slam_toolbox建图8.4.4地图的发布其次,在一个新的终端,启动RViz2,执行命令:ros2runrviz2rviz2打开RViz2后,需要手动添加地图组件。首先,点击左侧下方的“Add”按钮,然后找到“Map”选项,接着点击“OK”以成功添加。然后,手动输入地图组件的主题为/map(此时虽然启动了map_server,但map_server还没有激活,不会发布地图,/map话题尚未发布,因此只能手动输入)。8.4slam_toolbox建图8.4.4地图的发布8.4slam_toolbox建图8.4.4地图的发布最后,切换map_server节点的状态到active,发布地图。在ROS2中,map_server节点采用了生命周期节点进行管理。节点的生命周期管理需要在启动过程中进行状态过渡。需要将map_server节点从create状态过渡到active状态。ros2lifecycle命令提供了手动触发生命周期节点进行状态过渡的功能。在一个新终端,依次执行以下命令:ros2lifecycleset/map_serverconfigureros2lifecycleset/map_serveractivate上述命令的执行效果如图,如图所示,表明节点配置并且激活成功。8.4slam_toolbox建图8.4.4地图的发布此时在启动map_server的终端界面,可以看到终端成功输出了所加载地图的参数信息,如图所示,表明地图发布成功。8.4slam_toolbox建图8.4.4地图的发布同时在RViz2界面,即可看到地图被成功地加载和显示,如图所示。8.4slam_toolbox建图8.4.4地图的发布(2)使用Nav2导航中的nav2_util功能包中的lifecycle_bringup节点首先,创建map_server节点,并设置发布的地图。在地图所在的文件文件夹打开终端,执行命令:ros2runnav2_map_servermap_server--ros-args--paramyaml_filename:=map_1725111373.yaml其次,在一个新终端里启动RViz2。并和方法(1)中一样,手动添加MAP组件,并且将Topic切换为/map。ros2runrviz2rviz2最后,在一个新终端里,运行以下命令:ros2runnav2_utillifec
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 机械制造工艺师产品加工精度控制绩效评定表
- 创意美术班:描绘美好世界小学主题班会课件
- 网络安全防护技术手册与漏洞扫描指南
- 警钟长鸣预防网络诈骗小学主题班会课件
- 关于2026年战略合作伙伴会议纪要的确认函(3篇)范文
- 危险化学品生产单位车工运行操作安全操作规程
- 2026执业医师技能考试真题+答案完整版
- 基于物联网技术的仓储管理系统升级改造计划
- 制造业工厂生产车间主任生产效率绩效评定表
- 2026年全国专利代理师资格考试专利代理实务历年参考题库含答案
- 2026年辅导员面试题含参考答案
- 2026年《安全生产法》考试题库及答案
- 2026年甘肃省临夏州事业单位招聘565人参考题库及答案详解(有一套)
- 2026年成都市直机关遴选公务员笔试真题及答案解析
- 2026年辽宁高级档案职称考试(档案管理概论)练习题及答案
- 世界历史九年级上册新教材分析(2026新版) 课件
- 2026重庆国隆农业科技产业发展集团有限公司招聘9人(第二批)考试备考试题及答案详解
- 2026年市政施工员继续教育考试卷题库附答案
- 2026年广西公需科目《人工智能国家战略与政策通识》题库
- 电子厂品控细则
- 2026年八年级物理八年级下册期末模拟试卷(山东专用版·压轴题突破卷含答案详解与评分标准)
评论
0/150
提交评论