机器人入门(三)—— ROS环境搭建与ROS Master、Node、Topic、Message

机器人入门(三)

  • 一、虚拟机环境准备与ROS环境开发搭建
    • 1.1 虚拟机环境准备
    • 1.2 ROS开发环境搭建
      • 1.2.1 搭建过程
      • 1.2.2 创建catkin工作空间
        • 1.2.2.1 什么是catkin?
        • 1.2.2.2 catkin workspace各目录作用
        • 1.2.2.3 catkin workspace创建实操过程
      • 1.2.3 搭建过程中的问题及解决方案
  • 二、ROS Master、Node、Topic、Message(结点、主题、消息)
    • 2.1 Node、Topic、Message之间的通信逻辑
    • 2.2 ROS Master
    • 2.3 Node、Topic、Message —— 以Turtlesim为示例
    • 2.4 键盘操作turtlesim
    • 2.5 重置背景颜色
    • 2.6 瞬移turtlesim
    • ROS实用命令
  • References

参考书籍为:ROS Robotics By Example (Second Edition) —— Carol Fairchild Dr.Thomas L.Harman,微信读书可免费阅读。

一、虚拟机环境准备与ROS环境开发搭建

1.1 虚拟机环境准备

VMware虚拟机+《Ubuntu16.04.iso镜像文件官网下载》,VMware虚拟机的安装方式见另一篇文章:《Ubuntu下软件安装》

1.2 ROS开发环境搭建

1.2.1 搭建过程

这两个软件都准备好后,开始搭建我们将要运行ROS的虚拟机。首先是配置ROS镜像源,这样我们就能下载ROS相关的工具,由于是外国人写的书,他配置的镜像源对我们而言可能访问速度比较慢,因此,我们要采用国内的ROS镜像源,参考文章:《遇到ROS下载或更新不顺畅?不如试试国内的华为云镜像!》 国内还有其它镜像源,比如中科大,但此处我还是盛赞一次华为:心系中华,有所作为。Ubuntu其它镜像源也可以一起换成国内的,配置镜像源时要注意Ubuntu的版本是16.04,不然很多安装会有问题,传送门:《ubuntu-清华镜像源官网》

# /etc/apt/sources.list,删除了注释,采用的是http而非清华官网描述的https,实践发现用https会报找不到证书,无法更新软件列表
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main multiverse restricted universe

若采用https,会报 server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none,这是CA证书认证失败了,但我的虚拟机里是有这个证书的,其他人遇见过这个一模一样的问题:《server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none 失败》,我这里图省事直接http了。

下面是我的实操过程。

#1.将仓库地址配置至系统镜像源
sudo sh -c 'echo "deb https://repo.huaweicloud.com/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
#2.输入如下命令,导入并信任ROS的GPG Key
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
#3.刷新软件源缓存,更新索引
sudo apt update
#4.稍等片刻,大小约为2.5G
sudo apt install ros-kinetic-desktop-full

由于rosdep使用的是国外源,因此有博主开发了一个rosdepc,请使用rosdepc替代rosdep,后续过程参考这篇:《使用国内源安装ros-kinetic过程记录 - bilibili》

# install pip3
sudo apt install python3-pip
# 初始化rosdepc
sudo rosdepc init
rosdepc update
# 添加ros环境变量
echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
# 安装额外依赖包
sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential

然后按照书中Chapter1Installing and launching ROS一节的内容,检查env环境变量

$ env | grep ROS

应出现如下结果,若没有以下结果,请检查你的安装配置过程

ROS_ROOT=/opt/ros/kinetic/share/ros
ROS_PACKAGE_PATH=/opt/ros/kinetic/share
ROS_MASTER_URI=http://localhost:11311
ROSLISP_PACKAGE_DIRECTORIES=
ROS_DISTRO=kinetic
ROS_ETC_DIR=/opt/ros/kinetic/etc/ros

1.2.2 创建catkin工作空间

刚刚那篇bilibili的文章有创建catkin工作空间的操作过程,可以参考但并不完整,只是按照此文章操作后,就可以看到小乌龟了,下面是对书籍中关于catkin内容的一些整理。

1.2.2.1 什么是catkin?

开宗明义,定义先行,辩论赛场里这句话都用烂了,烂归烂,关于概念的定义的认知,会极大的影响到人观察社会的视角,科学事物也一样。
下面是关于catkin的一点简单介绍,其余内容见官网原文:catkin / conceptual_overview
(1) catkin是ROS的构建工具,继承自ROS最开始的构建工具rosbuild,此工具由美国的一家公司Willow Garage创建,Willow Garage是一家致力于机器人技术研究和开发的公司,位于美国加州,已于2014年倒闭,catkin的中文含义是在柳树上发现的尾状花簇,植物学名称是柔荑花序。
(2) catkin结合了CMakePython,位于CMake工作流上层,并给其提供一些额外的能力。

1.2.2.2 catkin workspace各目录作用
.
├── build # The build space is where CMake is invoked to build the catkin packages in the source space.
├── devel # The development space (or devel space) is where built targets are placed prior to being installed. 
└── src   # The source space contains the source code of catkin packages.

其余内容见:Workspaces - ROS Wiki

1.2.2.3 catkin workspace创建实操过程

建立并初始化

$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace

构建catkin workspace

$ cd ~/catkin_ws/
$ catkin_make

将上面的catkin workspace添加至ROS环境中

source ~/catkin_ws/devel/setup.bash

上面这条命令,终端关闭并再次打开终端后配置就失效了,执行下面这行命令,保证每次用该普通用户打开,该catkin workspace是添加至ROS环境中的。

$ echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
$ source ~/.bashrc
#并检查$ROS_PACKAGE_PATH变量是否有包含catkin_ws,若有,则配置起效了
$ echo $ROS_PACKAGE_PATH
/home/programmer/catkin_ws/src:/opt/ros/kinetic/share 
#此处可以看出/catkin_ws/src 和 /kinetic/share目录的作用一样,都是各种Package所在的目录

然后,按照书本的提示,依次运行下面的ros命令

$ rospack help | less
$ rospack list | less
$ rospack list-names | grep turtle

$ roscd turtlesim
$ rosls turtlesim

rosls turtlesim后,会得到下面的结果

programmer@ubuntu:/opt/ros/kinetic/share/turtlesim$ rosls turtlesim
cmake  images  msg  package.xml  srv

用树形图表示是

programmer@ubuntu:/opt/ros/kinetic/share/turtlesim$ tree -L 1
.
├── cmake				 # Dir.
├── images			  	 # Dir.  There are various turtle images that can be used.
├── msg 				 # Dir.  /msg for messages
├── package.xml			 # File. This file defines properties about the package such as the package name, version numbers, authors, maintainers, and dependencies on other catkin packages. [catkin / package.xml](http://wiki.ros.org/catkin/package.xml)
└── srv					 # Dir.  /srv for services

此处的/opt/ros/kinetic/share/turtlesim文件夹是ROS的一个package,书中提到:“ROS的软件模块被拆分进一个一个的package,每个package的内容包含有:各式各样的程序,图片,数据乃至教程”,官网表述为:“ROS的软件程序由packages组成”,详细内容见: Packages - ROS Wiki

1.2.3 搭建过程中的问题及解决方案

《roscore 运行失败,提示 /.ros/roscore-11311.pid 没权限的问题》

二、ROS Master、Node、Topic、Message(结点、主题、消息)

2.1 Node、Topic、Message之间的通信逻辑

到上面为止,基本的ROS环境已经具备了,可以更深入的探索ROS。在ROS的设计中,结点与结点,可以互相通信,如图:

其余内容请看官网描述 Understanding topics - ROS.org,根据上面这张图,机器人的通信方式和人有什么区别?从图上看,机器人的结点之间可以直接通信,相当于有多个大脑,就像摄像头可以直接告诉轮子要往哪走,摄像头也可以告诉机械臂什么时候可以放下来,但是人的眼睛却不能直接告诉脚,2点钟方向有个美女,赶紧起身去要微信,还得经过大脑处理一遍。人只有这一个思维中枢,所有指令都要通过脊髓传递至大脑,然后大脑再向脊髓传递指令,肢体才能作出行动。但这能说ROS的通信方式比人更先进吗?恐怕不能,这只能说明机器的构造适合如此,而人之所以没有进化出这种思考模式,或许是因为某些因素,在进化过程中被舍弃了,章鱼就有中央大脑和分布式大脑,其触手就是分布式大脑。有网友提出过这类问题,也有人做出了他们的思考,看看无妨:《人类为什么不将神经系统分散,使遇到危险而损失整个大脑的风险降到最低?》 - 知乎《人类永生-分布式人脑系统、人类进化的终极形态》 - JackTao的文章 - 知乎

2.2 ROS Master

在了解关于Node, Topic,Message的ros命令之前,还需要启动一个东西,那就是ROS Master。见名知意,Master在英文中,作名词是“人”,作动词是“掌握”,与之对应的是Slave,即“奴隶、仆”与“臣服式的苦干,顺从”,因此Master-Slave也译为“主从”,很多技术领域都有这两个名词出现,在这里,ROS Master起着管理全局的作用,Node之间的通信要从Master这里走一道,即由Master负责建立Node之间的通信关系,建立好后,Node之间就可以绕过Master进行P2P通信了,并且,Master还负责监听,什么时候有新的Node启动和加入通信,因此,Master具备动态分配Node之间的通信连接能力,最后,Master采用TCP/IP协议,在ROS中,这被称为TCPROS,其余内容见:Master - ROS Wiki

看到这里,我联想到一个场景,那就是相亲市场与婚姻中介,婚姻中介有相亲市场丰厚的资源,不要想这些男性和女性为什么不主动,这样中介手上就没资源了,主动出击的大概会有一些动机在,既然主动性较强,那么对于自由恋爱的想法就更强烈,所以大部分不会走到或者走入相亲市场,而不主动的也有自身的原因,否则也不会进入婚介市场,单身的原因简单归结就这几条,不想找与找不到,“看不上”与“被看不上”,联系现实,你能说这些几条原因归根到底是年轻人不想、不懂怎么谈恋爱么?不能,相对于从前那个思想比较传统和淳朴,穿露脐装被批伤风败俗、有伤风化的年代,父母那辈人都能眉来眼去,暗送秋波,或者迫于现实养儿防老,不可能一代人之内,刻在基因里的本能就退化了,历史有其不可逆的规律,不因人的意志而转移。

回到ROS Master,使用roscore命令启动ROS Master:

#该命令要保持Terminal终端不关闭
$ roscore
#也可采用nohup将进程挂到后台保持运行,这样做关闭Terminal不受影响
$ nohup roscore > roscore.log &
#此命令执行完后,启动的有
#1.ROS Master
#2.ROS Parameter Server #The Parameter Server is a shared dictionary of parameters that nodes store and retrieve at runtime. The Parameter Server runs inside the Master and parameters are globally viewable so that nodes can access the parameters.
#3.rosout Node (for logging)

更多内容见:roscore - ROS Wiki

2.3 Node、Topic、Message —— 以Turtlesim为示例

Master启动后,再使用rosrun启动Turtlesim,这个程序将展示一个可以操作的小乌龟,Turtlesim程序文件可以在/opt/ros/kinetic/share这个存放ROS packages的目录下找到。

$ rosrun turtlesim turtlesim_node
# 命令格式为 rosrun [package name][executable name],但注意,这里的executable name不能乱写,只能填这个turtlesim_node
# 否则就会报[rosrun] Couldn't find executable named xxxxxxx below /opt/ros/kinetic/share/turtlesim

然后,屏幕上就会出现一只小乌龟,而且每次打开都是不一样的乌龟图片,是轮流播放的:
机器人入门(三)—— ROS环境搭建与ROS Master、Node、Topic、Message_第1张图片
把turtlesim这个package的程序跑起来,用rosnode list看Node列表,注意,/turtlesim是node的名字,turtlesim是package的名字。

programmer@ubuntu:~$ rosnode list
/rosout
/turtlesim

然后,用rosnode info node1 [node2...]命令,以/turtlesim作为参数,执行

$ rosnode info /turtlesim

# 得到以下输出
--------------------------------------------------------------------------------
Node [/turtlesim]
Publications: 
 * /rosout [rosgraph_msgs/Log]
 * /turtle1/color_sensor [turtlesim/Color]
 * /turtle1/pose [turtlesim/Pose]

Subscriptions: 
 * /turtle1/cmd_vel [unknown type]

Services: 
 * /clear
 * /kill
 * /reset
 * /spawn
 * /turtle1/set_pen
 * /turtle1/teleport_absolute
 * /turtle1/teleport_relative
 * /turtlesim/get_loggers
 * /turtlesim/set_logger_level


contacting node http://ubuntu:38653/ ...
Pid: 4905
Connections:
 * topic: /rosout
    * to: /rosout
    * direction: outbound
    * transport: TCPROS

可以看到哪类topic是Publication的,哪些是Subscription的,也可以用rostopic list直接查所有的topic列表

programmer@ubuntu:~$ rostopic list
/rosout # /rosout 在debug时非常有用
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

所有活着的node,都把消息发送给/rosout这个topic,但/rosout_agg这个topic,只接受/rosout这个topic的消息,然后,查看各个topic的种类

programmer@ubuntu:~$ rostopic type /turtle1/color_sensor
turtlesim/Color
programmer@ubuntu:~$ rostopic type /turtle1/cmd_vel
geometry_msgs/Twist
programmer@ubuntu:~$ rostopic type /turtle1/pose
turtlesim/Pose
#输出结果的格式是[package name]/[message type]

Node和Topic看完了,看Message,用$ rosmsg list | grep [package_name]查turtlesim这个package涉及到哪些message

programmer@ubuntu:~$ rosmsg list | grep turtlesim
turtlesim/Color
turtlesim/Pose

然后查下message所对应的数据结构格式

programmer@ubuntu:~$ rosmsg show turtlesim/Color
uint8 r
uint8 g
uint8 b

最后,看topic在发什么message

programmer@ubuntu:~$ rostopic echo /turtle1/color_sensor
r: 69
g: 86
b: 255
---
#这里会刷屏,Ctrl+C中止

怎么记忆这些命令?回到这张动图,看着这张图,按图索骥
(1) 找有哪些结点Node,因此是rosnode listrosnode info sepecify_node[other node]
(2) 然后是找有哪些Topic,因此是rostopic list
(3) Node和Topic看完,看Message,因此是rosmsg listrosmsg list | grep [package_name],与查看message的数据格式rosmsg show [message_name]
(4) 然后看Topic都在发些什么,因此是rostopic echo [topic_name],echo有回声的意思,让该Topic回应下它在讲些嘛。

啰嗦太多了,得让乌龟动起来,那么知道上面的流程后,就可以手动publish message到这个node所subscribe的topic了。

programmer@ubuntu:~$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
# rostopic pub [topic_name] [message_type] -option
# -r 查阅手册是publishing rate的意思,单位HZ,因此自带有重复的意思,书本上给的是repeat,所以乌龟原地转圈,频率由1设置为0.5,你将看到转圈一顿一顿的乌龟,也就是两秒动一次
# '[2.0, 0.0, 0.0]'分别是沿x轴前进速度,沿y轴前进速度,沿z轴前进速度
# '[0.0, 0.0, 1.8]'分别是绕x轴的角速度,绕y轴的角速度,绕z轴的角速度,z轴在哪?想象与屏幕垂直延伸戳你眼睛,可以用右手螺旋定则,大拇指方向为z轴方向,四指所指的方向即角速度绕转方向
# 横轴为x轴,竖轴为y轴,坐标原点[0.0, 0.0]在屏幕左下角位置,与直角坐标系是一样的,屏幕中央的位置是[5.544445, 5.544445],

有个问题,前面的参数好说,后面的这个线速度角速度怎么填?这还是案例给好的,遇到其它的message真不知道怎么填,咋办?

# 输入命令到这里,然后按补全按键Tab
programmer@ubuntu:~$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist 
# 就会打出对应的message定义好的数据结构
programmer@ubuntu:~$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist "linear:
  x: 0.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0"
# 再配置上你要的选项,和上面的效果是一致的
programmer@ubuntu:~$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist "linear:
  x: 0.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0" -r 1

案例给出的数据格式是YAML格式,见YAML on the ROS command line - ROS Wiki,Tab键补全的数据格式是其文件中定义好的数据结构格式。
机器人入门(三)—— ROS环境搭建与ROS Master、Node、Topic、Message_第2张图片

2.4 键盘操作turtlesim

关闭刚刚的Terminal终端,重新打开,并输入

$ rosrun turtlesim turtle_teleop_key

2.5 重置背景颜色

下面加快速度,只写结论。

programmer@ubuntu:~$ rosparam list
/background_b
/background_g
/background_r
/rosdistro
/roslaunch/uris/host_ubuntu__37981
/rosversion
/run_id
# 末尾四个parameter由Master创建

programmer@ubuntu:~$ rosparam get /
background_b: 255
background_g: 86
background_r: 69
.
.
.
# ------------------------------- Separated line -------------------------------
programmer@ubuntu:~$ rosparam set background_b 0
programmer@ubuntu:~$ rosparam set background_g 0
programmer@ubuntu:~$ rosparam set background_r 255
programmer@ubuntu:~$ rosservice call /clear

2.6 瞬移turtlesim

teleport: vt.(心灵学用语)心灵运输(物体、人)

# 瞬移到(x,y, theta) = (1,1,0)的绝对位置,theta=0意思是瞬移后,乌龟的头朝向x轴正方向
programmer@ubuntu:~$ rosservice call /turtle1/teleport_absolute  1 1 0
# 瞬移一个相对距离,(listance distance, theta) = (1,0),即朝x轴正方向走1个距离
programmer@ubuntu:~$ rosservice call /turtle1/teleport_relative  1 0

ROS实用命令

ROS Command-line tools - ROS Wiki

References

1.华为开源镜像站
2.公众号“鱼香ROS”
3.【ROS中的catkin之前世今生】

你可能感兴趣的:(机器人,1024程序员节)