Ros
ROS的概念
- 一种软件框架,当我们按照它的规范编写、运行各个程序,就可以通过它的函数和工具,使我们的程序之间能够更方便地进行通信(话题、服务、动作、参数服务器),让我们调试更加方便。
特点:
- 分布式计算
- ①一些机器人搭载多台计算机,每台计算机用于控制机器人的部分驱动器或传感器;
- ②即使只有一台计算机,通常仍将程序划分为独立运行且相互协作的小的模块来完成复杂的控制任务。
- ③当多个机器人需要协同完成一个任务时,往往需要互相通信来支撑任务的完成;
- ④用户通常通过其他搭建ros的主机与机器人进行ros层的通信。
2.快速测试
①可以使用模拟器替代底层硬件模块,独立测试顶层部分,提高测试效率,并且可以仿真测试。【各类仿真工具】
②可以在调试过程中记录传感器数据及其他类型的消息数据,并在试验后按时间戳回放。【rosbag工具】
3.良好的开发生态
众多开发者维护的算法和工具。
ROS系统架构
系统基本架构
总的来说,整个ROS的项目在部署运行过程中,分为几个部分:
环境
执行器
传感器
软件结构
环境
包含了软件环境和硬件环境。通常一个ROS的机器人,需要一个开发主板用于运算和控制操作。
例如,我们用树莓派作为开发板,用来作为这个机器人的运算和控制操作,那么这个就是软件所运行的
硬件环境。开发板上通常需要有操作系统,所装的操作系统属于系统环境。当然开发板上可能会外接一
些其他硬件,如摄像头。那么这些硬件也属于硬件环境。
执行器
执行器主要作用是给操作系统发送一些指令,通过指令取控制硬件操作。例如发送指令给开发板,让开
发板外接的陀机转动,驱动物体运动。执行器更像是硬件驱动的输入。
传感器
在硬件环境中,可能会安装一些环境探测的硬件,例如温度感应器。这些硬件感应器会将感觉的数据发
布出来,传感器其实扮演的就是这些硬件发布数据的传播者,更像是硬件驱动的输出。
软件结构
这里所说的软件结构是指,ROS机器人运行时部署的软件及软件间的关系。
机器人运行起来后,内部会有很多单元程序运行,每个单元程序做很小的事情。有的小程序负责读取硬
件驱动传递的数据,有的负责处理读取的数据,有的负责判断数据,有的负责发出指令….
总之,ros将复杂的程序分解成了很小的一部分,每部分干很少的活,每个部分还可以复用。
ROS 软件结构组成
ROS Master
管理Node节点间进行通讯的
每个Node节点都需要到Ros Master中进行通讯
通roscore命令可以启动ROS Master,启动节点前,必须启动ROS Master。
# 启动ROS Master
roscore
ROS节点
具备单一功能的可执行程序
可以单独编译,可执行,可管理
存放在package中
ROS 哲学
1. 点对点
点对点的设计。
Node节点单元
采用了分布式网络结构
节点间通过RPC + TCP/UDP进行通讯
2. 分布式
分散协同式布局。可以将ROS同时部署到多台机器上,让多台机器进行通讯。
3. 多语种
多编程语言的支持。
可以采用python,c++,lisp等语言进行开发。
遵循协议进行编码,和编程语言无关
4.重量轻
组件工具包丰富。ros提供了丰富的开发工具包。
5. 免费开源
免费并且开源。
BSD许可。可修改,可复用,可商用。
开源使软件进步
工作目录结构
Workspace,Package,Node是工程结构中的几个关键词,也是核心概念。以上视图我们初步的认知
他们的包含关系。
标准的Workspace工作目录结构如下:
📁workspace
├── 📁build
├── 📁devel
│ ├── 📃setup.bash
└── 📁src
├── 📃CMakeLists.txt
├── 📁pkg
│ ├── 📃CMakeLists.txt
│ ├── 📁include
│ ├── 📃package.xml
│ └── 📁src
├── 📁pkg
│ ├── 📃CMakeLists.txt
│ ├── 📁include
│ ├── 📃package.xml
│ └── 📁src
└── 📁pkg
├── 📃CMakeLists.txt
├── 📁include
├── 📃package.xml
└── 📁src
完整的机构示意图如下:
工作目录理解
Tip
生活中,企业通过部门管理员工。
人多瞎胡乱,鸡多不下蛋,一旦项目变大,组织结构和规范就变的非常重要。
我们基于ros开发一个无人驾驶的小车,代码结构按照package划分,可以划分如下
camera视觉包: 负责视频的采集,图像解析,障碍识别等
hardware硬件包:负责控制小车,硬件的加速减速,方向移动
motion控制包: 负责用来规划计算 运动轨迹和如何运动
提示
按照公司结构来去类比,无人小汽车相当于一个公司,下面的模块相当于一个部门,模块下的功能相当
于部门里干活的人。
按照ROS的项目结构来划分,无人小汽车工程就是一个workspace,视觉功能模块就是一个
package,模块下的视频采集功能就是一个Node。
ros的这种结构划分,和公司结构划分是一个道理。功能多,通过只能进行管理划分,规范开发,让开
发效率提升,解决一些耦合。
工作目录说明
工作空间
我们在开发一个ROS项目的时候,是以工作空间来代表一个项目的。
workspace: 工作空间
build:ros编译打包的结果产出目录。 我们不需要对这个文件夹做任何编辑操作,属于自动生成。
devel: 开发所需要的目录
src:存放package的目录
CMakeLists.txt: 整个工作空间编译的脚本。此文件我们通常不用去做修改操作。
工作单元package
一个项目中可以创建多个工作单元,这个工作单元,我们称之为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
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 涂良湘!