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上:
在ubt_for_ROS2上:
此时在俩ubt_for_ROS上的Terminal里,敲入任何字符,回车,都能发送到对方,正如:you will be able to type back and forth between the two consoles, like an old-fashioned chat program.
反过来再测试一遍~ OK。
所以我们不仅要改hosts文件,使机器访问的 机器名 与 ip对应上,我们还需要修改hostname。
这里我们两台ubuntu for ros的hostname都是ubuntu,
>>把ubt_for_ROS1的hostname改为:
ubtros1
>>把ubt_for_ROS2的hostname改为:
ubtros2
在ubt_for_ROS1上
把“ubuntu”改为“ubtros1”
在ubt_for_ROS2上
把“ubuntu”改为“ubtros2” ,这样就区分开了俩ubt_for_ROS
修改hosts文件:
背景知识:
在俩虚拟机上都配置环境变量:(有时候提示连接不上ros master, 检查环境变量)
检查环境变量:
此时会显示ROS_MASTER_URI=ubtros1:11311, 切记,是ROS_MASTER_URI=ubtros1:11311
在虚拟机“ubt_for_ROS2”上:
此时会在虚拟机“ubt_for_ROS2”上出现乌龟的窗口,说明已经连接上“ubt_for_ROS1”上的ros master!
在虚拟机“ubt_for_ROS1”上:
没动,在在虚拟机“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通即可。
这一节我想完成 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 ubtros2After 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通即可。
相关文章推荐
- Android在 Alertdialog对话框中点击消失?
- SQL中Charindex和Oracle中对应的函数Instr
- 2012年下半年软件评测师(下午)试题分析与解答
- 机房收费系统之登录
- iterms基本使用
- OC对象与Core Foundation对象的转换
- CoreGraphics基本使用示例
- Redis安装及主从配置
- 堆和栈的区别
- 《致青春》
- java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start com
- java类初始化顺序
- Java垃圾回收机制
- OJ Shape 组合问题
- DFS+剪枝 hdu1010 Tempter of the Bone
- java list 排序
- Spring中<mvc:annotation-driven />的作用
- django字段设置null和blank的区别
- 使用Markdown手册
- jedis集群常见的问题JedisClusterException: CLUSTERDOWN The cluster is down