https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
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:
https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
Website may be down.
解决方案:
1)先尝试sudo -E rosdep init。不行则再看下一步。
2)先看看是网络不通(代理服务器没有设置正确)
env | grep proxy
看看HTTP_PROXY, HTTPS_PROXY, http_proxy, https_proxy这些设置的是否OK。
尝试看用火狐和谷歌浏览器访问https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list,
如果不能访问,则说明网络不通。先把网络调通。网络调通后还不行,再看下一步。
3)用wget测试一下,看是否是证书不对
wget https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
如果返回
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 https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
如果这时就正确的获得了这个文件,就说明确实是证书不对。
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('https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list', verify=False)
print(page1.content.decode())
#方法三:urlopen访问https,绕过证书的例子
context = ssl._create_unverified_context()
f = urlopen('https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list', 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
根据官方指引,在进行到“1.2 初始化rosdep“时,执行rosdep init
时会提示Website may be down的错误。
报错部分代码在/usr/lib/python2.7/dist-packages/rosdep2/main.py
中,原因是download_default_sources_list()
无法访问http://raw.githubusercontent.com网站。
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. 解决步骤
git clone https://github.com/ros/rosdistro.git
;- 在本地
rosdistro
中搜索20-default.list
,将其url指向本地repo; - 搜索
rosdep2
和rosdistro
中出现http://raw.githubusercontent.com的位置,将其指向本地repo。
效果如图所示:
转载自https://zhuanlan.zhihu.com/p/107218921
sudo gedit /etc/hosts
在打开的文件中添加: 199.232.28.133 raw.githubusercontent.com
posted on 2020-04-06 23:33 gary_123 阅读(10999) 评论(1) 编辑 收藏 举报