【Beginner Level】ROS入門教程(一)
本文為原創部落格, 轉載請註明出處:https://blog.csdn.net/q_z_r_s
參考自:http://wiki.ros.org/ROS/Tutorials
Core ROS 教程(新手)
1. 安裝和配置ROS環境
1.1 管理ROS環境
確保ROS環境變數已被設定
printenv | grep ROS
#輸出如下
[email protected]:~$ printenv | grep ROS
ROS_ROOT=/opt/ros/indigo/share/ros
ROS_PACKAGE_PATH=/opt/ros/indigo/share:/opt/ros/indigo/stacks
ROS_MASTER_URI= http://localhost:11311
ROSLISP_PACKAGE_DIRECTORIES=
ROS_DISTRO=indigo
ROS_ETC_DIR=/opt/ros/indigo/etc/ros
1.2 建立ROS工作空間
關於catkin和rosbuild的選擇
ROS Indigo釋出於2014年, ROS Groovy釋出於2012, 根據官網說明, ROS Groovy及其之後的版本使用catkin, ROS Fuerte及更老的版本使用rosbuild, 因此, 我這裡使用catkin
$ mkdir -p ~/catkin_ws/src $ cd ~/catkin_ws/ $ catkin_make
在工作空間中首次執行catkin_make
命令後, 它會在./src
目錄下建立一個CMakeLists.txt.
[email protected]:~/catkin_ws$ ls
build devel src
在devel
資料夾中, 有幾個setup.*sh
的檔案, source
任何一個, 都將覆蓋工作空間頂層環境
$ source devel/setup.bash
輸入以下命令, 確保ROS_PACKAGE_PATH
環境變數包含了當前路徑
$ echo $ROS_PACKAGE_PATH
/home/youruser/catkin_ws/src:/opt/ros/kinetic/share
#自己新增的, 非官網
[email protected]:~/catkin_ws$ printenv | grep ROS
ROS_ROOT=/opt/ros/indigo/share/ros
ROS_PACKAGE_PATH=/home/linux/catkin_ws/src:/opt/ros/indigo/share:/opt/ros/indigo/stacks
ROS_MASTER_URI=http://localhost:11311
ROSLISP_PACKAGE_DIRECTORIES=/home/linux/catkin_ws/devel/share/common-lisp
ROS_DISTRO=indigo
ROS_ETC_DIR=/opt/ros/indigo/etc/ros
通過對比, 僅有ROS_PACKAGE_PATH
和ROSLISP_PACKAGE_DIRECTORIES
發生了變化
2. ROS檔案系統
2.1 安裝ros-indigo-ros-turorials(安裝ROS時已經安裝過了)
sudo apt-get install ros-indigo-ros-tutorials
2.2 檔案系統概念
- Packages: Packages是ROS程式碼的軟體單元的一種組織方式, 每個Package可以包含庫, 可執行程式, 指令碼等.
- Manifests(package.xml): manifest(中文: 清單)是一個package的描述檔案. 它定義了包之間的依賴, 並用來捕獲包的元資訊(meta information, 元資料是關於資料的組織、資料域及其關係的資訊,簡言之,元資料就是關於資料的資料。), 例如版本, 維護者, 證書等等.
2.3 檔案系統工具
ROS程式碼分佈於很多packages
中, 使用諸如ls
和cd
這樣命令列來進行檔案導航是及其繁瑣乏味的, 因此ROS提供了相關的工具來使用
-
使用rospack
rospack可以獲得有關packages的資訊, 此處展示
find
命令, 幫助命令為rospack help
[email protected]:~/catkin_ws$ rospack find roscpp /opt/ros/indigo/share/roscpp
-
使用roscd
roscd是rosbash的一部分, 此命令可以讓你直接把目錄改變到一個package中或一個stack中
#語法, 可以直接進入某個package資料夾中 roscd [locationname[/subdir]] [email protected]:~/catkin_ws$ roscd roscpp [email protected]:/opt/ros/indigo/share/roscpp$ pwd /opt/ros/indigo/share/roscpp
注: 和其他ROS工具類似, roscd只尋找
ROS_PACKAGE_PATH
所列出路徑, 其中的每個路徑用:
來分隔. -
roscd log
此命令會進入ROS儲存log的資料夾, 如果執行此命令之前名優執行過ROS程式, 此命令會報錯, 找不到此資料夾.
[email protected]:/opt/ros/indigo/share/roscpp$ roscd log No active roscore bash: cd: /home/linux/.ros/log: 沒有那個檔案或目錄
-
使用rosls
rosls與roscd類似, 不多介紹.
-
Tab補全
rosls, roscd, TAB都與Linux shell提供了同樣的功能, 不多介紹
2.4 總結
- rospack = ros + pack(age)
- roscd = ros + cd
- rosls = ros + ls
此類明明風格在ROS工具中很常用.
3. 建立ROS Package
此章節使用roscreate-pkg
或catkin
建立一個新的package, 並用rospack列出包的的依賴關係.
3.1 一個catkin package的組成
-
必須包含一個catkin相容的package.xml檔案
-
必須包含一個使用catkin的CMakeLists.txt
-
每個package必須有自己的資料夾: 這意味著沒有巢狀的包,也沒有共享同一目錄的多個包.
最簡單的package如下:
my_package/ CMakeLists.txt package.xml
3.2 catkin工作空間中的package
使用catkin packages工作的推薦方式是使用catkin工作空間, 當然也可以單獨建立一個catkin package. 一個普通的工作空間大概如下:
workspace_folder/ -- WORKSPACE
src/ -- SOURCE SPACE
CMakeLists.txt -- 'Toplevel' CMake file, provided by catkin
package_1/
CMakeLists.txt -- CMakeLists.txt file for package_1
package.xml -- Package manifest for package_1
...
package_n/
CMakeLists.txt -- CMakeLists.txt file for package_n
package.xml -- Package manifest for package_n
3.3 建立一個catkin Package
-
建立工作空間的方法見:
1.2 建立ROS工作空間
-
catkin_create_pkg <package_name> [depend1][depend2] [depend3]
$ cd ~/catkin_ws/src $ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
3.4 編譯catkin工作空間並source
$ cd ~/catkin_ws
$ catkin_make
$ . ~/catkin_ws/devel/setup.bash
3.5 package依賴
-
一級依賴:
$ rospack depends1 beginner_tutorials
此命令的輸出與穿件package時傳入的引數一致, 這些對packages的依賴儲存在package.xml中.
-
間接依賴:
$ rospack depends1 rospy
大多數情況下, 一個依賴項都會有它自己的依賴. rospack可以遞迴檢測所有的巢狀依賴.
3.6 定製Package
-
定製package.xml
包括description, maintainer, license, dependencies(包括了buildtool_depend, build_depend, exec_depend)
-
定製CMakeLists.txt
4. 編譯ROS Package
4.1 編譯Packages
-
catkin_make可以看做是組合呼叫了標準Cmake工作流: cmake, make
# In a CMake project $ mkdir build $ cd build $ cmake .. $ make $ make install # (optionally) # In a catkin workspace $ catkin_make $ catkin_make install # (optionally)
catkin_make命令將編譯
src
目錄下的所有工程. 對於原始碼不在當前目錄下的使用方法為:# In a catkin workspace $ catkin_make --source my_src $ catkin_make install --source my_src # (optionally)
-
編譯Package
在當前工作空間中(~/catkin_ws/):
catkin_make
.
5. ROS Nodes
本節引入ROS graph的概念, 並探討roscore, rosnode, rosrun的使用.
5.1 Graph概念概覽
- Nodes: 一個node表示一個使用ROS來與其他nodes進行通訊的
可執行程式
. - Messages: ROS資料型別.
- Topics: Nodes可以向topic釋出訊息,也可以訂閱topic來接收訊息.
- Master: Name service for ROS(即幫助節點找到彼此).
- rosout: ROS下的stdout/stderr.
- roscore: Master + rosout + parameter server
5.2 Nodes
在ROS package中, 一個node實際上只不過是一個可執行檔案. ROS nodes使用ROS client library與其他nodes進行通訊. Nodes可以釋出和訂閱一個Topic. Nodes也可以提供或使用一個Service.
5.3 Client Libraries
ROS client library允許使用不同程式語言寫出來的nodes進行通訊
- rospy = python client library
- roscpp = c++ client library
5.4 roscore
roscore是當你使用ROS時第一個應該執行的東西
5.5 使用rosnode
rosnode顯示當前正在執行的有關ROS nodes的資訊
#列出活躍狀態的nodes
$ rosnode list
#顯示有關指定node的資訊
$ rosnode info /rosout
5.6 使用rosrun
rosrun允許使用package名來直接執行一個package中的node(不用非得知道package的路徑).
#Usage:
$ rosrun [package_name] [node_name]
#run the turtlesim_node in the turtlesim package
$ rosrun turtlesim turtlesim_node
ROS支援為node重新指定名字
$ rosrun turtlesim turtlesim_node __name:=my_turtle
[email protected]:~$ rosnode list
/my_turtle
/rosout
可以使用$ rosnode ping my_turtle
來測試是否真的跑起來了.
5.7 總結
- roscore = ros + core: master(prodives name service for ROS) + rosout(stdout/stderr) + parameter server.
- rosnode = ros + node: ROS tool to get information about a node.
- rosrun = ros + run: runs a node from a given package.
6. ROS Topics
本節引入ROS topics, 與此同時使用rostopic和rqt_plot工具.
6.1 準備工作
- 確保roscore在執行, 在一個新開啟終端輸入
roscore
可進行測試 - 執行
$ rosrun turtlesim turtlesim_node
- 執行
$ rosrun turtlesim turtle_teleop_key
, 使用方向鍵控制turtle移動
6.2 ROS Topics
-
使用
rqt-graph
rqt-graph
建立系統的一個動態圖.rtq-graph
是rqt package
的一部分, 安裝方法如下:$ sudo apt-get install ros-<distro>-rqt $ sudo apt-get install ros-<distro>-rqt-common-plugins
在新終端中輸入:
$ rosrun rqt_graph rqt_graph
會出現一個視覺化視窗, 顯示nodes之間的關係. -
引入
rostopic
rostopic
工具用來獲取ROS topics. -
使用
rostopic echo
rostopic echo
顯示釋出在一個topic上的資料, 只有在執行之後有新的訊息釋出到topic上時才會有輸出.#Usage: $ rostopic echo [topic] $ rostopic echo /turtle1/cmd_vel
-
使用
rostopic list
使用
$ rostopic list -v
列出所有的topics
6.3 ROS Messages
topics上的通訊是通過在nodes之間傳送ROS messages進行的. 釋出者和訂閱者必須傳送和接收同種型別的訊息. 這意味著, topic的型別是由釋出在其上的message型別定義的. message的型別可通過rostopic type [topic]
來查詢. 可以使用rosmsg show type
檢視資訊格式.
6.4 rostopic續
-
rostopic pub
可以在一個topic上釋出資料#Usage: $ rostopic pub [topic] [msg_type] [args] #雙短線表示後邊的不是命令選項 $ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
-
rostopic hz
報告資料釋出速率:$ rostopic hz [topic]
6.5 使用rqt_plot
使用指令: $ rosrun rqt_plot rqt_plot
, 新增需要檢視的topic即可.
7. ROS Services and Parameters
本節介紹ROS Services and Parameters, 與此同時使用rosservice和rosparam命令列工具. Services
是nodes間進行通訊的另一種方式, Services
允許nodes傳送一個請求(request和接收一個響應(response).
#Usage:
rosservice list [topic]#列出[topic]所提供的服務
rosservice type [service]#顯示服務型別
rosservice call [service] [args]#呼叫服務
#檢視帶引數的示例
rosservice find #find services by service type
rosservice uri #print service ROSRPC uri
$ rosservice type /spawn | rossrv show
float32 x
float32 y
float32 theta
string name
---
string name
$ rosservice call /spawn 2 2 0.2 ""#name field is optional
name: turtle2
rosparam
循序我們儲存和操作ROS Parameter Server
上的資料, Parameter Server
可以儲存整型, 浮點型, 布林型, 字典, 列表. rosparam
使用YAML
標記語言語法.
#Usage:
rosparam set [param_name] #set parameter
#設定引數之後使用/clear服務重新整理操作
$ rosservice call /clear
rosparam get [param_name] #get parameter
rosparam load #load parameters from file
rosparam dump #dump parameters to file
rosparam delete #delete parameter
rosparam list #list parameter names
#Usage:
rosparam dump [file_name] [namespace]
rosparam load [file_name] [namespace]
#write all the parameters to the file params.yaml
$ rosparam dump params.yaml
# load these yaml files into new namespaces, e.g. copy
$ rosparam load params.yaml copy
$ rosparam get /copy/background_b