創(chuàng)建一個(gè)ROS Package
這個(gè)教程包括使用roscreate-pkg或者catkin去創(chuàng)建一個(gè)新的package,以及使用rospack去列出package的依賴锌云。在Indigo中,推薦使用catkin褂乍。
catkin package由什么組成
一個(gè)package被認(rèn)為是catkin packages必須滿足這些要求:
- a.必須包含一個(gè)catkin compliant(編譯) package.xml文件(提供關(guān)于package的元信息)持隧;
-
b.必須包含一個(gè)使用catkin的CMakeLists.txt文件。Cat
kin metapackages(元package)必須有一個(gè)CMakeLists.txt樣本文件逃片;
- c.在一個(gè)文件夾中不允許有超過(guò)兩個(gè)的package(這就著意味著沒有其他packages共享這個(gè)目錄)屡拨。
這個(gè)簡(jiǎn)單的package可能像這個(gè)樣子:
my_package/
CMakeLists.txt
package.xml
catkin工作空間中的packages
推薦使用catkin packages的方式是使用catkin工作空間,但是你也可以單獨(dú)使用catkin建立packages褥实。一般的工作空間看起來(lái)像這樣:
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
創(chuàng)建一個(gè)catkin package
這里將會(huì)用catkin_create_pkg腳本去創(chuàng)建一個(gè)新的catkin package呀狼。首先去到你之前創(chuàng)建的工作空間目錄,然后用catkin_create_pkg 腳本創(chuàng)建一個(gè)做“beginner_tutorials”的新package损离,它依賴于std_msgs哥艇,roscpp和roscpy,命令如下
$ cd ~/catkin_ws/src
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
現(xiàn)在創(chuàng)建了一個(gè) beginner_tutorials文件夾僻澎,包含有package.xml 貌踏、CMakeLists.txt文件,其中部分填寫了由你提供給catkin_create_pkg的信息怎棱。
catkin_create_pkg要求你提供一個(gè)package的名字和它所需要的依賴哩俭。它的用法如下:
$ catkin_create_pkg [package_name] [depend1] [depend2] [depend3]
在catkin/commands/catkin_create_pkg中有對(duì)catkin_create_pkg更加高級(jí)功能的描敘。
建立一個(gè)catkin工作空間并且啟用setup文件
現(xiàn)在需要在catkin工作空間編譯package拳恋。
$ cd ~/catkin_ws
$ catkin_make
執(zhí)行該命令后會(huì)在devel文件夾下生成一個(gè)和在/opt/ros/$ROSDISTRO_NAME(ROS版本名這里是/opt/ros/indigo)下相似的結(jié)構(gòu)凡资。
為把工作空間添加到ROS環(huán)境變量你需要執(zhí)行:
$ echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
# 使環(huán)境變量設(shè)置立即生效
$ source ~/.bashrc
# 使環(huán)境變量生效
$ source ~/catkin_ws/devel/setup.bash
# echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
# source ~/.bashrc
package的依賴
第一層依賴
用catkin_create_pkg時(shí),一些package提供了依賴谬运。這些第一層依賴可以通過(guò)rospack工具重現(xiàn)隙赁。注意,此處使用的命令選項(xiàng)是depends1
梆暖,而不是depends
伞访,depends1
是用來(lái)輸出第一層依賴關(guān)系的,而depends
是用來(lái)輸出所有遞歸以來(lái)關(guān)系的轰驳。
$ rospack depends1 beginner_tutorials
輸出:
roscpp
rospy
std_msgs
message_runtime
列出了運(yùn)行catkin_create_pkg命令時(shí)的一些依賴厚掷,這些依賴儲(chǔ)存在package.xml文件中。查看package.xml文件的命令如下:
$ roscd beginner_tutorials
$ cat package.xml
輸出:
<?xml version="1.0"?>
<package>
<name>beginner_tutorials</name>
<version>0.1.0</version>
<description>The beginner_tutorials package</description>
<maintainer email="skl338@todo.todo">skl338</maintainer>
<license>BSD</license>
<url type="website">http://wiki.ros.org/beginner_tutorials</url>
<author email="jane.doe@example.com">Jane Doe</author>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
<run_depend>roscpp</run_depend>
<run_depend>rospy</run_depend>
<run_depend>std_msgs</run_depend>
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>
</package>
間接依賴
許多情況下级解,依賴也有它的依賴冒黑。比如:
$ rospack depends1 rospy
輸出:
genpy
roscpp
rosgraph
rosgraph_msgs
roslib
std_msgs
rospack可以顯示所有遞歸的嵌套依賴。
$ rospack depends beginner_tutorials
輸出:
cpp_common
rostime
roscpp_traits
roscpp_serialization
genmsg
genpy
message_runtime
catkin
gencpp
genlisp
message_generation
rosbuild
rosconsole
std_msgs
rosgraph_msgs
xmlrpcpp
roscpp
rosgraph
rospack
roslib
rospy
編譯package
只要所有的package系統(tǒng)依賴都安裝好了勤哗,就可以編譯了抡爹。如果你是用apt或者其他package管理器安裝的ROS,那就應(yīng)該已經(jīng)有所有的依賴了芒划。記得使你的環(huán)境設(shè)置文件生效:
# source /opt/ros/%YOUR_ROS_DISTRO%/setup.bash
$ source /opt/ros/indigo/setup.bash
使用catkin_make
catkin_make命令行工具對(duì)與標(biāo)準(zhǔn)的catkin工作流程來(lái)說(shuō)是一個(gè)非常方便的冬竟,你可以理解為它把調(diào)用cmake和編譯結(jié)合起來(lái)了欧穴。
用法:
# In a catkin workspace
$ catkin_make [make_targets] [-DCMAKE_VARIABLES=...]
對(duì)于一個(gè)不熟悉標(biāo)準(zhǔn)CMake流程的人來(lái)說(shuō),可以分解為以下幾個(gè)步驟(但是實(shí)際上執(zhí)行這些命令是沒用的泵殴,它只是說(shuō)明CMake是怎樣工作的):
# In a CMake project
$ mkdir build
$ cd build
$ cmake ..
$ make
$ make install # (optionally)
這是每個(gè)CMake工程的過(guò)程涮帘,但是它可以在一個(gè)工作空間中編譯多個(gè)catkin工程。在一個(gè)工作空間中編譯多個(gè)catkin packages是這樣操作的:
# In a catkin workspace
$ catkin_make
$ catkin_make install # (optionally)
以上代碼可以編譯在src文件夾中的任何catkin工程笑诅,這里參考了:
http://www.ros.org/reps/rep-0128.html
如果你的源代碼不在src中焚辅,可以用my_src代替編譯(如果出錯(cuò),說(shuō)明my_src不存在):
# In a catkin workspace
$ catkin_make --source my_src
$ catkin_make install --source my_src # (optionally)
CMake的更多用法參考:
http://wiki.ros.org/catkin/commands/catkin_make苟鸯。
編譯你的package
想要編譯你自己的代碼的讀者請(qǐng)看看之后的C++/Python教程同蜻,因?yàn)槟阋苍S需要修改CMakeList.txt。
經(jīng)過(guò)上一個(gè)教程“創(chuàng)建一個(gè)ROS Package”早处,現(xiàn)在你已經(jīng)有了一個(gè)catkin工作空間和一個(gè)叫做beginner_tutorials的新的package湾蔓。進(jìn)入catkin的工作空間,查看src文件:
$ cd ~/catkin_ws/
$ ls src
輸出:
beginner_tutorials/ CMakeLists.txt
在src文件夾中可以看到你在之前用catkin_create_pkg創(chuàng)建的叫做beginner_tutorials的文件砌梆,現(xiàn)在我們可以用catkin_make來(lái)編譯這個(gè)package:
$ catkin_make
注意到catkin_make首先顯示每個(gè)“space”的路徑默责,這些路徑在REP128和catkin/workspaces中有描述。值得注意的是咸包,因?yàn)檫@個(gè)操作在你的工作空間生成了幾個(gè)默認(rèn)的文件夾:build桃序、devel和src。
build文件夾是在編譯空間的默認(rèn)位置烂瘫,并且是調(diào)用cmake和make去配置和編譯你的package的地方媒熊。devel文件夾是默認(rèn)的devel空間,是你安裝package之前可執(zhí)行文件和庫(kù)的所在地坟比。
既然已經(jīng)編譯好ROS package了芦鳍,讓我們討論一下ROS Node吧葛账!
使用ROS Node
這一節(jié)將會(huì)介紹ROS圖的概念并且會(huì)討論roscoe、rosnode和rosrun命令行工具菲宴。
前提
在這個(gè)教程中我們會(huì)用到turtlesim小型仿真功能包,如果你已經(jīng)進(jìn)行了ROS的完整安裝喝峦,那么你已經(jīng)有了turtlesim功能包宣谈。否則請(qǐng)安裝:
# sudo apt-get install ros-<distro>-ros-tutorials
$ sudo apt-get install ros-indigo-ros-tutorials
圖概念的概論
Nodes:node是使用ROS去和其它node通信的可執(zhí)行文件愈犹。
Messages:ROS中訂閱或者發(fā)布給topic的一種數(shù)據(jù)形式键科。
Topics:Nodes可以發(fā)布messages給一個(gè)topic,也可以訂閱一個(gè)topic去接受它的messages勋锤。
Master:為ROS提供名稱服務(wù)(比如幫助nodes找到彼此)叁执。
rosout:相當(dāng)于ROS中的stdout/stderr谈宛。
roscore:Master+rosout+parameter server(參數(shù)服務(wù)之后會(huì)介紹)胎署。
Nodes
Node不過(guò)是ROS package中一個(gè)可執(zhí)行文件琼牧。ROS node利用ROS用戶庫(kù)去和其他node進(jìn)行通信巨坊。node也可以向topic發(fā)起發(fā)布或者訂閱趾撵,node也可以提供或者使用一個(gè)service占调。
用戶庫(kù)
用戶庫(kù)允許用不同語(yǔ)言編寫的node之間進(jìn)行通信:
- rospy = python client library
- roscpp = c++ client library
roscore
roscore是使用ROS時(shí)第一個(gè)要使用的工具妈候。
$ roscore
如果roscore沒有初始化苦银,你也許會(huì)遇到網(wǎng)絡(luò)配置問(wèn)題。查看Network Setup - Single Machine Configuration解決纺念。
如果roscore沒有初始化并且說(shuō)缺少權(quán)限陷谱,也許是~/.ros文件夾的用戶是root,可以用一下命令遞歸改變文件夾的所有者:
$ sudo chown -R <your_username> ~/.ros
使用rosnode
打開一個(gè)新的終端(前面那個(gè)roscore不要關(guān)閉)烟逊,你的環(huán)境變量會(huì)重置宪躯,/.bashrc被啟用了访雪,如果運(yùn)行rosnode等命令時(shí)有問(wèn)題時(shí)臣缀,需要添加一些環(huán)境變量setup文件去使這些命令到/.bashrc中精置,或者手動(dòng)使它們生效氯窍。
rosnode顯示了關(guān)于正在運(yùn)行的ros node的信息狼讨。rosnode list列出活動(dòng)的node政供。
$ rosnode list
可以看到:
/rosout
這告訴我們這里只有一個(gè)node在運(yùn)行布隔。這個(gè)node總是在運(yùn)行因?yàn)樗鼤?huì)收集和記錄node的調(diào)試信息衅檀。
rosnode info命令可以返回特定node的信息:
$ rosnode info /rosout
接下來(lái)讓我們看看其他的node沉眶。我們打算用rosrun去運(yùn)行另一個(gè)node谎倔。
使用rosrun
rosrun允許你在一個(gè)package中去用package的名字直接運(yùn)行一個(gè)node(不需要知道package的路徑)片习。
用法:
$ rosrun [package_name]
因此我們可以利用rosrun去運(yùn)行在turtlesim的package中的turtlesim_node藕咏。在一個(gè)新的終端中運(yùn)行:
$ rosrun turtlesim turtlesim_node
你會(huì)在窗口看到:
如果我們?cè)偃ゲ榭垂?jié)點(diǎn)列表,在一個(gè)新終端中運(yùn)行:
$ rosnode list
將會(huì)看到多了一個(gè)節(jié)點(diǎn)卦碾,叫做/turtlesim:
/rosout
/turtlesim
ROS一個(gè)強(qiáng)大的特點(diǎn)是可以在命令行重命名洲胖。關(guān)閉窗口绿映,再用Remapping Argument重新命名node
$ rosrun turtlesim turtlesim_node __name:=my_turtle
再次運(yùn)行:
$ rosnode list
看到:
/rosout
/my_turtle
如果用Ctrl+C結(jié)束進(jìn)程而不是關(guān)閉turtle的窗口那么在rosnode list時(shí)還會(huì)看到之前關(guān)閉的node叉弦,可以用rosnode cleanup清理淹冰。
再看看新的/my_turtle node,用rosnode ping命令去測(cè)試它是否正在運(yùn)行:
$ rosnode ping my_turtle
輸出:
rosnode: node is [/my_turtle]
pinging /my_turtle with a timeout of 3.0s
xmlrpc reply from http://aqy:42235/ time=1.152992ms
xmlrpc reply from http://aqy:42235/ time=1.120090ms
xmlrpc reply from http://aqy:42235/ time=1.700878ms
xmlrpc reply from http://aqy:42235/ time=1.127958ms
回顧
roscore = ros +core:master(提供ros的命名服務(wù))+rosout(stdout/stderr)+ parameter server (參數(shù)服務(wù)之后會(huì)介紹);
rosnode = ros +node ;ros用來(lái)獲取關(guān)于node信息的工具晶乔;
rosrun = ros + run;從一個(gè)給定的package運(yùn)行一個(gè)node.
既然你已經(jīng)理解ros node 是怎樣工作的了正罢,再來(lái)看看ros的topic怎樣工作的吧腺怯。
使用ROS Topic
這個(gè)教程介紹ROS topic和rostopic和rqt_plot命令行工具。
建立
先在一個(gè)新的終端中運(yùn)行roscore:
$ roscore
注意:只能運(yùn)行一個(gè)roscore晾虑。
tuetlesim
在新的終端中運(yùn)行turtlesim:
$ rosrun turtlesim turtlesim_node
turtle鍵盤遙控
我們需要用一些東西去控制turtle帜篇,在新的終端運(yùn)行:
$ rosrun turtlesim turtle_teleop_key
現(xiàn)在你可以用鍵盤上的方向鍵控制小烏龜了(保持鍵盤輸入窗口在焦點(diǎn))笙隙,再看看窗口后面發(fā)生了什么竟痰。
ROS Topic
turtlesim_node和turtle_teleop_key node之間用topic交流通信坏快。
turtle_teleop_key在這個(gè)topic上發(fā)布按鍵敲擊莽鸿,而turtlesim訂閱同樣的topic接受按鍵敲擊祥得。讓我們用rqt_graph顯示現(xiàn)在正在運(yùn)行的topic和nodes级及。
如果你是用electric或更早的版本创千,建議用rxygrah替代追驴。
用rqt_grah
rqt_grah創(chuàng)建了一個(gè)動(dòng)態(tài)的圖形顯示系統(tǒng)上正在進(jìn)行什么暇咆,rqt_grah是rqt package的一部分爸业。這里我們會(huì)用到rqt功能包扯旷,如果你已經(jīng)進(jìn)行了ROS的完整安裝钧忽,那么你已經(jīng)有了rqt功能包耸黑。否則請(qǐng)安裝:
$ sudo apt-get install ros-indigo-rqt
$ sudo apt-get install ros-indigo-rqt-common-plugins
再在新終端輸入:
$ rosrun rqt_graph rqt_graph
你將會(huì)看到:
如果把鼠標(biāo)放上去將會(huì)高亮大刊,node是藍(lán)色或者綠色葫辐,topic是紅色另患。正如你所見到的一樣,turtlesim_node和the turtle_teleop_key nodes是通過(guò)叫做/turtle1/command_velocity的在通信租冠。
介紹rostopic
rostopic工具允許你從rostopic中獲得信息顽爹。在shell中運(yùn)行:
$ rostopic -h
可以獲得rostopic的命令選項(xiàng):
rostopic is a command-line tool for printing information about ROS Topics.
Commands:
rostopic bw display bandwidth used by topic
rostopic echo print messages to screen
rostopic find find topics by type
rostopic hz display publishing rate of topic
rostopic info print information about active topic
rostopic list list active topics
rostopic pub publish data to topic
rostopic type print topic type
Type rostopic <command> -h for more detailed usage, e.g. 'rostopic echo -h'
讓我們用這些命令去檢驗(yàn)一下turtlesim。
使用rostopic echo
用法:
rostopic echo [topic]
允許我們看看turtle_teleop_key node發(fā)布的命令速度數(shù)據(jù)肉渴;
對(duì)于ROS Hydro和之后的版本同规,這個(gè)數(shù)據(jù)在發(fā)布在/turtle1/cmd_vel topic券勺,在新終端運(yùn)行:
$ rostopic echo /turtle1/cmd_vel
選擇turtle_teleop_key終端,用方向鍵控制小烏龜盗扒,你將會(huì)看到
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
讓我們?cè)賮?lái)看看rqt_graph侣灶。點(diǎn)擊左上角的刷新按鈕顯示新的node褥影,你將會(huì)看到rostopic echo也訂閱了turtle1/command_velocity topic凡怎。
使用rostopic list
rostopic list會(huì)列出現(xiàn)在所有被訂閱和發(fā)布的topic寨典∷食桑看看這個(gè)命令需要什么參數(shù)井氢,運(yùn)行:
$ rostopic list -h
Usage: rostopic list [/namespace]
Options:
-h, --help show this help message and exit
-b BAGFILE, --bag=BAGFILE
list topics in .bag file
-v, --verbose list full details about each topic
-p list only publishers
-s list only subscribers
--host group by host name
對(duì)于verbose選項(xiàng):
$ rostopic list -v
顯示詳細(xì)的一列topic信息包括發(fā)布的,訂閱的和它們的類型约急。
Published topics:
* /turtle1/color_sensor [turtlesim/Color] 1 publisher
* /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher
* /rosout [rosgraph_msgs/Log] 4 publishers
* /rosout_agg [rosgraph_msgs/Log] 1 publisher
* /turtle1/pose [turtlesim/Pose] 1 publisher
Subscribed topics:
* /turtle1/cmd_vel [geometry_msgs/Twist] 2 subscribers
* /rosout [rosgraph_msgs/Log] 1 subscriber
* /statistics [rosgraph_msgs/TopicStatistics] 1 subscriber
ROS Messages
Topic上的通信通過(guò)在nodes之間發(fā)送message來(lái)實(shí)現(xiàn)厌蔽。對(duì)于發(fā)布者(turtle_teleop_key)和訂閱者(turtlesim_node)之間的通信必須使用相同的message類型拐云。這就意味著,topic的類型由發(fā)布的message類型決定薇缅,發(fā)布在topic上的message的類型可以由rostopic type來(lái)決定泳桦。
使用rostopic type
rostopic type返回任何topic發(fā)布的message類型灸撰。用法如下:
$ rostopic type [topic]
對(duì)于ROS Hydro 和之后的版本:
$ rostopic type /turtle1/cmd_vel
你會(huì)得到:
geometry_msgs/Twist
想得到詳細(xì)信息完疫,運(yùn)行:
$ rosmsg show geometry_msgs/Twist
輸出:
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
既然我們已經(jīng)知道turtlesim期待什么類型的message了壳鹤,我們可以發(fā)布命令給小烏龜芳誓。
繼續(xù)rostopic
既然我們已經(jīng)知道ros message了欧芽,讓我們一起用ros messages吧千扔。
使用rostopic pub
rostopic pub把數(shù)據(jù)發(fā)布到正被廣播的topic上曲楚。用法如下:
rostopic pub [topic] [msg_type] [args]
對(duì)于ROS Hydro和之后的版本:
$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
這會(huì)給turtle發(fā)布一個(gè)message告訴它線速度2.0,角速度1.8抚垃。
這個(gè)命令十分復(fù)雜鹤树,所以我們仔細(xì)看看它的每個(gè)參數(shù)罕伯。對(duì)于ROS Hydro和之后的版本坟募,rostopic pub
這個(gè)命令會(huì)發(fā)送message給給定的topic懈糯;-1
這個(gè)選項(xiàng)使得rostopic只發(fā)布一條message然后退出昂利;/turtle1/cmd_vel
是要發(fā)布給它信息的那個(gè)topic;geometry_msgs/Twist
是發(fā)布topic時(shí)的message類型扩所;--
雙虛線告訴選項(xiàng)剖析器接下來(lái)的參數(shù)都不是選擇祖屏,以免把負(fù)號(hào)后面的參數(shù)當(dāng)成參數(shù)選項(xiàng)。一個(gè)geometry_msgs/Twist有兩組由三個(gè)浮點(diǎn)元素組成得的向量:線性的和角度的期丰。這樣的話钝荡,'[2.0, 0.0, 0.0]'
就是線性值x=2.0,y=0.0,z=0.0,而'[0.0, 0.0, 1.8]'
就是角度值x=0.0,y=0.0,z=1.8埠通。
你也許注意到小烏龜已經(jīng)停止了舞蔽,這是因?yàn)樾觚斝枰€(wěn)定的1HZ的命令流去保持運(yùn)動(dòng)做祝。我們可以用rostopic pub -r命令發(fā)布一個(gè)穩(wěn)定的命令流狠鸳。對(duì)于ROS Hydro和之后的版本:
$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
這將以1HZ的速度去發(fā)布速度命令給速度topic脯厨。
再刷新一下rqt_graph,看到rostopic pub node在和rostopic echo node通信:
當(dāng)你看到小烏龜在繞圈圈的時(shí)候可以在一個(gè)新的終端輸入rostopic echo命令看看turtlesim發(fā)布的數(shù)據(jù)什猖。
使用rostopic hz
rostopic hz報(bào)告數(shù)據(jù)發(fā)布的速度,用法如下:
$ rostopic hz [topic]
來(lái)看看turtkesim node以多快的速度發(fā)布/turtle1/pose。
$ rostopic hz /turtle1/pose
你會(huì)看到:
subscribed to [/turtle1/pose]
average rate: 62.502
min: 0.015s max: 0.017s std dev: 0.00015s window: 59
average rate: 62.499
min: 0.015s max: 0.017s std dev: 0.00019s window: 122
average rate: 62.501
min: 0.015s max: 0.017s std dev: 0.00018s window: 185
average rate: 62.500
min: 0.015s max: 0.017s std dev: 0.00017s window: 247
average rate: 62.500
min: 0.015s max: 0.017s std dev: 0.00017s window: 310
現(xiàn)在我們知道turtlesim大概以60HZ的速度發(fā)布數(shù)據(jù)绍豁。也可以用rostopic type和rosmsg獲取關(guān)于topic進(jìn)一步的信息。對(duì)于ROS Hydro和之后的版本:
$ rostopic type /turtle1/cmd_vel | rosmsg show
現(xiàn)在我們已經(jīng)用rostopic檢驗(yàn)了topic,讓我們用其他工具看看turtlesim發(fā)布的數(shù)據(jù)把英染。
使用rqt_plot
rqt_plot以時(shí)間軸的形式顯示發(fā)布在topic上的數(shù)據(jù)。這里我們用它去顯示發(fā)布在/turtle1/pose topic上的數(shù)據(jù)箭养。首先:
$ rosrun rqt_plot rqt_plot
這時(shí)會(huì)彈出一個(gè)新的窗口,一個(gè)文本框出現(xiàn)在左上角撼泛,文本框是輸入topic的,這里我們輸入/turtle1/pose/x會(huì)高亮原來(lái)不亮的按鈕潘酗。按下它并且用/turtle1/pose/y重復(fù)同樣的操作攒砖,就會(huì)看到x-y位置的圖像出現(xiàn)惰蜜。
點(diǎn)擊負(fù)號(hào)按鈕可以隱藏指定的topic。全部隱藏财著,增加/turtle1/pose/theta碎连,你會(huì)看到下面的圖像:
這章節(jié)就是這些了鱼辙,Ctrl+C殺死rostopic終端,但是讓turtlesim繼續(xù)運(yùn)行杜跷。
既然你明白ros topic是怎樣工作的了,讓我們來(lái)看看service和parameter是怎樣工作的淑趾。
學(xué)習(xí)和使用ROS service和parameter
這一節(jié)將介紹ROS service和parameter和命令行工具rosservice和rosparameter嘶摊。
使用rosservice
ROS Service是nodes之間進(jìn)行通信的另一種方式阱飘。service允許node之間發(fā)送請(qǐng)求和接受應(yīng)答俯萌。
rosservice可以輕易的附著在ROS的客戶或者服務(wù)框上辨萍,rosservice可以有許多命令可以在topic上使用爪飘,如下所示:
- rosservice list print information about active services
- rosservice call call the service with the provided args
- rosservice type print service type
- rosservice find find services by service type
- rosservice uri print service ROSRPC uri
使用rosservice list
$ rosservice list
打印:
/clear
/kill
/reset
/rosout/get_loggers
/rosout/set_logger_level
/spawn
/teleop_turtle/get_loggers
/teleop_turtle/set_logger_level
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/get_loggers
/turtlesim/set_logger_level
這個(gè)命令會(huì)顯示出node可以提供9種服務(wù),其中/rosout/get_loggers和/rosout/set_logger_level是和rosoutnode有關(guān)的。
讓我們用rosservice type仔細(xì)看看這些服務(wù)诱渤。
rossercie type
如果你想查看某個(gè)服務(wù)的類型,例如/clear服務(wù)谓着,代碼如下:
# rosservice type [service]
$ rosservice type clear
你會(huì)獲得:
std_srvs/Empty
這個(gè)服務(wù)是空的,這就意味著當(dāng)調(diào)用這個(gè)服務(wù)時(shí)不帶任何參數(shù)(比如舷蒲,當(dāng)發(fā)送請(qǐng)求時(shí)和接受回應(yīng)時(shí)沒有任何的數(shù)據(jù))。讓我們用rosservice call調(diào)用這個(gè)服務(wù)吧
rosservice call
這里我們不用任何參數(shù)調(diào)用/clear這個(gè)服務(wù)友多,因?yàn)檫@個(gè)服務(wù)是空的牲平。用法如下:
# rosservice call [service] [args]
$ rosservice call /clear
這個(gè)命令清除了小烏龜?shù)男凶吆圹E。
再看看有參數(shù)的service域滥,看看service spawn的信息:
$ rosservice type spawn| rossrv show
輸出:
float32 x
float32 y
float32 theta
string name
---
string name
通過(guò)這些字段纵柿,我們可知道如何來(lái)調(diào)用這個(gè)服務(wù)。這個(gè)服務(wù)將產(chǎn)生另一個(gè)小烏龜启绰,它的名字是可選的,我們自己不給它起名字,讓turtlesim這個(gè)package給它取名字:
$ rosservice call spawn 2 2 0.2 ""
參數(shù)的分別是x材诽、y的坐標(biāo)和角度還有名字。這個(gè)服務(wù)調(diào)用返回新的小烏龜?shù)拿郑簄ame: turtle2滩援。
現(xiàn)在應(yīng)該看起來(lái)像這樣:
使用rosparam
rosparam允許你儲(chǔ)存和操作在ROS parameter server上的數(shù)據(jù)畔塔,parameter server可以儲(chǔ)存整形榔组,浮點(diǎn)型公壤,布爾型,字典型和鏈表型的數(shù)據(jù).rosparam使用YAML審定語(yǔ)言以符合語(yǔ)法塔猾。簡(jiǎn)單的例子:YAML看起來(lái)十分自然,1是整形些阅,1.0是浮點(diǎn)型托呕,one是字符串,true是布爾型,[1,2,3]是一列的整形熊尉,{a:b,c:d}是字典型齿梁,rosparam有許多命令可以運(yùn)行用在parameters上气忠,如下所示:
- rosparam set set parameter
- rosparam get get parameter
- rosparam load load parameters from file
- rosparam dump dump parameters to file
- rosparam delete delete parameter
- rosparam list list parameter names
讓我們看看現(xiàn)在參數(shù)服務(wù)器上是什么參數(shù)精拟。
rosparam list
$ rosparam list
我們可以看到turtlesim node的背景顏色有三個(gè)參數(shù)
/background_b
/background_g
/background_r
/rosdistro
/roslaunch/uris/host_skl338_ubuntu__46285
/rosversion
/run_id
我們用rosparam set改變其中一個(gè)參數(shù)的值。
rosparam set和rosparam get
用法:
$ rosparam set [param_name]
$ rosparam get [param_name]
改變背景顏色中的紅色比例:
$ rosparam set background_r 150
然后調(diào)用clear service使這個(gè)參數(shù)改變生效:
$ rosservice call clear
現(xiàn)在turtlesim看起來(lái)像這個(gè)樣子:
讓我們看看參數(shù)服務(wù)器上的其他參數(shù)的值:
$ rosparam get background_g
可以獲得:
86
也可以用rosparam get/ 顯示整個(gè)參數(shù)服務(wù)器的內(nèi)容:
$ rosparam get /
可以獲得:
background_b: 255
background_g: 86
background_r: 150
rosdistro: 'indigo
'
roslaunch:
uris: {host_skl338_ubuntu__46285: 'http://skl338-ubuntu:46285/'}
rosversion: '1.11.16
'
run_id: cd81e498-9ccd-11e5-97cc-20474700e173
如果想保存這些數(shù)據(jù)到文件以便可以在其他時(shí)間重載践美,對(duì)于rosparam來(lái)說(shuō)這很容易洗贰。
rosparam dump和rosparam load
用法:
$ rosparam dump [file_name] [namespace]
$ rosparam load [file_name] [namespace]
我們把所有參數(shù)都寫入params.yaml文件:
$ rosparam dump params.yaml
你可以載入這些yaml文件到新的命名空間,比如copy:
$ rosparam load params.yaml copy
$ rosparam get copy/background_b
輸出:
255
使用rqt_console和roslaunch
這一節(jié)將介紹使用rqt_console和rqt_logger_level來(lái)調(diào)試以及使用roslaunch一次啟動(dòng)許多node陨倡。
前提
需要用到rqt和tuetlesim package敛滋,如果沒有安裝,請(qǐng)執(zhí)行:
$ sudo apt-get install ros-<distro>-rqt ros-<distro>-rqt-common-plugins ros-<distro>-turtlesim
注意:前面的教程中已經(jīng)編譯過(guò)rqt和tuetlesim這兩個(gè)package了兴革,如果不確定绎晃,再安裝一次也無(wú)妨。
使用rqt_console和rqt_logger_level
rqt_console附著在ROS logging框架上去顯示nodes的輸出結(jié)果杂曲。
rqt_logger_level允許我們?nèi)ジ淖僴odes運(yùn)行時(shí)候的信息顯示級(jí)別(調(diào)試庶艾,警告,信息和錯(cuò)誤)解阅。
現(xiàn)在讓我們看看turtlesim在rqt_console上的輸出并且當(dāng)我們使用turtlesim的時(shí)候變化logger級(jí)別落竹。
在運(yùn)行turtlesim之前,在兩個(gè)新的終端中分別運(yùn)rqt_consolerqt和rqt_logger_level:
$ rosrun rqt_console rqt_console
$ rosrun rqt_logger_level rqt_logger_level
你會(huì)看到兩個(gè)彈出的窗口:
現(xiàn)在再在新的窗口中運(yùn)行:
$ rosrun turtlesim turtlesim_node
因?yàn)槟J(rèn)的記錄器級(jí)別是Info所以你會(huì)看到turtlesim啟動(dòng)時(shí)發(fā)布的信息,大概是這個(gè)樣子:
現(xiàn)在我們把記錄器級(jí)別改為Warn货抄,在rqt_logger_level窗口中刷新nodes并且選擇Warn作為顯示選項(xiàng):
現(xiàn)在把小烏龜遙控到墻邊看看在rqt_console上有什么顯示:
對(duì)于ROS Hydro和之后的版本:
$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 0.0]'
logger級(jí)別的概述
記錄級(jí)別是按下列的的優(yōu)先級(jí)別區(qū)分的:
- Fatal
- Error
- Warn
- Info
- Debug
Fatal的級(jí)別最高述召,Debug的級(jí)別最低朱转。通過(guò)設(shè)置logger級(jí)別,你會(huì)得到這個(gè)優(yōu)先級(jí)別或更高級(jí)別的message积暖。比如藤为,通過(guò)設(shè)置級(jí)別為Warn,我們會(huì)得到所有的Warn,Error,和Fatal的記錄消息。
先Ctrl+C turtlesim夺刑,并且用roslaunch去生成更多的turtlesim nodes和一個(gè)mimicking node缅疟,讓一個(gè)turtlesim去模仿另一個(gè)。
使用roslaunch
roslaunch按照l(shuí)aunch文件中的定義去啟動(dòng)node遍愿。
用法:
$ roslaunch [package] [filename.launch]
首先進(jìn)入我們之前創(chuàng)建和編譯的beginner_tutorials package:
$ roscd beginner_tutorials
如果roscd說(shuō)類似于:No such package/stack 'beginner_tutorials' 你需要啟動(dòng)環(huán)境變量設(shè)置的文件存淫,像你之前在create_a_workspace教程末尾中做的一樣。
$ cd ~/catkin_ws
$ source devel/setup.bash
$ roscd beginner_tutorials
創(chuàng)建一個(gè)launch目錄:
$ mkdir launch
$ cd launch
launch文件
現(xiàn)在創(chuàng)建一個(gè)叫做turtlemimic.launch的launch文件并且把下面的東西粘貼在上面:
<launch>
<group ns="turtlesim1">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
<group ns="turtlesim2">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
<node pkg="turtlesim" name="mimic" type="mimic">
<remap from="input" to="turtlesim1/turtle1"/>
<remap from="output" to="turtlesim2/turtle1"/>
</node>
</launch>
Launch文件的解釋
現(xiàn)在我們把xml分解:
<launch>
我們用lauch標(biāo)簽開始launch文件沼填,所以launch文件是這樣鑒定的桅咆。
<group ns="turtlesim1">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
<group ns="turtlesim2">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
我們用一個(gè)叫做sim的turtlesim node定義兩個(gè)命名空間turtlesim1和turtlesim2,這樣我們就可以啟動(dòng)兩個(gè)仿真器而不會(huì)有名字沖突了坞笙。
<node pkg="turtlesim" name="mimic" type="mimic">
<remap from="input" to="turtlesim1/turtle1"/>
<remap from="output" to="turtlesim2/turtle1"/>
</node>
我們通過(guò)把topic的輸入和輸出去重命名為turtlesim1和turtlesim2來(lái)定義mimic node(即messages在topic中從turtlesim1輸入岩饼,從turtlesim2輸出),這樣重命名會(huì)導(dǎo)致turtlesim2模仿turtlesim1薛夜。
</launch>
末尾的xml標(biāo)簽也是代表launch文件.
roslaunching
現(xiàn)在我們用roslaunch啟動(dòng)launch文件:
$ roslaunch beginner_tutorials turtlemimic.launch
兩個(gè)turtlesim會(huì)啟動(dòng)籍茧,啟動(dòng)一個(gè)新的終端中并且發(fā)送rostopic命令:
$ rostopic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'
你將會(huì)看到即使命令只是發(fā)布給turtlesim1但是兩個(gè)小烏龜都開始運(yùn)動(dòng).
可以用rqt_graph去更好的理解launch文件做了什么。運(yùn)行rqt并在主窗口選擇rqt_graph:
$ rqt
或者直接運(yùn)行:
$ rqt_graph
到此梯澜,我們算是已經(jīng)學(xué)會(huì)了rqt_console和roslaunch命令的使用寞冯,接下來(lái)我們開始學(xué)習(xí)使用rosed——ROS中的編輯器。現(xiàn)在你可以按Ctrl-C退出所有turtlesims節(jié)點(diǎn)了腊徙,因?yàn)樵谙乱黄坛讨心悴粫?huì)再用到它們简十。