《自主导航技术与应用》课件 第七章自主导航系统应用_第1页
《自主导航技术与应用》课件 第七章自主导航系统应用_第2页
《自主导航技术与应用》课件 第七章自主导航系统应用_第3页
《自主导航技术与应用》课件 第七章自主导航系统应用_第4页
《自主导航技术与应用》课件 第七章自主导航系统应用_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

7.1ROS操作系统及使用ROS(RobotOperatingSystem)是一个开源的机器人中间件框架,而非传统操作系统,旨在为机器人开发提供跨平台、跨语言的支持。其核心功能包括硬件抽象、通信机制、工具链和库函数,帮助开发者高效集成传感器、执行器、算法等模块,实现机器人感知、决策与控制的协同。ROS通过节点(Node)作为基本执行单元,节点间通过话题(Topic)、服务(Service)、动作(Action)等通信机制交互,形成分布式网络拓扑(ROSGraph),支持多任务并行与模块化开发。例如,节点可独立完成图像处理、运动控制等功能,通过话题实时共享数据。ROS分为ROS1(基于TCPROS/ROSCPP通信)和ROS2(基于DDS协议,支持实时性与去中心化架构)两大版本。安装便捷,可通过一键脚本(如fishros)或手动配置环境变量完成。其工具链丰富,如Rviz用于可视化传感器数据与地图,Gazebo进行物理仿真,Catkin构建编译系统,支持Python、C++等语言开发。典型应用场景包括SLAM建图(如Cartographer)、机械臂运动规划(MoveIt!)、多机器人协同等。ROS社区活跃,提供大量功能包(Package)与教程,降低了机器人开发门槛,广泛应用于教育、科研及工业领域。7.1.1什么是ROSROS是一个灵活且强大的开源机器人操作系统,旨在为机器人软件开发提供一个通用的平台。ROS是构建机器人应用程序的一系列库、工具和程序包的集合(如下图),它通过提供硬件抽象、设备驱动、库函数、可视化工具、消息传递和软件包管理等功能,可以极大简化繁杂多样的机器人平台下的复杂任务创建与稳定行为控制。ROS由核心通信机制、开发工具、应用功能和生态系统四个部分组成7.1.1什么是ROS2)硬件无关性:ROS提供了对各种硬件设备的驱动和接口支持,使得开发者能够方便地与不同类型的传感器、执行器等设备进行交互。3)开放性和共享性:ROS是一个开源项目,拥有庞大的用户社区和丰富的资源库,开发者可以共享自己的软件包或从社区中获取现有的软件包,加快开发进程。4)可视化工具:ROS提供了可视化工具,如Rviz(RobotVisualizer)和RQt(RosQt),方便开发者实时查看和调试机器人的状态、传感器数据和运动轨迹。5)强大的生态系统:ROS生态系统中存在众多的第三方软件包和库,支持各种功能,如机器人感知、导航、运动控制等,能够满足不同应用需求。7.1.2ROS架构ROS一般分成操作系统(OperationSystem)层、中间层和应用层。目前ROS分成ROS1和ROS2两种,本章采用的演示环境是Ubuntu18.04+ROS(MelodicMorenia),是基于ROS1来操作的,为避免混淆,下文ROS均表示ROS1。ROS的架构如下图所示。ROS并不是一个传统意义上的操作系统,要依托于Linux系统在OS层,可以直接使用ROS官方支持度最好的Ubuntu操作系统,也可以使用macOS、Arch、Debian等操作系统。7.1.2ROS架构其次,Linux并没有针对机器人开发提供特殊的中间件,因此ROS在中间层做了大量工作,其中最重要的就是基于TCPROS/UDPROS的通信系统。ROS的通信系统基于TCP/UDP网络,在此之上进行了再次封装,也就是TCPROS/UDPROS。通信系统使用发布/订阅、客户端/服务器等模型,实现多种通信机制的数据传输。在通信机制之上,ROS提供了大量机器人开发相关的库,如数据类型定义、坐标变换、运动控制等,可以提供给应用层使用。7.1.2ROS架构最后,在应用层,ROS需要运行一个管理者——Master,负责管理整个系统的正常运行。ROS社区内共享了大量的机器人应用功能包,这些功能包内的模块以节点为单位运行,以ROS标准的输入输出作为接口,开发者不需要关注模块的内部实现机制,只需要了解接口规则即可实现复用,极大地提高了开发效率。7.1.3相关名词解释在使用ROS开发机器人时,总是不可避免的要接触一些在ROS中特定的重要名词概念。1)节点节点(Node)就是一些执行运算任务的进程,一个系统一般由多个节点组成,也可以称为“软件模块”。节点概念的引入使得基于ROS的系统在运行时更加形象。如下图所示,在这个图中,进程就是图中的节点,而端对端的连接关系就是节点之间的连线。7.1.3相关名词解释2)消息节点之间最重要的通信机制就是基于发布/订阅模型的消息(Message)通信。每一个消息都是一种严格的数据结构,支持标准数据类型(整型、浮点型、布尔型等),也支持嵌套结构和数组(类似于C语言的结构体struct),还可以根据需求由开发者自主定义。例如下图就是利用接口定义语言描述的一个点的消息。7.1.3相关名词解释3)话题消息以一种发布/订阅(Publish/Subscribe)的方式传递(见下图)。一个节点可以针对一个给定的话题(Topic)发布消息(称为发布者),也可以关注某个话题并订阅特定类型的数据(称为订阅者)。发布者和订阅者并不了解彼此的存在,系统中可能同时有多个节点发布或者订阅同一个话题的消息。7.1.3相关名词解释4)服务虽然基于话题的发布/订阅模型是一种很灵活的通信模式,但是对于双向的同步传输模式并不适合。在ROS中,我们称这种同步传输模式为服务(Service),其基于客户端/服务器(Client/Server)模型,包含两个部分的通信数据类型:一个用于请求,另一个用于应答,类似于Web服务器。与话题不同的是,ROS中只允许有一个节点提供指定命名的服务。7.1.3相关名词解释5)节点管理器为了统筹管理以上概念,系统当中需要有一个控制器使得所有节点有条不紊地执行,这就是ROS节点管理器(ROSMaster)。ROSMaster通过远程过程调用(RPC,RemoteProcedureCall)提供登记列表和对其他计算图表的查找功能,帮助ROS节点之间相互查找、建立连接,同时还为系统提供参数服务器,管理全局参数。ROSMaster就是一个管理者,没有它的话,节点将无法找到彼此,也无法交换消息或调用服务,整个系统将会瘫痪,由此可见其在ROS系统中的重要性。7.1.3相关名词解释6)文件系统类似于操作系统,ROS将所有文件按照一定的规则进行组织,不同功能的文件被放置在不同的文件夹下,如右图所示。功能包(Package):功能包是ROS软件中的基本单元,包含ROS节点、库、配置文件等。功能包清单(PackageManifest):每个功能包都包含一个名为package.xml的功能包清单,用于记录功能包的基本信息,包含作者信息、许可信息、依赖选项、编译标志等。元功能包(MetaPackage):在新版本的ROS中,将原有功能包集(Stack)的概念升级为“元功能包”,主要作用都是组织多个用于同一目的的功能包。例如一个ROS导航的元功能包中会包含建模、定位、导航等多个功能包。消息(Message)类型:消息是ROS节点之间发布/订阅的通信信息,可以使用ROS提供的消息类型,也可以使用.msg文件在功能包的msg文件夹下自定义所需要的消息类型。服务(Service)类型:服务类型定义了ROS客户端/服务器通信模型下的请求与应答数据类型,可以使用ROS系统提供的服务类型,也可以使用.srv文件在功能包的srv文件夹中进行定义。代码(Code):用来放置功能包节点源代码的文件夹。7.1.4ROS通信机制ROS的分布式框架,为用户提供多节点(进程)之间的通信服务,所有软件功能和工具都建立在这种分布式通信机制上,所以ROS的通信机制是底层也是核心的技术。在大多数应用场景下,尽管不需要关注底层通信的实现机制,但是了解其相关原理一定会帮助我们在开发过程中更好地使用ROS。以下就ROS核心的三种通信机制进行介绍。话题通信(发布订阅模式)服务通信(请求响应模式)参数服务器(参数共享模式)7.1.4ROS通信机制话题在ROS中使用最为频繁,其通信模型也较为复杂。如图所示话题通信实现模型是比较复杂的,该模型如下图所示,该模型中涉及到三个角色:ROSMaster(管理者)、Talker(发布者)和Listener(订阅者)。ROSMaster负责保管Talker和Listener注册的信息,并匹配话题相同的Talker与Listener,帮助Talker与Listener建立连接,连接建立后,Talker可以发布消息,且发布的消息会被Listener订阅。1.话题通信机制7.1.4ROS通信机制整个流程由以下步骤实现:(1)Talker注册Talker启动,通过1234端口使用RPC向ROSMaster注册发布者的信息,包含所发布消息的话题名;ROSMaster会将节点的注册信息加入注册列表中。ROSMaster会将节点的注册信息加入到注册表中。(2)Listener注册Listener启动后,也会通过RPC在ROSMaster中注册自身信息,包含需要订阅消息的话题名。ROSMaster会将节点的注册信息加入到注册表中。(3)ROSMaster实现信息匹配ROSMaster会根据注册表中的信息匹配Talker和Listener,并通过RPC向Listener发送Talker的RPC地址信息。(4)Listener向Talker发送请求Listener根据从Master发回的Talker地址信息,通过RPC向Talker发送连接请求,传输订阅的话题名称、消息类型以及通信协议(TCP/UDP)。(5)Talker确认请求Talker接收到Listener的请求后,也是通过RPC向Listener确认连接信息,并发送自身的TCP地址信息。(6)Listener与Talker件里连接Listener根据步骤4返回的消息使用TCP与Talker建立网络连接。(7)Talker向Listener发送消息1.话题通信机制7.1.4ROS通信机制2.服务通信机制服务是一种带有应答的通信机制,通信原理如图所示,与话题的通信相比,其减少了Listener与Talker之间的RPC通信。整个流程由以下步骤实现:服务是一种带有应答的通信机制,通信原理如图所示,与话题的通信相比,其减少了Listener与Talker之间的RPC通信。具体步骤如下:(1)Talker注册Talker启动,通过1234端口使用RPC向ROSMaster注册发布者的信息,包含所提供的服务名;ROSMaster会将节点的注册信息加入注册列表中。(2)Listener注册Listener启动,同样通过RPC向ROSMaster注册订阅者的信息,包含需要查找的服务名。(3)ROSMaster进行信息匹配Master根据Listener的订阅信息从注册列表中进行查找,如果没有找到匹配的服务提供者,则等待该服务的提供者加入;如果找到匹配的服务提供者信息,则通过RPC向Listener发送Talker的TCP地址信息。(4)Listener与Talker建立网络连接Listener接收到确认信息后,使用TCP尝试与Talker建立网络连接,并且发送服务的请求数据。(5)Talker向Listener发布服务应答数据Talker接收到服务请求和参数后,开始执行服务功能,执行完成后,向Listener发送应答数据。2.服务通信机制7.1.4ROS通信机制3.参数通信机制参数类似于ROS中的全局变量,由ROSMaster进行管理,其通信机制较为简单,不涉及TCP/UDP的通信7.1.4ROS通信机制整个流程由以下步骤实现:(1)Talker设置变量Talker使用RPC向ROSMaster发送参数设置数据,包含参数名和参数值;ROSMaster会将参数名和参数值保存到参数列表中。(2)Listener查询参数值Listener通过RPC向ROSMaster发送参数查找请求,包含所要查找的参数名。(3)ROSMaster向Listener发送参数值Master根据Listener的查找请求从参数列表中进行查找,查找到参数后,使用RPC将参数值发送给Listener。这里需要注意的是,如果Talker向Master更新参数值,Listener在不重新查询参数值的情况下是无法知晓参数值已经被更新的。所以在很多应用场景中,需要一种动态参数更新的机制。3.参数通信机制7.1.4ROS通信机制在深入研究怎么利用ROS开发机器人之前,我们简单尝试ROS的使用。首先启动ROS自带的小海龟测试程序,依次在三个终端中输入以下三条指令:$roscore$rosrunturtlesimturtlesim_node$rosrunturtlesimturtle_teleop_key在深入研究怎么利用ROS开发机器人之前,我们简单尝试ROS的使用。首先启动ROS自带的小海龟测试程序,依次在三个终端中输入以下三条指令:$roscore$rosrunturtlesimturtlesim_node$rosrunturtlesimturtle_teleop_key3.参数通信机制如图所示,小海龟可以通过键盘上下左右移动,表明ROS基本的环境安装成功。7.1.5ROS使用简例7.2激光雷达导航系统实例在ROS系统中,激光雷达导航系统的典型实例可参考基于RPLIDARA1雷达与TARKBOT麦克纳姆轮机器人的实现。该系统通过激光雷达实时扫描环境,利用Cartographer或gmapping算法构建2D栅格地图,并在Rviz中可视化地图与机器人位姿。导航功能基于ROSNavigationStack,结合AMCL算法进行定位,通过move_base包实现全局路径规划(如A*算法)与局部动态窗口法(DWA)避障,使机器人能自主绕开障碍物并抵达目标点。实验中,用户通过SSH远程控制小车,使用键盘或APP遥控移动,完成地图闭合后保存为.yaml和.pgm文件,支持后续多点导航任务。此外,系统还可扩展至多机协作场景,通过激光雷达数据融合实现多机器人协同避障与路径优化,适用于仓储物流、工业巡检等场景。7.2.1ROS中的导航功能简介机器人依赖导航技术实现自主的移动。ROS系统具有导航(Navigation)功能包,包括建图、定位、规划三大功能。它是一个二维导航堆栈,接收来自里程计、传感器流和目标姿态的信息,并输出发送到移动底盘的命令。ROS官方提供了一张导航功能包集的图示,如下图所示,该图中囊括了ROS导航的一些关键技术。上图中,白色的部分是必须且已实现的组件,灰色的部分是可选且已实现的组件,蓝色的部分是必须为每一个机器人平台创建的组件。其包括全局地图、自身定位、路径规划、运动控制、环境感知五个主要过程值得注意的是机器人在定位过程中,对与参考坐标系的使用,在ROS系统里有两种常用的方式:1)通过里程计定位:实时收集机器人的速度信息,计算并发布机器人坐标系与父级参考系的相对关系。2)通过传感器定位:传感器收集外界环境信息,通过匹配计算并发布机器人坐标系与父级参考系的相对关系。上述两种定位实现中,机器人坐标系一般使用机器人模型中的根坐标系(base_link或base_footprint),里程计定位时,父级坐标系一般称之为odom,如果通过传感器定位,父级参考系一般称之为map。当二者结合使用时,map和odom都是机器人模型根坐标系的父级,这是不符合坐标变换中"单继承"的原则的,所以,一般会将转换关系设置为:map->doom->base_link或base_footprint。7.2.1ROS中的导航功能简介7.2.2导航机器人模型搭建导航机器人模型搭建是一个融合硬件集成、软件配置与算法优化的系统性工程,核心步骤包括:硬件层面需选配差速底盘、激光雷达、摄像头等组件并完成电路连接;软件层面需部署ROS框架,配置传感器驱动及URDF机器人模型;算法层面则通过SLAM(如Gmapping或Cartographer)实现环境建模与定位,并结合导航栈(如Nav2或move_base)完成路径规划与动态避障;最后通过TF树验证、参数调优及多传感器融合优化系统性能,确保机器人实现精准导航与智能交互。7.2.3激光雷达导航实现激光雷达导航的实现基于激光雷达(LiDAR)通过发射激光脉冲并接收反射信号,利用飞行时间(ToF)原理精确计算目标距离,结合扫描技术生成环境的三维点云数据。其核心流程包括:激光发射器向周围环境发射激光束,接收器捕获反射信号后,通过光速与时间差计算障碍物距离,并结合扫描系统(如旋转或固态扫描)获取多角度数据,形成高精度三维点云地图。随后,通过SLAM(同步定位与地图构建)算法,将点云数据与惯性导航系统(IMU)、GPS等传感器信息融合,实时更新设备的位置、速度和姿态,实现动态环境中的精准定位与路径规划。例如,在自动驾驶中,激光雷达可识别车道线、行人及障碍物,结合算法预判移动轨迹,确保安全避障;在无人机或机器人领域,则通过点云建模实现复杂场景的自主导航。这一技术依赖高效的数据处理(如滤波、点云配准)和多传感器协同,最终为智能系统提供鲁棒的环境感知与决策支持。7.3视觉导航系统实例在ROS中,视觉导航系统典型实例为:基于RGB-D相机(如IntelRealSenseD435)实时采集深度与图像数据,通过视觉SLAM算法(如rtabmap或ORB-SLAM3)构建3D点云地图并定位,结合ROSNavigationStack的全局A*路径规划与局部DWA动态避障,实现自主导航。系统通过Rviz可视化地图与轨迹,支持多传感器融合与实时任务调整,适用于室内服务机器人或无人机场景。7.3.1深度相机模型实现在诸多SLAM算法中,一般都需要订阅激光雷达数据用于构建地图,因为激光雷达可以感知周围环境的深度信息,而深度相机也具备感知深度信息的功能,但是激光雷达价格比较昂贵,可以选用深度相机(Kinect)代替激光雷达,不过二者发布的消息类型是完全不同的,如果想要实现传感器的置换,那么就需要将深度相机发布的三维的图形信息转换成二维的激光雷达信息,这一功能就是通过ROS中的一个功能包:depthimage_to_laserscan来实现的。在转换之前,先来测试一下写好的相机模型,终端执行以下命令:#终端1$source./devel/setup.bash$roslaunchurdf_gazebotest.launch

#终端2$source./devel/setup.bash$roslaunchurdf_rvizCar.launch选择深度相机的话题,可得到右图所示结果7.3.2深度相机建图导航实现在kinect中也可以以点云的方式显示感知周围环境,但是需要先进行坐标变换,首先在src/urdf_gazebo/urdf/gazebo/depthCamera.xacro文件中修改:<frameName>support_depth</frameName>然后在src/urdf_gazebo/launch/test.launch中添加坐标变换关系:<nodepkg="tf2_ros"type="static_transform_publisher"name="static_transform_publisher"args="000-1.570-1.57/support/support_depth"/>最后在终端执行以下命令:#终端1$source./devel/setup.bash$roslaunchurdf_gazebotest.launch

#终端2$source./devel/setup.bash$roslaunchurdf_rvizCar.launch添加PointCloud2话题,可以得到如右图所示的结果,中间就是点云图。在ROS系统中完成深度相机建图导航的实现,需先安装深度相机驱动及导航功能包(如rtabmap-ros),通过depthimage_to_laserscan将深度图像转换为伪激光数据,利用RTAB-Map等SLAM算法构建三维栅格地图,结合move_base导航包进行路径规划,并通过闭环检测优化地图精度,最后在Rviz中可视化地图与导航路径,实现机器人自主定位与避障。7.3.2深度相机建图导航实现7.4机器人平台自主导航实例本节导航实例采用Turtlebot3机器人,TurtleBot3的目标是大幅降低平台的尺寸和价格,而不会牺牲性能,功能和质量。由于提供了不同可选,如底盘,计算机和传感器,TurtleBot3可以通过各种方式进行定制。7.4.1环境搭建机器人依赖导航技术实现自主的移动。ROS系统具有导航(Navigation)功能包,包括建图、定位、规划三大功能。它是一个二维导航堆栈,接收来自里程计、传感器流和目标姿态的信息,并输出发送到移动底盘的命令。ROS官方提供了一张导航功能包集的图示,如下图所示,该图中囊括了ROS导航的一些关键技术。7.4.2仿真测试

结合之前的内容,首先建图,保存地图,然后在已知地图环境下进行路径规划,可同时启用局部规划策略,通过激光雷达SLAM辅助局部建图,进行局部避障。

首先,打开Gazebo以及Rviz:

再开一个终端,打开键盘控制节点,用于控制小车运动建图,如右图(上)所示。

保存好图像过后,关闭打开Rviz的终端(终端2),然后在终端2中执行Turtlebot3源码里边的导航包文件。结果如右图(下)所示。7.5无人机平台自主导航实例上一节的导航实例仿真基于激光雷达的轮式机器人,本节将在无人机平台上实现自主导航,由于目前激光雷达的体积一般较大,不适用于小型的四旋翼无人机用于机载建图,因此,本节使用深度相机完成四旋翼无人机导航。7.5.1实现框架前面章节中,提到过基于相机的地图构建过程,本节采用鲁棒性更优的实时视觉SLAM算法框架,分为前端和后端,前端提取视觉信息(单目或者双目视觉特征点)并进行跟踪,后端处理前端得到的特征点跟踪信息,可融合IMU,GPS等外部信息,利用优化算法实时得出当前的状态。本节的开源代码EGO-Planner(Fast-Drone-250)旋翼无人机轨迹规划算法目前有以下

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论