关于ROS安装过程中遇到的sudo rosdep init
和rosdep update
失败问题,网上的帖子简直就是一大箩筐了。笔者最近又安装了一次ROS,发现以前记录的解决方法都不管用了,搜遍网上的帖子,99%是转载、或者过时了。最后终于找到一篇说清楚的了,可以参考这篇文章:ROS rosdep init/update报错终极解决方法。
要想解决问题,先搞清楚问题原因。sudo rosdep init
和rosdep update
运行不起的根本原因是"raw.githubusercontent.com"这个网站不好使。
"raw.githubusercontent.com"实际上是Google GitHub的用户服务器,sudo rosdep init
和rosdep update
都是从该网站上下载一些文件,在初次安装ROS的时候一般国内网是进不去的。
既然是网的问题那么解决网络问题就行了。(想看终极解决方法的直接跳到方法三即可)
科学上网,这个不多说了,如果你能找到方法上外网就啥事没有了。鉴于绝大多数同志没有这个条件,也不提倡这个方法。(很多贴说用手机开热点,我一直用的手机热点证明没有用)
sudo rosdep init
做的事情其实就是下载了一个20-default.list
文件到 /etc/ros/rosdep/sources.list.d
文件夹下,我们可以手动创建这个文件然后粘贴内容,创建文件:
sudo gedit /etc/ros/rosdep/sources.list.d/20-default.list
然后粘贴下面的内容进去:
# os-specific listings first
yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml osx
# generic
yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml
yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/python.yaml
yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/ruby.yaml
gbpdistro https://raw.githubusercontent.com/ros/rosdistro/master/releases/fuerte.yaml fuerte
# newer distributions (Groovy, Hydro, ...) must not be listed anymore, they are being fetched from the rosdistro index.yaml instead
这样就完成了sudo rosdep init
的工作,最后的20-default.list
的内容如图所示
rosdep update
做的事情就是根据上面的20-default.list
文件中的网址链接去下载相应的文件,可以看到用到了五个文件,osx-homebrew.yawl,base.yawl,python.yawl,ruby.yawl,fuerte.yawl
,地址都在"raw.githubusercontent.com"
下面,因为网络进不去所以当然下载不下来,rosdep update
就运行不起。
既然默认的IP是进不去这个网站的,那么可以找一个替代的IP,方法是上IP查询网(https://site.ip138.com)查询"raw.githubusercontent.com"
的IP地址,点击进入。查询结果是这样的(结果不是固定的):
可以看到有四个IP地址可以用,185.199.108.133——185.199.111.133,地址是荷兰的,这个不用管。ping一下这几个ip试试:
ping 185.199.108.133
结果是下面这样的,说明连接正常,后面的time越短说明网络传输速度越快。可以四个IP都试一下,选一个最快的。这里以185.199.108.133为例。
终端输入命令:
sudo gedit /etc/hosts
添加一行
185.199.108.133 raw.githubusercontent.com
/etc/hosts最后是这样的:
(很多博客也说到了这个方法,告诉你直接添加"152.XXX.XXX.XXX raw.githubusercontent.com”,或者其他的IP地址,但是这些IP地址都是过时了,因为它会更新,当然不管用了。所以一定要上这个IP查询网站自己查)
好的,现在可以访问了,重新执行一下rosdep update
,顺利的话可以成功了。这种方法截至2020年都是非常好使的,算得上终极解决方法了。
但今年可能流年不利,今年不太好使。
基本报的错都是网络超时,可能会在上面五个文件任何一个的下载中提示handshake timeout。
ERROR: unable to process source [http://github.com/ros/rosdistro/raw/master/rosdep/base.yaml]:
<urlopen error _ssl.c:489: The handshake operation timed out> (http://github.com/ros/rosdistro/raw/master/rosdep/base.yaml)
好的,这个问题很多人遇到了,很多帖子教我们修改超时时间。方法是更改/usr/lib/python2.7/dist-packages/rosdep2/
下的三个文件sources_list.py、gbpdistro_support.py、rep3.py
中的DOWNLOAD_TIMEOUT = 15.0
值,改大一点就可以了。
sudo gedit /usr/lib/python2.7/dist-packages/rosdep2/sources_list.py
Ctrl+F 查找 DOWNLOAD_TIMEOUT
,把后面的15改大一点,比如100。其他几个文件一样操作去修改。
再试几次rosdep update
,可能会成功。我只能告诉你我失败了,那么继续改,我把超时时间改到了500,依然超时。。。
好了,此路不通,换终极方法,请看方法三。
前面说了rosdep update
做的事情就是根据20-default.list
文件中的网址链接("raw.githubusercontent.com"
)去下载相应的文件,既然用网络下载不了,能不能手动下载呢?答案是可以的。
raw.githubusercontent.com实际上就是github的用户数据服务器,rosdep程序下载的就是github.com/ros/rosdistro这个repository里的文件。
执行下面的命令:
git clone https://github.com/ros/rosdistro.git
(当然也可以直接去https://github.com/ros/rosdistro.git
点Download Zip
下载)
网速可能会有点慢,这里我也提供免费下载:ROS安装文件rosdistro-master.zip。
会在当前目录下载进一个名为rosdistro-master.zip
的文件夹,前面说的那些文件都在里面。
首先将这个文件解压,然后放到一个新的目录下,我放到了/etc/ros
下,执行命令(具体的路径根据你的目录修改)
sudo cp -r /home/ubuntu/Documents/rosdistro-master /etc/ros
首先修改20-default.list
,执行:
sudo gedit /etc/ros/rosdep/sources.list.d/20-default.list
将里面链接到"raw.githubusercontent.com"
的内容全部替换为链接到本地文件,最后20-default.list
的内容是这样的(具体的文件路径根据你放的位置更改):
# os-specific listings first
#yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml osx
yaml file:///etc/ros/rosdistro-master/rosdep/osx-homebrew.yaml osx
# generic
#yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml
#yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/python.yaml
#yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/ruby.yaml
#gbpdistro https://raw.githubusercontent.com/ros/rosdistro/master/releases/fuerte.yaml fuerte
yaml file:///etc/ros/rosdistro-master/rosdep/base.yaml
yaml file:///etc/ros/rosdistro-master/rosdep/python.yaml
yaml file:///etc/ros/rosdistro-master/rosdep/ruby.yaml
gbpdistro file:///etc/ros/rosdistro-master/releases/fuerte.yaml fuerte
# newer distributions (Groovy, Hydro, ...) must not be listed anymore, they are being fetched from the rosdistro index.yaml instead
然后修改下面三个文件,同样将其中链接到"raw.githubusercontent.com"
的内容全部替换为链接到本地文件。可以使用Ctrl+F 查找 raw.githubusercontent.com
,每个文件当中都有一处需要修改。
1. /usr/lib/python2.7/dist-packages/rosdep2/gbpdistro_support.py
2. /usr/lib/python2.7/dist-packages/rosdep2/rep3.py
3. /usr/lib/python2.7/dist-packages/rosdistro/__init__.py
修改gbpdistro_support.py
,执行:
sudo gedit /usr/lib/python2.7/dist-packages/rosdep2/gbpdistro_support.py
定位到raw.githubusercontent.com
这一行(使用Ctrl+F 查找),注释掉原来的链接改为本地文件,修改的内容如下面所示:
# FUERTE_GBPDISTRO_URL = 'https://raw.githubusercontent.com/ros/rosdistro/master/releases/fuerte.yaml'
FUERTE_GBPDISTRO_URL = 'file:///etc/ros/rosdistro-master/releases/fuerte.yaml'
sudo gedit /usr/lib/python2.7/dist-packages/rosdep2/rep3.py
同样定位到raw.githubusercontent.com
这一行(使用Ctrl+F 查找),注释掉原来的链接改为本地文件,修改的内容如下面所示:
# REP3_TARGETS_URL = 'https://raw.githubusercontent.com/ros/rosdistro/master/releases/targets.yaml'
REP3_TARGETS_URL = 'file:///etc/ros/rosdistro-master/releases/targets.yaml'
修改__init__.py
,执行:
sudo gedit /usr/lib/python2.7/dist-packages/rosdistro/__init__.py
同样定位到raw.githubusercontent.com
这一行(使用Ctrl+F 查找),注释掉原来的链接改为本地文件,修改的内容如下面所示:
# DEFAULT_INDEX_URL = 'https://raw.githubusercontent.com/ros/rosdistro/master/index-v4.yaml'
DEFAULT_INDEX_URL = 'file:///etc/ros/rosdistro-master/index-v4.yaml'