机器人操作系统ROS(04):ROS基本元素

2、文件系统

package是ros的代码组合,manifests用来描述package。先安装一个演示包:
$ sudo apt-get install ros-kinetic-ros-tutorials
几个工具:
$ rospack find [package_name],allows to get information about packages.
$ roscd [locationname[/subdir]],allows to change directory (cd) directly to a package or a stack.
$ rosls [package_name],allows to ls directly in a package by name rather than by absolute path.
$ Tab Completion,这个和所有unix-like的系统一样的。

3、create package

package必须具有一个package.xml和CMakeLists.txt,最简单像这样:
my_package/
CMakeLists.txt
package.xml

Notes:
1、create package要在src之下:
$ cd ~/catkin_ws/src
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
2、build package要在工作区之下:
$ cd ~/catkin_ws
$ catkin_make
这样获得和/opt/ros/kinetic结构类似的catkin_ws/devel。
3、需要运行build所得到的setup.*sh从而把catkin_ws工作区source到当前ros环境:
$ . ~/catkin_ws/devel/setup.bash
4、查看该package的一阶依赖关系,其实就是package.xml:
$ rospack depends 1 beginner_tutorials
或者查看所有依赖:
$ rospack depends beginner_tutorials
5、这些关系其实保存于Manifests (package.xml)文件:
<description>The beginner_tutorials package</description>
<maintainer email=”user@todo.todo”>user</maintainer>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<run_depend>roscpp</run_depend>

4、build package

1、CMake流程是:
转到CMake project
$ mkdir build
$ cd build
$ cmake ..
$ make
$ make install # (可选)
2、catkin流程是:
转到workspace
$ cd ~/catkin_ws/
$ catkin_make
$ catkin_make install # (可选)

5、Nodes

1、安装一个轻量级的模拟器:
$ sudo apt-get install ros-kinetic-ros-tutorials
2、roscore=ROS-Master + rosout + parameter server,使用roscore启动ROS:
$ roscore
3、rosnode指令
$ rosnode list
/rosout
$ rosnode info /rosout
4、rosrun启动一个package的node,例如:
$ rosrun turtlesim turtlesim_node
$ rosnode list
/rosout
/turtlesim
也可以给以新的名字参数,例如关闭前面打开的小乌龟,然后:
$ rosrun turtlesim turtlesim_node __name:=my_turtle
$ rosnode list
/rosout
/my_turtle
如果还能list出来第一次的turtlesim,是因为用ctl-c退出而不是关闭小乌龟,此时是ping是不通:
$ rosnode ping turtlesim
可以用这个清理:
$ rosnode cleanup

6、Topic

1、运行模拟器的node和控制器的node
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key
这样,就可以用鼠标控制小乌龟移动。
2、查看node和topic
Turtlesim_node和turtle_teleop_key node通过Topic通讯,turtle_teleop_key在topic中发布用户敲击的键,而turtlesim订阅这个topic以接收用户敲击的键。rqt_graph可以图形化显示当前运行的nodes和topics,安装rqt_graph:
$ sudo apt-get install ros-kinetic-rqt
$ sudo apt-get install ros-kinetic-rqt-common-plugins
运行:
$ rosrun rqt_graph rqt_graph
可以看到蓝色和绿色的两个nodes以及红色的topic,turtlesim_node和turtle_teleop_key这两个nodes通过/turtle1/command_velocity这个topic进行通讯。

3、rostopic指令
list可以显示当前发布和订阅的所有topics:
$ rostopic list -v

echo可以把turtle_teleop_key这个node在topic中public的数据echo出来:
$ rostopic echo /turtle1/cmd_vel
这时候如果刷新一下rpt-graph,可以看到多出来node,这个多出来的node就是rostopic echo:

4、rosmsg
topic上面传递的是各个nodes之间的message,发布者发布和接收者接收的消息必须数据类型一致。
$ rostopic type /turtle1/cmd_vel
geometry_msgs/Twist
查看一下这个消息的数据类型:
$ rosmsg show geometry_msgs/Twist
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
知道确切地知道消息的数据类型之后,可以发布消息:
$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist — ‘[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, 1.8]’
解释:rostopic pub发布一个消息,-1发布一次消息就停止,/turtle1/cmd_vel是要发布到的topic,geometry_msgs/Twist指定消息的数据类型,–表明在此之后不再是选项而是参数,两个-是因为有的参数是以-开始的负值,这里的参数是线速度2.0、角速度1.8这样YAML格式的参数。
$ rostopic pub -r 2 /turtle1/cmd_vel geometry_msgs/Twist — ‘[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, 1.8]’
这个是连续发布,此时刷新rpt-graph可见多出的node:

$ rostopic echo /turtle1/pose
可以查看连续的发布的数据。或者使用$ rosrun rqt_plot rqt_plot也可以。

-1、YAML
Several ROS tools (rostopic, rosservice) use the YAML markup language on the command line.

YAML was chosen as, in most cases, it offers a very simple, nearly markup-less solution to typing in typed parameters.
canonical: 12345
decimal: +12,345
octal: 014
hexadecimal: 0xC
canonical: 1.23015e+3
exponential: 12.3015e+02
fixed: 1,230.15
string: foo
doublequoted: “Double-quotes allow escape sequences.u263A”
singlequoted: ‘Single quotes do not’
true: true
false: false
true-y: y
false-n: n
string: ‘12345’
dict: {a: 1, b: 2}
list: [1, 2, 3, 4, 5]

5A.1、Representing Messages in YAML
$ rosservice call /foo msg/Type 1 2
这个将产生{1,2}的list类型。
$ rosservice call /foo msg/Type ‘{a: 1, b: 2}’
这个是dict类型。

7、services和param

service是各个node之间除了topic之外的另一种通讯方式,node可以发起请求或接收响应,rosservic指令可以控制ROS的client/service结构。$rosservice list可以发现存在reset,clear,spawn,kill,turtle1/set_pen,/turtle1/teleport_absolute,/turtle1/teleport_relative,turtlesim/get_loggers,turtlesim/set_logger_level等几项服务。
1、rosservice
$ rosservice type clear
std_srvs/Empty
这说明clear为空服务,没有参数,也就是请求时不发送数据响应时不接收数据,尝试call:
$ rosservice call /clear
它清除了turtlesim_node的背景。
再看一个带参数的,先查看spawn这个创建新的小乌龟的service的结构:
$ rosservice type spawn | rossrv show
发现是ixytheta三个位置参数和一个名字参数,然后用默认弥功能自参数尝试call:
$ rosservice call spawn 2 2 0.2 “”
name: turtle2

2、rosparam
rosparam可以操作参数服务器的数据:
$ rosparam list
例如修改背景颜色:
$ rosparam set background_r 150
使其生效:
$ rosservice call clear
查看:
$ rosparam get background_g
86
或者查看整个参数服务器:
$ rosparam get /

8、console和roslanch

1、如果需要则安装一些新包(重复安装并不会造成不良影响):
$ sudo apt-get install ros-kinetic-rqt
$ sudo apt-get install ros-kinetic-rqt-common-plugins
2、rqt_console和rqt_logger_level
依附于ros debugging框架的rqt_console可以显示调试信息,而rqt_logger_level可以设定优先级(DEBUG, WARN, INFO, and ERROR)。
3、启动控制台:
$ rosrun rqt_console rqt_console
$ rosrun rqt_logger_level rqt_logger_level
或者用roslaunch启动launch文件。
$ roscd beginner_tutorials
$ mkdir launch
$ cd launch
建立turtlemimic.launch文件:
<launch>

<group ns=”turtlesim1″>
<node pkg=”turtlesim” name=”sim” type=”turtlesim_node”/>
</group>
<group ns=”turtlesim2″>
<node pkg=”turtlesim” name=”sim” type=”turtlesim_node”/>
</group>
<node pkg=”turtlesim” name=”mimic” type=”mimic”>
<remap from=”input” to=”turtlesim1/turtle1″/>
<remap from=”output” to=”turtlesim2/turtle1″/>
</node>

</launch>

运行:
$ roslaunch beginner_tutorials turtlemimic.launch
驱动两个小乌龟:
$ rostopic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 — ‘[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, -1.8]’

9、rosed

如果必要先安装vim:
$ sudo apt-get install vim
设置编辑器:
$ export EDITOR=’nano -w’
使用rosed就免去了繁琐的指定文件路径:
$ rosed roscpp Logger.msg

10、rosbag

$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key
查看有哪些主题:
$ rostopic list -v
准备记录:
$ mkdir ~/bagfiles
$ cd ~/bagfiles
$ rosbag record -a
可以回放:
$ rosbag play <your bagfile>

机器人操作系统ROS(01):基本概念

  • 1、乌班图Ubuntu

这ROS系统是指机器人操作系统robot operating system,并不是实时操作系统RTOS:realt-ime operation ystem,这个机器人操作系统ROS不具备实时性。ROS在2007年起源于斯坦福大学,在2010年由WG美国公司发布,目标是提高代码复用效率。ROS作为软件框架,只能算次操作系统。 ROS一般安装在类linux系统上,常见的是乌班图Ubuntu。Ubuntu是基于Debian的一款发行,debian是社区型linux,不同于Redhat/suse之类公司化的linux。Ubuntu是基于Debian和GNOME的以桌面应用为主的Linux操作系统,很少用作服务器。后期桌面由Gnome改为Unity,最新版本16.04 LTS,代号Xenial ,32-bit版本大概1.5G。 准备单独电脑或者安装多系统或者安装VMware之类虚拟机:

1.1、如果是物理安装,UltraISO刻录ISO到优盘,install时建立一个50G的EXT4日志文件系统的主分区,建立一个2G的swap格式的用于swap的逻辑分区(内存足其实不需要),建立200M的EXT4格式的用于boot的逻辑分区(也不需要),建立home分区。

1.2、如果是VMware虚拟机安装,10.0的Workstation还支持32-bit,下载大概400M,还需要安装VMwareTools。

1.3、下载当前版本的ROS Kinetic Kame,安装,这个比较新没有教程,按照install instructions一步步就可以,中间如果出现问题多数是因为访问境外网站受限的缘故。

1.4、如果找不到software center,需要修改NoDisplay=false。如果遇到Hash Sum mismatch,一般是因为天朝的网络导致TCP包错,学校可以换edu.cn校园网,公司的只好sudo apt-get update –fix-missing,如果还是提示 failed to download,可以$sudo rm -fR /var/lib/apt/lists/* 然后$ sudo mkdir /var/lib/apt/lists/partial最后再$ sudo apt-get update,一般都会Reading package lists… Done。如果还是不行的话那就PVN翻墙了。翻墙之后选择日本新加坡等地区,然后用https://repogen.simplylinux.ch/generate.php产生source.lists。

  • 2、ROS特点

ROS采用分布式处理框架,又叫Nodes,可执行文件单独设计,运行时依靠通讯,实现模块间的轻度耦合,通讯包括基于服务的同步的远程过程调用通讯以及基于主题Topic的异步的数据流通讯,还有参数服务器上的数据存储。ROS框架的main核心部分主要由WG公司设计和维护,提供分布式计算的基本工具以及整个ROS核心部分的程序编写,universe全球代码由不同国家的ROS社区组织开发和维护:底层库代码例如OpenCV,中间功能代码如人脸识别,上层应用代码完成某一确定的功能。

ROS特点:

2.1、点对点设计。

ROS的点对点设计以及服务和节点管理器等机制,可以分散由计算机视觉和语音识别以及路径规划等功能带来的实时计算压力。

2.2、多语言支持。

ROS支持许多种不同的语言,例如C++、Python、Octave、LISP、Java,也包含其他语言的多种接口实现。为了支持交叉语言,ROS利用了简单的、语言无关的接口定义语言描述模块之间的消息传送。这种语言无关的消息处理,让多种语言可以自由的混合和匹配使用。

  • 3、ROS代码

3.1、重要概念:节点(node)、消息(message)、话题(topic)、服务(service)。

3.1.1节点nonde

node是一些运算任务的进程,也可以称为软件模块。当许多节点同时运行时,可以很方便的将端对端的通讯绘制成一个图表。在这个图表中,进程是图中的节点,端对端的连接关系就是其中弧线连接。

3.1.2消息message

message可以包含任意的嵌套结构和数组,节点之间通过消息进行通讯。

3.1.3话题topic。

消息message以一种发布/订阅的方式传递,一个节点可以在一个给定主题中发布消息,一个节点针对某个主题关注与订阅特定类型的数据,可能同时有多个节点发布或者订阅同一个主题的消息。发布者和订阅者彼此互不了解。

3.1.4服务service。

用一个字符串和一对严格规范的消息定义:一个用于请求,一个用于回应,类似于web服务器的web服务器是由URIs定义的,同时带有完整定义类型的请求和回复文档。

总结:

节点Node-可执行的最基本单元,用C++和Python来编写,

主题Topics-节点间传输数据的总线,

消息Messages-节点向特定主体发出的信息,

服务Services-用户开发的,直接与节点通信,

管理器ROS Maste-节点之间通信的管理员,提供命名,注册服务,跟踪和记录话题的发布和订阅,提供参数服务器。

在上面概念的基础上,需要有一个控制器可以使所有节点有条不紊的执行,这就是ROS控制器(ROS Master)。ROS Master 通过RPC(Remote Procedure Call Protocol,远程过程调用)提供了登记列表和对其他计算图表的查找。没有控制器,节点将无法找到其他节点,交换消息或调用服务。比如控制节点订阅和发布消息的模型如下:

3.2、文件系统。

指的是在硬盘上面查看的ROS源代码的组织形式,重要概念有包(package)、堆(stack)。

3.2.1包package

package包含节点、ROS依赖库、数据套、配置文件、第三方软件、或者任何其他逻辑构成。ROS软件以包的方式组织,包的目标是提供一种易于使用的结构以便于软件的重复使用。

3.2.2堆stack

stack是包的集合,提供一个完整的功能,例如“navigation stack”。Stack与版本号关联,同时也是如何发行ROS软件方式的关键。例如下图是在包和堆在文件中的具体结构:

stack.xml提供关于Stack元数据,包括它的许可信息和Stack之间依赖关系。manifest.xml提供关于Package元数据,包括它的许可信息和Package之间依赖关系,以及语言特性信息像编译旗帜(编译优化参数)。

  • 4、ROS流程

ROS控制器ROS Master允许节点互相发现和通讯,node就像网络上分布的各台计算机:

比如一台机器人连接一部相机,那么机器人和笔记本电脑都可以发现这个相机node,机器人的相机node负责图像采集,机器人的图像处理node负责后期加工,笔记本的显示node负责显示图像:

相机node先注册到ROS-master,然后通过发布比如/img-data这样的topic,机器人图像处理node和笔记本显示node就都可以订阅img-data这个topic。这样,只要相机node从相机接收到数据,就可以直接发布给另外两个node:

上面是推送的流程,那么可不可以由图像处理node请求时候才传输数据?这可以通过srevice实现。类似于node向ROS-master注册topic,node也可以向master注册service。

这个流程是图像处理node请求数据,相机node收集数据,然后响应reply。