1、概述
前面我们做的操作都是在单个设备上进行,也就是分别开启多个终端,在不同终端上启动节点等相关操作,这里我们使用两台设备来控制,一台虚拟机和一台无人车(使用VNC Viewer连上去,也可以看做一台Linux虚拟机)
VNC Viewer有兴趣的可以查阅:远程连接VNC-Viewer与安全传输WinSCP软件
2、安装Chrony包与SSH服务器
2.1、介绍
Chrony是NTP(Network Time Protocol)网络时间协议的替代品,能更精确、更快的同步时钟,传统NTP需要几个小时,而Chrony仅需要数秒种或数毫秒就可以完成时间同步。
安装这个时间同步服务是很有意义的,因为每台设备的运行环境等都不一样,本地时钟可能会不一致,虽然有校正过,但是过一段时间之后,又可能不一致了,那么对于分布式架构来说,就会造成不好的结果,我们需要不同的设备协同完成,所以需要统一时间。
Chrony由两个程序组成,分别是chronyd和chronyc。
chronyd是一个后台运行的守护进程,用于调整内核中运行的系统时钟和时钟服务器同步,确定计算机增减时间的比率,并对此进行补偿。
chronyc提供了一个用户界面,用于监控性能并进行多样化的配置。它可以在chronyd实例控制的计算机上工作,也可以在一台不同的远程计算机上工作。
OpenSSH是SSH协议的免费开源实现,功能包括:实现SSH协议,可以让本地计算机和远程服务器之间建立安全的连接,提供安全的传输通道,保护数据的传输安全。
2.2、安装
分别在两台设备上安装chrony包以及ssh服务器用来实现同步
sudo apt-get install chrony openssh-server
分别输入ifconfig与hostname命令,找出其IP地址和主机名
虚拟机(主机)
192.168.1.128 YAB
无人车(从机)
192.168.1.11 jetson-desktop
2.3、修改hosts
修改hosts文件,将两者的IP与主机名都写入里面
所有用户加个可写权限:sudo chmod a+w /etc/hosts
修改hosts文件:gedit /etc/hosts
192.168.1.128 YAB
192.168.1.11 jetson-desktop
修改好了之后,在两台设备上都输入下列命令重启网络,实现两台设备间通信:
sudo /etc/init.d/networking restart
确认服务是否启动
ps -e | grep ssh
也可以互相ping主机名测试下,是否可以ping通,能够ping通就没有问题。
2.4、设置环境变量
接下来就设置环境变量,最好是加入到.bashrc文件
虚拟机(主机)
echo "export ROS_HOSTNAME=YAB" >> ~/.bashrc
echo "export ROS_MASTER_URI=http://YAB:11311" >>~/.bashrc
source ~/.bashrc
无人车(从机)
echo "export ROS_HOSTNAME=jetson-desktop" >> ~/.bashrc
echo "export ROS_MASTER_URI=http://YAB:11311" >>~/.bashrc
source ~/.bashrc
2.5、启动节点
虚拟机(主机)启动ROS管理节点Master:roscore
无人车(从机)
启动乌龟
rosrun turtlesim turtlesim_node
启动键盘控制
rosrun turtlesim turtle_teleop_key
这样就可以在从机上控制乌龟了,这里也可以看出分布式的优势,可以让相互独立的节点能够相互通信,非常棒。如下图:
当然上面的URI也可以使用IP地址,这个看个人的具体情况吧。
3、不同网段处理
这里可能大家会遇到一个不在同一个网段的情况,这样就不能互相通信,这里以本人的为例,怎么更改虚拟中的IP网段。
本人电脑是有线网络,IP是在192.168.3.xx的网段,虚拟机一般都是直连物理网络,所以IP地址也是在192.168.3.xx这个网段
而无人车使用的是无线USB网卡(Realtek 8188GU Wireless LAN 802.11n USB NIC),IP地址是192.168.1.11
由于虚拟机跟无人车不在同一个网段里面,所以不能相互通信,这个时候我们需要使用到“虚拟网络编辑器”,如下图:
点击进来之后,右下角点击“更改设置”,如下图:
将出现一个新的VMnet0选择,我们点击“桥接模式(将虚拟机直接连接到外部网络)(B)”,其中已桥接至:选择无人车的无线USB网卡即可。如下图:
最后我们来到虚拟机的设置,点击“网络适配器”,网络连接,这里我们选择“自定义(U):特定虚拟网络”,选择上面配置好的VMnet0即可。如下图:
重启网络:sudo /etc/init.d/networking restart
我们在两台设备上面分别互相ping下,不出意外是可以互相ping通了,如下图: