【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
之前我们学习ros的时候,大部分都是基于仿真来做的。但是最终,我们还是要把ros部署到小车上的。这就带来一个问题,首先小车肯定是要上ros的,毕竟小车要行走在各个地方。然而,我们在本地也是需要对小车进行控制的。这种控制,有可能是调试,有可能是监控,也有可能是发送任务。不管怎么说,本地pc也是需要对小车进行通信的。另外,对于真正的使用者来说,他可能手里也有一个发送任务的android pad,也是要发送任务给小车的。所以,这里就引申出一个需求,ros网络应该怎么搭建。
要保证所有的设备都能正常通信,那么构建一个合理的wifi网络是必不可少的。router可以选用工业级的路由器,2.4g或者5g都可以。pad和pc都是成熟的电子产品,一般就是android系统和windows系统。robot的话,则需要一个配置一个无线模块,配置好分配的ip。这样一个简单的网络就算构建好了。
一般来说,所有的设备配置在同一个网段即可。比如,router配置成192.168.0.1或者192.168.0.254,pad配置成192.168.0.101,robot配置成192.168.0.102,pc配置成192.168.0.103即可。
目前为止还有一个事情没有决定,那就是robot和pc谁是master的问题。网上大部分的案例,都把robot设置成master,pc和pad当成slave。这是可以的。不过因为pc还会涉及到交通管制、任务分配、客户的业务系统对接等工作,这时候把ros一部分master做的活,例如move_base中的全局搜路和局部搜路放到pc来做,这也是较为常见的情形。
前面讨论了各个模块ip的设置,那么怎么把他们和ros绑定在一起呢。其实也不复杂。最主要的工作就是设置ROS_MASTER_URI和ROS_HOSTNAME。pad可以这样设置,
- export ROS_MASTER_URI=http://192.168.0.102:11311
- export ROS_HOSTNAME=192.168.0.101
robot这样设置,
- export ROS_MASTER_URI=http://192.168.0.102:11311
- export ROS_HOSTNAME=192.168.0.102
最后pc这样设置,
- export ROS_MASTER_URI=http://192.168.0.102:11311
- export ROS_HOSTNAME=192.168.0.103
通过观察,我们发现不同设备中,ROS_MASTER_URI都是一样的,端口11311也是固定的。但是ROS_HOSTNAME都是每个设备自己的ip,所以从这也看得出robot是ros的核心,其他设备本质上都是slave设备。
既然robot是核心,那么启动设备的时候,必须等robot成功启动之后,其他的pad、pc才能顺利启动。也就是说,robot上面的roscore先启动,其他设备才连的上去。
手上有robot的同学可以直接在arm开发板设置好ros之后,连同pc一起测试。暂时还没有机器人的同学,可以通过多虚拟机+网络桥接的办法看看可不可以实现多设备之间的ros组网。如果可以在一台设备上roscore启动成功,另外一台设备上rosrun启动成功,那代表我们的配置是没有问题的。这也间接说明了ROS_MASTER_URI和ROS_HOSTNAME是设置成功的。
目前pad的系统以andoird为主,ros提供了一个rosjava包,勉强支持ros开发。如果用着不顺手,可以通过xmlrpc + rosrun client的办法来解决,这也算一个折中的思路吧。