ROS介绍及快速体验


ROS概念

ROS全称Robot Operating System(机器人操作系统)

  • ROS是适用于机器人的开源元操作系统

  • ROS集成了大量的工具,库,协议,提供类似OS所提供的功能,简化对机器人的控制

  • 还提供了用于在多台计算机上获取,构建,编写和运行代码的工具和库,ROS在某些方面类似于“机器人框架”

  • ROS设计者将ROS表述为“ROS = Plumbing + Tools + Capabilities + Ecosystem”,即ROS是通讯机制、工具软件包、机器人高层技能以及机器人生态系统的集合体

ROS框架

ROS 框架主要分成三个层级,分别是 ROS 文件系统、ROS 计算图和 ROS 社区。

ROS文件系统

ROS 的文件系统主要介绍了硬盘上 ROS 文件的组织形式。其中,我们必须了解的主要有以下几个方面:

  • 软件包(Package):ROS 软件包是 ROS 软件框架的独立单元。ROS 软件包可能包含源代码、第三方软件库、配置文件等。ROS 软件包可以复用和共享。
  • 软件包清单(Package Manifest):清单文件(package.xml)列出了软件包的所有详细信息,包括名称、描述、许可信息以及最重要的依赖关系。
  • 消息(msg)类型:消息的描述存储在软件包的 msg 文件夹下。ROS 消息是一组通过 ROS 的消息传递系统进行数据发送的数据结构。消息的定义存储在扩展名为 .msg 的文件里。
  • 服务(srv)类型:服务的描述使用扩展名 .srv 存储在 srv 文件夹下。该文件定义了 ROS 内服务请求和响应的数据结构。

WorkSpace --- 自定义的工作空间

    |--- build:编译空间,用于存放CMake和catkin的缓存信息、配置信息和其他中间文件。

    |--- devel:开发空间,用于存放编译后生成的目标文件,包括头文件、动态&静态链接库、可执行文件等。

    |--- src: 源码

        |-- package:功能包(ROS基本单元)包含多个节点、库与配置文件,包名所有字母小写,只能由字母、数字与下划线组成

            |-- CMakeLists.txt 配置编译规则,比如源文件、依赖项、目标文件

            |-- package.xml 包信息,比如:包名、版本、作者、依赖项...(以前版本是 manifest.xml)

            |-- scripts 存储python文件

            |-- src 存储C++源文件

            |-- include 头文件

            |-- msg 消息通信格式文件

            |-- srv 服务通信格式文件

            |-- action 动作格式文件

            |-- launch 可一次性运行多个节点 

            |-- config 配置信息

        |-- CMakeLists.txt: 编译的基本配置

ROS计算图

ros 程序运行之后,不同的节点之间是错综复杂的,ROS 中提供了一个实用的工具:rqt_graph。

rqt_graph能够创建一个显示当前系统运行情况的动态图形。ROS 分布式系统中不同进程需要进行数据交互,计算图可以以点对点的网络形式表现数据交互过程。rqt_graph是rqt程序包中的一部分。

ROS 计算图中的基本功能包括节点、ROS 控制器、参数服务器、消息和服务:

  • 节点(Node):ROS 节点是使用 ROS 功能处理数据的进程。节点的基本功能是计算。例如,节点可以对激光扫描仪数据进行处理,以检查是否存在碰撞。ROS 节点的编写需要 ROS 客户端库文件(如roscpp和rospy)的支持。
  • ROS 控制器(Master):ROS 节点可以通过名为 ROS 控制器的程序相互连接。此程序提供计算图其他节点的名称、注册和查找信息。如果不运行这个控制器,节点之间将无法相互连接和发送消息。
  • 参数服务器(Parameter server):ROS 参数是静态值,存储在叫作参数服务器的全局位置。所有节点都可以从参数服务器访问这些值。我们甚至可以将参数服务器的范围设置为 private 以访问单个节点,或者设置为 public 以访问所有节点。
  • ROS主题(Topic):ROS 节点使用命名总线(叫作 ROS 主题)彼此通信。数据以消息的形式流经主题。通过主题发送消息称为发布,通过主题接收数据称为订阅。
  • 消息(Message):ROS 消息是一种数据类型,可以由基本数据类型(如整型、浮点型、布尔类型等)组成。ROS 消息流经 ROS 主题。一个主题一次只能发送/接收一种类型的消息。我们可以创建自己的消息定义并通过主题发送它。
  • 服务(Service):我们看到使用 ROS 主题的发布/订阅模型是一种非常灵活的通信模式,这是一种一对多的通信模式,意味着一个主题可以被任意数量的节点订阅。在某些情况下,可能还需要一种请求/应答类型的交互方式,它可以用于分布式系统。这种交互方式可以使用 ROS 服务实现。ROS 服务的工作方式与 ROS 主题类似,因为它们都有消息类型定义。使用该消息定义可以将服务请求发送到另一个提供该服务的节点。服务的结果将作为应答发送。该节点必须等待,直到从另一个节点接收到结果。
  • ROS 消息记录包(Bag):这是一种用于保存和回放 ROS 主题的文件格式。ROS 消息记录包是记录传感器数据和处理数据的重要工具。这些包之后可以用于离线测试算法

演示

首先,按照前面所示,运行案例

然后,启动新终端,键入: rqt_graph 或 rosrun rqt_graph rqt_graph,可以看到类似下图的网络拓扑图,该图可以显示不同节点之间的关系。

ROS快速体验

HelloWorld实现简介

ROS中涉及的编程语言以C++和Python为主,ROS中的大多数程序两者都可以实现,ROS中的程序即便使用不同的编程语言,实现流程也大致类似,以当前HelloWorld程序为例,实现流程大致如下:

  • 先创建一个工作空间;
  • 再创建一个功能包;
  • 编辑源文件;
  • 编辑配置文件;
  • 编译并执行。

1.创建工作空间并初始化

mkdir -p 自定义空间名称/src
cd 自定义空间名称
catkin_make

2.进入 src 创建 ros 包并添加依赖

cd src
catkin_create_pkg 自定义ROS包名 roscpp rospy std_msgs

上述命令,会在工作空间下生成一个功能包,该功能包依赖于** roscpp、rospy 与 std_msgs**,其中roscpp是使用C++实现的库,而rospy则是使用python实现的库,std_msgs是标准消息库,创建ROS功能包时,一般都会依赖这三个库实现。

补充 :在ROS中,虽然实现同一功能时,C++和Python可以互换,但是具体选择哪种语言,需要视需求而定,因为两种语言相较而言:C++运行效率高但是编码效率低,而Python则反之,基于二者互补的特点,ROS设计者分别设计了roscpp与rospy库,前者旨在成为ROS的高性能库,而后者则一般用于对性能无要求的场景,旨在提高开发效率。

HelloWorld(C++版)

1.进入 ros 包的 src 目录编辑源文件

cd 自定义的包

C++源码实现(文件名自定义)

#include "ros/ros.h"

int main(int argc, char *argv[])
{
    //执行 ros 节点初始化
    ros::init(argc,argv,"hello");
    //创建 ros 节点句柄(非必须)
    ros::NodeHandle n;
    //控制台输出 hello world
    ROS_INFO("hello world!");

    return 0;
}

2.编辑 ros 包下的 Cmakelist.txt文件

add_executable(步骤3的源文件名
  src/步骤3的源文件名.cpp
)
target_link_libraries(步骤3的源文件名
  ${catkin_LIBRARIES}
)

3.进入工作空间目录并编译

cd 自定义空间名称
catkin_make

生成 build devel ….

4.执行

先启动命令行1:

roscore

再启动命令行2:

cd 工作空间
source ./devel/setup.bash
rosrun 包名 C++节点

命令行输出: HelloWorld!

补充:source ~/工作空间/devel/setup.bash可以添加进.bashrc文件,使用上更方便

添加方式1: 直接使用 gedit 或 vi 编辑 .bashrc 文件,最后添加该内容

添加方式2:echo “source ~/工作空间/devel/setup.bash” >> ~/.bashrc

参考文献

ROS机器人操作系统简介

机器人入门教程


文章作者: oceanechy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 oceanechy !
  目录