Open Logital opened 6 years ago
你好,帮在你执行ros命令的终端上,执行以下命令:
env|grep ROS
把对应的环境变量贴一下,此外,提供一下apollo-platform 的版本,多谢。 apollo 的ros indigo对原生的ros indigo做了一些改动,详细见 https://github.com/ApolloAuto/apollo-platform/blob/master/ros/docs/design/ros_decentralization.md。 apollo ros indigo的改动目前不依赖于网卡和ip地址,底层是靠多播进行节点发现的,只有loopback虚拟网卡的情况下,也是可以通信的。本地试了一下只有lo的情况,是可以通信的。
环境变量如下
ROS_ROOT=/apollo/third_party/ros_x86_64/share/ros ROS_PACKAGE_PATH=/apollo/third_party/ros_x86_64/share:/apollo/third_party/ros_x86_64/stacks ROS_MASTER_URI=http://localhost:11311 ROS_DOMAIN_ID=77 ROSLISP_PACKAGE_DIRECTORIES= ROS_DISTRO=indigo ROS_ETC_DIR=/apollo/third_party/ros_x86_64/etc/ros
十分抱歉的是apollo的版本我现在看不到,大概是1.5的 我这里如果有docker0网卡,即使关闭它,仅剩一个lo,rostopic仍然是可以正常使用的,然是如果是一台完全没有安装过docker的PC则会出现这个问题
刚才贴错了环境变量,刚修改了一下
将网卡的ip全部置空,就是下面的现象
haotian@haotian:# ifconfig -a
eth0 Link encap:Ethernet HWaddr f4:8e:38:f1:c4:a3
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:9676 errors:0 dropped:0 overruns:0 frame:0
TX packets:9676 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:2408143 (2.4 MB) TX bytes:2408143 (2.4 MB)
wlan0 Link encap:Ethernet HWaddr 3c:f8:62:dd:9f:3c
inet6 addr: fe80::3ef8:62ff:fedd:9f3c/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:12624 errors:0 dropped:0 overruns:0 frame:0
TX packets:7937 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4019487 (4.0 MB) TX bytes:2293996 (2.2 MB)
haotian@haotian:# rostopic list
给eth0设置IP,再重启roscore,就是下面的现象,是正常的
haotian@haotian:# sudo ifconfig eth0 192.168.66.77
haotian@haotian:# ifconfig -a
eth0 Link encap:Ethernet HWaddr f4:8e:38:f1:c4:a3
inet addr:192.168.66.77 Bcast:192.168.66.255 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:35727 errors:0 dropped:0 overruns:0 frame:0
TX packets:35727 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:5376263 (5.3 MB) TX bytes:5376263 (5.3 MB)
wlan0 Link encap:Ethernet HWaddr 3c:f8:62:dd:9f:3c
inet6 addr: fe80::3ef8:62ff:fedd:9f3c/64 Scope:Link
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:13714 errors:0 dropped:0 overruns:0 frame:0
TX packets:8520 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4228529 (4.2 MB) TX bytes:2437696 (2.4 MB)
haotian@haotian:# rostopic list /rosout /rosout_agg haotian@haotian:#
环境变量如下 haotian@haotian:# env | grep ROS ROS_ROOT=/apollo/third_party/ros_x86_64/share/ros ROS_PACKAGE_PATH=/apollo/third_party/ros_x86_64/share:/apollo/third_party/ros_x86_64/stacks ROS_MASTER_URI=http://localhost:11311 ROS_DOMAIN_ID=77 ROSLISP_PACKAGE_DIRECTORIES= ROS_DISTRO=indigo ROS_ETC_DIR=/apollo/third_party/ros_x86_64/etc/ros haotian@haotian:#
如果不需要夸机通信的话,可以设置以下环境变量:
export ROS_IP=127.0.0.1
上面的问题,看起来是ip清空(设置网卡ip为0.0.0.0)引起。
执行一下:
route -n
查看是否有对应的路由,因为底层RTPS是靠发送多播来实现拓扑发现的,需要路由将多播报文发送出去。
我本地把所有的网卡的ip都清空后,执行 route -n,发现是空的。底层调用RTPS发送报文的时候,报以下错误:
Network is unreachable
你那边的本机ip是dhcp获取的是么?获取不到ip地址的时候出现的这个问题?
如果只有lo使用的话,建议设置 环境变量 ROS_IP=127.0.0.1,这样多播报文会通过lo口发送。
我将apollo的ros indigo提取出来部署在一台没有docker的x86 ubuntu14的pc上,关掉所有网卡,只保留lo正在工作,这时我启动roscore,再使用rostopic list或者echo,都会什么都看不到,没有任何消息。
反过来如果我打开wlan0,并且连接一个wifi,甚至只是设置一个ip,再重启roscore,消息就可以正常工作。
这些现象在原版的ros中没有发生过,并且如果我在这台PC上安装了docker,,即使不使用apollo的docker,仅使用apollo的ros indigo,这个问题也会恢复正常。
另外,我在/etc/network/interface里面给eth0设置固定IP,这样虽然IP有效,但是ros的消息依然无效,然而如果我再将wlan0的IP也在这里设置好,ros的消息就有效了。
也就是说apollo的ros indigo似乎依赖于网卡和ip地址的一些关系,但是我现在不想使用docker,并且网络环境确实不允许随意设定IP,因此我想请问开发者们,你们对这个现象有没有什么见解,或者解决方案