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:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM