rosdep init ROS安装问题解决方案 +解决ROS系统 rosdep update超时问题的新方法

操作系统:Ubuntu18.04 ROS版本:melodic 笔者在很长一段时间里,由于自身电脑问题,只能通过VMWare软件安装Ubuntu操作系统的虚拟机进行ROS相关的学习与应用,并偶然并多次的发现安装完系统后,进行ROS安装过程中,跟着官方安装教程执行到下面贴出的命令行时,出现了如下图所示的错误提示:

sudo rosdep init

ERROR: cannot download default sources list from:
https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
Website may be down.

在这里插入图片描述
于是试着通过浏览器访问error中提及的网址:浏览器启动——!!!
在这里插入图片描述
发现网址都无法打开,于是尝试以下代码,ping一下这个网址

ping raw.githubusercontent.com

却发现其实通过终端ping的方式,我们是可以访问上述网页地址的
在这里插入图片描述
那么究竟error中返回的地址到底有什么内容呢,于是从一台安装好ROS的电脑上,我们访问了这个error中提及的网址,从下图可以看出这个网址页面的一些信息。
在这里插入图片描述
于是在安装好ROS的电脑上翻看了相关文件,发现在/etc/ros/rosdep/sources.list.d文件目录下有一个名称为20-default.list文件,打开显示如下,通过对比发现,该文档的内容与error返回网址的内容一致,于是笔者猜测sudo rosdep init为链接上述网址,下载相关文件(20-default.list)到上述目录中,并且通过rosdep update访问该文件中的相关地址,下载相关文件。

代理方法:

由于近期国内Github Raw的可用IP越来越少,通过修改hosts文件解决rosdep update超时问题的方法已经不太好用,本文通过修改rosdep源码中下载资源的函数来解决这一问题。
网站https://ghproxy.com/支持github的资源代理,非常好用,我们将用此代理加速rosdep对Github Raw的访问,进而解决rosdep update超时问题。
首先定位rosdep资源下载函数。从报错信息中得知,该函数名为download_rosdep_data,位于/usr/lib/python2.7/dist-packages/rosdep2/sources_list.py。我们修改这一函数,添加:

url="https://ghproxy.com/"+url

应用ghproxy的代理服务。
在这里插入图片描述

rosdep init ROS安装问题解决方案 +解决ROS系统 rosdep update超时问题的新方法_第1张图片
用同样的方法修改/usr/lib/python2.7/dist-packages/rosdistro/__init__.py里面的DEFAULT_INDEX_URL(感谢评论区@p4227117的补充)。
即将DEFAULT_INDEX_URL 进行如下替换:

DEFAULT_INDEX_URL = 'https://ghproxy.com/https://raw.githubusercontent.com/ros/rosdistro/master/index-v4.yaml'

除此处外,下述文件中也含有github地址,分别是:

/usr/lib/python2.7/dist-packages/rosdep2/gbpdistro_support.py 36行
/usr/lib/python2.7/dist-packages/rosdep2/sources_list.py 72行
/usr/lib/python2.7/dist-packages/rosdep2/rep3.py    39行
/usr/lib/python2.7/dist-packages/rosdistro/manifest_provider/github.py 68行 119行

均可通过在地址前添加https://ghproxy.com/前缀来应用代理服务。
2021.7.26补充:
对于第五个地址[https://raw.githubusercontent.com/ros/rosdistro/master/releases/fuerte.yaml]报错

    在/usr/lib/python2.7/dist-packages/rosdep2/gbpdistro_support.py 第204行添加如下代码gbpdistro_url = "https://ghproxy.com/" + gbpdistro_url

再次尝试执行rosdep update,问题解决。

原文链接:https://blog.csdn.net/leida_wt/article/details/115120940

######以下是搜寻其他博客的方案测试未解决我自己的方案############################

解决方案
解决方案0x01

如果你正遇到这个问题,那么第一个解决方案就是,更换网络,你可以尝试使用你的手机热点,然后继续尝试以下指令,如果你成功了,那么你可以结束本文章的阅读,当然欢迎你继续阅读。

sudo rosdep init
rosdep update

解决方案0x02 后边追加两行即可(199.232.96.133  ip贼好用)

该解决方案是针对由于以下两个无法正常访问,但可以ping通,于是修改hosts文件,加入以下两个网址的IP地址实现访问。

sudo gedit /etc/hosts
 
199.232.96.133 raw.github.com
199.232.96.133 raw.githubusercontent.com

修改完成后,在终端执行

sudo rosdep init
rosdep update

另外:

用www.ipaddress.com去查,ip138查询到的ip不好用

输入raw.githubusercontent.com查询IP地址

解决方案0x03

如果使用解决方案0x01仍然无法解决你的问题,那么你可以尝试以下步骤,此解决方案的原理是基于手动完成sudo rosdep init的步骤,然后再通过rosdep update完成整个方案的实施。 步骤一:首先打开一个终端,执行以下指令创建root并切换至root用户

sudo passwd    //接着提示输入UNIX密码,输入你的用户密码即可
sudo su //或者su root 然后输入密码切换至root用户
sudo mkdir -p /etc/ros/rosdep/sources.list.d
cd /etc/ros/rosdep/sources.list.d
sudo gedit 20-default.list

步骤二:将以下内容复制进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

步骤三:执行以下指令

exit //退出root用户
rosdep update

如果你成功了,那么你可以结束本文章的阅读,当然欢迎你继续阅读。 但也许你会遇到如下图所示的问题,发现20-default.list中的地址都无法连接,此时你可以将20-default.list中的内容替换如下,即将raw.githubusercontent.com替换为raw.github.com后保存文件,在终端中执行

rosdep update

如果你成功了,那么你可以结束本文章的阅读,当然欢迎你继续阅读
在这里插入图片描述

# os-specific listings first
yaml https://raw.github.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml osx
 
# generic
yaml https://raw.github.com/ros/rosdistro/master/rosdep/base.yaml
yaml https://raw.github.com/ros/rosdistro/master/rosdep/python.yaml
yaml https://raw.github.com/ros/rosdistro/master/rosdep/ruby.yaml
gbpdistro https://raw.github.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 su
sudo gedit /etc/hosts

在hosts中添加以下内容并保存,在执行完后继续rosdep update

199.232.28.133 raw.githubusercontent.com
151.101.228.133 raw.github.com

解决方案 0x04-终极篇

如果上述步骤仍然不能解决你的问题,那么可以进行这最后的步骤。 执行以下指令,

sudo rosdep init

系统提示已经存在20-default.list(于解决方案0x02创建),那么下面就将该文件删除

sudo su
cd /etc/ros/rosdep/sources.list.d
sudo rm 20-default.list
exit

移除文件后打开新的终端

sudo rosdep init
rosdep update

虚拟机网络问题

笔者在使用虚拟机安装ubuntu操作系统安装ros过程中遭遇了上述问题,完成上述各步骤后忍让出现time out的报错现象,即便是手机热点也无法解决问题,于是思考是不是虚拟机的网络配置问题。首先打开虚拟机的设置,我们可以看到虚拟机默认的网络适配器是NET模式:用于共享主机的IP地址;
在这里插入图片描述
步骤一:将网络适配器切换为桥接模式 如果通过上面设置面板直接设置为桥接模式后启动虚拟机,会发现虚拟机没有网络了。原因是因为虚拟机的桥接网络设置默认是自动的,但是这个自动并不智能,那么如何去更改这个设置呢,点击上方菜单栏的编辑,选择虚拟网络编辑器
在这里插入图片描述
从图片上我们看不到桥接网络,点击更改设置,然后面板消失,然后在点击菜单栏的编辑,选择虚拟网络编辑器,此时可以看到桥接模式,并将下方已桥接至的自动更改为电脑网卡
在这里插入图片描述
至此,虚拟机网络由NET模式转至桥接模式,此时在进行rosdep update即可解决time out问题。
写在最后

上述的解决方案目前已经经过几次验证可行,如果通过此方案,解决了你遇到的问题,方便的话,请在留言处盖章(留言),方便后面发现这篇文章的人能够相信本文的真实性与可行性。愿各位在学习与科研的道路上,一帆风顺!

你可能感兴趣的:(Ros,Ros)