ROS安装过程的临门一脚就是执行sudo rosdep init和rosdep update,可实际这一过程却问题频出,以下总结常见的问题及解决方法
一、sudo rosdep init 找不到命令提示
这个错误算是比较好解决的,相当于少包,本着缺啥补啥的原则,进行apt安装即可,但注意安装的rosdep版本
对于ROS Melodic(Ubuntu18.04)及以前版本,如ROS Kinetic(Ubuntu16.04),选择安装
sudo apt-get install python-rosdep
对于ROS Noetic(Ubuntu20.04),选择安装
sudo apt-get install python3-rosdep
以上相当于一个是python2一个是python3的区别
网络上还能搜索到sudo apt-get install python-rosdep2,这里不推荐尝试rosdep2,本人尝试了以后直接把安装好的ROS给卸载了,破坏了ROS环境
二、执行sudo rosdep init:ERROR: cannot download default sources list from......
执行rosdep update:ERROR: unable to process source......
我相信能搜到这篇文章的,多数是这个错误,总结一下,产生这个错误的原因就是:
网络被墙
2021.8月更新~现在国内对github的访问更加困难了,不建议采用除VPN以外的方法进行rosdep update
目前亲测可行的办法:
1.找一个VPN工具,如clash(自行搜索使用方法,github上有很多免费订阅可用https://github.com/ermaozi/get_subscribe)
2.开启允许局域网连接(参考:clash win10开局域网代理_五味鱼头的草稿纸-优快云博客_clash局域网代理)
3.在Ubuntu上使用代理(参考:ubuntu 代理配置_初学者乐园的博客-优快云博客_ubuntu 代理)
export http_proxy=http://192.168.*.*:端口号
export https_proxy=http://192.168.*.*:端口号
4.在同一个终端运行rosdep update,成功更新
总结一下,使用代理是最快捷的解决这个问题的方法,归根结底就是突破网络障碍
以下是老方法,分为两个方向,一是改hosts,另外一个是改源码以后反复重试,用人品把墙撞出一个缺口,因为不确保在每个时间都一定可行,仅作为参考
所以如果你有破墙的方法可以直接切换即可避免这个错误,以下针对无数次更换网络、切换手机热点也无法解决问题的情况
关键问题1:能否浏览器访问https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
现实情况是不行的,解决方案和不能访问github一样,找到raw.githubusercontent.com的ip,或者把dns修改成谷歌服务器,具体:
修改DNS
之所以无法访问raw.githubusercontent.com,是因为国内DNS服务器无法解析这个网址的ip地址,导致无法连接至网站服务器,因此我们需要添加能够解析这个网址的DNS服务器
ubuntu中储存DNS地址的文件为/etc/resolv.conf,可以通过gedit打开,如下面的命令,也可以通过其他文本编辑程序如nano,vi等打开
sudo gedit /etc/resolv.conf
将原有的nameserver这一行注释,并添加以下两行:
nameserver 8.8.8.8
nameserver 8.8.4.4
8.8.8.8和8.8.4.4是谷歌的DNS服务器,按理应该能够解析github网站的ip,但是国内访问谷歌的DNS比较慢,所以在使用结束后,最好还是还原为114.114.114.114这种国内的DNS服务器,这样访问国内镜像也会快一些,但是注意不要同时都添加,可能会出错
(参考https://blog.youkuaiyun.com/c417469898/article/details/106360595)
修改IP
修改DNS的好处在于,可以动态适应网站的IP变化,但是由于谷歌DNS服务器的响应比较慢,很容易出现超时等网络错误,并且也存在被墙的可能,所以也可以直接查找raw.githubusercontent.com的解析IP,直接建立域名和IP的映射关系
ubuntu中储存IP映射的文件为/etc/hosts,同样,我这采用gedit打开
sudo gedit /etc/hosts
加入一行
199.232.4.133 raw.githubusercontent.com
值得注意的是,上面的ip:199.232.4.133并不一定是你现在的ip,这种方法具有时效性,因此需要预先查询网站的ip
https://githubusercontent.com.ipaddress.com/raw.githubusercontent.com
可通过上述网站进行查询,将查询结果替代199.232.4.133即可
(参考https://blog.youkuaiyun.com/u013468614/article/details/102917569)
不论是修改DNS还是修改IP,其结果是为了让电脑能够连接raw.githubusercontent.com,切换DNS或IP时需要等待一小会才能生效,一般而言,通过本方法基本能够解决rosdep的网络问题
关键问题2:浏览器能够访问raw.githubusercontent.com,但rosdep的连接时好时坏,完全靠运气,update时,部分网址出现urlopen error [Errno XXX]
出现这个问题,就比较麻烦,因为电脑是能够ping通github的,但是就是连接不稳定,对于rosdep update只要有一个连接错误就会报错,无法继续更新,我个人觉得这里设计很不合理,为何不多尝试几次再报错?于是我把rosdep的源代码进行了修改
拷贝新rosdep
以下仅对安装了python-rosdep的ROS系统有效,安装python3-rosdep可以参考如下解决方案,只不过把2的代码移植到3即可
从这里https://github.com/HILMR/rosdep_fix/blob/main/sources_list.py下载新的sources_list.py文件到当前目录,然后在终端执行下列命令
sudo cp /usr/lib/python2.7/dist-packages/rosdep2/sources_list.py sources_list.py.bak #备份
sudo cp sources_list.py /usr/lib/python2.7/dist-packages/rosdep2/sources_list.py #写入新文件
然后在终端执行sudo rosdep init 或者rosdep update,如果网络连接不稳定会进行重试,最多重试20次(可修改)
Retry:1
Retry:2
...
Hit ...
这样就基本解决了靠运气的重试方法
下面介绍一下具体的细节,如果不想看细节可以直接跳过
rosdep源码修改
rosdep的源码位于/usr/lib/python2.7/dist-packages/rosdep2,可以通过ls指令查看相应的文件
ls /usr/lib/python2.7/dist-packages/rosdep2
其中关键的文件为main.py和sources_list.py
main.py是入口程序,从中可知
rosdep init 调用了sources_list.py的download_default_sources_list()函数
rosdep update 调用了sources_list.py的update_sources_list()函数
网络连接的错误都是urllib2库中的urlopen抛出的,因此最核心的问题可以从这里入手,比如:
设置超时时间(urlopen error timed out)
找到sources_list.py里下面的变量,把15改大即可解决urlopen抛出的超时错误
DOWNLOAD_TIMEOUT = 15.0
重试连接(urlopen error [Errno 104] Connection reset by peer)
在一些需要访问网络连接的代码段加入重试机制
is_ok=False
count=0
while(not is_ok):
try:
f = urlopen(url_request, timeout=DOWNLOAD_TIMEOUT) #这里是需要网络连接的函数区
is_ok=True
except:
count=count+1 #进行重试
print('Retry:',count)
if count>MAX_RETRY: #超过最大次数MAX_RETRY则跳出
is_ok=True
注意,如果是urlopen error [Errno 111] Connection refused,还是应该考虑DNS和IP是否设置正确,否则即使重试也是一直失败的
证书问题(urlopen error [SSL: CERTIFICATE_VERIFY_FAILED])
这个问题我倒是没遇到,但是有人遇到过,也可以通过修改sources_list.py代码解决,即在代码开头加上
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
(参考https://zhuanlan.zhihu.com/p/77483614)
关键问题3:上述方法都试过了,全没用
这里提供一个思路
执行sudo rosdep init会在/etc/ros/rosdep/sources.list.d产生一个20-default.list的文件
执行rosdep update会在/home/xxx/.ros/rosdep/sources.cache(xxx是你的用户名)产生一个文件夹,里面有一堆缓存文件
因此将这些文件拷贝过来,理论上是可以直接使用的,不需要再rosdep了,但是注意,如果时间相隔太久或者版本不一致,可能导致文件失效
相关文件我都上传至github了https://github.com/HILMR/rosdep_fix【Ubuntu18.04LTS,ROS Melodic】
我这将这些文件提供出来,如果能派上用场,那就更好了,如果不行,只能在网上找找别的办法了,或者考虑VPN
(参考https://blog.youkuaiyun.com/pangweijian/article/details/105759665、https://blog.youkuaiyun.com/qq_45616304/article/details/107852051)
2万+





