rosdep init 及update报错的解决办法汇总(亲测) 您所在的位置:网站首页 sudo报错 rosdep init 及update报错的解决办法汇总(亲测)

rosdep init 及update报错的解决办法汇总(亲测)

2023-11-09 05:29| 来源: 网络整理| 查看: 265

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开局域网代理_五味鱼头的草稿纸-CSDN博客_clash局域网代理)

3.在Ubuntu上使用代理(参考:ubuntu 代理配置_初学者乐园的博客-CSDN博客_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.csdn.net/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.csdn.net/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.csdn.net/pangweijian/article/details/105759665、https://blog.csdn.net/qq_45616304/article/details/107852051)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有