首页 > 技术文章 > https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list

gary-guo 2020-04-06 23:33 原文

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.

 

 

解决方法:我使用的最后一个,可以

Traceback (most recent call last): File "/usr/bin/rosdep", line 3, in <module> from rosdep2.main import rosdep_main ImportError: No module named 'rosdep2'

解决方案:将Ubuntu默认python版本设置为2.7。

如果报错:

ERROR: cannot download default sources list from:

Website may be down.

解决方案:

1)先尝试sudo -E rosdep init。不行则再看下一步。

2)先看看是网络不通(代理服务器没有设置正确)

env | grep proxy

看看HTTP_PROXY, HTTPS_PROXY, http_proxy, https_proxy这些设置的是否OK。

尝试看用火狐和谷歌浏览器访问

如果不能访问,则说明网络不通。先把网络调通。网络调通后还不行,再看下一步。

3)用wget测试一下,看是否是证书不对

wget

如果返回

ERROR: cannot verify Build software better, together's certificate, issued by ‘.......’:

Unable to locally verify the issuer's authority.

To connect to Build software better, together insecurely, use `--no-check-certificate'.

则说明证书不对。此时,按上述提示,增加--no-check-certificate,试试

wget --no-check-certificate

如果这时就正确的获得了这个文件,就说明确实是证书不对。

4)尝试解决证书问题

sudo apt-get install ca-certificates

sudo c_rehash /etc/ssl/certs

如果还是解决不了,就麻烦了,必须用下面巨麻烦的办法,绕过证书。

5)下面是一个python3的小程序,试试是否可以绕过证书

import requests

import requests_ntlm

from urllib.request import urlopen

from urllib.error import URLError

import ssl

#方法一:session访问http的例子

session = requests.session()

session.auth = requests_ntlm.HttpNtlmAuth(r'你的域\你的用户名','你的密码', session)

session.proxies = { "http": "你的http代理(不包括用户名密码)", "https": "你的https代理(不包括用户名密码)", }

page = session.get('百度一下,你就知道')

print(page.content.decode())

 

#方法一:session访问https,绕过证书的例子,关键一句是verify=False

session1 = requests.session()

session1.proxies = { "http": "你的http代理(包括用户名密码)", "https": "你的https代理(包括用户名密码)" }

page1 = session1.get('', verify=False)

print(page1.content.decode())

 

#方法三:urlopen访问https,绕过证书的例子

context = ssl._create_unverified_context()

f = urlopen('', timeout=10.0, context = context)

print(f.read())

如果测试通过,3种方法都获得了结果,就说明绕过的策略可行,接下来就是巨巨麻烦的实作绕过了。

6)绕过证书

1> 找到rosdep

因为sudo -E rosdep init失败,所以我们用whereis rosdep,看看rosdeop是个什么,得到:

rosde: /usr/bin/rosdep

它就是一个python2的程序。所以,我们的策略很明确,就是修改rosdep的源代码,把所有访问url的地方,都改成绕过证书。

2> 找到rosdep2

首先,从rosdep的内容,可以看到

from rosdep2.main import rosdep_main

所以,我们要找rosdep2在哪里。通过查看sys.path,方法是写一个b.py,内容只有2行

import sys

print sys.path

然后用python2 b.py来运行,看到所有的python2的路径。

其中有2个可疑的:

'/opt/ros/kinetic/lib/python2.7/dist-packages', '/usr/lib/python2.7'

分别去找,第一个里面没找到,第二个里面找到了,位置在:

/usr/lib/python2.7/dist-packages/rosdep2

里面也确实有一个main.py,里面确实也有一个函数rosdep_main

3> 顺藤摸瓜,找到访问url的代码

在main.py中,从rosdep_main()开始,追踪到command_init(),再追踪到download_default_sources_list(),通过在这句前后增加print()语句定位到是这句出错。

download_default_sources_list()是from .sources_list import的,所以打开sources_list.py,定位到download_default_sources_list(),

在这里,使用了urlopen(),它就是罪魁祸首。

4> 修改它

urlopen()的前面增加一句 context = ssl._create_unverified_context()

urlopen()增加一个参数:context = context

代码就变成了:

context = ssl._create_unverified_context() #add

try:

f = urlopen(url, timeout=DOWNLOAD_TIMEOUT, context = context) #modified

5> 重新运行 sudo -E rosdep init

这个报错就过了,但还会再报其他的错,按照上面的方法,顺藤摸瓜,把所有urlopen()都改掉。

6> 当sudo -E rosdep init通过后,运行rosdep update

还会报错,按照上面的方法,顺藤摸瓜,把所有urlopen()都改掉。

注意,其中还有import rosdistro,而rosdistro在/usr/lib/python2.7/dist-packages/下,追踪时,要看它的__init__.py。

最后就成功了。

7> 最后统计一下,改了如下地方:

./rosdep2/gbpdistro_support.py:import ssl #add by me

./rosdep2/gbpdistro_support.py: context = ssl._create_unverified_context() #add by me

./rosdep2/gbpdistro_support.py: f = urlopen(gbpdistro_url, timeout=DOWNLOAD_TIMEOUT, context = context) #modified by me

./rosdep2/sources_list.py:import ssl #add by me

./rosdep2/sources_list.py: context = ssl._create_unverified_context() #add by me

./rosdep2/sources_list.py: f = urlopen(url, timeout=DOWNLOAD_TIMEOUT, context = context) #modified by me

./rosdep2/sources_list.py: context = ssl._create_unverified_context() #add by me

./rosdep2/sources_list.py: f = urlopen(url, timeout=DOWNLOAD_TIMEOUT, context = context) #modified by me

./rosdep2/rep3.py:import ssl #add by me

./rosdep2/rep3.py: context = ssl._create_unverified_context() #add by me

./rosdep2/rep3.py: f = urlopen(targets_url, timeout=DOWNLOAD_TIMEOUT, context = context) #modified by me

./rosdistro/loader.py:import ssl #add by me

./rosdistro/loader.py: context = ssl._create_unverified_context() #add by me

./rosdistro/loader.py: fh = urlopen(url, timeout=timeout, context = context) #modified by me

 

 

 

如果还不行,则使用下面

0. 研究背景

由于本机是Debian 10.3,所以采用源码安装方式安装ROS。

melodic/Installation/Source - ROS Wiki​wiki.ros.org

根据官方指引,在进行到“1.2 初始化rosdep“时,执行rosdep init时会提示Website may be down的错误。

报错部分代码在/usr/lib/python2.7/dist-packages/rosdep2/main.py中,原因是download_default_sources_list()无法访问网站。

rosedep update时也要联网,默认的网站还是raw.githubusercontent.com,所以也会报错。

1. 国内研究现状

国内某知名搜索引擎排行前列的几种解决方案(已排除广告):

解决思路是从网络层面入手,用科学(科-学-上-网)或玄学(手机热点)的方式,如 果出现认证错误的问题,再通过安装依赖包修改rosdep源码的方式解决。

2. 研究思路

raw.githubusercontent.com实际上就是github的用户数据服务器,rosdep程序下载的就是github.com/ros/rosdistro这个repo里的yaml文件

虽然raw.githubusercontent.com服务器无法访问,但是yaml文件可以直接从git clone的repo中获得。

所以,只要将ros/rosdistro整个git下来,然后再将

  • 20-default.list
  • /usr/lib/python2.7/dist-packages/rosdep2/main.py
  • /usr/lib/python2.7/dist-packages/rosdep2/rep3.py
  • /usr/lib/python2.7/dist-packages/rosdistro/__init__.py

中的默认url全部指向本地的git,即可解决这个问题。

3. 解决步骤

  1. git clone https://github.com/ros/rosdistro.git
  2. 在本地rosdistro中搜索20-default.list,将其url指向本地repo;
  3. 搜索rosdep2rosdistro中出现的位置,将其指向本地repo。

效果如图所示:

转载自https://zhuanlan.zhihu.com/p/107218921

推荐阅读