ROS架构详解
- ROS 是什么
- 本文开发环境
- 架构介绍
- ROS 软件结构组成
- ROS 哲学
- 文件系统
- 工作目录说明
- Workspace创建
- Package创建
- 使用Clion开发package
- 调试运行代码
ROS 是什么
The Robot Operating System (ROS) is a flexible framework for writing robot software. It is a collection of tools, libraries, and conventions that aim to simplify the task of creating complex and robust robot behavior across a wide variety of robotic platforms.
机器人操作系统(ROS)是一种用于编写机器人软件的灵活框架。 它是工具,库和协议的集合,旨在简化各种机器人平台上,去构建复杂而强大的机器人。
ROS 是 Robot Operating System的简写,翻译过来就是机器人操作系统。它是一个软件框架,目的是提供开发平台,工具及生态给开发人员,让开发人员快速的去开发强大的机器人系统。
本文开发环境
ROS: Melodic版本
Ubuntu: 18.04版本
开发工具: clion
架构介绍
系统基本架构,总的来说,整个ROS的项目在部署运行过程中,分为几个部分:环境、 执行器、 传感器、 软件结构
(环境)
包含了软件环境和硬件环境。通常一个ROS的机器人,需要一个开发主板用于运算和控制操作。例如,我们用树莓派作为开发板,用来作为这个机器人的运算和控制操作,那么这个就是软件所运行的硬件环境。开发板上通常需要有操作系统,所装的操作系统属于系统环境。当然开发板上可能会外接一些其他硬件,如摄像头。那么这些硬件也属于硬件环境。
(执行器)
执行器主要作用是给操作系统发送一些指令,通过指令取控制硬件操作。例如发送指令给开发板,让开发板外接的陀机转动,驱动物体运动。执行器更像是硬件驱动的输入。
(传感器)
在硬件环境中,可能会安装一些环境探测的硬件,例如温度感应器。这些硬件感应器会将感觉的数据发布出来,传感器其实扮演的就是这些硬件发布数据的传播者,更像是硬件驱动的输出。
(软件结构)
这里所说的软件结构是指,ROS机器人运行时部署的软件及软件间的关系。
机器人运行起来后,内部会有很多单元程序运行,每个单元程序做很小的事情。有的小程序负责读取硬件驱动传递的数据,有的负责处理读取的数据,有的负责判断数据,有的负责发出指令…
总之,ros将复杂的程序分解成了很小的一部分,每部分干很少的活,每个部分还可以复用。
ROS 软件结构组成
ROS Master和ROS Node
(ROS Master)
- 管理Node节点间进行通讯的
- 每个Node节点都需要到Ros Master中进行通讯
- 通roscore命令可以启动ROS Master,启动节点前,必须启动ROS Master。(启动ROS Master命令 : roscore)
(ROS Node)
- 具备单一功能的可执行程序
- 可以单独编译,可执行,可管理
- 存放在package中
ROS 哲学
- Peer to peer
点对点的设计。
Node节点单元
采用了分布式网络结构
节点间通过RPC + TCP/UDP进行通讯 - Distributed
分散协同式布局。可以将ROS同时部署到多台机器上,让多台机器进行通讯。 - Multi-lingual
多编程语言的支持。
可以采用python,c++,lisp等语言进行开发。
遵循协议进行编码,和编程语言无关 - Light-weight
组件工具包丰富。ros提供了丰富的开发工具包 - Free and open-source
免费并且开源。
BSD许可。可修改,可复用,可商用。
开源使软件进步
文件系统
工作目录结构
Workspace,Package,Node是工程结构中的几个关键词,也是核心概念。以上视图我们初步的认知他们的包含关系。
- 标准的Workspace工作目录结构如下:
- 完整的机构示意图如下:
- 工作目录理解
生活中,企业通过部门管理员工。
人多瞎胡乱,鸡多不下蛋,一旦项目变大,组织结构和规范就变的非常重要。ros的这种结构划分,和公司结构划分是一个道理。功能复杂的时候进行管理划分,规范开发,让开发效率提升,解决一些耦合。
工作目录说明
- 工作空间workspace,我们在开发一个ROS项目的时候,是以工作空间来代表一个项目的。
workspace: 工作空间
build:ros编译打包的结果产出目录。我们不需要对这个文件夹做任何编辑操作,属于自动生成。
devel: 开发所需要的目录
src:存放package的目录
CMakeLists.txt: 整个工作空间编译的脚本。此文件我们通常不用去做修改操作。 - 工作单元package,一个项目中可以创建多个工作单元,这个工作单元,我们称之为package。
pkg1: package的名称,开发过程中根据自己实际情况进行创建设定。
CMakeLists.txt: 当前package的编译脚本。通常需要为c++代码添加编译时的依赖,执行等操作。
package.xml: package相关信息。通常添加一些ros库的支持
include文件夹: 存放c++ 头文件的
config文件夹:存放参数配置文件,格式为yaml
launch文件夹:存放.launch文件的。
src:c++源代码
scripts:python源代码
srv:存放定义的service
msg: 存放自定义的消息协议
action: 存放自定义的action
Workspace创建
1. 新建工作空间目录结构
mkdir -p first_ws/src
2. 编译工作空间
cd first_ws
catkin_make
(来到创建的工作空间目录下,调用ros的名命令catkin_make,将工作空间进行编译。
编译后,会得到工作空间的文件结构,build,devel,CMakeLists.txt都会自动生成。catkin_make是ROS的编译工具,我们会经常用到)
Package创建
1. 来到workspace的src目录下
cd first_ws/src
2. 通过catkin创建package
catkin_create_pkg firstros roscpp rospy rosmsg
(参数解释:catkin_create_pkg是创建package的命令。运行以上命令,会新建好package的目录,并且在目录中创建CMakeLists.txt,package.xml,src,include等文件和 目录
第一个参数firstros是指创建的package名称,可以根据自己的实际需求去设定。
后面的参数roscpp,rospy,rosmsg是指当前创建的这个package需要提供哪些环境依赖。
roscpp是对c++的一种依赖,有了它就可以用c++开发ros程序。
rospy是对python的一种依赖,有了它就可以用python开发ros程序。
rosmsg是Node间通讯的消息协议依赖,有了它就可以让节点间进行消息通讯。
注意:通常在开发过程中,这三个依赖都是必备的。)
使用Clion开发package
1. 启动clion
cd ~/clion/bin
./clion.sh
开启命令行工具,来到工作空间目录下,设置开发环境。此操作非常重要。 devel目录中的setup.bash是用于开发环境中,方便找到开发依赖的。来到clion的安装目录下,通过命令启动clion
- 使用clion打开package
clion启动后,首先点击open,
然后找到工作空间,在工作空间的src中找到要打开的package - 新建python文件,
特别要注意的是,目前ROS Melodic版本还不支持python3,要等到ROS N版才会支持。
因此,我们选择环境的时候选择python2.x版本。默认编写的py文件是不具备执行权限的。我们需要手动讲文件权限修改为可执行。
调试运行代码
1. 启动命令行,来到工作空间目录下,编译项目
cd first_ws
catkin_make
编译的过程,会将新建的package进行编译。
在编写python版本程序时,这一操作可以省略。
但是建议养成良好习惯,还是进行编译。
2. 启动ROS Master
roscore
打开新的命令行,启动ROS master
ROS节点启动前,必须启动ros master
3. 运行节点
启动编译好的node节点,有两种方式可以运行。
1. 通过clion工具直接运行
2. 通过命令行运行
cd first_ws
source devel/setup.bash (做这一步的操作是为了让rosrun 命令找到刚刚编译好的node,新打开的窗口如果没有把当前工程需要的环境source 进去的话, 就 需要重新source)
rosrun firstros test.py (rosrun命令后跟第一个参数是package的名称,第二个参数是节点名称)