您的位置:首页 > 其它

ROS进阶学习手记 6 -- 利用PC1控制PC2上的乌龟

2015-07-21 15:16 453 查看
在完成了上一节,我们已经可以自己写node向某个topic发送某个msg data structure的Messages。

这一节我想完成 Remote 通信的任务,真正体现ROS的分布式计算的特点。

参考:

http://wiki.ros.org/ROS/NetworkSetup
http://wiki.ros.org/ROS/Tutorials/MultipleMachines

网络连接:

物理连接:



使用Bridge方式桥接,相当于现在有了4台电脑用网线连接起来。(怎么建立见文后附录)

配置虚拟机1的ip为:

IP addr:192.168.2.111 Mask:255.255.255.0 DefaultGateway: 192.168.2.1 Bcast:default

配置宿主机1的ip为:

IP addr:192.168.2.1 Mask:255.255.255.0 DefaultGateway: 192.168.2.1 Bcast:default
配置虚拟机2的ip为:

IP addr:192.168.2.222 Mask:255.255.255.0 DefaultGateway: 192.168.2.1 Bcast:default
配置宿主机2的ip为:

IP addr:192.168.2.2 Mask:255.255.255.0 DefaultGateway: 192.168.2.1 Bcast:default

好,我们假设建立了ubt - ubt之间的连接(怎么建立见文后附录,或http://blog.csdn.net/sonictl/article/details/47005273)

我们在ubt_for_ROS1上ping 192.168.2.222, 在ubt_for_ROS2上ping 192.168.2.111, 都能ping通。

用netcat测试端口是否连通:http://wiki.ros.org/ROS/NetworkSetup#Further_check:_netcat

在ubt_for_ROS1上:

$ netcat -l 1431

在ubt_for_ROS2上:

$ netcat 192.168.2.111 1431

此时在俩ubt_for_ROS上的Terminal里,敲入任何字符,回车,都能发送到对方,正如:you will be able to type back and forth between the two consoles, like an old-fashioned chat program.

反过来再测试一遍~ OK。

=== ROS 对 名称 的解析 ===

当一个ROS节点广播一个topic时,它会提交 hostname:port 组合(URI),别的nodes想要收听这个topic时,会用到这个URI。所以一个node提供的hostname一定要被所有别的nodes用得上,才能与那个topic联系。ROS客户端的库使用了这个名字,这个名字是机器报告的它的hostname。这个hostname 就是在Terminal里运行命令hostname返回的那个值。

所以我们不仅要改hosts文件,使机器访问的 机器名 与 ip对应上,我们还需要修改hostname。

这里我们两台ubuntu for ros的hostname都是ubuntu,

>>把ubt_for_ROS1的hostname改为:

ubtros1

>>把ubt_for_ROS2的hostname改为:

ubtros2

在ubt_for_ROS1上

$sudo gedit /etc/hostname

把“ubuntu”改为“ubtros1”

在ubt_for_ROS2上

$sudo gedit /etc/hostname

把“ubuntu”改为“ubtros2” ,这样就区分开了俩ubt_for_ROS

修改hosts文件:

$ sudo vi /etc/hosts

#至于vi工具的使用方法,请自行搜索
    #添加如下的ip解析规则
    192.168.2.111   ubtros1
    192.168.2.222   ubtros2
After you are finished configuring your networking files, don't forget to restart your network for the changes to take effect. 或者直接重启ubuntu更保险。

exbot@ubuntu:~$ sudo /etc/init.d/networking restart 
           * Running /etc/init.d/networking restart is deprecated because it may not enable again some interfaces
           * Reconfiguring network interfaces...                                   [ OK ]

背景知识:

修改Ubuntu主机名:
-$sudo vi /etc/hostname

修改hosts:
-$sudo vi /etc/hosts

#据说只改hostname不改hosts会出现问题。
#其实是hostname是主机名,hosts是DNS转发ip用的一个查询表而已。

hostname命令不带任何参数默认是用来显示主机名的,如果在该命令的后面加上一个字符串,那么这个字符串就是暂时设置主机名,重启后复原。
好了,我就改了hosts和hostname。检查后继续!ping ubtros1 和 ping ubtros2都是可以的。hostname命令运行结果也是变了的。

在俩虚拟机上都配置环境变量:(有时候提示连接不上ros master, 检查环境变量)

$ export ROS_MASTER_URI=http://ubtros1:11311

检查环境变量:

$ echo $ROS_MASTER_URI



开始运行我们的nodes在俩虚拟机上!

在虚拟机“ubt_for_ROS1”上:

$ roscore

此时会显示ROS_MASTER_URI=ubtros1:11311, 切记,是ROS_MASTER_URI=ubtros1:11311

在虚拟机“ubt_for_ROS2”上:

$ rosrun turtlesim turtlesim_node

此时会在虚拟机“ubt_for_ROS2”上出现乌龟的窗口,说明已经连接上“ubt_for_ROS1”上的ros master!

在虚拟机“ubt_for_ROS1”上:

$ rosrun robot_cleaner robot_cleaner_node

没动,在在虚拟机“ubt_for_ROS2”上,$ rostopic list : unable to communicate with ros master ,重新配置了一下ROS_MASTER_URI,解决。

在ubt_for_ROS1 屏幕截图:




在ubt_for_ROS2 屏幕截图:






附录:==== 俩虚拟机的网络通信的配置====

关于网线直连的配置:http://jingyan.baidu.com/article/3065b3b6c552edbecff8a4a1.html

双方Host_PC:Win7都能ping通对方Win7。

关于虚拟机的网络配置方式,参考:http://blog.csdn.net/mrjy1475726263/article/details/7772372

使用Bridge方式桥接,相当于现在有了4台电脑用网线连接起来。

配置虚拟机1的ip为:

IP addr:192.168.2.111 Mask:255.255.255.0 DefaultGateway: 192.168.2.1 Bcast:default

配置宿主机1的ip为:

IP addr:192.168.2.1 Mask:255.255.255.0 DefaultGateway: 192.168.2.1 Bcast:default
配置虚拟机2的ip为:

IP addr:192.168.2.222 Mask:255.255.255.0 DefaultGateway: 192.168.2.1 Bcast:default
配置宿主机2的ip为:

IP addr:192.168.2.2 Mask:255.255.255.0 DefaultGateway: 192.168.2.1 Bcast:default

相关截图:

宿主机1的设置:







虚拟机1相关设置:




现在费了这么大劲,解决了连接问题,当然还有别的方式,比如一台宿主机两台虚拟机,读者去自己调研。

只要两台虚拟机之间能ping通即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: