ROS小车上位机控制器是基于树莓派3B或树莓派3B+,虽然树莓派配备了LCD显示屏,可以连接鼠标键盘进行控制操作,但在实际工程中并不能实现,不符合工程原则,通常常使用SSH或VNC Viewer等方式,通过让树莓派和主机端连接同一网段,进行WIFI远程控制的方式实现,在本次我们使用SSH的方式进行远程操控,然后将小车的ROS_IP和主机的ROS_IP设置为同一个,利用ROS的分布式松耦合通讯机制进行话题间的共享,在主机端接收到话题后,使用可视化软件Rviz进行显示和可视化操控。
硬件列表:
虚拟机系统:ubuntu16.04
树莓派:3B+或3B
激光雷达:思岚科技A1或A2
电机:普通直流电机+编码器
里程计:IMU和编码器
可选:摄像头、RGB-D
最开始配置需要显示屏、鼠标、键盘连接树莓派
把小车组装好,电池充满电,小车主控接 HDMI显示器、鼠标、键盘,让树莓派连接手机热点,不要连接校园网等公用网络,要连接局域网。使用ifconfig命令查看小车的IP地址:
电脑端也连接到同一个手机热点,打开虚拟机,在设置中将虚拟机的网络适配器改为桥接模式:
在虚拟机中使用ifconfig查看虚拟机的IP地址:
现在两边以及连接到了同一个网段,使用ping命令看两边能不能顺畅通讯:
现在两边通畅,可以在虚拟机中使用ssh方式远程控制树莓派的终端:
ssh hit@172.20.10.8
hit是自定义的连接名,后面是树莓派IP
输入密码后即可进入树莓派端的终端,至此远程连接配置完成。
首先需要修改环境变量,ROS的通讯机制是分布式松耦合通讯,多台电脑可以通过注册到同一个Master节点,共享话题消息,其中只需要修改每台机器的环境变量,让这几台电脑上运行的节点彼此认识即可。
在ROS的环境变量中,需要在~/.bashrc中设置的并不多,出现频率最高的有三个:ROS_MASTER_URI、
ROS_HOSTNAME、
ROS_IP
ROS_MASTER_URI比较好理解,就是整个ROS系统的主机的IP网址。
ROS_IP和ROS_HOSTNAME是可选的环境变量,用来设置ROS节点或工具的公开网地址。这两个选项是互斥的,如果两者都设置优先使用ROS_HOSTNAME。如果你指定一个IP地址,使用ROS_IP;如果指定一个主机名(a host name),使用ROS_HOSTNAME。当一个ROS成员报告URI给master或者其他成员,这个值就会被用到。这个设置只用在一台计算机有多个地址,需要强制ROS到特定的一个的情况。
除了’localhost’(本地主机),ROS成员绑定到所有可用的网络接口,他不影响实际绑定地址。如果这个值设定为本地主机,ROS成员只绑定在环回接口。这将会阻止远程成员与本地成员交流。
说白了,就是HOSTNAME的优先级要比IP的优先级高,设定了hostname就以hostname为准,不在管后面是否还有IP的设置。在配置中我们只要设置HOSTNAME就行了,这个HOSTNAME就是从机节点的身份证,需要让主机认识它。
大概清楚了这几个概念,我们就可以做以下修改,实现分布式通信:
主机选择为树莓派,从机选择为虚拟机
在树莓派端使用以下命令配置环境变量:
vi ~/.bashrc
使用下面这条命令使修改立刻生效:
source ~/.bashrc
在主机端使用以下命令,修改环境变量:
gedit ~/.bashrc
使用下面这条命令使修改立刻生效:
source ~/.bashrc
至此分布式通信配置完成,下面进行实验演示
首先在虚拟机中使用Ctrl+Alt+T打开一个终端,使用ssh进入树莓派端:
ssh hit@172.20.10.8
在小车端使用以下命令,启动与STM32通讯的节点,并进行各硬件的初始化:
roslaunch rikirobot bringup.launch
连接成功,初始化结果:
在虚拟机端使用以下代码,开启键盘控制节点:
rosrun teleop_twist_keyboard teleop_twist_keyboard.py
整个逻辑是:树莓派作为主机端,虚拟机作为从机端,从机注册到主机的ROS_MASTER_URI,就是从机的节点向主机的ROS_MASTER进行注册,然后从机有自己的身份证(网络IP),以便主机端认识它的节点,这样从机和主机之间就能共享话题,从机端的键盘控制节点发布速度指令/cmd_vel,主机端接收到速度指令控制小车进行移动。
实物效果如下:
本文利用了ROS分布式通讯的优点,利用树莓派3B+配合虚拟机实现了使用SSH的方式远程对小车的控制,更贴近与工业科研领域的ROS使用方法,最后进行了实物演示,验证了该通讯的正确性和便捷性。