一个功能包具有创建ROS程序的最小结构和最少内容。一个package可包含ROS运行的进程(节点)、配置文件等。
功能包清单提供关于功能包、许可关系、依赖关系、编译标志等信息。一个包的清单有一个名为package.xml(以前版本为minifest.xml)的文件管理。
将几个具有某些功能的功能包组织在一起,就是一个元功能包。在ROS系统中,存在大量不同用途的元功能包,例如导航功能包集。
也由一个名为package.xml的文件管理,但有一个XML格式的导出标记。它在结构上有一定的限制。
消息是一个进程发送到其他进程的信息。ROS系统中有很多的标准类型消息。消息类型的说明储存在my_package/msg/MyMessageType.msg中,也就是对应功能包的msg文件夹下。
服务描述说明储存在my_package/srv/MySeviceType.srv中,定义了在ROS中由每个进程提供的关于服务请求和响应的数据结构。
在源空间(src)文件夹中,放置了功能包、项目、复制的包等。在这个空间中,最重要的一个文件是CMakeLists.txt。当在工作空间配置包时,src文件夹中的CMakeLists.txt会调用CMake。这个文件是通过catkin_init_workspace命令创建的。
在build文件夹中,CMake和catkin为功能包项目保存缓存信息、配置和其他中间文件。
在devel文件夹中,用来保存编译后的程序,这些是无需安装就能用来测试的程序。一旦项目通过测试,就可以安装或导出功能包从而与其他开发人员分享。
(1)功能包指的是一种特定结构的文件和文件夹组合。
(2)package的最精简结构(判断是否是一个package):
(3)package中的代码格式:
(4)package中的自定义通信格式:
(5)package的组成:
(6)package.xml
文件package.xml必须在每个功能包中,它用来说明此包相关的各类信息。打开一个package.xml文件,可以看到包的名称、依赖关系等信息。功能包清单的作用就是为了方便安装和分发这些功能包。
#package.xml
#包名
#版本号
#包描述
#维护者
#许可证
#编译工具
#编译时的依赖
#运行时的依赖
在package.xml文件中两个典型的标记是
节点是主要的计算执行进程。如果想要有一个可以与其他节点进行交互的进程,那么需要创建一个节点,并将此节点连接到ROS网络。通常情况下,系统包含能够实现不同功能的多个节点。最好让众多节点都具有单一的功能,而不是在系统中创建一个包罗万象的大节点。
节点都是各自独立的可执行文件,能够通过主题、服务或参数服务器与其他进程(节点)通信。ROS通过使用节点将代码和功能解耦,提高了系统容错能力和可维护性,使系统简化。
节点在系统中必须有唯一的名称。节点使用特定名称与其他节点进行通信而不产生二义性。节点可以使用不同的库进行编写,如roscpp和rospy。roscpp基于C++,rospy基于python。
ROS提供了处理节点和显示节点信息的工具,如rosnode。rosnode是一个用于显示节点信息的命令行工具。支持的命令如下:
·rosnode info NODE 输出当前节点信息
·rosnode kill NODE 结束当前运行节点进程或发送给定信号
·rosnode list 列出当前活动节点
·rosnode machine hostname 列出某一特定计算机上运行的节点或列出主机名称
·rosnode ping NODE 测试节点间的连通性
·rosnode cleanup 将无法访问节点的注册信息删除
每个消息都必须有一个名称以便被ROS网络分发。当一个节点发送数据时,我们就说该节点正在向主题发布消息。节点可以通过订阅某个主题,接收来自其他节点的消息。一个节点可以订阅一个主题,而不需要任何其他节点同时发布该主题,这就保证了消息的发布者和订阅者之间的解耦,完全无须知道对方的存在。主题的名称必须是唯一的,否则在同名主题之间的消息路由就会发生错误。
主题是节点间用来传输数据的总线。通过主题进行消息传输不需要节点之间连接。这就意味着发布者和订阅者之间不需要知道彼此是否存在。一个主题可以有多个订阅者,也可以有多个发布者,但是用不同的节点发布同样的主题时要慎重,否则会产生冲突。
每个主题都是强类型的,发布到主题上的消息必须与主题的ROS消息类型相匹配,并且节点只能接收类型匹配的消息。节点想要订阅主题,就必须具有相同的类型。
ROS的主题可以使用TCP/IP和UDP传输。基于TCP传输称为TCPROS,它使用TCP/IP长连接,这时ROS默认的传输方式。基于UDP传输称为UDPROS,它是一种低延迟高效率的传输方式,但可能产生数据丢失,所以它最适合于像远程操控的任务。
ROS有一个rostopic工具用于主题操作,它是一个命令行工具,允许我们获取主题的相关信息或直接在网络上发布数据。支持的命令如下:
·rostopic bw /topic 显示主题所使用的宽带
·rostopic echo /topic 将消息输出到屏幕
·/font>rostopic find message_type 按照类型查找主题
·rostopic hz /topic 显示主题的发布频率
·rostopic info /topic 输出主题的信息,例如其消息类型、发布者、订阅者
·rostopic list 输出活动的主题
·rostopic pub /topic type args 将数据发布到主题,它允许我们直接从命令行中对任意主题创建和发布数据
·rostopic type /topic 输出主题的类型,即主题中发布的消息类型
(1)每个node启动时都要向master注册
(2)管理node之间的通信
启动roscore:
与topic和service通信方式不同, 参数服务器也可以说是特殊的“通信方式”。 特殊点在于参数服务器是节点存储参数的地方、 用于配置参数, 全局共享参数。 参数服务器使用互联网传输, 在节点管理器中运行, 实现整个通信过程。参数服务器作为ROS中另外一种数据传输方式, 有别于topic和service, 它更加的静态。 参数服务器维护着一个数据字典, 字典里存储着各种参数和配置。
参数服务器的维护方式非常的简单灵活, 总的来讲有三种方式:
使用命令行来维护参数服务器, 主要使用 rosparam 语句来进行操作的各种命令, 如下表:
load和dump文件需要遵守YAML格式, YAML格式具体示例如下:
name:'Zhangsan'
age:20
gender:'M'
score{Chinese:80,Math:90}
score_history:[85,82,88,90]
简明解释。 就是“名称+: +值”这样一种常用的解释方式。 一般格式如下:
key : value
launch文件中有很多标签, 而与参数服务器相关的标签只有两个, 一个是 , 另一个是 。 这两个标签功能比较相近, 但 一般只设置一个参数,而rosparam先指定一个YAML文件, 然后施加command,其效果等于 rosparam load file_name 。
除了上述最常用的两种读写参数服务器的方法, 还有一种就是修改ROS的源码, 也就是利用API来对参数服务器进行操作。
$ roslaunch robot_sim_demo robot_spawn.launch
$ rosrun robot_sim_demo robot_keyboard_teleop.py
rosrun image_view image_view image:=/camera/rgb/image_raw
rosrun image_view image_view image:=/camera/depth/image_raw
roslaunch navigation_sim_demo amcl_demo.launch
roslaunch navigation_dim_demo view_navigation.launch