ApolloAuto / apollo-platform

Collections of Apollo Platform Software
736 stars 389 forks source link

关于将apollo的ros从docker中提取出来后发生的问题 #64

Open Logital opened 6 years ago

Logital commented 6 years ago

我将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,因此我想请问开发者们,你们对这个现象有没有什么见解,或者解决方案

hillbrook commented 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的情况,是可以通信的。

Logital commented 6 years ago

环境变量如下

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则会出现这个问题


刚才贴错了环境变量,刚修改了一下

Logital commented 6 years ago

将网卡的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

haotian@haotian:#

给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:#

hillbrook commented 6 years ago

如果不需要夸机通信的话,可以设置以下环境变量:

 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口发送。