ROS 基础
…
近期做的东西和ROS有关,因此想做一些关于ROS的笔记。这篇文章主要分为以下几个部分。
- ROS简介
- ROS的工程架构
- ROS的计算图集
- ROS工具包
- 未完结
1. ROS简介
ROS(Robot OS)是运行在Ubuntu上的次级系统,它内部由多个节点构成,每个节点即一个进程。这些节点之间各自分工,又相互合作,共同完成一些列任务。一般一个ROS工程由master节点和多个子节点构成,master负责管理各个节点,而子节点则负责各自具体的任务。
2. ROS的工程架构
对于一个ROS工程,它一般分为三部分:
- build:编译产生的中间文件;
- devel:编译的结果文件;
- src:源代码目录。
项目架构概览
- /catkin_ws
- /build
- /devel
- /src
- /folder_1
- /package_1
- /package_2
- /folder_2
- /package_3
- /package_4
- /metapackage
一个ROS工程的src部分,是由一个个Package组成的。每个Package一般对应一个应用或是一个节点。另外还有一类特殊的Package,叫做Metapackage,即虚包,它们没有自己的内容,但是由很多依赖,因此常用来做功能集使用。
Package架构概览:
- /package
- /msg
- x.msg
- /srv
- x.srv
- /action
- x.action
- /scripts
- x.py
- x.sh
- /launch
- x.launch
- /config
- x.yaml
- /include
- x.h
- /src
- x.cpp
- /other_dirs
- other_files
- CMakeLists.txt
- package.xml
ROS支持C++和Python开发。在一个Package下,script下一般存放python文件,src、include文件夹下面分别存放了c++的.cpp文件和.h文件。launch文件夹下存放了ROS的启动文件,这些启动文件描述了这个包的启动过程中需要定义的参数,需要依赖的其它的包等内容。config文件夹下存放了一些配置文件,通过yaml语言定义。ROS自带了三种通信方式,其中msg描述了通过topic方式通信过程中的数据格式,srv、action则分别保存了service和action通信的数据格式。
3. ROS的计算图集
计算图集,也叫通信架构,是ROS节点之间通信的工具。ROS节点之间的通信方式共有三种。
Topic
Topic是最常见的通信方式,topic是一个独立于节点的存在。每个节点既可以发布topic,也可以订阅topic。发布者会始终无条件的发布消息,所以不论有没有其他节点在订阅消息,都会按照一定频率发布topic。并且topic的发布者可以不只是一个节点,偶尔也会有多个节点在同一个topic上发布消息。当然,订阅topic的节点也可以是多个。
一个节点如果想发布topic,必须先创建一个msg,这个msg就像是一个结构体,节点可以在这个msg中存放一些数据,然后发布到topic上。另一个节点如果想订阅这个topic,就必须按照这个msg的结构进行监听。
msg文件结构
1 | float32 x |
Service
当进行一些复杂的,计算量大的任务时,Topic却无法胜任这种情况了,因为Topic是不论有没有订阅者,发布者都会无条件发布消息,这就会导致大量的计算资源被浪费了。而Service这种通信方式正是弥补了这一缺陷。Service会根据服务请求者的请求,按需执行,因此大大节约了计算资源。
Service由服务的提供方提供相应服务,而请求方需要按照srv文件中定义的格式向服务提供方请求服务。
srv文件结构
1 | // 请求格式 |
Action
对于一些执行时间较长的服务,服务的请求方还需要知道服务的实时进度。这时候Action就派上用场了。Action除了像服务那样按需执行外,在执行的过程中,也会按照一定的频率向请求方发送一些其他的数据,这些数据都是在action文件中定义的。
action文件结构
1 | // 请求格式 |
数据格式文件中的数据类型
1 | bool |
4. ROS工具包
Gazebo 物理仿真工具
可以对机器人进行物理仿真,可以对机器人设置重量,碰撞模型,转动惯量等设置。
Rviz 机器人可视化工具
主要用于机器人调试,数据可视化操作。
MoveIt! 机械臂路径规划工具
专门用于机械臂控制使用,里面集成了大量的关于机械臂的工具包。
Rqt ROS代码调试工具
提供了一系列代码调试工具:
rqt_graph 绘制计算图(通信架构图)
rqt_plot 绘制数据变化曲线
rqt_console 查看日志的工具
rqt_* 其他工具