在机器人开发过程中,因工作需要,需要经常在Ubuntu16.04或18.04下安装ros系统,但是在安装过程中经常遇到rosdep依赖初始化及更新非常困难。
在使用Ros之前,必须先安装和初始化rosdep命令行工具,可以使你今后轻松地安装库和编译源代码时的系统依赖。
$ sudo apt-get install python-rosdep
$ sudo rosdep init
初始化时报出如下错误信息:
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.
这里可以在网页中手动下载20-default.list文件并复制到到/etc/ros/rosdep/sources.list.d目录下
https://raw.ctl.app/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
当然,也可以手动修改/usr/lib/python2.7/dist-packages/rosdep2
/sources_list.py文件中的DEFAULT_SOURCES_LIST_URL=
https://raw.ctl.app/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
替换为:https://raw.ctl.app/ros/rosdistro/master/rosdep/sources.list.d/20-default.list即可执行
sudo rosdep init
$ rosdep update
更新时,经常报出超时错误。
之所以会报出如上两个错误,主要原因在于:在国内的部分网络环境中,访问https://raw.githubusercontent.com服务器时,经常出现无法访问的现象。主要出现网络访问超时,甚至根本连不上。
常规的解决办法是:
方法1、找到raw.githubusercontent.com对应的可访问的DNS地址。
在网上登录到DNS查询页面,输入raw.githubusercontent.com网址,查找TTL值比较小的IP地址,将其写入/etc/hosts文件中,示例如下:
$ sudo gedit /etc/hosts
127.0.0.1 localhost
127.0.1.1 xxxxx
199.232.28.133 raw.githubusercontent.com #一定要放在这个位置
185.199.111.133 raw.githubusercontent.com
保存后重启。
这种情况下,遇到网络不好,延时比较大时,可以修改/usr/lib/python2.7/dist-packages/rosdep2/下的三个文件sources_list.py、gbpdistro_support.py、rep3.py中的DOWNLOAD_TIMEOUT = 15.0值,改大一点再试试。如果多次尝试仍然失败,则此方法就行不通了,主要取决于网络状况。
方法2、替换raw.githubusercontent.com网址为raw.ctl.app
将初始化和更新过程中出现的https://raw.githubusercontent.com/ros/rosdistro/master都替换为https://raw.ctl.app/ros/rosdistro/master。
替换方法如下:
以下为sudo gedit /etc/ros/rosdep/sources.list.d/20-default.list的修改内容
原内容:
# os-specific listings first
yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml osx
# generic
yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml
yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/python.yaml
yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/ruby.yaml
gbpdistro https://raw.githubusercontent.com/ros/rosdistro/master/releases/fuerte.yaml fuerte
# newer distributions (Groovy, Hydro, ...) must not be listed anymore, they are being fetched from the rosdistro index.yaml instead
修改后的内容如下:
# os-specific listings first
yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml osx
# generic
yaml https://raw.ctl.app/ros/rosdistro/master/rosdep/base.yaml
yaml https://raw.ctl.app/ros/rosdistro/master/rosdep/python.yaml
yaml https://raw.raw.ctl.app/ros/rosdistro/master/rosdep/ruby.yaml
gbpdistro https://raw.ctl.app/ros/rosdistro/master/releases/fuerte.yaml fuerte
# newer distributions (Groovy, Hydro, ...) must not be listed anymore, they are being fetched from the rosdistro index.yaml instead
除了修改20-default.list文件,更新时,还会出现https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/index-v4.yaml,主要一些python文件中还有https://raw.githubusercontent.com的网址路径信息。
将/usr/lib/python2.7/dist-packages/rosdep2/rep3.py、sources_list
.py中的raw.githubusercontent.com替换为raw.ctl.app.
另外,还要修改/usr/lib/python2.7/dist-packages/rosdistro/__init__.py文件中的raw.githubusercontent.com。
注意此处和rep3.py的目录不同。因为在rosdep2目录中有同名的__init__.py文件存在。
修改后,重启,再次执行rosdep update可以很快更新完成。
方法3:在本地建立一个目录,手动下载这些文件:
yaml https://raw.ctl.app/ros/rosdistro/master/rosdep/base.yaml
yaml https://raw.ctl.app/ros/rosdistro/master/rosdep/python.yaml
yaml https://raw.raw.ctl.app/ros/rosdistro/master/rosdep/ruby.yaml
gbpdistro https://raw.ctl.app/ros/rosdistro/master/releases/fuerte.yaml fuerte
还有index-v4.yaml(__init__.py文件中指向的配置文件)、targets.yaml(rep3.py文件中指向的配置文件)、osx-homebrew.yaml
将https://raw.githubusercontent.com/ros/rosdistro/master重定向到本地的file://home/xxx/rosdistro/目录下,将下载yaml文件放在该目录下,再执行更新即可。
最终执行成功。如下所示: