目录
问题
安装ROS Melodic时执行以下指令时出现报错。
sudo rosdep init rosdep update
如题,具体如下:
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.
能ping,浏览器能访问,能curl。
解决
法1
打开host文件,地址为/etc/hosts
。
添加以下内容。
151.101.84.133 raw.githubusercontent.com
保存再次执行即可。
法2
看ERROR是urlopen和ssl验证的问题,虽然已经可以读取我们手动新建的20-default.list中的内容,但并没有解决根本问题,要下载东西时依然出错。
报的错误原因是python 升级到 2.7.9 之后引入了一个新特性,当使用urllib.urlopen打开一个 https 链接时,会验证一次 SSL 证书,而当目标网站使用的是自签名的证书时就会抛出一个 urllib2.URLError的错误消息。
既然前面尝试了很多办法都没法解决SSL验证问题,那只能想办法在执行rosdep update时尝试定位urllib.urlopen()函数并规避掉SSL验证。
搜了很久,终于找到Z-HE:sudo rosdep init出错的解决方案,定位rosdep命令中用到的urllib.urlopen()
rosdep命令是py脚本,入口:
查找rosdep地址: /usr/bin/rosdep
查看rosdep.py内容:from rosdep2.main import rosdep_main
查找rosdep2地址:/usr/lib/python2.7/dist-packages/rosdep2
从main.py中进一步定位,发现是在
/usr/lib/python2.7/dist-packages/rosdep2/sources_list.py中的
download_default_sources_list()调用了urlopen()
找到urlopen()之后,如果参考链接里的解决方案,需要修改所有调用的14个地方,太复杂。如果我们可以在rosdep浅入口处设置urlopen()全局属性,取消SSL验证,那是不是可以一下解决问题?
在网上查找后发现确实可以设置SSL验证全局取消(参考Py 坑之 CERTIFICATE_VERIFY_FAILED)。
因此,在/usr/lib/python2.7/dist-packages/rosdep2/sources_list.py中顶部直接插入两行代码取消SSL验证
import ssl
ssl._create_default_https_context = ssl._create_unverified_context