1. 程式人生 > >ROS學習筆記(二)

ROS學習筆記(二)

一、ROS的節點

1.前期準備:安裝虛擬包

$sudo apt-get install ros--ros-tutorials

2.ROS概念(英文原版)

Nodes(節點): A node is an executable that uses ROS to communicate with other nodes. Messages(訊息): ROS data type used when subscribing or publishing to a topic. Topics(話題): Nodes can publish messages to a topic as well as subscribe to a topic to receive messages. Master: Name service for ROS (i.e. helps nodes find each other) rosout: ROS equivalent of stdout/stderr roscore: Master + rosout + parameter server (parameter server will be introduced later) 如果roscore沒有初始化併發送有關缺少許可權的訊息,則可能是?/ .ros資料夾由root擁有,以遞迴方式更改該資料夾的所有權: ~/.bashrc 新增環境變數

$ rosnode list //檢視當前正在跑的ROS節點
$ rosnode info /rosout //檢視當前的系統ROS訊息(訂閱者,釋出者)

使用rosrun啟動節點

$ rosrun turtlesim turtlesim_node //啟動節點 小烏龜視窗
$ rosnode list
/rosout
/turtlesim

修改節點名字

$rosrun turtlesim turtlesim_node __name:=my_turtle //關閉上一個節點,運行當前命令修改節點名字
$ rosnode list  
/my_turtle
/rosout
$ rosnode ping my_turtle //測試是否正常

二、理解ROS的話題

1.小海龜模擬
$ roscore           //開啟ROS
$ rosrun turtlesim turtlesim_node  // 開啟虛擬模擬節點
$ rosrun turtlesim turtle_teleop_key //開啟鍵盤箭頭控制小海龜
2.ROS話題

rqt_graph建立了一個動態圖表,顯示系統中發生了什麼。rqt_graph是rqt包的一部分。

$ sudo apt-get install ros-<distro>-rqt  //安裝ROS的話跳過這兩句直接執行
$ sudo apt-get install ros-<distro>-rqt-common-plugins
$ rosrun rqt_graph rqt_graph
2.1 話題列表

話題引數列表

$ rostopic -h 
rostopic bw     display bandwidth used by topic
rostopic echo   print messages to screen
rostopic hz     display publishing rate of topic    
rostopic list   print information about active topics
rostopic pub    publish data to topic
rostopic type   print topic type

檢視主題訊息

$ rostopic echo topic 
$ rostopic list -h
Usage: rostopic list [/topic]

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

檢視正在執行的話題

$ rostopic list -v  
Published topics:
 * /turtle1/color_sensor [turtlesim/Color] 1 publisher
 * /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher
 * /rosout [rosgraph_msgs/Log] 2 publishers
 * /rosout_agg [rosgraph_msgs/Log] 1 publisher
 * /turtle1/pose [turtlesim/Pose] ics:
 * /turtle1/cmd_vel [geometry_msgs/Twist] 1 subscriber
 * /rosout [rosgraph_msgs/Log] 1 subscriber
3.ROS的訊息
3.1 正在使用的訊息型別

檢視訊息的詳細情況

$ rostopic type /turtle1/command_velocity
$rosmsg show turtlesim/Velocity  

釋出訊息 ,格式為:rostopic pub [topic] [msg_type] [args]

$ rostopic pub -1 /turtle1/command_velocity turtlesim/Velocity  -- 2.0  1.8  //例子
$ rostopic pub /turtle1/command_velocity turtlesim/Velocity -r 1 -- 2.0  -1.8 //以1hz頻率傳送

檢視資料釋出的頻率

$rostopic hz [topic] ostopic hz

檢視節點圖

$rqt_graph  

檢視座標圖

$ rosrun rqt_plot rqt_plot
3.2 ROS服務

rosservice list 輸出可用服務的資訊 rosservice call 呼叫帶引數的服務 rosservice type 輸出服務型別 rosservice find 依據型別尋找服務find services by service type rosservice uri 輸出服務的ROSRPC uri

rosparam使得我們能夠儲存並操作ROS引數伺服器(Parameter Server)上的資料。 引數伺服器能夠儲存整型、浮點、布林、字串、字典和列表等資料型別。 rosparam使用YAML標記語言的語法。 一般而言,YAML的表述很簡單: 1是整型 1.0是浮點型 one是字串 true是布林 [1,2,3]是整型列表 {a:b,c:d}是字典 rosparam有很多指令可以用來操作引數,如下所示: 使用方法: rosparam set 設定引數 rosparam get 獲取引數 rosparam load 從檔案讀取引數 rosparam dump 向檔案中寫入引數 rosparam delete 刪除引數 rosparam list 列出引數名

3.3ROS中引數

列出引數名

$rosparam list   
/background_b
/background_g
/background_r
/roslaunch/uris/aqy:51932
/run_id

修改背景顏色的紅色通道:

$ rosparam set background_r 150 
$ rosservice call clear   //生效

獲取背景的綠色通道的值

 $ rosparam get background_g 

顯示引數伺服器上的所有內容

 $ rosparam get   
    background_b: 255
    background_g: 86
    background_r: 150
    rosdistro: 'kinetic
    roslaunch:
    uris: {host_ubuntu__37149: 'http://ubuntu:37149/'}
    rosversion: '1.12.13'
    run_id: 30be30a0-9e26-11e8-9edf-000c290a5f97

儲存資訊

$ rosparam dump params.yaml  //儲存資訊
$ rosparam load params.yaml copy  //載入資訊
$ rosparam get copy/background_b  //匯入資訊
3.4使用rqt_console和rqt_logger_level

rqt_console屬於ROS日誌框架(logging framework)的一部分,用來顯示節點的輸出資訊 rqt_logger_level允許我們修改節點執行時輸出資訊的日誌等級(logger levels) 檢視日誌

$ rosrun rqt_console rqt_console  

檢視日誌等級

$ rosrun rqt_logger_level rqt_logger_level 

Fatal 日誌等級,設定後能看見以上的 Error Warn Info Debug

launch檔案內容

<launch>

<node name="talker"pkg="rospy_tutorials" type="talker" >

</node>?

</launch>

其中pkg=“rospy_tutorials”,這是自己要啟動的節點所在的包;type=“talker”,這是自己寫的節點.cpp程式通過編譯生產的可執行檔案的名字,你最初編譯.cpp程式的時候要在CMakeLists.txt新增cpp程式編譯的設定,這個可執行檔案的名字在CMakeLists.txt中就可以找到;name=“talker”,這是節點的名字。 其他標籤的含義

</node> 啟動一個節點.
<param> 設定引數伺服器上的引數
<remap> 宣告一個名稱的對映,允許你通過名稱對映引數到ROS 節點(通過更結構化的方式而不是直接設定節點引數屬性來啟動的節點)。
<machine> 宣告啟動要使用的機器.
<rosparam> 使用rosparam 檔案設定啟動要用的ROS 引數
<include> 包含roslaunch 檔案.
<env> 制定啟動節點的環境變數
<test> 啟動一個測試節點see rostest).
<arg> 宣告引數
<group> 共享一個名稱空間或對映的封閉的元素組。

編寫一個海龜跟隨另外一個海龜的啟動檔案

 <launch>
    <group ns="turtlesim1">
    
          <nodepkg="turtlesim" name="sim"type="turtlesim_node"/>
    
    </group>
    
    <group ns="turtlesim2">
    
          <node pkg="turtlesim"name="sim" type="turtlesim_node"/>
    
    </group>
    
            <groupns="turtlesim3">
    
          <nodepkg="turtlesim" name="sim"type="turtlesim_node"/>
    
    </group>     
    
                 <node pkg="turtlesim" name="turtle_mimic"type="mimic">
    
                  <remap from="input"to="turtlesim1/turtle1"/>
    
                  <remap from="output"to="turtlesim2/turtle1"/>
    
                  </node>
    
                  <node pkg="turtlesim" name="turtle_mimic1"type="mimic">
    
                  <remap from="input" to="turtlesim1/turtle1"/>
    
                  <remap from="output"to="turtlesim3/turtle1"/>
    
                 </node>   
    
    </launch>

rosed是rosbash 的一部分。 利用它可以直接通過package名來獲取到待編輯的檔案而無需指定該檔案的儲存路徑了。

3.5 建立msg檔案
$ cd ~/catkin_ws/src/beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg

或者直接編輯Num.msg寫更多的變數:

string first_name
string last_name
uint8 age
uint32 score

確保msg檔案被轉換成為C++,Python和其他語言的原始碼,確保package.XML包含:

<build_depend>message_generation</build_depend> 在構建的時候,我們只需要"message_generation"。
<run_depend>message_runtime</run_depend>  在執行的時候,我們只需要"message_runtime"。

在CMakeLists.txt裡用find_packag函式,增加對message_generation的依賴,這樣就可以生成訊息了。

find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation)
確保設定依賴
catkin_package(
  ...
  CATKIN_DEPENDS message_runtime ...
  ...)
去掉add_meggage_files註釋符號#,用你的.msg檔案替代Message*.msg,就像下邊這樣:
add_message_files(
  FILES
  Num.msg
)

例子:************自己建立編寫的功能包中CMakeLists.txt裡必須擁有以下幾個

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
message_generation   #自己寫的功能包,一定要新增,不然會報錯。
)
add_message_files(
   FILES
#   Message1.msg
#   Message2.msg
Num.msg
 )
generate_messages(
  DEPENDENCIES
  std_msgs
)
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES beginner_tutorials
#  CATKIN_DEPENDS roscpp rospy std_msgs
#  DEPENDS system_lib
CATKIN_DEPENDS message_runtime
)

XML檔案中***************

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>       

其他版本最後一句可能是

 <run_depend>message_runtime</run_depend> 

$ rosmsg show beginner_tutorials/Num 檢視定義的訊息

建立srv

##建立msg時新增過就不用再次新增
    find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation)  
    ##新增自己的服務
    add_service_files(
      FILES
    #   Service1.srv
    #   Service2.srv
    AddTwoInts.srv
    )

檢視ROS是否能識別

$ rossrv show beginner_tutorials/AddTwoInts 

不指定包來檢視

$ rossrv show AddTwoInts 
3.7 package.xml可以說是為了讓ROS識別自己寫的包,CMakeList相當於讓編譯器編譯自己寫的原始檔實驗如下:

在foobar下建立package.xml檔案,並新增以下內容:

<package>
  <name>foobar</name>
  <version>1.2.4</version>
  <description>
  This package provides foo capability.
  </description>
  <maintainer email="[email protected]">PR-foobar</maintainer>
  <license>BSD</license>

  <buildtool_depend>catkin</buildtool_depend>

  <build_depend>roscpp</build_depend>
  <build_depend>std_msgs</build_depend>

  <run_depend>roscpp</run_depend>
  <run_depend>std_msgs</run_depend>
</package>

完成後,就可以找到路徑

$ rospack find foobar

然後建立CMakeList檔案,這樣 catkin_make才能夠利用 CMake 強大的跨平臺特性來編譯所建立的package

cmake_minimum_required(VERSION 2.8.3)
project(foobar)
find_package(catkin REQUIRED roscpp std_msgs)
catkin_package()

依賴項並沒有被系統預設安裝,因此,ROS提供了一個工具rosdep來下載並安裝所需系統依賴項

$ roscd turtlesim
$ rosdep install turtlesim
3.6錄製與回放

錄製

$ mkdir ~/bagfiles
$ cd ~/bagfiles
$ rosbag record -a

檢視

$ rosbag info <your bagfile>

回放

$ rosbag play <your bagfile>
$ rosbag play -r 2 <your bagfile> 帶頻率回放
$ rosbag record -O subset /turtle1/command_velocity /turtle1/pose 指定回放

定位錯誤

$ roscd
$ roswtf

roscreate-pkg節省精力避免錯誤,但package只不過就是一個資料夾外加一個XML檔案

$ mkdir -p src/foobar
$ cd src/foobar

三、ROS命令總結:

rospack = ros+pack(age) : 提供ROS package相關的資訊 rosstack = ros+stack : 提供stacks 相關的資訊 roscd = ros+cd : changes directory to a ROS package or stack rosls = ros+ls : lists files in a ROS package roscp = ros+cp : copies files from/to a ROS package rosmsg = ros+msg : provides information related to ROS message definitions rossrv = ros+srv : provides information related to ROS service definitions rosmake = ros+make : makes (compiles) a ROS package

練習自己編寫talker/listener