ROS 2 ardent apalone安裝和使用說明
ROS 2 Ardent Apalone是機器人作業系統(2代)第一個正式版。
目前ROS 2和ROS 1 具體資料分別在如下兩個網址:
在ROS十週年剛過,即釋出了第一個ROS 2的正式版ardent apalone。
下面依據官網簡單介紹一下ROS 2的安裝,ROS 2 ardent提供了軟體源和原始碼編譯兩種安裝使用方式,這和ROS 1是幾乎完全一致的。
1. Linux安裝(debians)
設定軟體源,如下:
$ sudo apt update && sudo apt install curl
$ curl http://repo.ros2.org/repos.key | sudo apt-key add -
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1679 100 1679 0 0 2887 0 --:--:-- --:--:-- --:--:-- 2889
OK
$ sudo sh -c 'echo "deb [arch=amd64,arm64] http://repo.ros2.org/ubuntu/main xenial main" > /etc/apt/sources.list.d/ros2-latest.list'
2. 安裝ROS 2軟體包:
ROS 2的軟體包命令如ROS 1,格式為ros-ardent-xxx,例如rviz,如下可以看到:
$ sudo apt-get install ros-ardent-rviz
ros-ardent-rviz2 ros-ardent-rviz-ogre-vendor
ros-ardent-rviz-assimp-vendor ros-ardent-rviz-rendering
ros-ardent-rviz-common ros-ardent-rviz-rendering-tests
ros-ardent-rviz-default-plugins ros-ardent-rviz-yaml-cpp-vendor
使用下面命令安裝ROS 2 ardent全部包,注意,ros-ardent-ros1-bridge和ros-ardent-turtlebot2-*需要ROS 1的支援(
$ sudo apt install `apt list ros-ardent-* 2> /dev/null | grep "/" | awk -F/ '{print $1}' | grep -v -e ros-ardent-ros1-bridge -e ros-ardent-turtlebot2- | tr "\n" " "`
保持足夠耐心等待安裝結束,ROS 2已有的軟體包如下:
Display all 183 possibilities? (y or n)
ros-ardent-actionlib-msgs ros-ardent-ament-uncrustify ros-ardent-lifecycle-msgs ros-ardent-rosidl-typesupport-interface
ros-ardent-amcl ros-ardent-astra-camera ros-ardent-logging-demo ros-ardent-rosidl-typesupport-introspection-c
ros-ardent-ament-clang-format ros-ardent-builtin-interfaces ros-ardent-map-server ros-ardent-rosidl-typesupport-introspection-cpp
ros-ardent-ament-cmake ros-ardent-cartographer ros-ardent-nav-msgs ros-ardent-rosidl-typesupport-opensplice-c
ros-ardent-ament-cmake-auto ros-ardent-cartographer-ros ros-ardent-opensplice-cmake-module ros-ardent-rosidl-typesupport-opensplice-cpp
ros-ardent-ament-cmake-clang-format ros-ardent-cartographer-ros-msgs ros-ardent-orocos-kdl ros-ardent-ros-workspace
ros-ardent-ament-cmake-copyright ros-ardent-class-loader ros-ardent-osrf-pycommon ros-ardent-rttest
ros-ardent-ament-cmake-core ros-ardent-common-interfaces ros-ardent-pcl-conversions ros-ardent-rviz2
ros-ardent-ament-cmake-cppcheck ros-ardent-composition ros-ardent-pendulum-control ros-ardent-rviz-assimp-vendor
ros-ardent-ament-cmake-cpplint ros-ardent-console-bridge ros-ardent-pendulum-msgs ros-ardent-rviz-common
ros-ardent-ament-cmake-export-definitions ros-ardent-demo-nodes-cpp ros-ardent-pluginlib ros-ardent-rviz-default-plugins
ros-ardent-ament-cmake-export-dependencies ros-ardent-demo-nodes-cpp-native ros-ardent-poco-vendor ros-ardent-rviz-ogre-vendor
ros-ardent-ament-cmake-export-include-directories ros-ardent-demo-nodes-py ros-ardent-python-cmake-module ros-ardent-rviz-rendering
ros-ardent-ament-cmake-export-interfaces ros-ardent-depthimage-to-laserscan ros-ardent-rcl ros-ardent-rviz-rendering-tests
ros-ardent-ament-cmake-export-libraries ros-ardent-depthimage-to-pointcloud2 ros-ardent-rclcpp ros-ardent-rviz-yaml-cpp-vendor
ros-ardent-ament-cmake-export-link-flags ros-ardent-diagnostic-msgs ros-ardent-rclcpp-lifecycle ros-ardent-sensor-msgs
ros-ardent-ament-cmake-flake8 ros-ardent-dummy-map-server ros-ardent-rcl-interfaces ros-ardent-shape-msgs
ros-ardent-ament-cmake-gmock ros-ardent-dummy-robot-bringup ros-ardent-rcl-lifecycle ros-ardent-sros2
ros-ardent-ament-cmake-gtest ros-ardent-dummy-sensors ros-ardent-rclpy ros-ardent-std-msgs
ros-ardent-ament-cmake-include-directories ros-ardent-example-interfaces ros-ardent-rcutils ros-ardent-std-srvs
ros-ardent-ament-cmake-libraries ros-ardent-examples-rclcpp-minimal-client ros-ardent-resource-retriever ros-ardent-stereo-msgs
ros-ardent-ament-cmake-lint-cmake ros-ardent-examples-rclcpp-minimal-composition ros-ardent-rmw ros-ardent-teleop-twist-joy
ros-ardent-ament-cmake-nose ros-ardent-examples-rclcpp-minimal-publisher ros-ardent-rmw-fastrtps-cpp ros-ardent-teleop-twist-keyboard
ros-ardent-ament-cmake-pep257 ros-ardent-examples-rclcpp-minimal-service ros-ardent-rmw-implementation ros-ardent-test-msgs
ros-ardent-ament-cmake-pep8 ros-ardent-examples-rclcpp-minimal-subscriber ros-ardent-rmw-implementation-cmake ros-ardent-tf2
ros-ardent-ament-cmake-pyflakes ros-ardent-examples-rclcpp-minimal-timer ros-ardent-rmw-opensplice-cpp ros-ardent-tf2-eigen
ros-ardent-ament-cmake-pytest ros-ardent-examples-rclpy-executors ros-ardent-robot-state-publisher ros-ardent-tf2-geometry-msgs
ros-ardent-ament-cmake-python ros-ardent-examples-rclpy-minimal-client ros-ardent-ros1-bridge ros-ardent-tf2-msgs
ros-ardent-ament-cmake-ros ros-ardent-examples-rclpy-minimal-publisher ros-ardent-ros2cli ros-ardent-tf2-ros
ros-ardent-ament-cmake-target-dependencies ros-ardent-examples-rclpy-minimal-service ros-ardent-ros2msg ros-ardent-tinyxml2-vendor
ros-ardent-ament-cmake-test ros-ardent-examples-rclpy-minimal-subscriber ros-ardent-ros2node ros-ardent-tinyxml-vendor
ros-ardent-ament-cmake-uncrustify ros-ardent-fastcdr ros-ardent-ros2pkg ros-ardent-tlsf
ros-ardent-ament-copyright ros-ardent-fastrtps ros-ardent-ros2run ros-ardent-tlsf-cpp
ros-ardent-ament-cppcheck ros-ardent-fastrtps-cmake-module ros-ardent-ros2service ros-ardent-topic-monitor
ros-ardent-ament-cpplint ros-ardent-geometry-msgs ros-ardent-ros2srv ros-ardent-trajectory-msgs
ros-ardent-ament-flake8 ros-ardent-gmock-vendor ros-ardent-ros2topic ros-ardent-turtlebot2-amcl
ros-ardent-ament-index-cpp ros-ardent-gtest-vendor ros-ardent-rosidl-cmake ros-ardent-turtlebot2-cartographer
ros-ardent-ament-index-python ros-ardent-image-geometry ros-ardent-rosidl-default-generators ros-ardent-turtlebot2-drivers
ros-ardent-ament-lint-auto ros-ardent-image-tools ros-ardent-rosidl-default-runtime ros-ardent-turtlebot2-follower
ros-ardent-ament-lint-cmake ros-ardent-intra-process-demo ros-ardent-rosidl-generator-c ros-ardent-turtlebot2-teleop
ros-ardent-ament-lint-common ros-ardent-joy ros-ardent-rosidl-generator-cpp ros-ardent-uncrustify
ros-ardent-ament-package ros-ardent-kdl-parser ros-ardent-rosidl-generator-dds-idl ros-ardent-urdf
ros-ardent-ament-pep257 ros-ardent-launch ros-ardent-rosidl-generator-py ros-ardent-urdfdom
ros-ardent-ament-pep8 ros-ardent-launch-testing ros-ardent-rosidl-parser ros-ardent-urdfdom-headers
ros-ardent-ament-pyflakes ros-ardent-libcurl-vendor ros-ardent-rosidl-typesupport-c ros-ardent-visualization-msgs
ros-ardent-ament-tools ros-ardent-lifecycle ros-ardent-rosidl-typesupport-cpp
3. 環境設定
這個也和ROS 1是保持一致的,如下:
$ source /opt/ros/ardent/setup.bash
如果有Python包argcomplete(版本0.8.5或更高),可以匯入如下檔案獲取命令列工具:
$ source /opt/ros/ardent/share/ros2cli/environment/ros2-argcomplete.bash
4. 選擇RMW實現
預設情況下,RMW使用FastRPTS,通過設定環境變數RMW_IMPLEMENTATION=rmw_opensplice_cpp,可以切換為OpenSplice。
5. 使用ROS 1功能包的附加包
在ROS 2和ROS 1都安裝配置完成的系統,可以通過ros1_bridge同時使用,如果使用Docker可以避免環境之間的切換等配置,安裝如下包:
$ sudo apt install ros-ardent-ros1-bridge ros-ardent-turtlebot2-*
如果之前安裝過ROS 2 b3版本,在配置時會出現一些警告,最佳解決方法是解除安裝beta版本。
$ source /opt/ros/ardent/setup.bash
Warning: OSPL_URI was already set to [[file:///opt/ros/r2b3/share/opensplice_cmake_module/config/ros_ospl.xml]]. This will not override it to the default [[file:///opt/ros/ardent/share/opensplice_cmake_module/config/ros_ospl.xml]]. Please make sure this is the config that you want.
$ sudo apt-get remove ros-r2b3-*
6. 測試
使用訊息收發進行測試,如下,如正常則安裝完成,進入教程進行學習:
原始碼安裝請參考官網,推薦優先閱讀官網。
----
----
ROS 1和ROS 2之間的區別
本文概述了ROS 2與ROS 1相比所做的更改。
原作者:德克托馬斯
前言
儘可能簡短地描述每一個變化,但是給熟悉ROS 1的讀者提供足夠的上下文和理由。如果有更多的外部資訊可用(例如其他文章),應該將其連結到。
某些描述的功能尚不可用,並標有⏳。
平臺和依賴關係
平臺
ROS 1僅在Ubuntu上進行CI測試。社群在其他Linux版本以及OS X上積極支援。
ROS 2目前在Ubuntu Xenial,OS X El Capitan以及Windows 10上進行了CI測試和支援(請參閱ci.ros2.org)。
語言
C ++標準
ROS 1的核心是針對C ++ 03,並沒有在其API中使用C ++ 11功能。ROS 2廣泛使用C ++ 11,並使用C ++ 14的某些部分。在未來,ROS 2可能會開始使用C ++ 17,只要它在所有主要平臺上受支援。
Python
ROS 1是針對Python 2. ROS 2至少需要Python版本3.5。
重用現有的中介軟體
ROS 1使用自定義序列化格式,自定義傳輸協議以及自定義中央發現機制。ROS 2有一個抽象的中介軟體介面,通過它提供序列化,傳輸和發現。目前這個介面的所有實現都是基於DDS標準的。這使得ROS 2能夠提供各種服務質量的策略,從而改善通過不同網路的通訊。
建立系統
有關構建系統的更多資訊,請參見柔夷花序Catkin文章。
支援CMake旁邊的其他構建系統
每個ROS包都是一個CMake專案。在ROS 2中,可以輕鬆地支援其他構建系統。現在構建工具支援CMake旁邊的純Python包。
Python包
在ROS 1中,使用Python程式碼的軟體包只能使用setup.py檔案中可用功能的一小部分,因為setup.py檔案是由CMake內的自定義邏輯處理的。在ROS 2中,一個Python包可以使用setup.py檔案中的任何東西,例如入口點,因為它們被呼叫python3 setup.py install
。
環境設定
在ROS 1中,構建工具會生成指令碼,這些指令碼必須來源以便在能夠使用構建的ROS軟體包之前設定環境。這種方法只有在使用ROS特定的構建工具構建ROS包時才有效。
在ROS 2中,環境設定分為特定於包的指令碼和特定於工作空間的指令碼。每個軟體包都提供了必要的指令碼,使其在構建後可用。構建工具只調用特定於工作空間的指令碼,然後呼叫特定於包的指令碼。
沒有非隔離的構建
在ROS 1中,可以在單個CMake上下文中構建多個包。雖然這加快了構建步驟,但是每個包都需要確保正確定義了交叉包目標依賴關係。另外所有的軟體包共享相同的名稱空間,導致目標名稱衝突等。
在ROS 2中,只支援隔離的構建,即每個包都是獨立構建的。安裝空間可以是隔離的或合併的。
沒有開發空間
在ROS 1中,可以在不安裝包的情況下構建包。從開發空間與源空間結合起來,系統已經可以使用。但是每個軟體包都必須積極支援開發空間,例如環境鉤子和CMake程式碼。
在ROS 2中,必須先安裝一個軟體包,然後才能使用它。
ROS 1中的開發空間的一個原因是使開發人員能夠更改檔案,例如Python程式碼或啟動檔案,並直接使用修改後的程式碼,而無需重新編譯軟體包。在ROS 2中保留了這個好處,可以選擇性地用符號連結替換安裝步驟中的複製操作。
支援catkin_simple用例
在ROS 1中,包catkin_simple旨在使編寫ROS包的CMake程式碼變得更容易。在許多情況下,它不能實現這個目標,這通常是由於像開發空間這樣的支援功能所必需的設計的限制。
在ROS 2中,CMake API進行了重組,以支援這個用例。
對沒有清單的軟體包的最小支援
在ROS 1中,構建系統只考慮具有清單檔案的包。在ROS 2中,可以在沒有清單檔案的資料夾中檢測具有支援的構建系統的包。如果軟體包遵循慣例,甚至有可能檢測到一些缺失的元資訊(如依賴關係)。
訊息,服務
有關更多資訊,請參閱ROS介面定義文章。
C ++中的分隔名稱空間
在ROS 1中,.msg和.srv檔案可以具有相同的名稱,但生成的程式碼會發生衝突。請求和響應部分的服務也是如此。
在ROS 2中,生成的程式碼使用單獨的名稱空間來保證它是無衝突的。
Python中的同名
為訊息和服務生成的Python程式碼當前在ROS 1和ROS 2中使用相同的模組和類名稱。因此,它們不能在單個應用程式中匯入。如果需要,這個決定可能會被重新審視。
訊息定義中的可選預設值
在ROS 2中,訊息中的原始值現在可以具有預設值,在訊息構建時設定。非原始欄位(即字串陣列,巢狀訊息)的預設值不可能(⏳)。
陣列和字串的可選上限
為了計算訊息在記憶體中的最大大小,這是必要的,這允許用動態大小預分配訊息。這對效能和實時用例很有用。
統一持續時間和時間型別
在ROS 1中,持續時間和時間型別是在客戶端庫中定義的。資料結構的成員名稱在C ++(sec,nsec)和Python(secs,nsecs)中是不同的。
在ROS 2中,這些型別被定義為訊息,因此在不同的語言中是一致的。
從標題訊息中刪除序列欄位
該領域已被棄用了很長一段時間,並沒有在ROS 1中一貫設定。
客戶端庫
跨語言
主題名稱空間(⏳)
目前ROS 2不支援主題名稱中的名稱空間。這主要是由於DDS主題名稱中有效字元的限制。一個設計文件描述瞭如何在未來應該加入。
通知
在ROS 1中,關於ROS圖的所有資訊都必須從主站查詢。在ROS 2中,更改將釋出,例如,如果引數已更改,則會發出通知。
具有生命週期的元件
在ROS 1中,每個節點通常都有自己的主要功能。在ROS 2中,建議從具有生命週期的元件中繼承子類。
生命週期可以被像roslaunch這樣的工具用來以確定性的方式啟動一個由許多元件組成的系統(⏳)。
有關更多資訊,請參閱節點生命週期文章。
引數和動態重新配置
在ROS 1中,全域性引數和節點特定的動態重新配置引數是兩個單獨的概念。在ROS 2中,正在使用統一的方法。它類似於動態重新配置,名為“全域性引數伺服器”(⏳)的節點將接受無條件設定值的請求。在ROS 1中,所有這些資訊都需要被調查,因為ROS 2的變化將被公佈以通知其他實體。
欲瞭解更多資訊,請參閱引數設計文章。
行動(⏳)
ROS 2目前沒有行動的概念。它將在未來作為可搶佔伺服器和反饋釋出者的組合加入。
執行緒模型
在ROS 1中,開發人員只能選擇單執行緒執行或多執行緒執行。在ROS 2中,更多的粒度執行模型可以在C ++中使用(例如跨越多個節點),並且自定義執行器可以輕鬆實現。對於Python來說,執行模型還沒有實現。
ROS圖表
在ROS 1中,節點和主題只能在啟動時重新對映。在ROS 2中,對重對映的支援尚未實現(⏳)。目標是啟用重新對映以及別名,不僅在啟動時間,而且在執行時。
在ROS 1中,節點名稱是唯一的,當啟動具有相同名稱的新節點時,通過關閉現有節點來強制實施。在ROS 2中,節點名稱的唯一性還沒有被強制執行。
C和C ++
支援實時
ROS 1不支援編寫實時程式碼,而是依賴於Orocos等外部框架。在ROS 2中,當使用合適的RTOS和仔細編寫的使用者程式碼時,可以編寫實時節點。
C ++
節點與Nodelet
在ROS 1中,節點和節點的API是不同的,並且需要開發者在程式設計時決定節點到程序的對映。在ROS 2中,建議將每個元件編譯成一個共享庫,然後可以在單獨的程序中載入它,或與其他元件(如ROS 1 nodelets)共享相同的程序。這使得可以在部署時選擇流程佈局。
每個程序允許多個節點
在ROS 1中,不可能在一個程序中建立多個節點。這是由於API本身,也是由於內部的實施決定。在ROS 2中,可以在一個程序中建立多個節點。
工具
roslaunch(⏳)
在ROS 1中,roslaunch檔案是用XML定義的,功能非常有限。在ROS 2中,啟動檔案是用Python編寫的,可以使用更復雜的邏輯,如條件等。當前狀態只提供最小的功能來執行使用多個程序的測試。
資源查詢
在ROS 1中,通過基於ROS_PACKAGE_PATH搜尋檔案系統來查詢各種資源(包,訊息,外掛等)。當ROS_PACKAGE_PATH中的樹很大時,這可能導致效能較差,並且快取產生不一致的狀態。
在ROS 2中,資源可以在編譯時在索引處註冊,然後在執行時被有效查詢。有關更多資訊,請參閱資源索引的文件。
打包
ABI版本控制(⏳)
由於它假定ABI不相容,ROS 1重建所有下游軟體包。為了避免這種大的開銷,ROS 2包應該能夠宣告它的ABI,以儘可能避免重建下游包。
Windows二進位制包(⏳)
ROS 1只能從Windows上的原始碼(也只適用於幾個ROS軟體包,不受支援)構建。ROS 2將提供基於Chocolatey的二進位制包。
附件(相關資料):
-ROS 2-
ROS 2
機器人作業系統(ROS)是一套軟體庫和工具,可幫助您構建機器人應用程式。從驅動程式到最先進的演算法,以及功能強大的開發人員工具,ROS都可以為您的下一個機器人專案提供所需的內容。這都是開源的。
在這裡,您將找到關於如何安裝和使用ROS 2的軟體的文件,ROS 2正在大力開發之中。請參閱下面有關ROS 2的更多資訊。
如果您正在尋找有關ROS 1的資訊(即,ROS已經存在10多年,現在可能會用到),請檢視ROS網站或文件wiki。
在繼續閱讀之前,請閱讀功能頁面以瞭解當前ROS 2版本的內容。
安裝
請參閱安裝頁面。
教程和功能
ROS 2正在大力發展。您可以檢查出的教程頁面看到一系列的什麼系統可以在當前狀態下做的,如果它適合你的工程例項今天取決於具體的要求。有關當前功能的詳細資訊,請參閱功能。
計劃
ROS 2目前計劃每六個月釋出一個新版本(這是ROS 1的兩倍),以便社群成員有機會提供有關不斷髮展的系統的早期反饋。有關即將推出的ROS 2功能的詳細資訊,請參閱路線圖。
約定
有關如何為ROS 2開發做出貢獻的詳細資訊,請參閱貢獻頁面和開發人員指南。
報告或提出問題
檢視聯絡頁面。
關於ROS 2
自2007年啟動ROS以來,機器人和ROS社群發生了很大變化。ROS 2專案的目標是適應這些變化,充分利用ROS 1的優點,改進不是什麼。有一個關於ROS 2的動機完整的文章在這裡。
在哪裡可以找到更多資訊
ROS 2的程式碼是開源的,分解成各種版本庫。您可以在ros2 github組織中找到大多數儲存庫的程式碼。
docs.ros2.org包含有關ROS 2內部設計和組織的最新詳細資訊。
awesome-ros2是ROS 2軟體包和資源的“備忘單”風格快速參考,它將獲得(希望)在精選列表的列表中列出,以幫助GitHub使用者瞭解ROS 2。
以下是關於ROS 2的ROSCon講座,並提供了有關ROS 2和各種演示工作的資訊:
標題 | 型別 | 連結 |
---|---|---|
ROS 2推動機器人發展未來的願景 | ROSCon 2017簡報 | 幻燈片/視訊 |
ROS 2更新 - alpha釋出摘要,架構概述 | ROSCon 2016簡報 | 幻燈片/視訊 |
評估ROS2通訊層的彈性 | ROSCon 2016簡報 | 幻燈片/視訊 |
ROS 2的狀態 - 演示和背後的技術 | ROSCon 2015簡報 | 幻燈片/視訊 |
ROS 2在“小型”嵌入式系統上 | ROSCon 2015簡報 | 幻燈片/視訊 |
ROS和ROS 2.0中的實時控制 | ROSCon 2015簡報 | 幻燈片 |