ROS入门级教程
目錄
前言
一、ROS簡介與安裝
二、ROS文件系統
三、ROS核心概念
1.節點
2.話題
3.通訊機制
四、ROS的編譯與簡單使用
五、調試工具
1.Rviz和Gazebo
2.rqt工具
?3.rosbag
六、常用指令
1.常用的文件系統命令實踐
2.節點(Nodes)相關的命令
3.Topic 相關的命令
4.Message 相關的命令
5.Service 相關的命令
6.參數服務器相關的命令
總結
前言
????????本文講述ROS的入門級教程,介紹ROS的安裝,ROS程序的主體架構、核心概念、已有程序的編譯與使用、常用的調試工具和一些指令。
提示:系統配置:ubuntu18.04 + ROS Melodic
一、ROS簡介與安裝
????????Robot Operating System (ROS) 機器人操作系統的官方定義:
????????ROS 是面向機器人的開源的元操作系統(meta-operating system),它能夠提供與傳統操作系統類似的諸多功能,如硬件抽象、底層設備控制、常用功能實現、進程間消息傳遞和程序包管理等。此外,它還提供相關工具和庫,用于獲取、編輯、編譯代碼,以及在多臺計算機上運行程序,實現分布式計算。
????????第一代ROS僅支持安裝于ubuntu系統,第二代ROS2也支持windows等系統。ROS的版本受制于系統版本,如ubuntu18.04僅支持ROS Melodic,ubuntu20.04僅支持ROS Noetic。以下是具體安裝步驟:
??????? 1.安裝ubuntu系統,具體步驟略,以下以ubuntu18.04為例。
??????? 2.安裝ROS(Melodic)
??????????????? 2.1安裝ROS源文件,打開終端輸入:
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
#或者選用國內的軟件源,提高下載速度
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
??????????????? 2.2設置公鑰,繼續在終端輸入:
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
??????????????? 2.3更新最新可用軟件包列表,繼續在終端輸入:
sudo apt update
??????????????? 2.4安裝ROS,繼續在終端輸入,建議安裝完整版:
sudo apt install ros-melodic-desktop-full
??????????????? 2.5初始化 rosdep,繼續在終端輸入,這里使用不知名高手的方法有效規避墻:
sudo rosdepc init
rosdepc update
??????????????? 2.6設置環境,繼續在終端輸入:
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
??????? 3.測試,運行小海龜和rviz
??????? 3.1.1打開終端輸入
roscore
??????? 3.1.2再打開一個終端輸入
rosrun turtlesim turtlesim_node
??????? 3.1.3出現了一個小海龜,再打開一個終端輸入
rosrun turtlesim turtle_teleop_key
?????????讓光標在第三個打開的終端中閃爍,此時就可以通過方向鍵控制小烏龜移動了
?
??????? 3.2.1運行rviz
????????打開終端輸入
rosocre
??????? 3.2.2再打開一個終端輸入
rosrun rviz rviz (或者rviz)
?
?????????出現這個畫面說明rviz等組件安裝成功
???????? 4.退出ROS程序(進程)
將光標放入對應終端內,按Ctrl+C,適用于幾乎所有ROS程序
二、ROS文件系統
????????ROS 文件系統的主要目的是使創建的工程集中化,同時提供足夠的靈活性使依賴關系分散化。
?
?
????????Catkin 是 ROS定制的編譯構建系統,對CMake的擴展。總之,Catkin就是用來編譯ROS程序的。Catkin工作空間,就是一個文件夾。,組織和管理功能包的文件夾,以catkin工具編譯。對它的創建,克隆修改之類的,都在這個文件夾中完成。
????????Build:里面放的是c_make和catkin的緩存信息和中間文件。
????????Devel:存放目標文件,比如:頭文件,動態鏈接庫,靜態鏈接庫,可執行文件。
????????Src:是我們真正寫代碼的地方。我們只需要專注于src就可以了。
????????Package 是catkin編譯的基本單元。Catkin編譯的對象就是一個一個的package。Catkin在編譯的時候是在src目錄下,以遞歸形式查找每一個package,所以也可以將多個package放在一個folder下面。
?
三、ROS核心概念
1.節點
????????節點(Node)是ROS程序的運行實例(可執行文件的實例化),也可以理解為幾乎相互獨立的程序,不同節點實現不同功能,節點通過ROS節點管理器(Master)注冊信息,并且多個節點可同時運行。(另一角度定義,ROS 程序的運行實例,即一個進程,稱為節點。)
2.話題
????????話題(Topic)是節點之間通訊的橋梁,節點將消息發布到話題,同時也可以訂閱話題以接收消息。
3.通訊機制
????????ROS通訊采用分布式網絡結構,使用基于TCP(俗稱3次握手)的通信方式,實現模塊間點對點的連接。其通訊方式有以下幾種。
??????? 3.1基于話題(Topic)的通信
????????
????????①Talker(節點1)向Master(節點管理器)注冊發布者的信息,包含發布消息的話題名(此處為"bar",地址為"1234"),Master會將其儲存到注冊列表,等待接受此話題的Listener(節點2)。
????????②Listener向Master注冊接收者的信息,包含訂閱的話題名"bar"。
????????③Master根據Listener訂閱的話題在注冊列表尋找與之匹配的話題。如果沒有找到匹配的發布者,則等待發布者的加入,如果找到可以與之匹配的發布者信息,則向Listener發送Talker的地址信息"1234"。
????????④⑤⑥Listener接收到Talker的地址信息,就嘗試向Talker發送連接許可,當Talker與Listener互相確認信息后就建立連接(3次握手)。
????????⑦等連接成功后,Talker才向Listener發送消息(地址為"2345")。可以發現,話題在兩節點通訊之間用于相互驗證身份,起到橋梁作用。
????????需要注意的是,這兩個節點可以以任意順序開始、結束,不會導致任何錯誤,他們是相互獨立的。
??????? 3.2基于服務(Service)的通信
?
????????服務調用(service calls)是ROS另一種通信方法。它與話題通信的區別是:服務允許Client(節點1:客戶端)發送請求(request)到Server(節點2:服務器) 并獲得一個響應(response),服務調用是雙向的,且實現的是一對一的通信;對于話題,消息發布的節點不知道是否有其他節點訂閱了這個消息,而訂閱的節點也不知道是否有其他節點會發布這個消息,且同一個話題可以有很多個發布者和訂閱者。
????????服務的描述定義了ROS中需求和響應的數據結構,同消息類型一樣,服務數據類型也是由一系列域構成的。唯一的區別就在于服務數據類型分為兩部分,分別表示請求和響應。
????????3.3基于參數(Parameter)的通信
????????通過使用參數服務器(parameter server)來維護變量集的值,包括整數、浮點數、字符串以及其他數據類型。參數服務器允許節點主動查詢所需參數的值它們適用于配置那些不會隨時間頻繁變更的信息。
四、ROS的編譯與簡單使用
(這里只講述如何使用別人開發的ROS功能包,暫不講述如何自己開發)
1.創建一個workspace(工作空間)
打開終端依次執行:
#在/home/你的用戶名目錄/目錄下,新建一個文件夾
mkdir -p ~/catkin_ws/src
#進入到 ~/catkin_ws/src目錄下
cd ~/catkin_ws/src
#初始化workspace,執行完該命令后,src目錄下會多出一個 CMakeLists.txt 文件。
catkin_init_workspace
2.編譯package,生成可執行文件
#返回到上層目錄
cd ~/catkin_ws/
#編譯,執行完該命令后,發現工作空間catkin_ws中有三個目錄: build devel src,其中,src是我們創建工作空間時創建的目錄,另外兩個是執行完 catkin_make 后生成的。
catkin_make
3.運行ROS節點
#將對應的工作空間的路徑加入環境變量ROS_PACKAGE_PATH中。
source devel/setup.bash
#運行package功能包的node節點
rosrun package_name node_name
五、調試工具
1.Rviz和Gazebo
Rviz是一款3D可視化工具,強調把已有的數據可視化顯示。
Gazebo是3D物理仿真平臺,強調的是創建一個虛擬的仿真環境。
?Rviz需要已有的數據,而Gazebo可以創造數據。
我們可以在Gazebo中創建一個機器人世界,不僅可以仿真機器人的運動功能,還可以仿真機器人的傳感器數據,而這些數據就可以放到Rviz中顯示,所以使用gazebo的時候,經常也會和rviz配合使用。
2.rqt工具
①rqt_graph:查看節點之間的發布-訂閱關系。
?②rqt_plot:實時顯示一個發布到某個話題上的數據變化圖形。
?3.rosbag
????????包文件由 ROS 生成,可用于保存話題(Topic)和服務(Service)等傳輸的信息,采用 *.bag 文件格式。通常用于實驗數據的記錄和算法調試。
①錄制
#如果要記錄所有的topic,則可以直接使用-a來記錄
rosbag record -a
#如果僅記錄某些感興趣的topic的話,這可以使用下面這個命令樣式來進行記錄
rosbag record <topic_name> <topic_name>....
#如果要指定錄制文件名字的話,則使用-O/-o參數
rosbag record -O bagname.bag <topic_name> <topic_name>... #為文件命名
rosbag record -o bagname <topic_name> <topic_name>... #為文件名字做前綴
#其他錄制命令如下
rosbag record --duration=30 /topic_name #持續30s錄制,還可以指定m,h,和--split類似
rosbag record --split --size=1024 /topic_name1 #空間達到1024M后分文件存儲
rosbag record --split --duration=30 /topic_name1 #持續時間到30s后分文件存儲
rosbag record --split --duration=5m /topic_name1 #持續時間到5m后分文件存儲
rosbag record --split --duration=2h /topic_name1#持續時間到2h后分文件存儲
rosbag record -l 1000 /topic_name1? # 錄制該主題1000個消息限制
?②查看
當錄制好bag以后,可以利用info參數來查看bag的相關信息
rosbag info filename.bag
③播放
#當錄制好bag以后,可以利用play參數讓bag播放,回放bag中的topic
rosbag play <bagfile>
#如果想改變消息的發布速率,可以用下面的命令,-r 后面的數字對應播放速率
rosbag play -r 2 <bagfile>
#利用參數-l則可實驗循環播放
rosbag play -l <bagfile>
#如果只播放感興趣的 topic ,則用命令
rosbag play bag_name.bag --topics /topic_name1 /topic_name2
#開始播放立刻暫停,按空格繼續
rosbag play --pause bag_name.bag
#指定播放起始點
rosbag play bag_name.bag -s 5 #從5s的地方開始播放
#指定播放時長
rosbag play bag_name.bag -u 250 #播放250s信息
#發布時鐘,默認/clock話題是沒有消息的
rosbag play --clock bag_name.bag #默認/clock的話題頻率100hz
rosbag play --clock --hz 200 bag_name.bag #指定/clock的時鐘為200hz
④其他
#rosbag 重新索引是一個命令行工具,用于修復破損的袋文件如果某個包由于任何原因沒有清潔地關閉,則索引信息可能已損壞。使用此工具重新讀取消息數據并重新生成索引。
rosbag reindex old.bag
#重新錄制rostopic filter
#過濾單個topic
#生成的tf.bag僅包含/tf這一個topic
rosbag filter input.bag only-tf.bag "topic == '/tf'"???
#生成的output.bag包含‘/velodyne_point_cloud、/visensor/imu、/visensor/left/image_raw‘這三個topic
rosbag filter input.bag output.bag "topic == '/velodyne_point_cloud' or topic =='/visensor/imu' or topic == '/visensor/left/image_raw'" ?
?
#根據時間過濾:
rosbag filter input.bag output.bag "t.to_sec() <= 1284703931.86"
六、常用指令
1.常用的文件系統命令實踐
rospack find turtlesim
rosstack find ros_comm
rosls turtlesim
roscd turtlesim
pwd?? ??? ??? ??? ??? ??? ??? ?# 顯示當前所在目錄
cd | cd ~ | cd - | cd ..?? ?# 目錄跳轉
ls | ll?? ??? ??? ?# 列出目錄和文件
ps -ef?? ??? ??? ?# 以完整格式顯示所有進程信息
kill <pid>?? ?# 殺死指定進程
grep -rn 'publish' ./?? ?# 遞歸搜索當前目錄下包含#"publish"字符串的文件
2.節點(Nodes)相關的命令
rosrun <package-name> <executable-name>
rosnode help
rosnode list
rosnode info <node1> <node2> …
rosnode machine <machine-name>
rosnode ping <node-name>
rosnode kill <node-name>
rosnode cleanup
3.Topic 相關的命令
rostopic help
rostopic list
rostopic echo <topic-name>?? ??? ?# eg. /turtle1/pose
rostopic hz <topic-name>?? ??? ??? ?# eg. /turtle1/pose
rostopic bw <topic-name>?? ??? ?# eg. /turtle1/pose
rostopic info <topic-name>?? ??? ?# eg. /turtle1/cmd_vel
rostopic type <topic-name>?? ??? ?# eg. /turtle1/cmd_vel
rostopic find <message-type-name>
4.Message 相關的命令
rosmsg help
rosmsg list
rosmsg info <message-type>?? # eg. turtlesim/Pose
# 顯示指定軟件包中定義的所有消息
rosmsg package <package-name>
# 顯示定義了消息的所有軟件包
rosmsg packages
5.Service 相關的命令
rosservice help
rosservice list
rosnode info <node-name>?? ??? ??? ?# eg. /turtlesim
rosservice node <service-name>?? ?# eg. /clear
rosservice info <service-name>?? ?# eg. /clear
rossrv info <service-type-name>
rosservice call <service-name> [args …]
eg. rosservice call /clear?? ?# 清除運行軌跡
6.參數服務器相關的命令
rosparam help
rosparam list
rosparam get <param-name>?? ?# eg. background_b
rosparam set <param-name> <value>
rosservice call /clear?? ?#使背景色生效
總結
本篇介紹了ROS基本入門操作,只涉及ROS的安裝和使用已有的程序,暫未考慮開發。
總結
- 上一篇: 20180514-A · Star Wa
- 下一篇: 推荐——《梦想金山》