• 踩坑之旅:配置 ROS 环境


    以下内容为本人的著作,如需要转载,请声明原文链接 微信公众号「englyf」https://mp.weixin.qq.com/s/IS2lkMud7x_u0aZKar9z3w


    最近在学习机器人相关的导航算法,为了方便于验证算法的效果,需要搭一个 ROS(Robot Operate System) 环境。特地写点笔记,这是这个机器人系列的首篇笔记。

    虽然在网络上有很详细的教程,不过在对着教程一步步安装的过程中还是踩了不少坑。因为在墙内(你懂的),会导致联网下载文件的时候老是失败。可能你会说不可以指定墙内的安装源吗?可以是可以,不过在安装完 ROS 包后还需要初始化一些环境,比如 rosdep 的初始化,这时候还是需要从 github 联网下载文件的,这时就算指定了墙内的安装源也不管事,因为这个 github 的域名被污染了。下面就记录一下解决的过程吧,回首往事真的一把心酸。。。

    基础环境:

    Ubuntu 18.04

    ROS Melodic

    VMware® Workstation 14 Pro

    1.配置软件仓库

    确保软件仓库里允许下载的资源类型包括 main, universe, restricted, multiverse。如下面图所示,

    2.指定墙内的安装源

    国内的安装源有好几个,还是觉得阿里的安装源比较快一些,直接拷贝下面的内容到 /etc/apt/sources.list 文件中替换原来的内容并且保存

    deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
    
    deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
    
    deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
    
    # deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
    # deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
    
    deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
    

    单独指定 ROS 包的安装源

    sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.aliyun.com/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
    

    3.指定密钥

    sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
    

    到目前为止,以上的设置都很顺利。如果这一步你刚好出错了,可以到这里去看看处理方法。

    4.安装 ROS 包

    更新一下安装索引

    sudo apt update
    

    安装完整的桌面版

    sudo apt install ros-melodic-desktop-full
    

    中间会出现提示

    Do you want to continue? [Y/n]
    

    输入 Y 然后回车继续安装过程,花点时间休息一下再回来。。。

    回来一看

    E: Failed to fetch http://mirrors.aliyun.com/ros/ubuntu/pool/main/r/ros-melodic-rqt-moveit/ros-melodic-rqt-moveit_0.5.10-1bionic.20210505.031448_amd64.deb  Undetermined Error [IP: 120.241.234.99 80]
    E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
    

    出现了这一坨失败提示,后边还建议加个参数 --fix-missing 下载补漏,好的再来一次

    sudo apt install ros-melodic-desktop-full --fix-missing
    

    好了,安装完成

    5.配置 ROS 环境变量

    为了在每次启动 bash 时都自动载入 ROS 的环境变量,输入

    echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
    source ~/.bashrc
    

    配置完,重启一下 Terminal 窗口

    6.安装一些关键的依赖包

    sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential
    

    中间又会出现提示

    Do you want to continue? [Y/n]
    

    输入 Y 然后回车继续安装过程

    7.初始化 ROS 的依赖安装管理包 rosdep

    rosdep 是 ROS 安装管理包。使用 ROS 过程中如果需要安装被 ROS 要编译的源代码,或被某些 ROS 核心组件依赖的包,那么就可以用 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.
    

    报错内容的意思说白了就是说域名 raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list 的页面找不到了。真实情况其实是这个地址的域名因为众所周知的原因被污染了,并不是页面已经下架。

    我是这么处理的,在网上搜一下关键词 域名查IP 找到可以查域名对应 IP 的网站,然后根据查到的 IP 来修改 主机名静态查询表 文件。如果网站告诉你 禁止查询该域名,那就再换一个网站再查,多大点事!

    我这里页面返回的结果是

    物理地址 IP地址 数字地址
    美国加利福尼亚旧金山 185.199.108.133 3116854405
    美国加利福尼亚旧金山 185.199.111.133 3116855173
    美国加利福尼亚旧金山 185.199.110.133 3116854917
    美国加利福尼亚旧金山 185.199.109.133 3116854661
    打开 /etc/hosts 文件,这个就是 主机名静态查询表
    sudo gedit /etc/hosts
    

    对应上边查到的 IP 地址,把下面的内容拷贝追加到 /etc/hosts 的尾部并保存

    185.199.108.133 raw.githubusercontent.com
    185.199.111.133 raw.githubusercontent.com
    185.199.110.133 raw.githubusercontent.com
    185.199.109.133 raw.githubusercontent.com
    

    然后,再试一次

    ~$ sudo rosdep init
    Wrote /etc/ros/rosdep/sources.list.d/20-default.list
    Recommended: please run
    
    	rosdep update
    

    成功通过这一关,接着执行更新一下

    ~$ rosdep update
    reading in sources list data from /etc/ros/rosdep/sources.list.d
    Hit https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml
    ERROR: error loading sources list:
    	('The read operation timed out',)
    

    可惜又访问失败了,这会儿报的是读操作超时。重试了好几回,没办法了,看来要动用大招~

    上面说白了就是读 github 网站的资源不稳定,那么我们就找一个 github 的代理资源吧。刚好我这认识一个 https://ghproxy.com/ 支持对 github 资源代理加速,速度非常好,目前是的。

    下面是应用加速代理

    打开文件,这里注意一下 ROS Melodic 用的是 python2

    sudo gedit /usr/lib/python2.7/dist-packages/rosdep2/sources_list.py
    

    找到函数 download_rosdep_data,把变量 url 赋值成

    url = "https://ghproxy.com/" + url
    

    修改后效果

    def download_rosdep_data(url):
        """
        :raises: :exc:`DownloadFailure` If data cannot be
            retrieved (e.g. 404, bad YAML format, server down).
        """
        try:
            # http/https URLs need custom requests to specify the user-agent, since some repositories reject
            # requests from the default user-agent.
    	    url = "https://ghproxy.com/" + url
            if url.startswith("http://") or url.startswith("https://"):
                url_request = request.Request(url, headers={'User-Agent': 'rosdep/{version}'.format(version=__version__)})
            else:
                url_request = url
            f = urlopen(url_request, timeout=DOWNLOAD_TIMEOUT)
            text = f.read()
            f.close()
            data = yaml.safe_load(text)
            if type(data) != dict:
                raise DownloadFailure('rosdep data from [%s] is not a YAML dictionary' % (url))
            return data
        except (URLError, httplib.HTTPException) as e:
            raise DownloadFailure(str(e) + ' (%s)' % url)
        except yaml.YAMLError as e:
            raise DownloadFailure(str(e))
    

    打开下面的几个文件,在所有找到的 https://raw.githubusercontent.com 字符串前添加上 https://ghproxy.com/ 保存即可。

    /usr/lib/python2.7/dist-packages/rosdistro/__init__.py
    /usr/lib/python2.7/dist-packages/rosdep2/gbpdistro_support.py
    /usr/lib/python2.7/dist-packages/rosdep2/sources_list.py
    /usr/lib/python2.7/dist-packages/rosdep2/rep3.py
    /usr/lib/python2.7/dist-packages/rosdistro/manifest_provider/github.py
    

    不过,对于文件 /usr/lib/python2.7/dist-packages/rosdep2/gbpdistro_support.py 里函数 download_gbpdistro_as_rosdep_data 的输入参数 gbpdistro_url 在应用前也需要补上加速地址

    def download_gbpdistro_as_rosdep_data(gbpdistro_url, targets_url=None):
        """
        Download gbpdistro file from web and convert format to rosdep distro data.
    
        DEPRECATED: see REP137. This function will output
                    (at least) one deprecation warning
    
        :param gbpdistro_url: url of gbpdistro file, ``str``
        :param target_url: override URL of platform targets file
        :raises: :exc:`DownloadFailure`
        :raises: :exc:`InvalidData` If targets file does not pass cursory
         validation checks.
        """
        # we can convert a gbpdistro file into rosdep data by following a
        # couple rules
        # will output a warning
        targets_data = download_targets_data(targets_url=targets_url)
        gbpdistro_url = "https://ghproxy.com/" + gbpdistro_url
        try:
            f = urlopen(gbpdistro_url, timeout=DOWNLOAD_TIMEOUT)
            text = f.read()
            f.close()
            gbpdistro_data = yaml.safe_load(text)
            # will output a warning
            return gbprepo_to_rosdep_data(gbpdistro_data,
                                          targets_data,
                                          gbpdistro_url)
        except Exception as e:
            raise DownloadFailure('Failed to download target platform data '
                                  'for gbpdistro:\n\t' + str(e))
    

    好了,大招都使完了,看看效果

    ~$ rosdep update
    reading in sources list data from /etc/ros/rosdep/sources.list.d
    Hit https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml
    Hit https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml
    Hit https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/python.yaml
    Hit https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/ruby.yaml
    Hit https://raw.githubusercontent.com/ros/rosdistro/master/releases/fuerte.yaml
    Query rosdistro index https://ghproxy.com/https://raw.githubusercontent.com/ros/rosdistro/master/index-v4.yaml
    Skip end-of-life distro "ardent"
    Skip end-of-life distro "bouncy"
    Skip end-of-life distro "crystal"
    Skip end-of-life distro "dashing"
    Skip end-of-life distro "eloquent"
    Add distro "foxy"
    Add distro "galactic"
    Skip end-of-life distro "groovy"
    Add distro "humble"
    Skip end-of-life distro "hydro"
    Skip end-of-life distro "indigo"
    Skip end-of-life distro "jade"
    Skip end-of-life distro "kinetic"
    Skip end-of-life distro "lunar"
    Add distro "melodic"
    Add distro "noetic"
    Add distro "rolling"
    updated cache in /home/if/.ros/rosdep/sources.cache
    

    8.测试一下环境

    分别按顺序独立在各自的终端里执行下边的这几个指令

    // 启动 ROS 核心
    roscore
    
    // 启动 ROS 仿真平台
    rosrun turtlesim turtlesim_node
    
    // 接收方向键按键信息
    rosrun turtlesim turtle_teleop_key
    

    在最后的终端里按着键盘方向键就可以控制仿真窗口里的小乌龟动起来了


    如果你能顺利走到这里,说明 ROS 环境可以正常跑了。

    后记:
    其实写这篇笔记的过程中,除了首次配置环境,还穿插了很多任务,导致配置的过程一直停滞不前,笔记也落下那么久才发出来。如果你在对照这篇笔记来配置 ROS 环境的时候也碰到了其它的问题,欢迎留言提出来,或者添加我的微信公众号englyf给我留言?毕竟博客不一定一直在线。

  • 相关阅读:
    SpringBoot介绍
    左旋氧氟沙星/载纳米雄黄磁性/As2O3磁性Fe3O4/三氧化二砷白蛋白纳米球
    Vite创建Vue项目后遇到的问题
    HStore表全了解:实时入库与高效查询利器
    uboot 添加命令
    NAT协议
    一周内快速上线!菊风联手浙银金租打造轻量化智能单向视频见证解决方案
    Kafka介绍、安装以及原理解析
    Vue中el-table条件渲染防止样式乱掉
    [Centos]Docker卸载/安装&常用命令
  • 原文地址:https://www.cnblogs.com/englyf/p/16660252.html