深入了解ROS的细节
这篇博客旨在深入地了解ROS平台,详细解析多个命令的功能以及利用场景,这里要用到一个模拟器产生一个小乌龟的节点来演示各个命令的使用,建立在安装好ROS的前提下,安装过程和创建工作空间参考

ROS文件系统介绍
文件系统概念
  1. Packages:软件包是ROS应用层程序代码的组织单元,每个软件包都可以包含程序库、可执行文件、脚本或者其它手动创建的东西
  2. Manifest (package.xml): 清单,是对于’软件包’相关信息的描述,用于定义软件包相关元信息之间的依赖关系,这些信息包括版本、维护者和许可协议

文件系统工具-rospack、roscd、roscd log、rosls
程序代码是分布在众多ROS软件包当中,当使用命令行工具(比如 ls 和 cd )来浏览时会非常繁琐,因此 ROS 提供了专门的命令工具来简化这些操作。

1. 使用 rospack
rospack允许你获取软件包的有关信息。在本教程中,我们只涉及到rospack中find参数选项,该选项可以返回软件包的路径信息
rospack find [包名称]

2. roscd是rosbash命令集中的一部分,它允许你直接切换(cd)工作目录到某个软件包或者软件包集当中
3. 使用 roscd log 可以切换到 ROS 保存日记文件的目录下。需要注意的是,如果你没有执行过任何 ROS 程序,系统会报错说该目录不存在
4. rosls 是 rosbash 命令集中的一部分,它允许你直接按软件包的名称而不是绝对路径执行 ls 命令
创建工作空间
source /opt/ros/melodic/setup.bash这是配置一下ROS的环境变量,一般ROS安装后这条命令就会加到./bashrc文件中,每打开一个终端就会执行一次,确保配置了ROS的环境变量
创建工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make

如果使用的Python3,干净的catkin工作区的第一个catkin_make命令必须为:
catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3

接下来配置一下环境变量,只有配置了catkin工作目录的环境,编写的程序包才可以被ROS找到并执行
source devel/setup.bash

创建ROS程序包
ROS程序包的组成:package.xml、CMakeLists.txt,后续含有src源码文件夹,include文件夹等
package.xml文件提供有关程序包的依赖信息
CMakeLists.txt主要记载了程序包编译时所需要的依赖包信息,这个文件就是为编译命令服务的
注意:每个程序包单独为一个目录,这意味着在同一个目录下不能有嵌套的或者多个程序包存在
创建一个程序包
创建程序包的命令为catkin_create_pkg <package_name> [depend1] [depend2] [depend3],示例如下
cd ~/catkin_ws/src
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

使用rospack命令可以查询程序包的依赖关系
rospack depends1 beginner_tutorials #查看一级依赖
rospack depends beginner_tutorials  #查看多级依赖

创建完程序包后就可以在src目录下编写.cpp文件,这是实现程序包功能的核心部分
编译ROS程序包
一旦安装了所需的系统依赖项,我们就可以开始编译刚才创建的程序包,注意如果是使用包管理软件安装ROS的,默认已经安装好了所有依赖

记得事先配置一下环境
source /opt/ros/你的ROS的版本/setup.bash

使用catkin_make,catkin_make 是一个命令行工具,它简化了catkin的标准工作流程。你可以认为catkin_make是在CMake标准工作流程中依次调用了cmake 和 make
# 在catkin工作空间下
catkin_make [make_targets] [-DCMAKE_VARIABLES=...]
#指定编译源码的位置
catkin_make --source my_src

编译之后产生build和devel文件夹,build 目录是build space的默认所在位置,同时cmake 和 make也是在这里被调用来配置并编译你的程序包。devel 目录是devel space的默认所在位置, 同时也是在你安装程序包之前存放可执行文件和库文件的地方
理解ROS节点
概念阐述
Nodes:节点,一个节点即为一个可执行文件,它可以通过ROS与其它节点进行通信
Messages:消息,消息是一种ROS数据类型,用于订阅或发布到一个话题
Topics:话题,节点可以发布消息到话题,也可以订阅话题以接收消息
Master:节点管理器,ROS名称服务 (比如帮助节点找到彼此)
rosout: ROS中相当于stdout/stderr
roscore: 主机+ rosout + 参数服务器 (参数服务器会在后面介绍)
节点
一个节点其实只不过是ROS程序包中的一个可执行文件。ROS节点可以使用ROS客户库与其他节点通信。节点可以发布或接收一个话题。节点也可以提供或使用某种服务,节点是ros中非常重要的一个概念
比如说,咱们有一个机器人,和一个遥控器,那么这个机器人和遥控器开始工作后,就是两个节点。遥控器起到了下达指 令的作用;机器人负责监听遥控器下达的指令,完成相应动作。从这里我们可以看出,节点是一个能执行特定工作任 务的工作单元,并且能够相互通信,从而实现一个机器人系统整体的功能。在这里我们把遥控器和机器人简单定义为两个节点,实际上在机器人中根据控制器、传感器、执行机构等不同组成模块,还可以将其进一步细分为更多的节点,这个是根据用户编写的程序来定义的
客户端库,
ROS客户端库允许使用不同编程语言编写的节点之间互相通信:

rospy = python 客户端库
roscpp = c++ 客户端库
使用roscore命令
roscore 是你在运行所有ROS程序前首先要运行的命令

使用rosnode命令
rosnode 显示当前运行的ROS节点信息。rosnode list 指令列出活跃的节点

rosnode list

使用 rosrun命令
rosrun 允许你使用包名直接运行一个包内的节点(而不需要知道这个包的路径)
rosrun [package_name] [node_name]
rosrun turtlesim turtlesim_node

ROS的一个强大特性就是你可以通过命令行重新配置名称
rosrun turtlesim turtlesim_node __name:=my_turtle

理解ROS话题(topic)
本阶段介绍ROS话题(topics)以及如何使用rostopic 和 rxplot 命令行工具

首先确保确保roscore已经运行, 打开一个新的终端:
roscore

如果报错说已经运行了,是正常的,因为只能有一个roscore运行

在这里我还是使用turtlesim来演示,打开一个终端运行:
rosrun turtlesim turtlesim_node

这是在启动一个小乌龟节点

接下来可以运行一个控制节点,通过键盘控制小乌龟的运动
rosrun turtlesim turtle_teleop_key

现在你可以使用键盘上的方向键来控制turtle运动了。如果不能控制,请选中turtle_teleop_key所在的终端窗口以确保你的按键输入能够被捕获

下面我们来看看这背后发生的事情
turtlesim_node节点和turtle_teleop_key节点之间是通过一个ROS话题来互相通信的。turtle_teleop_key在一个话题上发布按键输入消息,而turtlesim则订阅该话题以接收该消息,下面让我们使用rqt_graph来显示当前运行的节点和话题,注意:如果你使用的是electric或更早期的版本,那么rqt是不可用的,目前的ROS版本应该都可以使用rqt

使用 rqt_graph
rqt_graph能够创建一个显示当前系统运行情况的动态图形。rqt_graph是rqt程序包中的一部分,如果你没有安装,请通过以下命令来安装:sudo apt-get install ros-<distro>-rqt、sudo apt-get install ros-<distro>-rqt-common-plugins

在一个新终端中运行:rosrun rqt_graph rqt_graph,你会看到类似下图所示的图形

在这里插入图片描述

如果你将鼠标放在/turtle1/command_velocity上方,相应的ROS节点(蓝色和绿色)和话题(红色)就会高亮显示。正如你所看到的,turtlesim_node和turtle_teleop_key节点正通过一个名为 /turtle1/command_velocity的话题来互相通信。
在这里插入图片描述

rostopic命令工具能让你获取有关ROS话题的信息
  1. rostopic echo可以显示在某个话题上发布的数据
  2. 让我们在一个新终端中看一下turtle_teleop_key节点在/turtle1/command_velocity话题(非hydro版)上发布的数据
rostopic echo /turtle1/cmd_vel

现在让我们再看一下rqt_graph(你可能需要刷新一下ROS graph),正如你所看到的,rostopic echo(红色显示部分)现在也订阅了turtle1/command_velocity话题

rostopic list -v

这会显示出有关所发布和订阅的话题及其类型的详细信息

使用 rostopic type

rostopic type 命令用来查看所发布话题的消息类型

rostopic type [topic]
使用 rostopic pub

rostopic pub可以把数据发布到当前某个正在广播的话题上

rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

你可能已经注意到turtle已经停止移动了。这是因为turtle需要一个稳定的频率为1Hz的命令流来保持移动状态。我们可以使用rostopic pub -r命令来发布一个稳定的命令流

rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
使用 rostopic hz

rostopic hz命令可以用来查看数据发布的频率

rostopic hz [topic]
使用 rqt_plot

rqt_plot命令可以实时显示一个发布到某个话题上的数据变化图形。这里我们将使用rqt_plot命令来绘制正在发布到/turtle1/pose话题上的数据变化图形,首先,在一个新终端中运行rqt_plot命令:

rosrun rqt_plot rqt_plot

这会弹出一个新窗口,在窗口左上角的一个文本框里面你可以添加需要绘制的话题。在里面输入/turtle1/pose/x后之前处于禁用状态的加号按钮将会被使能变亮。按一下该按钮,并对/turtle1/pose/y重复相同的过程。现在你会在图形中看到turtle的x-y位置坐标图。

在这里插入图片描述

按下减号按钮会显示一组菜单让你隐藏图形中指定的话题。现在隐藏掉你刚才添加的话题并添加/turtle1/pose/theta,你会看到如下图所示的图形:在这里插入图片描述