草庐IT

踩坑之旅:配置 ROS 环境

ENG八戒 2023-03-28 原文

以下内容为本人的著作,如需要转载,请声明原文链接 微信公众号「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给我留言?毕竟博客不一定一直在线。

有关踩坑之旅:配置 ROS 环境的更多相关文章

  1. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  2. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  3. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  4. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  5. 神州数码无线产品(AC+AP)配置 - 2

    注意:本文主要掌握DCN自研无线产品的基本配置方法和注意事项,能够进行一般的项目实施、调试与运维AP基本配置命令AP登录用户名和密码均为:adminAP默认IP地址为:192.168.1.10AP默认情况下DHCP开启AP静态地址配置:setmanagementstatic-ip192.168.10.1AP开启/关闭DHCP功能:setmanagementdhcp-statusup/downAP设置默认网关:setstatic-ip-routegeteway192.168.10.254查看AP基本信息:getsystemgetmanagementgetmanaged-apgetrouteAP配

  6. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

  7. ruby-on-rails - ruby gem如何在rails环境下工作 - 2

    我试图在rails中了解rubygems是如何变得可以自动使用的,而不是在使用required的文件中gem? 最佳答案 这是通过bundler/setup完成的:http://bundler.io/v1.3/bundler_setup.html.它在您的config/boot.rb文件中是必需的。简而言之,它首先将环境变量设置为指向您的Gemfile:ENV['BUNDLE_GEMFILE']||=File.expand_path('../../Gemfile',__FILE__)然后它通过要求bundler/setup将所有ge

  8. Ruby 默认将 IRB 配置为 Pretty_Inspect - 2

    我是ruby​​的新手,正在配置IRB。我喜欢pretty-print(需要'pp'),但总是输入pp来漂亮地打印它似乎很麻烦。我想做的是默认情况下让它漂亮地打印出来,所以如果我有一个var,比如说,'myvar',然后键入myvar,它会自动调用pretty_inspect而不是常规检查。我从哪里开始?理想情况下,我将能够向我的.irbrc文件添加一个自动调用的方法。有什么想法吗?谢谢! 最佳答案 irb中默认pretty-print对象正是hirb被迫去做。Theseposts解释hirb如何将几乎所有内容转换为ascii表。虽

  9. ruby - 是否可以将 IRB 提示配置为动态更改? - 2

    我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO

  10. ruby - 如何配置 Ruby Mechanize 代理以通过 Charles Web 代理工作? - 2

    我正在使用Ruby/Mechanize编写一个“自动填写表格”应用程序。它几乎可以工作。我可以使用精彩CharlesWeb代理以查看服务器和我的Firefox浏览器之间的交换。现在我想使用Charles查看服务器和我的应用程序之间的交换。Charles在端口8888上代理。假设服务器位于https://my.host.com。.一件不起作用的事情是:@agent||=Mechanize.newdo|agent|agent.set_proxy("my.host.com",8888)end这会导致Net::HTTP::Persistent::Error:...lib/net/http/pe

随机推荐