版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ROS星火计划 ROS通信及工作机制 NXROBO&ExBotROS通信及工作机制上一讲中,主要讲解了ROS功能包系统依赖的管理、编译构建系统、工作空间的创建和叠加、功能包的创建及package.xml文件的规则。这一讲继续进行功能包的相关内容学习,主要从以下几方面进行:• ROSnode的编写规则• CMakeLists.txt文件规则• 功能包的编译至此我们已经了解了功能包文件结构及相关配置文件的规则,下面开始着手编写最简单的功能包代码。ROS编程的一般流程前面我们讲这个ROS编程呢一般是我们首先得给他创建这个工作空间,如果这个工作空间已经有了那就可以直接在这个工作空间里面来去做相应工作。然后就是创建这个ROS的功能包就可以去这个编写自己的代码了。编程语言的选择C++作为编译类语言,运行时执行效率高,适合就算两较大的算法类程序。C++作为ROS原生语言,基于roscpp,功能全面完整。Python作为解释型语言,执行效率低,一般不适合大型算法类程序,但其编码效率较高,修改程序方便,可快速成形和测试。基于rospy,ROS有些功能没有pyhton接口。编程工具选择至于代码编辑器或IDE的选择,建议使用Vim或Eclipse。Vim可以让你专注编码,而且有很多插件,实现代码补全、语法高亮、文件管理等功能,但如果没用过,上手需要一段时间,命令掌握不熟反而效率更低。Eclipse交互界面更加为友好,有支持C++版本,使用PytDev插件实现支持Python。ROS通信层中间件可以说是ROS系统的核心,我们之前介绍的ROS系统诸多特性与功能都基于此,我们这节课就要仔细讨论ROS通信中间件的原理与topic/service具体实现,为我们之后进一步理解ROS框架,使用ROS通信api打好基础。之前介绍过,ROS的通信层设计是基于网络运输层tcp/udp协议,而最为重要的一点是,ROS的computationalgraph(计算图)概念。ROS的网络拓扑结构为p2p,节点间互相独立。下面进行ROS通信层中的术语解析。ROSnode的基本结构ROS核心函数和类ros::init()初始化函数ros::spin()事件循环函数ros::spinOnce()单词事件函数ros::start()启动函数ros::shutdown()关闭函数ros::NodeHandle()节点句柄类ros::Publisher()发布器类ros::Subscriber()订阅器类ros::Rateloop_rate()循环速率类node初始化——ros::init()通过调用ros::init()函数来初始化node。此函数向ROS系统传递命令行参数、定义node名字及其它参数。
在调用roscpp其它函数前必须先调用ros::init(),其函数原型为:argc和argv:ROS解析命令行参数进行参数映射。参数映像语法为name:=new_name,如:$rosrunbeginner_tutorialstestfoo:=/a/foo具体请查阅RemappingArguments/RemappingArguments如果手动指定这两个参数,那命令行参数就不能传送进来,可在此之前进行命令行参数的分析与处理。name:定义node的名字,不能带命名空间,可通过映射参数覆盖。在ROS系统中要保证Node名字唯一,如果运行同名的node,先运行的node会自动关闭。如果想一个node能同时多实例运行,可以通过设置option为init_options::AnonymousName,当然通过参数映射同样能实现。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上。除了上面介绍的初始化函数,还有两种ros::init()的重载函数:这两个重载函数将argc和argv替换成直接指定映像参数。node启动——ros::NodeHandlenhros::NodeHandl负责实例化与这个node有关的publisher/subscriber/service/parameterserver对象。通过创建ros::NodeHandle实例来启动node。这是最通常的做法,此步骤也可通过其他方式完成。第一个ros::NodeHandle实例创建后就会调用ros::start(),最后一个ros::NodeHandle实例销毁后就会调用ros::shutdown()。函数ros::start()才真正开始执行node的内部功能,包括运转线程、开始网络轮询和xmlrpc循环、连接内部订阅、运行service服务端等。函数ros::shutdown()是关闭node的,主要过程有断开一切网络连接(用于TOPIC和SERVICE)、从节点管理器(master)注销。函数ros::spin()函数进入事件循环。创建发布器发布器由ros::NodeHandle的实例化对象创建,将所发布主题的名称和对应的消息类型告知节点管理器发布器创建方式:ros::Publisherpub=nh.advertise<message_type>(topic_name,buff_len);topic_name:话题名称,指定往那个话题上发消息。message_type:消息类型,指定该话题(topic)上传输什么类型的消息。buff_len:发送缓冲区大小创建订阅器订阅器由ros::NodeHandle的实例化对象创建,将所发布主题的名称和对应的消息类型告知节点管理器订阅器创建方式:ros::Subscribersub=nh.subscribe(topic_name,buff_len,callback_func);topic_name:话题名称,指定往那个话题上获取消息。buff_len:接收缓冲区大小。callback_func:回调函数,即话题(topic)上有数据的时候,你要怎么处理这些数据。需要程序员明确定义此函数。创建服务器服务器由ros::NodeHandle的实例化对象创建,将服务名称和服务响应函数告知节点管理器,对外广播所能提供的服务。服务器创建方式:ros::ServiceServer=nh.advertiseService(service_name,service_func);service_name:服务名称,指定能提供哪个服务。service_func:响应服务请求的处理函数,既有客户端请求服务事,你要怎么处理这些请求。需要程序员明确定义一次函数。创建服务器客户端服务客户端由ros::NodeHandle的实例化对象创建,将请求的名称和服务类型告知节点管理器。客户端创建方式:ros::ServiceClientclient=nh.ServiceClient(service_type,service_name);service_name:服务名称,指定在哪个服务上请求服务。service_type:服务类型,指定出请求和响应的类型。主循环循环条件ros::ok():当接受到ctrl+c信号或者ros::shutdown()调用时,为false,终止运行节点。主循环中,使用ros::rate实现将循环一次的时间控制在一个我们设置的一个周期内。ROS_INFO();publish();编写CMakeLists.txt文件Cmakelist.txt作用CMakeLists.txt文件CMake构建系统的配置文件,用于描述代码如何编译构建以及安装到何位置等参数,CMake根据此档生成makefiles文件,任何兼容CMake的软件包至少包含一个CMakeLists.txt文件。相比普通的CMake项目,catkin项目中的CMakeLists.txt只是额外多加了几条约束。Cmakelist.txt作用CMake最低版本要求
(cmake_minimum_required)规定CMake的最低版本,catkin构建必须以此行开头,使用cmake_minimum_required宏命令。cmake_minimum_required(VERSION2.8.3功能包名(project())通过CMake的project()宏命令定义功能包名称,cmake脚本中通过${PROJECT_NAME}访问。创建环境变量${PROJECT_NAME}_BINARY_DIR和${PROJECT_NAME}_SOURCE_DIR。project(beginner_tutorials)构建时需要的其它CMake/Catkin软件包
构建此工程时需要的其它CMake/Catkin软件包,而且是构建依赖而非运行依赖,使用find_package()宏命令格式:find_package(<name>[[REQUIRED|COMPONENTS][componets...]])catkin是必须要定义:find_package(catkinREQUIRED)在CMake会话,工程依赖的其它包会自动作为catkin的组件(components)加入,如果将其加入到find_package()中则过程则简单得多:find_package(catkinREQUIREDCOMPONENTSstd_msgsrospyroscpp)find_package()宏命令会创建<NAME>_FOUND、<NAME>_INCLUDE_DIRS或<NAME>_INCLUDES、<NAME>_LIBRARIES或<NAME>_LIBS、<NAME>_DEFINITIONS这几个环境变量,以供CMake脚本调用,具体情况可在构建成功后查看工作空间build目录下的CMakecache.txt文件。处理Message/Service/Action文件
Messages(.msg)、services(.srv)和actions(.action)三个文件需要进行预处理以便于功能包构建使用,生成所支持的编程语言需要并识别的文件:add_message_files()add_service_files()add_action_files()其后加上宏:generate_messages()处理Message/Service/Action文件还需在find_package()宏中添加功能包信息参数,如:find_package(catkinREQUIREDCOMPONENTSmessage_generation)而且在package.xml文件中必须添加message_generation、actionlib和actionlib_msgs为构建依赖;message_runtime、actionlib和actionlib_msgs为运行依赖,如果此功能包依赖的其它功能包中已包含此依赖则不必再次添加。提示:actionlib*在需处理.action档情况下添加比较完整的示例,(假设这些messages依赖std_msgs和sensor_msgs),如:CMakList.txt规则定义功能包构建的输出信息
,为构建系统提供catkin特有的信息以供系统生成pkg-config和CMake文件,通过catkin构建系统的catkin_package()宏实现。其有5个可选参数:INCLUDE_DIRS
此功能包输出的包含路径(如用于:cflags)LIBRARIES
功能包输出的库CATKIN_DEPENDS
依赖的其它catkin工程DEPENDS
依赖的非catkin的CMake工程CFG_EXTRAS
其它配置项定义构建目标,构建目标包括可执行程序和库文件,主要定义内容包括:头文件路径库路径目标构建规则单元测试
通过catkin的宏catkin_add_gtest()实现:安装规则
构建完成后,所有构建目标将会存放于catkin工作空间的devel目录,如果想用makeinstall执行安装操作,就必须定义安装规则。安装对象一般有可执行程序或脚本、库、头文件、roslaunch文件及其它资源类文件。规则定义通过install()宏实现,有四种参数:TARGETS需安装的对象ARCHIVEDESTINATION静态库和DLL的清单文件LIBRARYDESTINATION非DLL共享库和模块RUNTIMEDESTINATION可执行对象和DLL形式的共享库定义构建目标包含路径通过include_directories()和link_directories()两个宏实现,分别表示要包含的头文件路径和库路径。头文件路径可以手动指定路径也可以使用由find_package()宏生成的形如*_INCLUDE_DIRS这样的CMake变量。库路径,无特殊情况,一般都由find_package()自动生成添加。目标规则主要指定构建的目标名称及其源文件和链接需要的库,由add_executable()和add_library()两个宏分别实现可执行程序和库目标定义。语法如下:使用target_link_libraries()宏来定义可执行程序链接需要的库:安装规则形式如下:Python绑定库必须安装到特殊的活页夹以便于其它Python代码import:头文件安装规则示例如下:roslaunch文件等资源文件的安装规则示例如下:对于Python执行代码,catkin提供catkin_install_python()宏来解决Python代码的安装规则:对于Python模块,通过添加*catkin_python_setup()*宏安装。此宏调用setup.py,实现Python模块的安装。
其它细节问题请查阅catkin文檔和CMake文檔。编译构建功能包编写好package.xml、CMakelist.txt及功能代码就可以进行编译构建了。编译构建工作在catkin工作空间顶层目录下进行:$cd~/catkin_ws
$catkin_make编译构建部分指定的包:$catkin_make-DCATKIN_WHITELIST_PACKAGES=”package1;package2”需要安装的话,就执行:$catkin_makeinstall编写CMakeLists.txt文件1.node初始化——rospy.init_node()rospynode初始化是其进程的初始化,包括指定node的名字、ROS的输出信息级别、是否创建SIGINT信号处理器,由**init_node()**函数完成,其原型如下:name(str):Node的名字,在ROS系统中唯一,而且不加命名空间。argv([str]):传递进来的命令行参数,包括映射参数,默认为sys.argv。如果指定argv,则必须在创建任何rospy数据结构之前调用init_node()。anonymous(bool):如果是True,则在指定的node名字后加随机数,保证多实例运行时最终node名唯一。但这样的node不能重映射名字。log_level(int):定义发送message给/rosout及记录日志文件的日志级别,可用值有:rospy.DEBUG,rospy.INFO,rospy.ERROR,rospy.WARN,rospy.FATAL,一般设置成INFO。disable_signals(bool):如果设置成True,则rospy不会注册自带的信号handler,需要手动调用rospy
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版土地租赁与使用权置换协议3篇
- 校企携手2025年度共建纺织工艺培训基地合同3篇
- 二零二五年度文化艺术展览场地临时使用协议书3篇
- 2025版建筑工程碎石料采购与安全管理合同3篇
- 2025年度个人教育培训机构投资合同书(教育连锁版)4篇
- 二零二五年深海油气资源开发电焊工劳务分包协议3篇
- 个人出租车的对外承包协议书 3篇
- 二零二五版淋浴房环保材料生产与应用合同3篇
- 二零二五年度城市道路施工监理合同标准版4篇
- 二零二五年度健康医疗大数据合作投资合同3篇
- 定额〔2025〕1号文-关于发布2018版电力建设工程概预算定额2024年度价格水平调整的通知
- 2024年城市轨道交通设备维保及安全检查合同3篇
- 【教案】+同一直线上二力的合成(教学设计)(人教版2024)八年级物理下册
- 湖北省武汉市青山区2023-2024学年七年级上学期期末质量检测数学试卷(含解析)
- 单位往个人转账的合同(2篇)
- 科研伦理审查与违规处理考核试卷
- GB/T 44101-2024中国式摔跤课程学生运动能力测评规范
- 高危妊娠的评估和护理
- 2024年山东铁投集团招聘笔试参考题库含答案解析
- 儿童10岁生日-百日宴-满月酒生日会成长相册展示(共二篇)
- 2023年高考全国甲卷数学(理)试卷【含答案】
评论
0/150
提交评论