ROS学习笔记

ROS学习笔记

  • 一、ROS文件系统级
    • 1、与其他操作系统类似,一个ROS程序的不同组件要放在不同的文件夹下。这些文件夹是根据功能的不同来对文件进行组织的。
      • 功能包(Package):
      • 功能包清单(Package Manifest):
      • 元功能包(MetaPackage):(以前版本为stack)
      • 元功能包清单(MetaPackage Manifest):
      • 消息类型(Message(msg) type):
      • 服务类型(Service(srv) type):
    • 2、工作空间
      • 源文件空间(source space):
      • 编译空间(build space):
      • 开发空间(development(devel) space):
    • 3、功能包:package
  • 二、ROS计算图级(通信架构):
    • 1、ROS会创建一个连接到所有进程的网络,在系统中的任何一个节点都可以访问此网络,并通过该网络与其他节点交互,获取其他节点发送的消息,并将自身数据发布到网络上。
    • 2、节点:node
    • 3、主题:topic
    • 4、服务:service
    • 5、消息:message
    • 6、节点管理器
    • 7、参数服务器(Parameter server)
      • (1)简介
      • (2)命令行维护
      • (3)launch文件内读写
      • (4)node源码
  • 三、ROS-Academy-for-Beginners命令演示
    • 1、启动gazebo
    • 2、启动键盘控制机器人移动
    • 3、启动rgb摄像头
    • 4、启动深度摄像头
    • 5、启动navigation模拟
    • 6、启动rviz,显示建立好的地图

ROS的基本思想:无须改动就能够在不同的机器人上复用代码。基于此,我们就可以在不同的机器人上分享和复用已经实现的功能。

一、ROS文件系统级

1、与其他操作系统类似,一个ROS程序的不同组件要放在不同的文件夹下。这些文件夹是根据功能的不同来对文件进行组织的。

ROS学习笔记_第1张图片

功能包(Package):

一个功能包具有创建ROS程序的最小结构和最少内容。一个package可包含ROS运行的进程(节点)、配置文件等。

功能包清单(Package Manifest):

功能包清单提供关于功能包、许可关系、依赖关系、编译标志等信息。一个包的清单有一个名为package.xml(以前版本为minifest.xml)的文件管理。

元功能包(MetaPackage):(以前版本为stack)

将几个具有某些功能的功能包组织在一起,就是一个元功能包。在ROS系统中,存在大量不同用途的元功能包,例如导航功能包集。

元功能包清单(MetaPackage Manifest):

也由一个名为package.xml的文件管理,但有一个XML格式的导出标记。它在结构上有一定的限制。

消息类型(Message(msg) type):

消息是一个进程发送到其他进程的信息。ROS系统中有很多的标准类型消息。消息类型的说明储存在my_package/msg/MyMessageType.msg中,也就是对应功能包的msg文件夹下。

服务类型(Service(srv) type):

服务描述说明储存在my_package/srv/MySeviceType.srv中,定义了在ROS中由每个进程提供的关于服务请求和响应的数据结构。

2、工作空间

源文件空间(source space):

在源空间(src)文件夹中,放置了功能包、项目、复制的包等。在这个空间中,最重要的一个文件是CMakeLists.txt。当在工作空间配置包时,src文件夹中的CMakeLists.txt会调用CMake。这个文件是通过catkin_init_workspace命令创建的。

编译空间(build space):

在build文件夹中,CMake和catkin为功能包项目保存缓存信息、配置和其他中间文件。

开发空间(development(devel) space):

在devel文件夹中,用来保存编译后的程序,这些是无需安装就能用来测试的程序。一旦项目通过测试,就可以安装或导出功能包从而与其他开发人员分享。

3、功能包:package

(1)功能包指的是一种特定结构的文件和文件夹组合。
(2)package的最精简结构(判断是否是一个package):
ROS学习笔记_第2张图片
(3)package中的代码格式:
ROS学习笔记_第3张图片
(4)package中的自定义通信格式:
ROS学习笔记_第4张图片
(5)package的组成:
ROS学习笔记_第5张图片
(6)package.xml
文件package.xml必须在每个功能包中,它用来说明此包相关的各类信息。打开一个package.xml文件,可以看到包的名称、依赖关系等信息。功能包清单的作用就是为了方便安装和分发这些功能包。

#package.xml

	              #包名
	           #版本号
	       #包描述
	        #维护者
	           #许可证 
	  #编译工具
	      #编译时的依赖
	        #运行时的依赖

在package.xml文件中两个典型的标记是,标记会显示当前功能包安装之前必须先安装哪些功能包,因为新的功能包会使用其他包的一些功能。标记会显示运行功能包中代码所需要的包。

二、ROS计算图级(通信架构):

1、ROS会创建一个连接到所有进程的网络,在系统中的任何一个节点都可以访问此网络,并通过该网络与其他节点交互,获取其他节点发送的消息,并将自身数据发布到网络上。

ROS学习笔记_第6张图片

2、节点:node

节点是主要的计算执行进程。如果想要有一个可以与其他节点进行交互的进程,那么需要创建一个节点,并将此节点连接到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 将无法访问节点的注册信息删除

3、主题:topic

每个消息都必须有一个名称以便被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 输出主题的类型,即主题中发布的消息类型

4、服务:service

5、消息:message

6、节点管理器

(1)每个node启动时都要向master注册
(2)管理node之间的通信

启动roscore:

  • master:节点管理器
  • rosout:日志输出
  • parameter server:参数服务器

7、参数服务器(Parameter server)

(1)简介

与topic和service通信方式不同, 参数服务器也可以说是特殊的“通信方式”。 特殊点在于参数服务器是节点存储参数的地方、 用于配置参数, 全局共享参数。 参数服务器使用互联网传输, 在节点管理器中运行, 实现整个通信过程。参数服务器作为ROS中另外一种数据传输方式, 有别于topic和service, 它更加的静态。 参数服务器维护着一个数据字典, 字典里存储着各种参数和配置。

参数服务器的维护方式非常的简单灵活, 总的来讲有三种方式:

  • 命令行维护
  • launch文件内读写
  • node源码

(2)命令行维护

使用命令行来维护参数服务器, 主要使用 rosparam 语句来进行操作的各种命令, 如下表:
ROS学习笔记_第7张图片
load和dump文件需要遵守YAML格式, YAML格式具体示例如下:

name:'Zhangsan'
age:20
gender:'M'
score{Chinese:80,Math:90}
score_history:[85,82,88,90]

简明解释。 就是“名称+: +值”这样一种常用的解释方式。 一般格式如下:

key : value

(3)launch文件内读写

launch文件中有很多标签, 而与参数服务器相关的标签只有两个, 一个是 , 另一个是 。 这两个标签功能比较相近, 但 一般只设置一个参数,而rosparam先指定一个YAML文件, 然后施加command,其效果等于 rosparam load file_name 。

(4)node源码

除了上述最常用的两种读写参数服务器的方法, 还有一种就是修改ROS的源码, 也就是利用API来对参数服务器进行操作。

三、ROS-Academy-for-Beginners命令演示

1、启动gazebo

$ roslaunch robot_sim_demo robot_spawn.launch

2、启动键盘控制机器人移动

$ rosrun robot_sim_demo robot_keyboard_teleop.py

3、启动rgb摄像头

rosrun image_view image_view image:=/camera/rgb/image_raw

4、启动深度摄像头

rosrun image_view image_view image:=/camera/depth/image_raw

5、启动navigation模拟

roslaunch navigation_sim_demo amcl_demo.launch

6、启动rviz,显示建立好的地图

roslaunch navigation_dim_demo view_navigation.launch

ROS学习笔记_第8张图片

你可能感兴趣的:(ROS杂记)