项目六任务1:ROS操作系统概述-学生手册_第1页
项目六任务1:ROS操作系统概述-学生手册_第2页
项目六任务1:ROS操作系统概述-学生手册_第3页
项目六任务1:ROS操作系统概述-学生手册_第4页
项目六任务1:ROS操作系统概述-学生手册_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

任务6.1ROS操作系统概述-学生手册【任务导入】ROS机器人操作系统是一个灵活的框架,旨在简化机器人软件开发、通过ROS,开发人员可以快速构建各种类型的机器人应用程序,实现机器人的感知、规划、控制等功能。在本次任务中,我们将深入了解ROS操作系统的定义、通信机制、常用组件以及ROS的运行管理。通过本次任务,我们将逐步揭开ROS操作系统的神秘面纱,探索其在机器人领域的应用与潜力。提示:此次任务提示:此次任务我们理解并熟悉ROS操作系统的基本架构,通过学习ROS操作系统、ROS运行管理以及常用组件等了解智能底盘中基于ROS系统实现的智慧场景。

【学习目标】素质目标通过对ROS操作系统的了解,激发学生对科技创新的渴望;学习理论部分知识,培养学生新技术的能力;在学习过程中,利用系统的细致划分使学生潜移默化拥有严谨细微的学习态度。知识目标理解ROS操作系统的定义[K83];熟悉并理解ROS通信机制[K84];熟悉并理解ROS运行管理[K85];了解ROS常用组件[K86]。能力目标能讲解ROS操作系统的定义[A74];能讲解ROS的通信机制[A75];能掌握节点运行管理launch文件的基本操作方法[A76];能掌握ROS常用组件的基本操作方法[A77]。【知识准备】ROS操作系统定义1.ROS基本概念ROS是RobotOperatingSystem的缩写,通常称为“机器人操作系统”。适用于机器人的开源的元操作系统。它提供了操作系统应有的服务,包括硬件抽象、底层设备控制、常用函数的实现、进程间消息传递以及包管理。它也提供用于获取、编译、编写和跨计算机运行代码所需的工具和库函数。它的目的是为了提高机器人研发中的软件复用率,简化跨机器人平台创建复杂、鲁棒的机器人行为这一过程的难度与复杂度。ROS操作系统架构ROS操作系统架构总共分为三层,OS层、中间层以及应用层,整体架构如REF_Ref161664650\h图6-1-1所示(1)OS层OS层,即为经典意义的操作系统。ROS并非像Windows、Linux等传统意义上的操作系统,无法直接运行在计算机硬件上,对于ROS的OS层,我们需要依托官方推荐的Linux的Ubuntu系统来运行(2)中间层ROS经常运行在Linux操作系统上,但Linux系统本身没有针对机器人开发的中间件,因此ROS在中间层做了大量工作。首先是基于TCP/UDP网络,并在此之上进一步封装而构建的TCPROS/UDPROS通信系统。另外ROS还提供了一种进程内的通信方式—Nodelet,为多进程通信提供了一种更为优化的数据传输方式。在通信机制之上,ROS提供了大量的机器人开发的库,以提供给应用层调用。(3)应用层为了保证整个ROS系统的正常运行,ROS需要在应用层运行一个管理者,即Master。Master负责管理整个系统正常运行,为节点间建立连接。图6-1-SEQ图_6-1-\*ARABIC1ROS操作系统架构ROS通信机制1.ROS通信机制简介机器人是一种高度复杂的系统性实现,在机器人上可能集成各种传感器(雷达、摄像头、GPS等)以及运动控制实现,为了解耦合,在ROS中每一个功能点都是一个单独的进程,每一个进程都是独立运行的。更确切的讲,ROS是进程(也称为Nodes)的分布式框架。因为这些进程甚至还可分布于不同主机,不同主机协同工作,从而分散计算压力。不过随之也有一个问题:不同的进程是如何通信的?不同进程间如何实现数据交换的?这里就涉及到ROS中的通信机制了。ROS中的基本通信机制主要有如下三种实现策略:话题通信、服务通信、参数服务器2.话题通信机制(发布订阅模式)话题在ROS中使用最为频繁,其通信模型也较为复杂。在ROS中有两个节点:一个是发布者Talker,另一个是订阅着Listener。两个节点分别发布、订阅同一个话题,启动顺序没有强制要求,此处假设Talker首先启动,可分为如下七步分析建立通信的详细过程,如REF_Ref161664685\h图6-1-2所示图6-1-SEQ图_6-1-\*ARABIC2话题通信机制(1)Talker注册Talker启动,通过1234端口使用RPC向ROSMaster注册发布者的信息,包含所发布消息的话题名;ROSMaster会将节点的注册信息加入注册列表中。(2)Listener注册Listener启动,同样通过RPC向ROSMaster注册订阅者的信息,包含需要订阅的话题名。(3)ROSMaster进行信息匹配Master根据Listener的订阅信息从注册列表中进行查找,如果没有找到匹配的发布者,则等待发布者的加入:如果找到匹配的发布者信息,则通过RPC向Listener发送Talker的RPC地址信息。(4)Listener发送连接请求Listener接收到Master发回的Talker地址信息,尝试通过RPC向Talker发送连接请求,传输订阅的话题名、消息类型以及通信协议(TCP/UDP)(5)Talker确认连接请求Talker接收到Listener发送的连接请求后,继续通过RPC向Listener确认连接信息,其中包含自身的TCP地址信息。(6)Listener尝试与Talker建立网络连接Listener接收到确认信息后,使用TCP尝试与Talker建立网络连接。(7)Talker向Listener发布数据成功建立连接后,Talker开始向Listener发送话题消息数据。从上面的分析中可以发现,前五个步骤使用的通信协议都是RPC,最后发布数据的过程才使用到TCP。ROSMaster在节点建立连接的过程中起到了重要作用,但是并不参与节点之间最终的数据传输。3.服务通信机制(请求响应模式)服务是一种带有应答的通信机制,与话题的通信相比,其减少了Listener与Talker之间的RPC通信,如REF_Ref161664719\h图6-1-3所示。图6-1-SEQ图_6-1-\*ARABIC3服务通信机制(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发送应答数据。4.参数服务器(参数共享模式)参数类似于ROS中的全局变量,由ROSMaster进行管理,其通信机制较为简单,不涉及TCP/UDP的通信,如REF_Ref161664758\h图6-1-4所示图6-1-SEQ图_6-1-\*ARABIC4参数服务器(1)Talker设置变量Talker使用RPC向ROSMaster发送参数设置数据,包含参数名和参数值;ROSMaster会将参数名和参数值保存到参数列表中。(2)Listener查询参数值Listener通过RPC向ROSMaster发送参数查找请求,包含所要查找的参数名。(3)ROSMaster向Listener发送参数值Master根据Listener的查找请求从参数列表中进行查找,查找到参数后,使用RPC将参数值发送给Listener。ROS运行管理1.ROS元功能包完成ROS中一个系统性的功能,可能涉及到多个功能包,比如实现了机器人导航模块,该模块下有地图、定位、路径规划...等不同的子级功能包。那么调用者安装该模块时,需要逐一的安装每一个功能包吗?显而易见的,逐一安装功能包的效率低下,在ROS中,提供了一种方式可以将不同的功能包打包成一个功能包,当安装某个功能模块时,直接调用打包后的功能包即可,该包又称之为元功能包(metapackage)。(1)元功能包概念元功能包MetaPackage是Linux的一个文件管理系统的概念。是ROS中的一个虚包,里面没有实质性的内容,但是它依赖了其他的软件包,通过这种方法可以把其他包组合起来,我们可以认为它是一本书的目录索引,告诉我们这个包集合中有哪些子包,并且该去哪里下载。例如:sudoaptinstallros-noetic-desktop-full命令安装ros时就使用了元功能包,该元功能包依赖于ROS中的其他一些功能包,安装该包时会一并安装依赖。还有一些常见的MetaPackage:navigationmoveit!turtlebot3....元功能包的作用是方便用户的安装,我们只需要这一个包就可以把其他相关的软件包组织到起安装了。(2)实现首先新建一个功能包,然后修改package.xml,内容如下:<exec_depend>被集成的功能包</exec_depend>.....<export><metapackage/></export>最后修改CMakeLists.txt,内容如下:cmake_minimum_required(VERSION3.0.2)project(demo)find_package(catkinREQUIRED)catkin_metapackage()2.ROS节点运行管理launch文件(1)launch文件概念launch文件是一个XML格式的文件,可以启动本地和远程的多个节点,还可以在参数服务器中设置参数。起到简化节点的配置与启动,提高ROS程序的启动效率的作用。launch文件是通过roslaunch功能包运行的,命令行格式如下:$roslaunchpackage_namefile.launch注意:roslaunch命令执行launch文件时,首先会判断是否启动了roscore,如果启动了,则不再启动,否则,会自动调用roscore。(2)launch标签<launch>标签是所有launch文件的根标签,充当其他标签的容器。1)属性deprecated="弃用声明":告知用户当前launch文件已经弃用。2)子级标签所有其它标签都是launch的子级。(3)node标签<node>标签用于指定ROS节点,是最常见的标签,需要注意的是:roslaunch命令不能保证按照node的声明顺序来启动节点(节点的启动是多进程的)。1)属性如REF_Ref161664793\h表6-1-1所示表6-1-SEQ表_6-1-\*ARABIC1属性说明pkg="包名"节点所属的包type="nodeType"节点类型(与之相同名称的可执行文件)name="nodeName"节点名称(在ROS网络拓扑中节点的名称)args="xxxxxxxxx"(可选)将参数传递给节点machine="机器名"在指定机器上启动节点respawn="true|false"(可选)如果节点退出,是否自动重启respawn_delay="N"(可选)如果respawn为true,那么延迟N秒后启动节点required="true|false"(可选)该节点是否必须,如果为true,那么如果该节点退出,将杀死整个roslaunchns="xxx"(可选)在指定命名空间xxx中启动节点clear_params="true|false"(可选)在启动前,删除节点的私有空间的所有参数output="log|screen"(可选)日志发送目标,可以设置为log日志文件,或screen屏幕,默认是log2)子级标签env环境变量设置;remap重映射节点名称;rosparam参数设置;param参数设置。(4)include标签include标签用于将另一个xml格式的launch文件导入到当前文件。1)属性如REF_Ref161664816\h表6-1-2所示表6-1-SEQ表_6-1-\*ARABIC2属性说明file="$(find包名)/xxx/xxx.launch"要包含的文件路径ns="xxx"(可选)在指定命名空间导入文件2)子级标签env环境变量设置。arg将参数传递给被包含的文件。(5)remap标签remap标签用于话题重命名。1)属性如REF_Ref161664838\h表6-1-3所示表6-1-SEQ表_6-1-\*ARABIC3属性说明from="xxx"原始话题名称to="yyy"目标名称(6)param标签<param>标签主要用于在参数服务器上设置参数,参数源可以在标签中通过value指定,也可以通过外部文件加载,在<node>标签中时,相当于私有命名空间。属性如REF_Ref161664857\h表6-1-4所示表6-1-SEQ表_6-1-\*ARABIC4属性说明name="命名空间/参数名"参数名称,可以包含命名空间value="xxx"(可选)定义参数值,如果此处省略,必须指定外部文件作为参数源type="str|int|double|bool|yaml"(可选)指定参数类型,如果未指定,roslaunch会尝试确定参数类型,规则如下:①如果包含'.'的数字解析未浮点型,否则为整型②"true"和"false"是bool值(不区分大小写)③其他是字符串(7)rosparam标签<rosparam>标签可以从YAML文件导入参数,或将参数导出到YAML文件,也可以用来删除参数,<rosparam>标签在<node>标签中时被视为私有。1)属性如REF_Ref161664921\h表6-1-5所示表6-1-SEQ表_6-1-\*ARABIC5属性说明command="load|dump|delete"(可选,默认load)加载、导出或删除参数file="$(findxxxxx)/xxx/yyy...."加载或导出到的yaml文件param="参数名称"ns="命名空间"(可选)(8)group标签<group>标签可以对节点分组,具有ns属性,可以让节点归属某个命名空间。1)属性如REF_Ref161664947\h表6-1-6所示表6-1-SEQ表_6-1-\*ARABIC6属性说明ns="名称空间"(可选)clear_params="true|false"(可选)启动前,是否删除组名称空间的所有参数(慎用....此功能危险)2)子级标签除了launch标签外的其他标签。(9)arg标签<arg>标签是用于动态传参,类似于函数的参数,可以增强launch文件的灵活性。1)属性name="参数名称";default="默认值"(可选);value="数值"(可选):不可以与default并存;doc="描述":参数说明。2)示例Launch文件传参语法实现,hello.lcaunch。<launch><argname="xxx"/><paramname="param"value="$(argxxx)"/></launch>命令行调用launch传参。roslaunchhello.launchxxx:=值ROS常用组件1.TF坐标变换(1)TF坐标变换的概念及分类1)TF坐标变换的概念机器人在空间中运动主要有两种形式:平移和旋转。也就是线速度和角速度。机器人系统上,有多个传感器,如激光雷达、摄像头等,有的传感器是可以感知机器人周边的物体方位(或者称之为:坐标,横向、纵向、高度的距离信息),以协助机器人定位障碍物,但是物体相对该传感器的方位信息并不等价于物体相对于机器人系统或机器人其它组件的方位信息,这中间需要进行坐标转换。TF(TransFormFrame),就是坐标变换,包括了位置和姿态两个方面的变换,在ROS中用于实现不同坐标系之间的点或向量的转换。ROS中是通过坐标系来标定物体的,确切的是通过右手坐标系来标定的,如REF_Ref161665416\h图6-1-5所示。注意区分坐标转换和坐标系转换。坐标转换是一个坐标在不同坐标系下的表示,而坐标系转换是不同坐标系的相对位姿关系。图6-1-SEQ图_6-1-\*ARABIC5TF坐标(2)TF坐标变换的分类坐标变换发分为静态坐标变换、动态坐标变换和多坐标变换。1)静态坐标变换:是指两个坐标系之间的相对位置是固定的。2)动态坐标变换:是指两个坐标系之间的相对位置是变化的。3)多坐标变换:对于静态坐标变换和动态坐标变换所涉及的坐标系统只有两个,而在机器人坐标系统中,会涉及多个坐标系统。比如父级坐标系统world下有两子级系统:son1和son2。(3)TF功能包及TF工具1)TF功能包坐标变换是机器人系统中常用的基础功能,ROS中的坐标变换系统由TF功能包维护。TF是一个让用户随时间跟踪多个坐标系的功能包,它用树形数据结构,根据时间缓冲并维护多个坐标系之间的坐标变换关系,可以帮助开发者在任意时间,在坐标系间完成点、向量等坐标的变换。在ROS中坐标变换最初对应的是TF,不过在hydro版本开始,TF被弃用,迁移到TF2,后者更为简洁高效,TF2对应的常用功能包有:2)geometry_msgs功能包:里面包含了常见坐标系的数据类型(eg.TransformStamped数据类型包含了参考坐标系的名称,参考坐标系创建的时间以及子坐标系相较于参考坐标系的相对位置(旋转+平移);PointStamped数据类型包含了子坐标系中点的坐标);3)tf2_geometry_msgs功能包:该功能包的主要作用就是根据“接收到的坐标系相互关系的信息(TransformStamped数据)以及自身子坐标系中坐标点的信息(PointStamped数据)”通过tf2功能包计算得到“参考坐标系下坐标点的位置信息”。4)tf2功能包:封装了坐标变换的常用消息。用于根据坐标系信息以及坐标系间的关系计算得到坐标系之间坐标变换关系(向量/坐标系的旋转)。5)tf2_ros功能包:该功能包用于在节点之间发送信息并进行相关操作,为tf2提供了roscpp和rospy绑定,封装了坐标变换常用的API。这些都是基于内部的NodeHandle对象实现的。例如,eg.Tf2_ros功能包中StaticTransformBroadcaster用于发布static_tf话题消息;TransformListener用于订阅static_tf话题消息;Buffer用于缓存订阅节点订阅到的static_tf话题消息。2.TF工具坐标系统虽然是一个基础理论,但是由于涉及多个空间之间的变换,不容易进行想象,所以TF提供了丰富的终端工具来帮助开发者调试和创建TF变换。(1)tf_monitorTf_monitor工具的功能是将当前的坐标系转换关系打印到终端控制台,命令的格式如下:rosruntftf_monitor也可以通过输入参数来查看指定坐标系之间的坐标系关系,命令的格式如下:tf_monitor<source_frame><target_frame>(2)tf_echotf_echo工具的功能是查看指定坐标系之间的变换关系,命令的格式如下:tf_echo<source_frame><target_frame>(3)static_transform_publisher这个是最重要的命令,既可以在命令行使用,也可以在launch文件使用,并且经常在launch文件中使用。主要有下面两种形式:①发布一个父坐标系到子坐标系的静态tf转换,偏移x/y/z(单位是m),旋转是欧拉角yaw/pitch/roll(单位是弧度rad),这里yaw(航向角)是关于Z轴的旋转,pitch(俯仰角)是关于Y轴的旋转,roll(横滚角)是关于X轴的旋转。这里的周期period_in_ms,是这个tf的发布周期。static_transform_publisherxyzyawpitchrollframe_idchild_frame_idperiod_in_ms在launch文件中使用格式:<launch> <nodepkg="tf"type="static_transform_publisher"name="link1_broadcaster"args="100000link1_parent_framelink1_child_frame100"/></launch>②发布一个父坐标系到子坐标系的静态tf转换,偏移x/y/z(单位是m),旋转是四元数qxqyqzqw,这里的周期period_in_ms,是这个tf的发布周期。static_transform_publisherxyzqxqyqzqwframe_idchild_frame_idperiod_in_ms在launch文件中使用格式:<launch> <nodepkg="tf"type="static_transform_publisher"name="link1_broadcaster"args="1000001link1_parent_framelink1_child_frame100"/></launch>(4)view_framesview_frames是可视化的调试工具,可以生成pdf文件,显示整棵TF树的信息。执行方式为:rosruntf2_toolsview_frames.py然后使用以下命令,或者pdf阅读器查看生成的pdf文件。evinceframes.pdf(5)rvizrviz是一种可视化工具,可以借助rviz显示坐标系关系,具体操作:1)新建窗口输入命令:rviz;在启动的rviz中设置FixedFrame为base_link;3)点击左下的add按钮,在弹出的窗口中选择TF组件,即可显示坐标关系。3.坐标msg消息订阅发布模型中数据载体msg是一个重要实现,在坐标变换中,需要使用坐标系的相对关系(geometry_msgs/TransformStamped)以及坐标点信息(geometry_msgs/PointStamped)。前者用于传输坐标系相关位置信息,后者用于传输某个坐标系内坐标点的信息。(1)geometry_msgs/TransformStamped命令行键入:rosmsginfogeometry_msgs/TransformStampedstd_msgs/Headerheader#头信息ui

温馨提示

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

最新文档

评论

0/150

提交评论