控制系统实现_分布式框架

参考教程:
http://www.autolabor.com.cn/book/ROSTutorials/
https://www.bilibili.com/video/BV1Ci4y1L7ZZ/?spm_id_from=333.999.0.0

1. 配置静态IP地址

1.1 配置树莓派静态IP地址

当前分布式框架搭建时,树莓派是作为主机,而PC则作为从机,关于分布式框架的搭建流程,我们需要为树莓派连接无线网络,并设置固定IP,实现如下:

  1. 硬件准备:使用显示屏或HDMI才即可连接树莓派并启动;
  2. 为树莓派连接无线网络;
  3. 为树莓派配置静态IP,具体操作如图:

点击桌面右上角的wifi图标,选择编辑连接,得到如下图所示

查看相应的IP地址

ubuntu@ubuntu:~$ ifconfig
eth0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether e4:5f:01:fb:b5:4b  txqueuelen 1000  (以太网)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (本地环回)
        RX packets 5533  bytes 580598 (580.5 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5533  bytes 580598 (580.5 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.167  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::e65f:1ff:fefb:b54c  prefixlen 64  scopeid 0x20<link>
        ether e4:5f:01:fb:b5:4c  txqueuelen 1000  (以太网)
        RX packets 240095  bytes 333868254 (333.8 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 76135  bytes 10300744 (10.3 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

1.2 配置虚拟机静态IP地址

配置虚拟机静态IP地址和树莓派操作类似

在详细信息(Details)下查看当前ip地址,记录好后,选择IPV4

2. 实现

2.1 准备

先要保证不同计算机处于同一网络中,最好分别设置固定IP,如果为虚拟机,需要将网络适配器改为桥接模式;

查看虚拟机的主机名

rosnoetic@rosnoetic-VirtualBox:~$ hostname
rosnoetic-VirtualBox

查看虚拟机中的ip地址

rosnoetic@rosnoetic-VirtualBox:~$ ifconfig

enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.43.66  netmask 255.255.255.0  broadcast 192.168.43.255
        inet6 fe80::985f:4b7c:e4e0:f0f0  prefixlen 64  scopeid 0x20<link>
        inet6 2409:8920:e11:138b:d275:2010:df26:71a  prefixlen 64  scopeid 0x0<global>
        inet6 2409:8920:e11:138b:b52e:3d49:f833:41ca  prefixlen 64  scopeid 0x0<global>
        ether 08:00:27:3e:6d:01  txqueuelen 1000  (以太网)
        RX packets 223  bytes 223428 (223.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 263  bytes 26888 (26.8 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (本地环回)
        RX packets 183  bytes 15201 (15.2 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 183  bytes 15201 (15.2 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

可以看到虚拟机的IP地址为192.168.43.66

然后ping一下树莓派,树莓派的IP是192.168.43.192,查看是否连通

rosnoetic@rosnoetic-VirtualBox:~$ ping 192.168.43.192
PING 192.168.43.192 (192.168.43.192) 56(84) bytes of data.
64 字节,来自 192.168.43.192: icmp_seq=1 ttl=64 时间=16.4 毫秒
64 字节,来自 192.168.43.192: icmp_seq=2 ttl=64 时间=9.57 毫秒
64 字节,来自 192.168.43.192: icmp_seq=3 ttl=64 时间=8.32 毫秒
64 字节,来自 192.168.43.192: icmp_seq=4 ttl=64 时间=7.16 毫秒
64 字节,来自 192.168.43.192: icmp_seq=5 ttl=64 时间=6.92 毫秒

2.2 配置文件修改

分别修改不同计算机的/etc/hosts文件,在该文件中加入对方的IP地址和计算机名:

主要注意的是,在这里

树莓派是主机端,

虚拟机是从机端

  • 主机端(树莓派):

    从机的IP    从机计算机
    

    打开/etc/hosts

    ubuntu@ubuntu:~$ sudo gedit /etc/hosts
    
    192.168.0.126 rosnoetic-VirtualBox
    

  • 从机端(虚拟机)

    主机的IP    主机计算机名
    

    打开/etc/hosts

    rosnoetic@rosnoetic-VirtualBox:~$ sudo gedit /etc/hosts
    

设置完毕,可以通过ping命令测试网络通信是否正常。

IP地址查看命令:ifconfig
计算机名称查看:hostname

2.3 配置主机(树莓派)IP

配置主机的IP地址

~/.bashrc 追加

export ROS_MASTER_URI=http://主机IP:11311
export ROS_HOSTNAME=主机IP

例如:

ubuntu@ubuntu:~$ gedit .bashrc

export ROS_MASTER_URI=http://192.168.0.166:11311
export ROS_HOSTNAME=192.168.0.166

修改完成后需要更新一下环境变量,也可以把命令行终端关掉重新开一个

ubuntu@ubuntu:~$ source .bashrc

2.4 配置从机(虚拟机)IP

配置从机的IP地址,从机可以有多台,每台都做如下设置:

~/.bashrc 追加,注意ROS_HOSTNAME当前为从机

export ROS_MASTER_URI=http://主机IP:11311
export ROS_HOSTNAME=从机IP

例如:

rosnoetic@rosnoetic-VirtualBox:~$ sudo gedit .bashrc

export ROS_MASTER_URI=http://192.168.43.192:11311
export ROS_HOSTNAME=192.168.43.66

重新刷新环境变量,或者重新启动命令行

rosnoetic@rosnoetic-VirtualBox:~$ source .bashrc

3. 测试

3.1 主机启动ros核心

主机启动 roscore(必须)

在树莓派(主机端)输入roscore,启动ros核心

3.2 主机订阅,从机发布

主机启动订阅节点,从机启动发布节点,测试通信是否正常

进入到树莓派(主机端),输入如下指令,启动小乌龟节点

ubuntu@ubuntu:~$ rosrun turtlesim turtlesim_node

进入到虚拟机(从机端),启动键盘控制节点,在虚拟机中按上下左右运动一下,可以看到小乌龟运动起来了,说明分布式搭建成功

rosnoetic@rosnoetic-VirtualBox:~$ rosrun turtlesim turtle_teleop_key

3.3 反向测试

反向测试,主机启动发布节点,从机启动订阅节点,测试通信是否正常在从机端中输入如下指令,启动小乌龟节点

rosnoetic@rosnoetic-VirtualBox:~$ rosrun turtlesim turtlesim_node

在主机端中输入如下指令,启动键盘控制节点

ubuntu@ubuntu:~$ rosrun turtlesim turtle_teleop_key

移动一下小乌龟,即可看到小乌龟运动起来了

从中我们可以看到主机端和从机端的双向通信均是成功的

4. 注意事项

  • ROS从机程序的运行依赖于ROS主机的ROS Master,从机运行程序时需要先在主机启动ROS Master,再在从机中执行动作。
  • 多机通信里的主从机ip地址需要处于同一个网段,即ip地址和子网掩码为相同的网络地址。
  • 环境配置文件.bashrc中的ROS_HOSTNAME不建议使用localhost,建议使用具体的ip地址。
  • 在从机ip地址没有设置正确的情况下,它依然可以访问到Rosmaster,但不能输入控制信息。
  • 如果是虚拟机参与多机通信,其网络模式需要设置成桥接模式,并且网络连接不能选“Static IP”。
  • 多机通信无法查看或订阅本地不存在的消息数据类型话题。
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐