移动机器人ROS架构分析

1.1小海龟仿真

ROS的核心概念不少,有节点、话题、消息、服务等,在实际机器人运行过程中,这些概念是如何体现的呢?

我们先来运行ROS系统一个经典的例程——小海龟。

请大家按照以下步骤进行操作。

1.首先,打开终端;

2.输入以下命令行,启动ROS Master:

$ roscore

3.启动成功后,打开一个新终端,输入以下命令行,启动小海龟仿真器,启动成功后,就会出现如图1-1所示的小海龟仿真器界面:

$ rosrun turtlesim turtlesim_node

4.再打开一个新的终端,输入以下命令行,启动海龟控制节点,大家可以通过键盘上上下左右键来控制小海龟运动:

$ rosrun turtlesim turtle_teleop_key

注意:在控制海龟运动的过程中一定要保证turtle_teleop_key节点终端在界面最前端的,如果其他终端在最前面就没有办法被终端读取到数据的。

小海龟功能是跑起来了,那这个例程是如何基于ROS的核心概念实现的呢?

接下来我们就分析一下例程背后的节点关系。

图1-1 小海龟仿真器界面

图1-2 启动海龟仿真器节点

图1-3 启动海龟控制节点

这里我们将用到ROS中一个重要的可视化调试工具——rosgraph,用来显示ROS运行中计算图,我们可以从上帝视角看到所有节点的运行关系。

图1-4 使用rqt_graph可视化工具查看系统中运行的计算图

接着上一个小海龟的例程,我们再来打开一个终端,输入以下命令行,启动rosgraph:

$ rqt_graph

启动完成后,即可看到如图1-4所示的计算图,这个界面会自动的监控当前运行的整个ROS系统,并且把里面的节点和节点间的关系动态的显示出来,其中椭圆表示节点,中间的箭头表示节点间的关系,箭头上的内容表示话题。

在这个例程中,我们分别启动了两个节点,一个是海龟仿真器,我们可以把它当成是一个虚拟的机器人,另外一个是键盘控制,用来控制机器人前后左右运动,两个节点在节点管理器的帮助下建立了数据通信,完成速度控制指令的传输。

1.2移动机器人运动控制

通过这个例程,我们需要理解节点在ROS中用来实现某些具体的功能,比如机器人的驱动、运动指令的发送等,节点之间可以通过话题将数据发送或接收。

小海龟毕竟是一个仿真的机器人,在实物机器人中是不是也类似呢,我们再来试一试。

接下来,我们来使用以下两句命令行启动LIMO机器人,并启动键盘控制节点,类似控制小海龟前后左右运动一样,我们也可以控制机器人运动。

$ roslaunch limo_base limo_base.launch
$ roslaunch limo_bringup limo_teletop_keyboard.launch

再打开rosgraph工具看一下节点关系,我们可以直观的发现,此时系统中运行了三个节点,如图1-5所示。

图1-5 使用rqt_graph可视化工具查看节点关系

第一个是和控制海龟运动相同的键盘控制节点teleop_keybord,用来读取键盘的输入键值,并封装成cmd_vel这个速度话题发布出去。

第二个节点是类似小海龟仿真器一样,用来驱动LIMO机器人的底盘控制节点limo_base_node,它会订阅速度指令,当收到数据后,就会驱动机器人发生运动了。

从这张图中,我们可以清晰的看到这两个节点和他们之间的关系,更多节点也是类似,如果未来使用过程中某一环的数据没收到,我们就可以快速定位原因了。

 

  • teleop_keybord:读取键盘动作,发布速度控制指令
  • limo_base_node:机器人底盘控制节点,包含PID算法控制电机运动、订阅/cmd_vel话题

 

以上案例实现的功能相对简单,在一个实现众多应用功能的复杂机器人系统中,节点和话题的数量都会很多,类似如图1-6所示这样,除了底层嵌入式运动控制器中需要实现的功能外,ROS环境下会通过一系列节点分别完成雷达、相机这些传感器的驱动,发布数据话题后,上层的导航、建图、图像处理节点来订阅并进行相应的算法处理,再传输到监控的计算机,给可视化节点做显示。每个节点各司其职,在ROS Master这个节点管理器的统一协调下,有条不紊的完成各项任务。

整个ROS运行中的节点就像一个企业中不同部门的员工,每个人都有自己明确的工作,大家共同在CEO的组织下积少成多,合作完成一项非常复杂的任务。当然,每个人都不能掉队,一旦掉队就可能会影响最终任务的完成。

图1-6 移动机器人运行结构分析