《鸿蒙机器人编程》课件-2-1-ROS基础理论_第1页
《鸿蒙机器人编程》课件-2-1-ROS基础理论_第2页
《鸿蒙机器人编程》课件-2-1-ROS基础理论_第3页
《鸿蒙机器人编程》课件-2-1-ROS基础理论_第4页
《鸿蒙机器人编程》课件-2-1-ROS基础理论_第5页
已阅读5页,还剩156页未读 继续免费阅读

下载本文档

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

文档简介

1.ROS起源及特色SmoothingTheROSLearningCurve本课目的:给出学习ROS的有效路径,加快学习速度内容:WhatisROS?WhyisROS?Whattolearn?HowtoLearn?©NXROBO20182什么是ROS?RobotOperatingSystem(ROS)是一个适用于机器人的开源的元操作系统。它提供了操作系统应有的服务,包括硬件抽象,底层设备控制,常用函数的实现,进程间消息传递,以及包管理。它也提供用于获取、编译、编写、和跨计算机运行代码所需的工具和库函数。松耦合点对点进程网络,一个分布式的通信框架,帮助程序进程之间更方便地通信。。支持的操作系统ROS主流在基于Unix的平台上运行。ROS的软件主要在Ubuntu和MacOSX系统上测试,同时ROS小区仍持续支持Fedora,Gentoo,ArchLinux和其它Linux平台。MicrosoftWindows已开始支时ROS,功能尚待完善。©NXROBO20183什么是ROS?©NXROBO20184从计算图视角理解ROSROS中可执行程序的基本单位叫节点(node)节点之间通过消息、服务、动作等机制进行通信这样就组成了一张网状图,也叫计算图什么是ROS?©NXROBO20185从文件系统视角理解ROSROS程序的不同组件放在不同的文件夹中文件夹根据不同的功能对文件进行组织这就是ROS的文件系统结构什么是ROS?©NXROBO20186从开源社区视角理解ROSROS是开源软件,全球机器人专家分享、贡献自己的智慧在网络社区分享和贡献软件及教程形成了强大的ROS开源社区ROS的起源©NXROBO20187脱胎于斯坦福的STAIR项目成长于PR2机器人项目,ROS是该项目的软件部分遵循OS理念:为了提高机器人设计和开发的效率避免机器人领域工作者重复造轮子,统一了开发标准ROS的历史©NXROBO20188为什么学习ROS?机器人开发:软件开发的比重越来越大软件框架选择:是软件架构设计中一个重要的决策ROSPlayerYARPOrocosCARMENOrcaMOOSMicrosoftRoboticsStudio©NXROBO20189ROS的优势1,松散耦合的机制方便机器人软件框架的组织2,最丰富的机器人功能库方便快速搭建原型3,便利的数据记录、分析、仿真工具,方便调试4,学界和产业界的标准方便学习和交流©NXROBO201810对于开发者:快速搭建机器人原型©NXROBO201811对于企业:License许可ROS的核心是BSD许可证。这是一个非常宽松的开放许可证。允许在商业和闭源产品使用。/licenses/BSD-3-Clause/wiki/BSD_licenses©NXROBO201812对于研究人员:丰富的资源,最新的成果目前学术领域大部分最新成果都会发布ROS的版本“ROS:anopensourceRobotOperatingSystem”(Quigleyetal.,2009):论文引用量9869Source:GoogleScholar2022-07-13

©NXROBO201813最庞大的使用者群体,事实上的机器人标准2018年数据:目前在使用操作系统做开发的人员用户超过60万。(个人用户中国第二)©NXROBO201814官方支持ROS的机器人100+产品:目前已经有很多机器人公司采用了ROS系统来开发一些应用于全新市场的产品,如ClearPath,Rethink,Unbounded,Neurala,BlueRiver,BIG-i,最典型的就是WillowGarage的PR2机器人。大公司的支持:Nvidia、博世、高通、英特尔、宝马以及大疆等。投资机构的热捧:仅2015年,相关风险投资机构就在基于ROS操作系统的机器人公司投资了超过1.5亿美元。©NXROBO201815代码统计Thetotallinecountisover14millionlinesofcodeTherehavebeen2477authorsAnd181509commitsAveraging73.3commitsperauthor©NXROBO201816代码语言cpp:2608592(63.98%)python:553332(13.57%)ansic:297629(7.30%)xml:280615(6.88%)lisp:149439(3.67%)java:135343(3.32%)ruby:26484(0.65%)sh:21120(0.52%)ROS的不足目前基于Ubuntu系统,移植嵌入式系统困难无实时性设计体积较大系统整体运行效率低总的来说,ROS不擅长开发对实时性及成本要求严苛的产品。©NXROBO201817一句话概括ROS帮助你快速制作机器人的众多软件库和工具的集合规定了统一通信接口的松耦合分布式开源软件框架。最大的好处:即插即用,提供统一软件接口,事实上的机器人研究的统一平台。有了统一的平台,我们才有共同交流的可能,以上也是我们学习ROS的主要原因。©NXROBO201818ROS10YearMontage©NXROBO201819/245826128ROS应该学什么?©NXROBO201820入门起步设计思想核心概念核心模块核心工具©NXROBO201821设计思想:分布式架构©NXROBO201822核心概念Nodes(节点)MessagesandTopics(消息与话题)Services(服务)ROSMaster(ROS管理器)Parameters(参数)Stacksandpackages(功能包集与功能包)©NXROBO201823ROSNodes节点是各自独立的可执行文件,能够通过话题、服务或参数服务器与其他进程(节点)通信。ROS通过使用节点将代码和功能解耦,提高了系统容错能力和可维护性,使系统简化。同时,节点允许了ROS系统能够布置在任意多个机器上并同时运行。节点在系统中必须有唯一的名称。节点可以使用不同的库进行编写,如roscpp和rospy。roscpp基于C++rospy基于Python。©NXROBO201824ROSTopics话题是节点间用来传输数据的总线。N-to-NPublish/Subscribe模式:同一个话题也可以有很多个订阅者。使用TCP/IP传输,称为TCPROS,ROS默认。使用UDP传输,称为UDPROS,适合于远程操控任务。(低延迟高效率的传输方式,但可能产生数据丢失)。©NXROBO201825ROSMessages一个节点通过向特定话题发布消息。消息具有一定的类型和数据结构,包括ROS提供的标准类型和用户自定义类型。消息的类型标准命名方式进行约定:功能包名称/.msg文件名。最常用的有geometry_msgs/Twist包括线速度和角速度Vectors三维向量©NXROBO201826ROSServices1-to-1Service/Client模型:当你需要直接与节点通信并获得应答时,将无法通过话题实现,这时需要使用服务。服务需要由使用者开发,节点并不提供标准服务。命令行工具:rossrv查看有关服务数据结构的信息rosservice列出服务清单和查询某个服务©NXROBO201827ROSMaster向ROS系统中其他节点提供命名和注册服务跟踪和记录话题的发布者和订阅者使ROS节点之间能够相互查找。一旦节点找到了彼此,就能建立一种点对点的通信方式。提供参数服务器©NXROBO201828ParameterServer参数服务器是可通过网络访问的共享的多变量字典。节点使用此服务器来存储和检索运行时的参数。©NXROBO201829ROSPackages功能包(Package):ROS中软件组织的基本形式,用于创建ROS程序。它包含源文件、脚本文件、配置文件、可执行文件等。本质就是一个特殊的文件夹,此文件夹中的文件和子文件夹按前面所说的文件系统的约定来编排,以方便管理、编译、使用此功能包。功能包管理:package.xml和CMakelists.txt文件,

其中package.xml用来描述此功能包的基本信息,

包括包名、作者、包之间的依赖等。CMakelists.txt

主要描述如何构建、编译此功能包程序。©NXROBO201830ROSPackageSystem©NXROBO201831核心模块©NXROBO201832ROS

Package种类©NXROBO201833ROS常用命令工具rostopic(Topics)rosservice(Services)rosnode(Nodes)rosparam(Parameters)rosmsg(Messages)rossrv(Services)roswtf(Generaldebugging)©NXROBO201834ROS常用可视化工具©NXROBO2018353D可视化工具Rviz|ROS常用可视化工具©NXROBO201836集成图形交互界面rqt|怎样学习ROS?©NXROBO201837两种教学模式InstructionismVs.Constructionism指导主义(Instructionism):传统教学方式:老师讲,学生听。特点:开环,或是死循环周期过长,等到期末考试或若干年工作后。建造主义(Constructionism):Learningbymaking,closetheloopofunderstandingAstepbystepguide©NXROBO201838学习步骤安装:/ROS/Installation官网教程:/ROS/Tutorials建议初学者认真学完整个“初级”20个教程!©NXROBO201839学习步骤听到最多的问题之一:问:老师,我tutorials做完了,接下来该干什么?答:运行真实的机器人、解决真实的问题!问:没有机器人怎么办?答:仿真环境©NXROBO201840仿真环境:由易至难Turtlesim一个QT开发的2D轨迹显示接口只能显示运动轨迹ArbotiX含有一个差速驱动机器人的rviz仿真器机器人运动及topic数据的3D显示Gazebo功能齐全的3D物理仿真工具非常重,对内存和显卡要求高,慎入!©NXROBO201841进阶部分结合硬件平台和具体应用学习使用各种packageOpenCV、PCL、MoveIt!、Control、Navigation、SLAM在开发过程中学习使用调试仿真工具rqt、rviz、Gazebo开发测试新的机器人算法集成各类package构建机器人原型©NXROBO201842ROS版本那么多,该用哪一个?下载使用统计Hydroandearlier:0.17%Indigo:14.50%(LongTermSupport)Jade:0.50%Kinetic:62.89%(LongTermSupport)Lunar:2.70%Melodic:6.49%(LongTermSupport)©NXROBO201843版本选择建议初学者:KineticLinux程序设计能力比较强的:Melodic注意:Ubuntu版本要与ROS版本需匹配ROSIndigo+Ubuntu(14.04.1LTS)ROSKinetic+Ubuntu(16.04LTS)ROSDistributionReleases©NXROBO201844命令行不熟悉怎么办?有IDE/IDEsEclipseCodeBlocksEmacsVimNetBeansQtCreatorQtCreatorPluginforROSPyCharm(communityedition)kDevelopRoboWareStudio©NXROBO201845不熟悉Linux怎么办?边用边学+遇到问题要善用搜索教程:http://www.ee.surrey.ac.uk/Teaching/Unix/中文版:LinuxC/C++程序设计一站式学习/akabook/zh/index.html©NXROBO201846ROS和ROS2.0该学习哪个呢?对于大众学习者、普通开发者、机器人算法开发者,在2018年仍推荐使用ROS。对于软件架构的学习者、强调实时性的开发者,建议关注ROS2.0。©NXROBO201847//ROS学习书籍©NXROBO2018482.ROS工作原理及通信机制课程内容智能机器人工作流程ROS的工作原理及基本概念ROS消息通信机制ROS服务通信机制ROS动作通信机制ROS参数服务器通信机制©NXROBO201850智能机器人工作流程©NXROBO201851智能机器人的传统实现方式©NXROBO201852mainfun_afun_bfun_cfun_cfun_dfun_efun_ffun_dfun_dROS的工作机制——ComputationalGraph(计算图)©NXROBO201853计算图:node为顶点,topic/service为边ROS的工作机制——ComputationalGraph(计算图)©NXROBO201854小乌龟机器人例子智能机器人基于ROS的实现方式©NXROBO201855智能机器人基于ROS的实现方式©NXROBO201856ROS通信层术语–Resource、NamespaceResource:构成计算图的一切东西都可以称为资源,比如:node、topic、service、parameter等为了方便使用这些资源,需要对这些资源进行命名,而且要求在系统中具有唯一性Namespace:为了避免名字冲突,ROS提出了一种策略:给同一个功能模块的资源名字加上一个“前缀”,这个前缀就叫做名字空间(Namespace)。可以对比C++中的Namespace概念,或文件夹(文件目录)的概念,Namespace对于避免名字冲突和提升代码重用性具有很好的作用。57©NXROBO2022ROS通信层术语-NodeNode:是一个数据处理或执行动作的进程,是计算图中的独立个体,系统中的独立功能单元。怎样设计node?密集的通信会导致系统性能的下降而过于紧密的聚合度会增加代码的耦合度58©NXROBO2022ROS通信层术语–MasterNodeMasternode:计算图中的管理通信节点所有信息的中心节点(超级节点)它跟踪节点中的publisher与subscriber,service的server与client,记录其他节点的位置(uri标明,host与port),并将这些信息通知给需要建立链接的节点ROS中无时间同步!!ROStime为当前系统时间!多机需要同步系统时间的工具来实现RPS内时钟同步。59©NXROBO2022ROS通信层术语-TopicTopic:ROS中广为使用的publish-subscribe异步的通信模式。这种方式将信息的产生和使用双方解耦,首发双方的信息都是由masternode进行管理。常用于不断更新的,含有较少逻辑处理的数据通信60©NXROBO2022ROS通信层术语-ServiceService:用于处理ROS通信中的同步通信,采用server/client语义。每个servicetype拥有request与response两部分,对于service中的Server,ROS不会检查重名(nameconflict),只有最后注册的server会生效,与client建立连接。常用于资料量较小,但有强逻辑处理的数据交换。61©NXROBO2022ROS通信层术语-ParameterParameter可以看作为ROS系统运行时中定义的全局变量,而Masternode中有Parameterserver来维护这些变量。这些变量的命名同样遵循namespace的命名规则namespace的存在使得parameter拥有非常清晰的层次,有效避免重名而且对parameter访问可以单独访问也可以树状访问(层层解析namespace)62©NXROBO2022ROS通信层术语-URI作用:定位node在分布式系统中的位置格式为:protocol://host:portProtocol一般为http或者rosrpc,host为hostname或者IP地址,port则为端口号。比如,在多台计算机上运行ROS的时候,通常需要指定ROSMaster的位置(整个系统只能有一个)63©NXROBO2022ROS_MASTER_URI=:11311ROS通信层术语-XML-RPCROS通过远程过程调用来建立节点之间的连接以及数据传输,ROS中的远程过程调用通过XML-RPC协议实现XML-RPC:ROS通信网路中的基础,一种通用远程调用协议用于masternode与其他节点之间的信息交换传输文本使用XML支持(支持语言类型多)调用时无状态(逻辑较为简单)ROS中topic/servicep2p传输时的nodename信息交换与parameterserver都是由XML-RPC进行支持64©NXROBO2022ROS通信层术语-XML-RPCParameterserver直接使用XML-RPC的数据类型:int

或者i4是32位的有符号整型,十进制表示中,前缀-号则为负数。boolean

只有两种取值,0和1,用于表示布尔类型。double

实数类型,前缀-号表示负数。dataTime.iso8601日期时间,用iso-8601格式表示。base64

用base64算法编码的二进制字符串。arrayvalues组成的表,在data实体下一层Struct

又称为map表示关系的集合,每一个struct实体是由一个name与value的键值对组成。65©NXROBO2022ROS消息通信机制©NXROBO202266cameraviewer/imagessensor_msgs::Imagepublishsensor_msgs::ImagesubscribeROS消息通信机制©NXROBO202267ROS消息通信过程——实例68©NXROBO2022ROS消息通信过程——实例69©NXROBO2022ROS消息的数据类型70std_msgs/Headerheaderfloat32angle_minfloat32angle_maxfloat32angle_incrementfloat32time_incrementfloat32scan_timefloat32range_minfloat32range_maxfloat32[]rangesfloat32[]intensities系统已有的标准消息类型©NXROBO2022生成自己的自定义类型:在package.xml中在CMakeLists.txt中catkin_make!71<build_depend>message_generation</build_depend><run_depend>message_runtime</run_depend>add_message_files(FILESpoint.msg)ROS消息的数据类型point.msg文件©NXROBO2022ROS消息通信机制——特点72异步“stream-like”通信异步的publish-subscribe通信模式可以有多个发布者,可以多个订阅者TCP/IP或UDP传输协议强类型消息传输非阻塞方式,调用完马上返回常用于不断更新的,含有较少逻辑处理的数据通信©NXROBO2022ROS服务通信机制73©NXROBO2022ROS服务通信机制74©NXROBO2022ROS服务通信机制75two_num_addition.srv文件系统已有的标准服务类型自定义自己的服务类型©NXROBO2022ROS服务通信机制——特点76同步“function-call-like”通信CS-模式只能有一个服务器,可以有多个客户端TCP/IP或UDP传输协议强类型消息传输阻塞方式,一旦调用,客户端得等待服务器端执行完才返回,继续执行下面语句常用于工作量较小的情形,但有强逻辑处理的数据交换。©NXROBO2022ROS动作通信机制77©NXROBO2022ROS动作通信机制——特点78形式上与service相同,属于直接点对点通信调用形式与message方式类似,非阻塞方式,调用后立即返回,可以继续执行下面的语句提供了一种状态查询及反馈机制,让客户端了解服务器端的执行情况常用于计算量较大的情形,且有强逻辑处理的数据交换。©NXROBO2022ROSParameterServer通信机制

Parameterserver就设置在masternode中。79©NXROBO2022DynamicReconfigure给出一种实时监测masternode中参数变化,并对node中相应运行参数进行修改的机制:dynamicreconfigure。原理略过。我们来通过例子来看看这个机制的强大。打开ROS中的自主导航+2D仿真器Stage(需已先装上navigation_stagepackage)80$roslaunchnavigation_stagemove_base_gmapping_5cm.launch©NXROBO2022DynamicReconfigure81©NXROBO2022小结我们详细介绍了ROS的通信机制的工作原理简要介绍通信层的核心概念较为详细地讲解消息、服务、动作、参数服务器四种重要的通信机制82©NXROBO20223.创建工作空间课程介绍课程目的:理解工作空间及功能包掌握工作空间创建方法掌握功能包创建方法所需基础:具备UbuntuLinux基础知识84©NXROBO2022课程内容ROS的编译构建系统简介ROS编程的一般流程工作空间的创建及其结构介绍多个工作空间的覆盖(overlay)功能包的创建及其结构介绍package.xml和Cmakelists.txt文件规则85©NXROBO2022ROS的编译构建系统Catkin:官方推荐的ROS编译构建系统,是原ROS编译构建系统rosbuild的继承者。catkin通过综合CMake宏和Python脚本在CMake正常工作流程之前实现一些功能操作。(Drypackages)Rosbuild:过时的编译构建系统,不建议使用。但目前官方还在支持以保证早期功能包工作。(Wetpackages)86©NXROBO2022回顾:ROS的文件系统(catkin)87©NXROBO2022创建工程空间创建自己的ROS包在包目录下创建***.cpp或.py源代码文件若*.cpp,则修改CMakeLists.txt文件编译ROS编程的一般流程√本课讲解√本课讲解88©NXROBO2022Catkin工作空间创建设置环境变量创建命令构建$source/opt/ros/noetic/setup.bash$mkdir-p~/catkin_ws/src

$cd~/catkin_ws/src&catkin_init_workspace$cd~/catkin_ws/

$catkin_make89©NXROBO2022Catkin工作空间结构90©NXROBO2022Catkin工作空间结构源码空间src存放功能包的所有源码文件,编译构建时就从这个目录寻找功能包。其CMakeLists.txt档,链接到\opt\ros\distro\catkin\cmake\toplevel.cmake文件。构建空间build存放编译构建过程中的中间档。开发空间devel存构建好的可执行程序和运行库,可由CATKIN_DEVEL_PREFIX变量重新设定,但目录的选择要求必须满足子目录没有功能包。安装空间install是功能包的安装目录,可由CATKIN_INSALL_PREFIX变量重新设定。因为新建工作空间,所以默认的install目录并未创建,执行以下命令创建。91$catkin_makeinstall©NXROBO2022环境变量设置通过setup.xxxshell脚本引入在~/.bashrc文件中添加source命令环境变量查看$source/opt/ros/noetic/setup.bash$env|grepros92©NXROBO2022工作空间的overlayROS环境变量93©NXROBO2022Catkin工作空间overlayOverlayROS系统目录$source/opt/ros/noetic/setup.bash

$env|grepros

$mkdir-p~/catkin_ws/src

$cd~/catkin_ws/src;catkin_init_workspace

$cd~/catkin_ws;catkin_make

$source~/catkin_ws/devel/setup.bash

$env|grepros94©NXROBO2022Catkin工作空间overlay95©NXROBO2022Catkin工作空间overlayCatkin工作区之间overlay$mkdir-p~/catkin_ws_2/src

$cd~/catkin_ws_2/src;catkin_init_workspace

$cd~/catkin_ws_2;catkin_make

$source~/catkin_ws_2/devel/setup.bash

$env|grepros96©NXROBO2022Catkin工作空间overlay97©NXROBO2022创建ROS功能包catkin_create_pkg命令行工具创建新的功能包:此命令的格式包括功能包的名称和依赖项;通常依赖项包括std_msgs、rospy和roscpp。功能包命名规则:只允许使用小写字母、数字和底线;首字符必须是小写字母示例:98$cd~/catkin_ws/src$catkin_create_pkg[package_name][depend1][depend2][depend3]©NXROBO2022$cd~/catkin_ws/src$catkin_create_pkgbeginner_tutorialsstd_msgsrospyroscpp创建Catkin功能包99©NXROBO2022Catkin功能包配置文件package.xml,范本文件:/usr/lib/python3/dist-packages/catkin_pkg/templates/package.xml.inCMakeLists.txt,范本文件:/usr/lib/python3/dist-packages/catkin_pkg/templates/CMakeLists.txt.in100©NXROBO2022package.xml主要内容描述性数据(如功能包的简介、维护者)功能包的元信息(如作者、网站)打包发行信息(如功能包版本)依赖的ROS功能包或系统软件包101©NXROBO2022Package.xml规则——基本信息标签必填标签:<name>:功能包名;<version>:版本号,以d.d.d的格式,d表示整数;<description>:功能包特性简介;<maintainer>:功能包发布者信息;<license>遵循的版权协议名如下。可选标签<url>:功能包的网址信息,主要有功能包相关主页,开源项目地址等;<author>:功能包的作者信息,可以有多个。102©NXROBO2022Package.xml规则——依赖关系标签编译构建依赖:<build_depend>,指定构建此功能包需要的软件包。构建汇出依赖:<build_export_depend>,指定此功能包构建库文件需要的软件包。执行依赖:<exec_depend>,指定此功能包运行时需要的软件包。测试依赖:<test_depend>,指定单元测试需要的附加依赖。构建工具依赖:<buildtool_depend>,指定这个包需要构建的工具。文档工具依赖:<doc_depend>,指定了这个包生成文档的需要文档生成工具。103©NXROBO2022CMakelists样例104©NXROBO2022Catkin功能包规则必须包含package.xml文件;必须包含CMakeLists.txt文件;功能包之间不允许嵌套105©NXROBO2022一个有用的包管理工具:rosdeprosdep安装rosdep初始化及更新$sudoaptinstallpython3-rosdep$sudorosdepinit

$rosdepupdate106©NXROBO2022rosdep用法rosdepcheck检查功能包的系统依赖是否安装rosdepinstall如果系统依赖未安装则生成bash脚本并执行以安装功能包的系统依赖rosdepkeys列出功能包的系统依赖的key值rosdepresolve根据key转换出系统依赖rosdep的主要用途是安装工作空间中ros包的依赖,首先切换到工作空间下,然后运行下述命令即可安装该工作空间的所有依赖,具体命令如下:rosdepinstall--from-pathssrc--ignore-src-r-y107©NXROBO2022小结ROS的编译构建系统简介ROS编程的一般流程工作空间的创建及其结构介绍多个工作空间的覆盖(overlay)功能包的创建及其结构介绍package.xml和Cmakelists.txt文件规则ROS功能包的依赖管理工具rosdep108©NXROBO20224.编写及编译ROS程序本课程主要内容用C++编写ROSnodeC++代码编写CMakeLists.txt的编写规则用python编写ROSnode©NXROBO2022110主要掌握ROSnode的编程范式,理解ROS通信机制在程序中的体现。创建工程空间创建自己的ROS包在包目录下创建***.cpp或.py源代码文件若*.cpp,则修改CMakeLists.txt文件编译ROS编程的一般流程111©NXROBO2022√本课讲解√本课讲解√本课讲解编程语言的选择C++作为编译类语言,运行时执行效率高,适合计算量较大的算法类程序;C++为ROS原生语言,基于roscpp,功能全面完整Python作为解释性语言,执行效率低,一般不适合大型算法类程序,但其编码效率较高,修改程序方便,可快速成形和测试。基于rospy,ROS有些功能没有python接口112©NXROBO2022编辑工具选择至于代码编辑器或IDE的选择,建议使用Vim或Eclipse。Vim可以让你专注编码,而且有很多插件,实现代码补全、语法高亮、文件管理等功能,但如果没用过,上手需要一段时间,命令掌握不熟反而效率更低。Eclipse交互界面更为友好,有支持C++版本,使用PyDev插件实现支持Python。113©NXROBO2022用C++编写ROSnode实例代码ros_tutorials:/ros/ros_tutorialsroscppapi文档:/kinetic/api/roscpp/html/鼓励大家多自己查看文档,多编程实践。ROSnode的基本结构115©NXROBO2022#include<ros.h>voidcallback_func(msg){…...}intmain(){

//1.初始化,向rosmaster注册登记

ros::init(...);

//2.启动节点,并定义发布器、订阅器、服务器、客户端、…

ros::NodeHandlenh; ros::Publisherpub=nh.advertise<message_type>(topic_name,buff_len); ros::Subscribersub=nh.subscribe(topic_name,buff_len,callback_func);

//3.循环发布消息或响应订阅到的消息

ros::Rateloop_rate(10); while(ros::ok()){

//3.1构建所需要发布的消息

...

//3.2发布消息

pub.publish(....);

//3.3调控节奏

ros::spinOnce(); loop_rate.sleep(); } return0;}ROS核心函数和类ros::init()初始化函数ros::spin()事件循环函数ros::spinOnce()单次事件函数ros::start()启动函数ros::shutdown()关闭函数ros::NodeHandle节点句柄类ros::Publisher发布器类ros::Subscriber订阅器类ros::Rateloop_rate循环速率类116©NXROBO2022node初始化——ros::init()通过调用ros::init()函数来初始化node,目的是向节点管理器注册node信息。此函数向ROS系统传递命令行参数、定义node名字及其它参数。

在调用roscpp其它函数前必须先调用ros::init(),其函数原型为:argc和argv:命令行参数信息,与普通C/C++语言main函数的命令行参数一样,但ROS参数映像语法为name:=new_name,如:具体请查阅RemappingArguments/RemappingArguments117$rosrunbeginner_tutorialstestfoo:=/a/foo©NXROBO2022name:定义node的名字,不能带命名空间,可通过映射参数覆盖。在ROS系统中要保证Node名字唯一,如果运行同名的node,先运行的node会自动关闭。如果想一个node能同时多实例运行,可以通过参数映射同样能实现,也可通过设置option为init_options::AnonymousName实现。118©NXROBO2022node初始化——ros::init()options:这个参数是可选项,是一个位结构体,所以可指定多个选项值,可设置的值有:ros::init_options::NoSigintHandler

指定此参数将不创建SIGINT信号处理器。如果设置了此参数,为了使node能被正常关闭,需要自行创建SIGINT信号的处理器。SIGINT信号是UNIX系统用来结束进程的,一般由CTRL+C等方式触发。ros::init_options::AnonymousName

指定此参数将在node名字后追加一个随机数,这样同一个node被多次运行时,每个实例名是唯一的。ros::init_options::NoRosou

指定此参数将不把ros控制台的输出信息广播到/rosout这个topic上。119©NXROBO2022node初始化——ros::init()ros::init()除了上面介绍的初始化函数,还有两种ros::init()的重载函数:这两个重载函数将argc和argv替换成直接指定映像参数。120©NXROBO2022node启动——ros::NodeHandlenh通过创建ros::NodeHandle实例来启动node。这是最通常的做法,此步骤也可通过其他方式完成。第一个ros::NodeHandle实例创建后就会调用ros::start(),最后一个ros::NodeHandle实例销毁后就会调用ros::shutdown()。函数ros::start()才真正开始执行node的内部功能,包括运转线程、开始网络轮询和xmlrpc循环、连接内部订阅、运行service服务端等。函数ros::shutdown()是关闭node的,主要过程有断开一切网络连接(用于TOPIC和SERVICE)、从节点管理器(master)注销。ros::NodeHandle负责实例化与这个node有关的publisher/subscriber/server/parameterserver对象。121©NXROBO2022创建发布器发布器由ros::NodeHandle的实例化对象创建,将所发布主题的名称和对应的消息类型告知节点管理器发布器创建方式:topic_name:话题名称,指定往哪个话题上发消息message_type:消息类型,指定该话题(topic)上传输什么类型的消息。buff_len:发送缓冲区大小122©NXROBO2022ros::Publisherpub=nh.advertise<message_type>(topic_name,buff_len);创建订阅器订阅器由ros::NodeHandle的实例化对象创建,将所订阅主题的名称及对应的消息类型告知节点管理器订阅器创建方式:topic_name:话题名称,指定从哪个话题上获取消息buff_len:接收缓冲区大小callback_func:回调函数,即话题(topic)上有数据的时候,你要怎么处理这些数据。需要程序员明定义此函数。123©NXROBO2022ros::Subscribersub=nh.subscribe(topic_name,buff_len,callback_func);创建服务器服务器由ros::NodeHandle的实例化对象创建,将服务名称和服务响应函数告知节点管理器,对外广播所能提供的服务服务器创建方式:service_name:服务名称,指定能提供哪个服务service_func:响应服务请求的处理函数,即有客户端请求服务时,你要怎么处理这些请求。需要程序员明定义此函数。124©NXROBO2022ros::ServiceServerserver=nh.advertiseService(service_name,service_func);创建服务客户端服务客户端由ros::NodeHandle的实例化对象创建,将请求服务的名称和服务类型告知节点管理器客户端创建方式:service_name:服务名称,指定在哪个服务上请求服务service_type:服务类型,指定出请求和响应的类型。125©NXROBO2022ros::ServiceClientclient=nh.ServiceClient<service_type>(service_name);主循环循环条件ros::ok():当接受到ctrl+c信号或者ros::shutdown()调用时,为false,终止运行节点。主循环中,使用ros::rate实现将循环一次的时间控制在一个我们设置的一个周期内。126©NXROBO2022或示例:发布节点127©NXROBO2022示例:订阅节点128©NXROBO2022129©NXROBO2022示例:服务器节点130©NXROBO2022示例:客户端节点ROSnode总结从api使用角度来看,通信方式的不同体现在程控流上。topic无同步service有同步publish非阻塞call阻塞。何时使用topic或service?实时更新的数据使用topic传输。特殊逻辑的小数据使用service。topic需要更多精力去处理异步数据获得与主控制流的逻辑关系。实现难度上要更高。131©NXROBO2022修改CMakelist.txt文件Cmakelist.txt作用CMakeLists.txt文件CMake构建系统的配置文件用于描述代码如何编译构建以及安装到何位置等参数CMake根据此档生成makefiles文件,任何兼容CMake的软件包至少包含一个CMakeLists.txt文件相比普通的CMake项目,catkin项目中的CMakeLists.txt只是额外多加了几条约束。133©NXROBO2022Cmakelist.txt样例134©NXROBO2022Cmakelist.txt规则CMake最低版本要求

(cmake_minimum_required)规定CMake的最低版本,catkin构建必须以此行开头,使用cmake_minimum_required宏命令。功能包名(project())通过CMake的project()宏命令定义功能包名称,cmake脚本中通过${PROJECT_NAME}访问。创建环境变量${PROJECT_NAME}_BINARY_DIR和${PROJECT_NAME}_SOURCE_DIR。cmake_minimum_required(VERSION2.8.3)project(beginner_tutorials)135©NXROBO2022Cmakelist.txt规则构建时需要的其它CMake/Catkin软件包

构建此工程时需要的其它CMake/Catkin软件包,而且是构建依赖而非运行依赖,使用find_package()宏命令格式:catkin是必须要定义:find_package(<name>[[REQUIRED|COMPONENTS][componets...]])find_package(catkinREQUIRED)136©NXROBO2022Cmakelist.txt规则在CMake会话,工程依赖的其它包会自动作为catkin的组件(components)加入,如果将其加入到find_package()中则过程则简单得多:find_package()宏命令会创建<NAME>_FOUND、<NAME>_INCLUDE_DIRS或<NAME>_INCLUDES、<NAME>_LIBRARIES或<NAME>_LIBS、<NAME>_DEFINITIONS这几个环境变量,以供CMake脚本调用,具体情况可在构建成功后查看工作空间build目录下的CMakecache.txt文件137find_package(catkinREQUIREDCOMPONENTSstd_msgsrospyroscpp)©NXROBO2022Cmakelist.txt规则处理Message/Service/Action文件

Messages(.msg)、services(.srv)和actions(.action)三个文件需要进行预处理以便于功能包构建使用,生成所支持的编程语言需要并识别的文件:其后加上宏:add_message_files()add_service_files()add_action_files()generate_messages()138©NXROBO2022处理Message/Service/Action文件还需在find_package()宏中添加功能包信息参数,如:而且在package.xml文件中必须添加message_generation、actionlib和actionlib_msgs为构建依赖;message_runtime、actionlib和actionlib_msgs为运行依赖,如果此功能包依赖的其它功能包中已包含此依赖则不必再次添加。提示:actionlib*在需处理.action档情况下添加find_package(catkinREQUIREDCOMPONENTSmessage_generation)139©NXROBO2022处理Message/Service/Action文件比较完整的示例,(假设这些messages依赖std_msgs和sensor_msgs),如:140©NXROBO2022Cmakelist.txt规则定义功能包构建的输出信息

为构建系统提供catkin特有的信息以供系统生成pkg-config和CMake文件,通过catkin构建系统的catkin_package()宏实现。其有5个可选参数:141INCLUDE_DIRS

此功能包输出的包含路径(如用于:cflags)LIBRARIES

功能包输出的库CATKIN_DEPENDS

依赖的其它catkin工程DEPENDS

依赖的非catkin的CMake工程CFG_EXTRAS

其它配置项©NXROBO2022Cmakelist.txt规则定义构建目标

构建目标包括可执行程序和库文件,主要定义内容包括:142头文件路径库路径目标构建规则©NXROBO2022定义构建目标包含路径

包含路径通过include_directories()和link_directories()两个宏实现,分别表示要包含的头文件路径和库路径。头文件路径可以手动指定路径也可以使用由find_package()宏生成的形如*_INCLUDE_DIRS这样的CMake变量。库路径,无特殊情况,一般都由find_package()自动生成添加。143©NXROBO2022定义构建目标目标规则

目标规则主要指定构建的目标名称及其源文件和链接需要的库,由add_executable()和add_library()两个宏分别实现可执行程序和库目标定义。语法如下:使用target_link_libraries()宏来定义可执行程序链接需要的库:144©NXROBO2022Cmakelist.txt规则单元测试

通过catkin的宏catkin_add_gtest()实现:145©NXROBO2022Cmakelist.txt规则安装规则

构建完成后,所有构建目标将会存放于catkin工作空间的devel目录,如果想用makeinstall执行安装操作,就必须定义安装规则。安装对象一般有可执行程序或脚本、库、头文件、roslaunch文件及其它资源类文件。规则定义通过install()宏实现,有四种参数:146TARGETS需安装的对象ARCHIVEDESTINATION静态库和DLL的清单文件LIBRARYDESTINATION非DLL共享库和模块RUNTIMEDESTINATION可执行对象和DLL形式的共享库©NXROBO2022安装规则形式如下:

Python绑定库必须安装到特殊的活页夹以便于其它Python代码import:147©NXROBO2022安装规则头文件安装规则示例如下:148©NXROBO2022安装规则roslaunch文件等资源文件的安装规则示例如下:对于Python执行代码,catkin提供catkin_install_python()宏来解决Python代码的安装规则:对于Python模块,通过添加*catkin_python_setup()*宏安装。此宏调用setup.py,实现Python模块的安装。

其它细节问题请查阅catkin文檔和CMake文檔。149©NXROBO2022编译构建功能包编写好package.xml、CMakelist.txt及功能代码就可以进行编译构建了。编译构建工作在catkin工作空间顶层目录下进行:编译构建部分指定的包:需要安装的话,就执行:$cd~/catkin_ws

$catkin_make$catkin_make-DCATKIN_WHITELIST_PACKAGES=”package1;package2”$catkin_makeinstall150©NXROBO2022用Python编写ROSnode实例代码ros_tutorials:/ros/ros_tutorialsroscppapi文档:/kinetic/api/rospy/html/鼓励大家多自己查看文档,多编程实践。创建工程空间创建自己的ROS包在包目录下创建***.py源代码文件无需编译ROSPython编程基本步骤√本课讲解152√本课讲解©NXROBO2022ROSnode的基本结构(python)153©NXROBO2022importrospydefcallback(msg):…….if__

温馨提示

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

评论

0/150

提交评论