移动机器人分布式通信

前边我们编写并运行的代码都是在机器人的控制器上实现的,需要我们先远程登录到机器人上再进行操作。

我们讲到ROS是一个分布式框架,那我们是不是可以在自己的电脑上编写并运行代码,再通过网络与远程的机器人实现数据交互呢?

当然是可以的。

我们甚至不用修改任何一行代码,只需要配置一下机器人控制器和笔记本电脑的ROS环境即可。

接下来,我们就一起学习这种分布式通信的配置方法。

图1 笔记本端IP地址

图2 机器人端IP地址

ROS的分布式通信是基于网络的,所以我们首先得保证你的笔记本和机器人控制器处于同一网络环境下,也就是都连接到了同一个路由器中,两者的网段相同

大家可以试试在笔记本电脑和机器人控制器中,都使用ifconfig命令查看一下各自的IP地址。

如果类似这里如图1图2所示的效果,前边192.168.3三个数字相同,就说明是在同一个网段中,最后一位肯定是不同的。

为了保证网络确实连通,可以分别在两个终端中,使用ping命令加对方的IP地址,测试一下是否可以连接,如果通信正常,说明分布式通信的基础网络条件是没问题的。

接下来需要配置一下ROS环境,因为同一个ROS系统中,只能有一个ROS Master,所以我们只能选择在机器人控制器或者笔记本电脑中的一个地方运行roscore。

这里我们暂定运行在机器人端,也就是让机器人作为主机,需要在bashrc这个文件中,配置如下三行内容。

$ gedit ~/.bashrc

首先是ROS_HOSTNAME,这个表示当前系统的主机名,我们直接使用IP地址作为名称,ROS_IP表示当前系统的IP地址,按照刚才查询的实际情况填写即可。

最为重要的是这个ROS_MASTER_URI,表示ROS Master的资源地址,通过ip地址加端口号表示,这里就是机器人的IP加一个ROS系统默认的11311端口,如果我们不做特意的修改,这个端口号是不会变的。

样就完成了主机的配置,可以保存退出。

图3 将机器人配置为主机

接下来配置作为从机的笔记本电脑,同样还是在bashrc配置文件中添加这样三行。

ROS_HOSTNAME主机名和ROS_IP按照实际的IP地址填写,重点关注一下ROS_MASTER_URI,得按照实际运行ROS Master的机器人控制地址填写,也就是49(按照实际地址填写)。

修改好之后也可以保存退出。

图4 将笔记本配置为从机

这样就全部配置完成了,整个过程中,我们并没有修改实际的功能代码。

接下来我们通过键盘控制的案例测试一下。把键盘节点的代码放在笔记本电脑上运行,看看能不能控制机器人运动。

首先通过一个终端或者远程桌面的方式启动LIMO机器人底盘,然后在笔记本电脑上运行键盘控制节点,接下来使用键盘控制一下机器人,机器人已经可以动起来了。

(机器人端)$ roslaunch limo_base limo_base.launch

(笔记本端)$ roslaunch limo_bringup limo_teletop_keyboard.launch

图5 分布式控制(左边机器人端、右边笔记本端)

这样是不是感觉ROS分布式通信框架的优势体现出来了。

此时此刻,机器人底盘和传感器节点运行在机器人的控制器上,键盘控制节点运行在笔记本电脑里,两者之间的话题通信是通过网络进行数据传输的,我们并不需要修改应用代码, ROS自身就可以很方便的支持如此的分布式通信。

以此展开,之前我们控制机器人走圆,订阅机器人实时位姿等节点,是不是也可以在自己的笔记本电脑上运行,接下来我们再来试一试。


移动机器人运动控制编程

还是先在机器人上运行驱动节点,接下来在笔记本电脑上运行之前编写的画圆节点。

没错,机器人依然可以实现圆周运动,此时的速度话题cmd_vel就是由位于笔记本电脑上的节点发布的,订阅者依然还是在机器人上。

图6 笔记本端运行机器人

再来试试订阅者,在机器人上运行驱动节点后,笔记本电脑上分别运行订阅节点和键盘控制节点,通过键盘控制机器人移动后,是不是也可以看到机器人实时位姿的更新,此时笔记本电脑上运行了两个节点,一个是键盘节点,发布速度指令,另外一个是位姿订阅节点,订阅机器人位姿话题,这些话题的数据传输,依然是依赖于网络实现的。

(机器人端) $ roslaunch limo_bringup limo_start.launch

(笔记本端) $ roslaunch limo_bringup limo_teletop_keyboard.launch

(笔记本端) $ rosrun limo_demo limo_subscriber.py

图7 查看机器人实时位置

未来进行更为复杂的机器人应用时,同样的方法,我们就可以在笔记本电脑上运行一些消耗算力的程序,或者使用Rviz检测机器人的数据,方便于我们操作,机器人端主要运行各种驱动和必要的功能处理,大家分工明确,更适合复杂应用的开发过程。