ROS 基礎(chǔ)

1. ROS 開發(fā)環(huán)境

1.1 安裝 ROS

Installation: http://wiki.ros.org/melodic/Installation/Ubuntu
Ubuntu 20.04 Install Ros:
https://blog.csdn.net/qq_44339029/article/details/108919545
https://blog.csdn.net/weixin_45168199/article/details/106910446

pycharm ros env setting:

# sudo vi /var/lib/snapd/desktop/applications/pycharm-community_pycharm-community.

update Exec:

[Desktop Entry]
X-SnapInstanceName=pycharm-community
Version=1.0
Type=Application
Name=PyCharm Community Edition
Icon=/snap/pycharm-community/232/bin/pycharm.png
#Exec=env BAMF_DESKTOP_FILE_HINT=/var/lib/snapd/desktop/applications/pycharm-community_pycharm-community.desktop /snap/bin/pycharm-community %f
Exec=bash -i -c "env BAMF_DESKTOP_FILE_HINT=/var/lib/snapd/desktop/applications/pycharm-community_pycharm-community.desktop /snap/bin/pycharm-community" %f
Comment=Python IDE for Professional Developers
Categories=Development;IDE;
Terminal=false
StartupWMClass=jetbrains-pycharm-ce
StartupNotify=true

# Setup your sources.list
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
# Set up your keys
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
   or
curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | sudo apt-key add -
# Installation
sudo apt update
sudo apt install ros-melodic-desktop-full
apt search ros-melodic
# sudo apt install ros-melodic-PACKAGE
e.g.
sudo apt install ros-melodic-slam-gmapping

1.2 配置ROS

初始化ros開發(fā)環(huán)境:

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

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

$ sudo rosdep init
$ rosdep update

解決sudo rosdep init和rosdep update的錯(cuò)誤

安裝ROS時(shí) sudo rosdep initsudo rosdep update 報(bào)錯(cuò):

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

https://site.ip138.com/raw.Githubusercontent.com/
輸入raw.githubusercontent.com
查詢IP地址
修改 /etc/hosts 直接在終端輸入
151.101.109.133 raw.githubusercontent.com

1. 工作空間 workspace

1.1 Create Workspace

$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace

1.2 Build Workspace

$ cd ~/catkin_ws
$ catkin_make

// 查看目錄結(jié)構(gòu)
$ tree -L 1 ~/catkin_ws
catkin_ws
├── build
├── devel
└── src

1.3 Init Workspace Env

$ source ~/catkin_ws/devel/setup.bash
// 查看工作空間環(huán)境變量(一層一層嵌套式的)
$ echo $/ROS_PACKAGE_PATH
/home/pi/catkin_ws/src:/opt/ros/melodic/share

2. 功能包 Package

2.1 自定義 Package

catkin_create_pkg <package_name> [depend1] [depend2] [depend3]

// Create
$ cd ~/catkin_ws/src
$ catkin_create_pkg learning_communication std_msgs rospy roscpp

// Build
$ cd ~/catkin_w
$ catkin_make

// Env
$ source ~/catkin_ws/devel/setup.bash

2.2 Ros 系統(tǒng)提供功能包

$ sudo apt-get install ros_melodic_ros_tutorials
$ rospack find roscpp_tutorials
/opt/ros/melodic/share/roscpp_tutorials

2.3 第三方開源 功能包

$ cd ~/catkin_ws/src
$ git clone git://github.com/ros/ros_tutorials.git
$ cd ~/catkin_ws
$ catkin_make
$ source ~/catkin_ws/devel/setup.bash
$ rospack find roscpp_tutorials
/home/pi/cue_ws/src/ros_tutorials/roscpp_tutorials

注意:工作空間覆蓋問題
在系統(tǒng)和不同工作空間中,功能包是可以重名的(本例中:roscpp_tutorials)。同名時(shí),會(huì)根據(jù)工作空間的覆蓋順序,優(yōu)先選擇最近工作空間里的功能包進(jìn)行使用。這是開發(fā)中需要關(guān)注的。避免功能包運(yùn)行在預(yù)期外的工作空間中。

3. Ros 架構(gòu)

3.1 Ros 基礎(chǔ)架構(gòu)設(shè)計(jì)

圖3-1 ROS 架構(gòu)

通信系統(tǒng): TCPROS/UDPROS

ROS 通信系統(tǒng),使用 發(fā)布/訂閱、客戶端/服務(wù)器 等模型,實(shí)現(xiàn)多種通信機(jī)制的數(shù)據(jù)傳輸。

跨進(jìn)程通信: Nodelet API

Ros Nodelet API 為多進(jìn)程通信提供一種更優(yōu)化的數(shù)據(jù)傳輸方式,適合對(duì)數(shù)據(jù)傳輸實(shí)時(shí)性有較高要求的應(yīng)用。

ROS 機(jī)器人開發(fā)相關(guān)庫(kù):Client Library

基于通信機(jī)制之上,ROS提供了大量機(jī)器人開發(fā)相關(guān)庫(kù),如數(shù)據(jù)類型定義、坐標(biāo)變換、運(yùn)動(dòng)控制等,可以提供給應(yīng)用層使用。

應(yīng)用層:Application Layer

在應(yīng)用層,ROS需要運(yùn)行一個(gè)管理者 -- Master,負(fù)責(zé)管理整個(gè)系統(tǒng)的正常運(yùn)行。ROS 社區(qū)提供了大量機(jī)器人應(yīng)用的功能包,這些功能包內(nèi)的模塊以節(jié)點(diǎn)為單位運(yùn)行,以ROS標(biāo)準(zhǔn)輸入輸出作為接口,讓開發(fā)者不需要關(guān)注模塊內(nèi)部的實(shí)現(xiàn)機(jī)制,只需要了解接口規(guī)則即可實(shí)現(xiàn)復(fù)用,極大的提高了工作效率。

從系統(tǒng)實(shí)現(xiàn)角度可以將ROS劃分為三個(gè)層次: 開源社區(qū)、文件系統(tǒng)、計(jì)算圖。


圖3-2 從系統(tǒng)實(shí)現(xiàn)角度可以將ROS劃分為三個(gè)層次

3.2 計(jì)算圖

從計(jì)算圖角度來看,ROS系統(tǒng)軟件的功能模塊以節(jié)點(diǎn)為單位獨(dú)立運(yùn)行,可以分布于多個(gè)相同或不同的主機(jī)中,在系統(tǒng)運(yùn)行時(shí)通過端對(duì)端的拓?fù)浣Y(jié)構(gòu)進(jìn)行連接。

// 計(jì)算圖查看工具
$ rqt_graph

3.2.1 節(jié)點(diǎn)(Node)

節(jié)點(diǎn)(Node)是執(zhí)行運(yùn)行任務(wù)的進(jìn)程,一個(gè)系統(tǒng)由多個(gè)節(jié)點(diǎn)構(gòu)成,也可以看作是軟件模塊。當(dāng)許多節(jié)點(diǎn)同時(shí)運(yùn)行時(shí),可以很方便的額將端對(duì)端的通信機(jī)制繪成節(jié)點(diǎn)關(guān)系圖。在這個(gè)圖中可以清晰看出節(jié)點(diǎn)(圈)和端對(duì)端的連接關(guān)系(節(jié)點(diǎn)間的連線)。


圖3-3 ROS 中的節(jié)點(diǎn)關(guān)系圖

3.2.2 消息(Message)

節(jié)點(diǎn)間通訊的通用數(shù)據(jù)結(jié)構(gòu)定義的封裝,可根據(jù)需求由開發(fā)者自定義。

3.2.3 話題(Topic)

消息以一種 發(fā)布/訂閱(Publish/Subscribe)的方式傳遞。數(shù)據(jù)以廣播的形式發(fā)布。這是一種單向的數(shù)據(jù)通信,發(fā)布者與訂閱者之間,訂閱者相互之間并不知道彼此的存在。


圖3-4 ROS中基于發(fā)布/訂閱模型的通信

3.2.4 服務(wù)(Service)

雙向同步傳輸,在ROS中,采用Service?;贑lient / Server模型實(shí)現(xiàn)。類似于Web服務(wù),包含兩部分通信數(shù)據(jù)類型:request / response。 ROS 只允許一個(gè)節(jié)點(diǎn)提供一個(gè)指定命名的服務(wù)。

3.2.5 節(jié)點(diǎn)管理器(ROS Master)

ROS Master 通過RPC調(diào)用,提供登記列表和對(duì)其他計(jì)算圖表查詢的功能,幫助ROS節(jié)點(diǎn)之間互相查找、建立連接。同時(shí)還未系統(tǒng)提供參數(shù)服務(wù)器,管理全局參數(shù)。ROS Master是一個(gè)管理者,沒有他,節(jié)點(diǎn)無法找到彼此,無法交換消息或調(diào)用服務(wù),整個(gè)系統(tǒng)將會(huì)癱瘓。

3.3 文件系統(tǒng)

參考:http://niehen.cn/ros/ros-file-system/

Catkin

對(duì)于ROS這樣大體量的平臺(tái)來說,就采用的是CMake,并且ROS對(duì)CMake進(jìn)行了擴(kuò)展,于是便有了Catkin編譯系統(tǒng)
CMake 是一個(gè)跨平臺(tái)的安裝工具,可以用最簡(jiǎn)單的語(yǔ)句來描述所有平臺(tái)的安裝,為軟件跨平臺(tái)創(chuàng)建而生。


enter description here

一個(gè)Catkin的軟件包(package)必須要包括兩個(gè)文件:
package.xml
CMakeLists.txt

catkin編譯的工作流程如下:
1.首先在工作空間catkin_ws/src/下遞歸的查找其中每一個(gè)ROS的package。
2.package中會(huì)有package.xml和CMakeLists.txt文件,Catkin(CMake)編譯系統(tǒng)依據(jù)CMakeLists.txt文件,從而生成makefiles(放在catkin_ws/build/)。
3.然后make剛剛生成的makefiles等文件,編譯鏈接生成可執(zhí)行文件(放在catkin_ws/devel)。

也就是說,Catkin就是將cmake與make指令做了一個(gè)封裝從而完成整個(gè)編譯過程的工具。

初始化Catkin工作空間
輸入下列指令,完成初始創(chuàng)建。

mkdir -p ~/catkin_ws/src  
cd ~/catkin_ws/
catkin_make #初始化工作空間

第一行代碼直接創(chuàng)建了第二層級(jí)的文件夾src,這也是我們放ROS軟件包的地方。第二行代碼使得進(jìn)程進(jìn)入工作空間,然后再是catkin_make。

進(jìn)行編譯
用catkin編譯一個(gè)工程或軟件包,只需要用catkin_make指令,一般當(dāng)我們寫完代碼,執(zhí)行一次catkin_make進(jìn)行編譯,調(diào)用系統(tǒng)自動(dòng)完成編譯和鏈接過程,構(gòu)建生成目標(biāo)文件.

cd ~/catkin_ws #回到工作空間,catkin_make必須在工作空間下執(zhí)行
catkin_make #開始編譯
source ~/catkin_ws/devel/setup.bash #刷新壞境

顯示文件結(jié)構(gòu)
在工作空間下用tree命令,。

cd ~/catkin_ws
sudo apt install tree
tree

通過tree命令可以看到catkin工作空間的結(jié)構(gòu),它包括了src、build、devel三個(gè)路徑
src/: ROS的catkin軟件包(源代碼包)
build/: catkin(CMake)的緩存信息和中間文件
devel/: 生成的目標(biāo)文件(包括頭文件,動(dòng)態(tài)鏈接庫(kù),靜態(tài)鏈接庫(kù),可執(zhí)行文件等)、環(huán)境變量


enter description here

平常主要用到的是src文件夾
我們寫的ROS程序、網(wǎng)上下載的ROS源代碼包都存放在這里。
在編譯時(shí),catkin編譯系統(tǒng)會(huì)遞歸的查找和編譯src/下的每一個(gè)源代碼包

package

package是catkin工作空間的基本單元,我們?cè)赗OS開發(fā)時(shí),寫好代碼,然后catkin_make,系統(tǒng)就會(huì)完成所有編譯構(gòu)建的工作。

package結(jié)構(gòu)

enter description here

Package可以分為二進(jìn)制和源代碼。
二進(jìn)制包里面包括了已經(jīng)編譯完成,可以直接運(yùn)行的程序,一般是官方給的程序,無法修改查看源代碼 一般在/opt/ros/kinetic/中存放
源代碼是指第三方開發(fā)的,根據(jù)需求自己下載。通常放在 ~/catkin_ws/src,需要通過make/cmake/caktin 進(jìn)行編譯使用,可以進(jìn)行修改源代碼對(duì)于編譯工具軟件包等有依賴問題。

package相關(guān)命令
rospack是對(duì)package管理的工具,命令的用法如下:
rostopic命令 | 作用
——— |————
rospack help | 顯示rospack的用法
rospack list | 列出本機(jī)所有package
rospack depends [package] | 顯示package的依賴包
rospack find [package] |定位某個(gè)package
rospack profile |刷新所有package的位置記錄
以上命令如果package缺省,則默認(rèn)為當(dāng)前目錄(如果當(dāng)前目錄包含package.xml)
roscd命令類似與Linux系統(tǒng)的cd,改進(jìn)之處在于roscd可以直接cd到ROS的軟件包。
rosls也可以視為L(zhǎng)inux指令ls的改進(jìn)版,可以直接lsROS軟件包的內(nèi)容。
rosdep是用于管理ROS package依賴項(xiàng)的命令行工具,用法如下
rostopic命令 | 作用
——— |————
roscd [pacakge] |cd到ROS package所在路徑
rosls命令 | 作用
rosls [pacakge] | 列出pacakge下的文件
rosdep命令 | 作用
rosdep check [pacakge] |檢查package的依賴是否滿足
rosdep install [pacakge]| 安裝pacakge的依賴
rosdep db |生成和顯示依賴數(shù)據(jù)庫(kù)
rosdep init |初始化/etc/ros/rosdep中的源
rosdep keys |檢查package的依賴是否滿足
rosdep update |更新本地的rosdep數(shù)據(jù)庫(kù)
一個(gè)較常使用的命令是rosdep install –from-paths src –ignore-src –rosdistro=kinetic -y,用于安裝工作空間中src路徑下所有package的依賴項(xiàng)(由pacakge.xml文件指定)。

package.xml

包括了package的描述信息,name, description, version, maintainer(s), license,opt. authors, url’s, dependencies, plugins, etc…
實(shí)際上rospack find、rosdep等命令之所以能快速定位和分析出package的依賴項(xiàng)信息,就是直接讀取了每一個(gè)pacakge中的package.xml文件
包含的標(biāo)簽有


enter description here

run_depend 也是運(yùn)行依賴 不過是上一版本的標(biāo)簽,也能共用。
示例 小海龜?shù)膒ackage.xml 部分文件


enter description here

可以使用 rospack find turtlesim 找到包的位置 或者 roscd turtlesim 直接找到該目錄下

CMakeLists.txt: 構(gòu)建package所需的CMake文件,調(diào)用Catkin的函數(shù)/宏,解析package.xml,找到其他依賴的catkin軟件包,將本軟件包添加到環(huán)境變量。

總體結(jié)構(gòu)如下


enter description here

對(duì)于CMake的語(yǔ)法可以參考 《CMake實(shí)踐》
示例 :

enter description here

這是小海龜?shù)腃makelists.txt 文件的一部分,具體可以到
/opt/ros/kinetic/share/turtlesim 中查看

launch文件

一般launch文件中會(huì)指定要啟動(dòng)哪些package下的哪些可執(zhí)行程序,指定以什么參數(shù)啟動(dòng),以及一些管理控制的命令。 launch文件通常放在軟件包的launch/路徑中中。

ROS為我們提供了一個(gè)命令能一次性啟動(dòng)master和多個(gè)node。該命令是:
$ roslaunch pkg_name file_name.launch
roslaunch就像是一個(gè)啟動(dòng)工具,能夠一次性把多個(gè)節(jié)點(diǎn)按照我們預(yù)先的配置(寫入launch文件中)啟動(dòng)起來

launch文件同樣也遵循著xml格式規(guī)范,是一種標(biāo)簽文本,它的格式包括以下標(biāo)簽:


enter description here

參考鏈接:

示例
launch文件的寫法和格式看起來內(nèi)容比較復(fù)雜,我們先來介紹一個(gè)最簡(jiǎn)單的例子如下:


enter description here

這是官網(wǎng)給出的一個(gè)最小的例子,文本中的信息是,它啟動(dòng)了一個(gè)單獨(dú)的節(jié)點(diǎn)talker,該節(jié)點(diǎn)是包rospy_tutorials軟件包中的節(jié)點(diǎn)。
但是實(shí)際比這個(gè)更為復(fù)雜

元功能包 Metapackage

功能包集,就是將多個(gè)功能接近,相互依賴的軟件包放到一個(gè)集合中去。
ros中常用的Metapackage有

Metapacakge名稱 描述
navigation 導(dǎo)航相關(guān)的功能包集
moveit 運(yùn)動(dòng)規(guī)劃相關(guān)的(主要是機(jī)械臂)功能包集
image_pipeline 圖像獲取、處理相關(guān)的功能包集
vision_opencv ROS與OpenCV交互的功能包集
turtlebot Turtlebot機(jī)器人相關(guān)的功能包集
pr2_robot pr2機(jī)器人驅(qū)動(dòng)功能包集

metapacakge中的 package.xml文件,CMakeLists.txt 文件 和普通pacakge不同點(diǎn)是:
CMakeLists.txt:加入了catkin_metapackage()宏,指定本軟件包為一個(gè)metapacakge。
package.xml:標(biāo)簽將所有軟件包列為依賴項(xiàng),標(biāo)簽中添加標(biāo)簽聲明。
metapacakge在我們實(shí)際開發(fā)一個(gè)大工程時(shí)可能有用

4. ROS2 升級(jí)

https://blog.csdn.net/weixin_36628778/article/details/104751581

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容