試用ROS系統(tǒng)

創(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


    roscore.png

    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 ![rosnode.png](http://upload-images.jianshu.io/upload_images/273380-2f3088486b50d920.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

如果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
rosnode

接下來(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ì)在窗口看到:

rosnode2.png

turtlesim_node

如果我們?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ā)生了什么竟痰。

turtle_teleop_key.png
turtle_teleop_key.png

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ì)看到:

rqt_graph.png
rqt_graph.png

如果把鼠標(biāo)放上去將會(huì)高亮大刊,node是藍(lán)色或者綠色葫辐,topic是紅色另患。正如你所見到的一樣,turtlesim_node和the turtle_teleop_key nodes是通過(guò)叫做/turtle1/command_velocity的在通信租冠。

rqt_graph2.png
rqt_graph2.png

介紹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凡怎。

rqt_graph3.png
rqt_graph3.png

使用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抚垃。

rostopic_pub1.png
rostopic_pub1.png

這個(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脯厨。

rostopic_pub2.png
rostopic_pub2.png

再刷新一下rqt_graph,看到rostopic pub node在和rostopic echo node通信:

rqt_graph4.png
rqt_graph4.png

當(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)惰蜜。

rqt_plot1.png
rqt_plot1.png

點(diǎn)擊負(fù)號(hào)按鈕可以隱藏指定的topic。全部隱藏财著,增加/turtle1/pose/theta碎连,你會(huì)看到下面的圖像:

rqt_plot2.png
rqt_plot2.png

這章節(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。

turtlesim_node.png
turtlesim_node.png

再看看有參數(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)像這樣:

rosservice1.png
rosservice1.png

使用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è)樣子:

rosservice2.png
rosservice2.png

讓我們看看參數(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è)彈出的窗口:

rqt_console.png
rqt_console.png
rqt_graph.png
rqt_graph.png

現(xiàn)在再在新的窗口中運(yùn)行:

$ rosrun turtlesim turtlesim_node

因?yàn)槟J(rèn)的記錄器級(jí)別是Info所以你會(huì)看到turtlesim啟動(dòng)時(shí)發(fā)布的信息,大概是這個(gè)樣子:

rqt_console_turtlesimstart.png
rqt_console_turtlesimstart.png

現(xiàn)在我們把記錄器級(jí)別改為Warn货抄,在rqt_logger_level窗口中刷新nodes并且選擇Warn作為顯示選項(xiàng):

rqt_logger_level_error.png
rqt_logger_level_error.png

現(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]'
rqt_console_turtlesimerror.png
rqt_console_turtlesimerror.png

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).

mimic.png
mimic.png

可以用rqt_graph去更好的理解launch文件做了什么。運(yùn)行rqt并在主窗口選擇rqt_graph:

$ rqt

或者直接運(yùn)行:

$ rqt_graph

mimiclaunch.png
mimiclaunch.png

到此梯澜,我們算是已經(jīng)學(xué)會(huì)了rqt_console和roslaunch命令的使用寞冯,接下來(lái)我們開始學(xué)習(xí)使用rosed——ROS中的編輯器。現(xiàn)在你可以按Ctrl-C退出所有turtlesims節(jié)點(diǎn)了腊徙,因?yàn)樵谙乱黄坛讨心悴粫?huì)再用到它們简十。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市撬腾,隨后出現(xiàn)的幾起案子螟蝙,更是在濱河造成了極大的恐慌,老刑警劉巖民傻,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胰默,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡漓踢,警方通過(guò)查閱死者的電腦和手機(jī)牵署,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)喧半,“玉大人奴迅,你說(shuō)我怎么就攤上這事⊥荩” “怎么了取具?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵脖隶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我暇检,道長(zhǎng)产阱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任块仆,我火速辦了婚禮构蹬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘悔据。我一直安慰自己庄敛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布蜜暑。 她就那樣靜靜地躺著铐姚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肛捍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天之众,我揣著相機(jī)與錄音拙毫,去河邊找鬼。 笑死棺禾,一個(gè)胖子當(dāng)著我的面吹牛缀蹄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播膘婶,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼缺前,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了悬襟?” 一聲冷哼從身側(cè)響起衅码,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脊岳,沒想到半個(gè)月后逝段,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡割捅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年奶躯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亿驾。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嘹黔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出莫瞬,到底是詐尸還是另有隱情儡蔓,我是刑警寧澤醉锄,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站浙值,受9級(jí)特大地震影響恳不,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜开呐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一烟勋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧筐付,春花似錦卵惦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至较解,卻和暖如春畜疾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背印衔。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工啡捶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奸焙。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓瞎暑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親与帆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子了赌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容