踩坑之旅:配置 ROS 環境

来源:https://www.cnblogs.com/englyf/archive/2022/09/06/16660252.html
-Advertisement-
Play Games

最近在學習機器人相關的導航演算法,為了方便於驗證演算法的效果,需要搭一個 ROS(Robot Operate System) 環境。特地寫點筆記,這是這個機器人系列的首篇筆記。 ...


以下內容為本人的著作,如需要轉載,請聲明原文鏈接 微信公眾號「englyf」https://www.cnblogs.com/englyf/p/16660252.html


最近在學習機器人相關的導航演算法,為了方便於驗證演算法的效果,需要搭一個 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給我留言?畢竟博客不一定一直線上。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 內置函數 # 1.abs函數 print(abs(-1)) # 絕對值方法 # 2.all函數 print(all([1,'aaa',''])) # false print(all([])) # true #all方法裡面是一個可迭代對象,all會自動將這個對象for迴圈一下,如果所有的值為true ...
  • 簡介 本項目是在newbee-mall項目的基礎上改造而來, 使用mybatis-plus,集成RedisSearch作為商城搜索中間件,商城首頁集成tianai-captcha作為滑塊驗證碼,還添加了高級秒殺、優惠劵以及完善可用的後臺全部功能,喜歡的話麻煩給我個star 商城集成RedisSear ...
  • 目錄 一.OpenGL ES圖像對比度調節 1.原始圖片 2.效果演示 二.OpenGL ES 圖像對比度調節源碼下載 三.猜你喜歡 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL ES 學習路線推薦 : OpenGL ...
  • 函數 定義 # 定義函數 def fn(): print("這是函數內部") # 調用 fn() fn() # 區分 fn: 這是真正意義上的函數本身 fn(): 這是調用函數 參數 形參 實參 函數參數可有可無,要看具體使用 形參是定義函數的參數 實參就是調用函數時需要傳遞的參數,函數有多少個形參 ...
  • 一、結論 首先說結論:深拷貝出來的對象就是完完全全的新對象,不管是對象本身(id),還是對象中包含的子對象,都和原始對象不一樣; 淺拷貝出來的對象就是外新內舊的對象,對象本身(id)和原始對象完全不同,但是子對象和原始對象的子對象是一樣的。 再補充說下賦值,賦值來的對象就是完完全全的原始對象,只是叫 ...
  • 鑒於有些小伙伴在尋找博客園遷移到個人博客的方案,本人針對博客園實現了一個自動備份腳本,可以快速將博客園中自己的文章備份成Markdown格式的獨立文件,備份後的md文件可以直接放入到hexo博客中,快速生成自己的站點,而不需要自己逐篇文章遷移,提高了備份文章的效率。 ...
  • 【問題】為什麼 System.Timers.Timer 更改間隔時間後的第一次觸發時間是設定時間的三倍? 獨立觀察員 2022 年 9 月 4 日 在編寫 “Wifi 固定器 [1]” 程式時,按如下方式使用了定時器: //聲明; private Timer _Timer = new Timer() ...
  • http請求調用是開發中經常會用到的功能。在內,調用自有項目的Web Api等形式介面時會用到;在外,調用一些第三方功能介面時,也會用到,因為,這些第三方功能往往是通過http地址的形式提供的,比如:簡訊服務、線上翻譯、地圖服務、語音智能、等… http請求調用,又分為Post與Get兩種形式。(支 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...