一. 绪论

关于ROS安装过程中遇到的sudo rosdep initrosdep update失败问题,网上的帖子简直就是一大箩筐了。笔者最近又安装了一次ROS,发现以前记录的解决方法都不管用了,搜遍网上的帖子,99%是转载、或者过时了。最后终于找到一篇说清楚的了,可以参考这篇文章:ROS rosdep init/update报错终极解决方法

二. 失败原因

要想解决问题,先搞清楚问题原因。sudo rosdep initrosdep update运行不起的根本原因是"raw.githubusercontent.com"这个网站不好使

"raw.githubusercontent.com"实际上是Google GitHub的用户服务器,sudo rosdep initrosdep 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.gitDownload 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'

文件里面截图是这样的:
在这里插入图片描述
修改rep3.py,执行:

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'

好了,再次执行rosdep update,这次肯定是要成功了,结果如下面所示。
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐