控制系统实现_分布式框架
参考教程:
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,实现如下:
- 硬件准备:使用显示屏或HDMI才即可连接树莓派并启动;
- 为树莓派连接无线网络;
- 为树莓派配置静态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”。
- 多机通信无法查看或订阅本地不存在的消息数据类型话题。