[笔记]机器人操作系统(ROS)浅析

1 绪论

ROS:Robot Operating System
ROS是面向机器人的开源的元操作系统(open-source, meta-operating system)

选择ROS的理由:

  • 分布式计算
  • 软件复用
  • 快速测试:(1)ROS系统框架将底层硬件控制模块和顶层数据处理与决策模块分离,从而可以使用模拟器替代底层硬件模块,独立测试顶层部分,提高测试效率。(2)ROS可以在调试过程中记录传感器数据及其他类型对的消息数据,并在试验后按时间戳回放。通过这种方式,每次运行机器人可以获得更多的测试机会。例如可以记录传感器的数据,并通过多次回放测试不同的数据处理算法。在ROS术语中,这类记录的数据叫做包(bag),一个被称为rosbag的工具可以用于记录和回放包数据。

ROS的误解之一:
ROS不是一门编程语言,实际上,ROS的主要代码由C++编写。客户端库还可以使用Python,Jave和Lisp等其他多种语言编写。

发行版本:ROS的主要版本称为发行版(Distributions),以顺序字母作为版本名的首字母。

编译系统

  • 在groovy及之前的版本中,ROS采用rosbuild系统来完成软件的编译
  • 之后的版本中,改用catkin编译系统。

2 入门概述

设置环境变量
ROS依赖一些环境变量去定位一些必要的文件。
为了设置环境变量,需要使用下面的命令,去执行setup.bash脚本。(以indigo版为例,实际使用时替换为你所用的版本,例如 kinetic)

source /opt/ros/indigo/setup.bash

检查/确认环境变量是否正确设置,用如下命令,如果正确设置了,应该看到一组值(ROS_DISTRO和ROS_PACKAGE_PATH等环境变量的值)。如果setup.bash尚未运行,则此命令的输出通常为空:

export | grep ROS

如果想每启动一个新的shell时,都自动运行脚本setup.bash,可以如下操作:

打开home directory下的.bashrc文件,将上述source命令添加到.bashrc文件的最后。

Packages:软件包/功能包
所有的ROS软件都被组织为packages(软件包/功能包)的形式。
ROS软件包是一组用于实现特定功能的相关文件的集合,包括:可执行文件支持文件

一些软件包的命令:

rospack list
rospack find package-name : 例如 rospack find turtle
rosls package-name : 例如 rosls turtlesim
roscd package-name

The Master: 节点管理器
ROS中实现通信的关键部分就是ROS节点管理器。要启动节点管理器(The Master)使用如下命令:

roscore

节点管理器应该在使用ROS的全部时间内持续运行。
一个合理的工作流程是:在一个终端启动roscore,然后打开其他终端运行其他程序。当结束时,可以通过在roscore所在的终端键入Ctrl-C停止节点管理器。

注意:如果roscore被终止,当前运行的其他节点将无法建立新的连接,即使稍后重启roscore也无济于事。

Nodes:节点
ROS程序的运行实例被称为节点(node)
A running instance of a ROS program is called a node.

启动节点:
rosrun package-name executable-name

一些node的命令:

rosnode list
rosnode info node-name
rosnode kill node-name

Topics and messages: 话题和消息
ROS节点之间进行通信所利用的最重要的机制就是消息传递。
在ROS中,消息有组织地存放在话题里。
消息传递的理念:

  • 当一个节点想要分享信息时,它就会发布(publish)消息到对应的一个或多个话题。
  • 当一个节点想要接收消息时,它就会订阅(subscribe)它所需要的一个或者多个话题。
  • ROS节点管理器负责确保发布节点和订阅节点能够找到对方。
  • 消息是直接从发布节点传递到订阅节点,中间并不经过节点管理器转交。

话题的一些命令:

rostopic list
rostopic echo topic-name : 例如 rostopic echo /turtle1/cmd_vel 打印消息内容
rostopic hz topic-name
rostopic bw topic-name
rostopic info topic-name 查看话题消息。输出中最重要的部分是第一行,它给出了该话题的消息类型

查看消息类型:
rosmsg show message-type-name : 例如 rosmsg show geometry_msgs/Twist

用命令行发布消息:最后的message-content是为消息类型中的所有域按顺序提供参数

rostopic pub -r rate-in-hz topic-name message-type message-content 例如:
rostopic pub -r 1 /turtle1/cmd_vel geometry_msgs/Twist ‘[2,0,0]’ ‘[0,0,0]’
注意,上一条命令中-r用来指定话题发布消息的频率,即以一定的时间周期发布消息。
这条命令同样支持一次性发布的模式-1(短横线+数字1)。
这条命令也支持特别的锁存模式 -l(短横线+字母l):只发布一次消息,但是会确保该话题的新订阅者也会收到消息。锁存模式(latch mode)是默认的模式。

  1. 话题通信的多对多机制:基于话题和消息的通信机制是多对多的,即多个发布者和多个订阅者可以共享同一个话题。
  2. ROS也为更加直接的一对一通信提供了一种称为**服务(Services)**的机制。
  3. 节点之间的松耦合关系:每个节点都不需要显式知道其他节点的存在与否。他们唯一的交互方式是间接地发生在基于话题和消息的通信层。这种节点之间的独立性,以及其支持的任务可分解特性(即复杂任务分解成可重用的小模块),是ROS最关键的设计特性之一。

你可能感兴趣的:(ROS)