ros_hostname与ros_ip

在ROS的环境变量中,需要在~/.bashrc中设置的并不多(此处是指在wiki的基本教程中出现的,大牛请无视),大概只有三个:
$ROS_MASTER_URI
$ROS_HOSTNAME
$ROS_IP
这三个是出现频率最高的。
$ROS_MASTER_URI比较好理解,就是整个ROS系统的主机的IP网址。注意是网址:

export ROS_MASTER_URI=http://192.168.8.101:11311

看见没,带http的!

而下面两个$ROS_HOSTNAME$ROS_IP 着实让我绕了好久。因为就是不知道改了哪里,roscore就进不去了。。。
所以下面一点点的实验:
实验为单机运行,也就是运行本机上的ROSCORE,先不涉及分布式配置。
本机的hostname为robin,IP为192.168.0.12

1、/etc/hosts中无添加内容,~/.bashrc中只有ROS_MASTER_URI:
/etc/hosts:


~/.bashrc:

export ROS_MASTER_URI=http://`hostname -I`:11311

OK,source后roscore一下,失败~!
看一下环境变量值:

robin@robin:~$ echo $ROS_MASTER_URI 
http://192.168.0.12 :11311
robin@robin:~$ echo $ROS_HOSTNAME

robin@robin:~$ echo $ROS_IP

hostname和IP都是没有值的。

2、仅在~/.bashrc中添加$ROS_IP,etc/hosts不变:

export ROS_MASTER_URI=http://`hostname -I`:11311
export ROS_IP=`hostname -I`

source后roscore,成功了。

3、仅在~/.bashrc中添加$ROS_HOSTNAME,etc/hosts不变:

export ROS_MASTER_URI=http://`hostname -I`:11311
export ROS_HOSTNAME=`hostname`

source后roscore,失败!

4、将3的HOSTNAME不用robin名称,换成IP值的话呢?

export ROS_MASTER_URI=http://`hostname -I`:11311
export ROS_HOSTNAME=`hostname -I`

成功!

5、还是换成3的情况,然后修改/etc/hosts呢?
bashrc:

export ROS_MASTER_URI=http://`hostname -I`:11311
export ROS_HOSTNAME=`hostname`

hosts:

192.168.0.12    robin

成功!

6、hosts为空,bashrc全都有呢?

export ROS_MASTER_URI=http://`hostname -I`:11311
export ROS_HOSTNAME=`hostname`
export ROS_IP=`hostname -I`

失败!

7、hosts写上,bashrc也写全呢?

hosts:

192.168.0.12    robin

bashrc:

export ROS_MASTER_URI=http://`hostname -I`:11311
export ROS_HOSTNAME=`hostname`
export ROS_IP=`hostname -I`

成功!

饶了好久才发现这个文章:http://www.mamicode.com/info-detail-915039.html
其中最重要的是:

  1. ROS_IP/ROS_HOSTNAME
    ROS_IP和ROS_HOSTNAME是可选的环境变量,用来设置ROS节点或工具的公开网地址。这两个选项是互斥的,如果两者都设置优先使用ROS_HOSTNAME。如果你指定一个IP地址,使用ROS_IP;如果制定一个主机名(a host name),使用ROS_HOSTNAME。当一个ROS成员报告URI给master或者其他成员,这个值就会被用到。这个设置只用在一台计算机有多个地址,需要强制ROS到特定的一个的情况。
    除了’localhost’(本地主机),ROS成员绑定到所有可用的网络接口,他不影响实际绑定地址。如果这个值设定为本地主机,ROS成员只绑定在环回接口。这将会阻止远程成员与本地成员交流。

说的直白一点就是,hostname的优先级要比IP的优先级高,设定了hostname就以hostname为准,不在管后面是否还有IP的设置。实验6失败,实验7成功,实验5成功。
这里的hostname设置又因为etc配置的原因,如果直接写上IP(hostname - I 实验4成功)就用这个IP了,没hosts什么事。但是若用名称的话(hostname 实验3失败,实验5成功),就需要在hosts中设置name的IP,不然会因为找不到名称的IP而启动不成功。
假若没有设置ROS_HOSTNAME的话,才会去寻找$ROS_IP 实验2成功,这个就比较直接了,直接就是IP地址。
如果两个都没有的话,实验1 的结果就是不成功。所以还是需要有一个的。

主从机的分布式配置后面再写,有了上面的思路,应该好写

你可能感兴趣的:(ROS)