【ROS】ROS使用
技術標籤:ros
一、構建軟體包
首先要source一下:
source /opt/ros/kinetic/setup.bash
catkin_make是一個命令列工具,它簡化了標準catkin工作流程
在catkin工作空間下
$ catkin_make [make_targets] [-DCMAKE_VARIABLES=...]
如果你的原始碼不在預設位置(catkin_ws/src),比如說存放在了my_src中,那可以這樣來使用catkin_make:
# 在catkin工作空間下
$ catkin_make --source my_src
前文中利用catkin_create_pkg
二、ROS節點
計算圖(Computation Graph)是一個由ROS程序組成的點對點網路,它們能夠共同處理資料。ROS的基本計算圖概念有節點(Nodes)、主節點(Master)、引數伺服器(Parameter Server)、訊息(Messages)、服務(Services)、話題(Topics)和袋(Bags),它們都以不同的方式向圖(Graph)提供資料。
-
節點(Nodes):節點是一個可執行檔案,它可以通過ROS來與其他節點進行通訊。
-
-
話題(Topics):節點可以將訊息釋出到話題,或通過訂閱話題來接收訊息。
-
主節點(Master):ROS的命名服務,例如幫助節點發現彼此。
-
rosout:在ROS中相當於stdout/stderr(標準輸出/標準錯誤)。
roscore是你在執行所有ROS程式前首先要執行的命令(確保roscore正在執行)
roscore
然後會有如下資訊:
... logging to ~/.ros/log/9cf88ce4-b14d-11df-8a75-00251148e8cf/roslaunch-machine_name-13039.log Checking log directory for disk usage. This may take awhile. Press Ctrl-C to interrupt Done checking log file disk usage. Usage is <1GB. started roslaunch server http://machine_name:33919/ ros_comm version 1.4.7 SUMMARY ======== PARAMETERS * /rosversion * /rosdistro NODES auto-starting new master process[master]: started with pid [13054] ROS_MASTER_URI=http://machine_name:11311/ setting /run_id to 9cf88ce4-b14d-11df-8a75-00251148e8cf process[rosout-1]: started with pid [13067] started core service [/rosout]
rosnode顯示當前正在執行的ROS節點資訊。rosnodelist命令會列出這些活動的節點:
rosnode list
輸出:/rosout
rosnodeinfo命令返回的是某個指定節點的資訊:
rosnode info /rosout
rosrun可以讓你用包名直接執行軟體包內的節點(而不需要知道包的路徑):
rosrun [package_name] [node_name]
所以現在我們試著執行turtlesim包中的turtlesim_node。
在一個新終端中:
rosrun turtlesim turtlesim_node
我們還需要通過鍵盤來控制turtle,開啟一個新終端:
rosrun turtlesim turtle_teleop_key
三、ROS話題
turtlesim_node節點和turtle_teleop_key節點之間是通過一個ROS話題來相互通訊的。turtle_teleop_key在話題上釋出鍵盤按下的訊息,turtlesim則訂閱該話題以接收訊息。
rqt_graph用動態的圖顯示了系統中正在發生的事情。rqt_graph是rqt程式包中的一部分。如果你發現沒有安裝,請:
sudo apt-get install ros-<distro>-rqt
sudo apt-get install ros-<distro>-rqt-common-plugins
rosrun rqt_graph rqt_graph
rostopic命令工具能讓你獲取ROS話題的資訊:
rostopicecho可以顯示在某個話題上釋出的資料
rostopic echo [topic]
Eg:rostopic echo /turtle1/cmd_vel
rostopiclist能夠列出當前已被訂閱和釋出的所有話題
rostopic list -v
rostopictype命令用來檢視所釋出話題的訊息型別
rostopic type [topic]
rostopic type /turtle1/cmd_vel
輸出:geometry_msgs/Twist
rosmsg檢視訊息的詳細資訊:
rosmsg show geometry_msgs/Twist
rostopicpub -1可以把一條資料釋出到當前某個正在廣播的話題上
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]'
【以上命令會發送一條訊息給turtlesim,告訴它以2.0大小的線速度和1.8大小的角速度移動】
用rostopicpub-r命令來發布源源不斷的命令,以1 Hz的速度釋出velocity指令到velocity話題上:
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'
四、ROS服務
服務(Services)是節點之間通訊的另一種方式。服務允許節點發送一個請求(request)並獲得一個響應(response)。
rosservice list 輸出活躍服務的資訊 rosservice call 用給定的引數呼叫服務 rosservice type 輸出服務的型別 rosservice find 按服務的型別查詢服務 rosservice uri 輸出服務的ROSRPC uri服務型別: /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
rosparam能讓我們在ROS引數伺服器(Parameter Server)上儲存和操作資料。引數伺服器能夠儲存整型(integer)、浮點(float)、布林(boolean)、字典(dictionaries)和列表(list)等資料型別。
rosparam set 設定引數 rosparam get 獲取引數 rosparam load 從檔案中載入引數 rosparam dump 向檔案中轉儲引數 rosparam delete 刪除引數 rosparam list 列出引數名/rosdistro /roslaunch/uris/host_nxt__43407 /rosversion /run_id /turtlesim/background_b /turtlesim/background_g /turtlesim/background_r
五、使用rqt_console和roslaunch
rqt_console連線到了ROS的日誌框架,以顯示節點的輸出資訊。
rqt_logger_level允許我們在節點執行時改變輸出資訊的詳細級別,包括Debug、Info、Warn和Error`。
$ rosrun rqt_console rqt_console
$ rosrun rqt_logger_level rqt_logger_level
roslaunch可以用來啟動定義在launch(啟動)檔案中的節點。
roslaunch [package] [filename.launch]
$ cd ~/catkin_ws
$ source devel/setup.bash
$ roscd beginner_tutorials
然後建立一個launch目錄:
$ mkdir launch
$ cd launch
現在一起建立一個名為turtlemimic.launch的launch檔案並複製貼上以下內容進去:
1 <launch> 2 3 <group ns="turtlesim1"> 4 <node pkg="turtlesim" name="sim" type="turtlesim_node"/> 5 </group> 6 7 <group ns="turtlesim2"> 8 <node pkg="turtlesim" name="sim" type="turtlesim_node"/> 9 </group> 10 【此處我們建立了兩個分組,並以名稱空間(namespace)標籤來區分,其中一個名為turtulesim1,另一個名為turtlesim2,兩個分組中都有相同的名為sim的turtlesim節點。這樣可以讓我們同時啟動兩個turtlesim模擬器,而不會產生命名衝突。】 11 <node pkg="turtlesim" name="mimic" type="mimic"> 12 <remap from="input" to="turtlesim1/turtle1"/> 13 <remap from="output" to="turtlesim2/turtle1"/> 14 </node> 15 【在這裡我們啟動模仿節點,話題的輸入和輸出分別重新命名為turtlesim1和turtlesim2,這樣就可以讓turtlesim2模仿turtlesim1了。】 16 </launch>
啟動
roslaunch beginner_tutorials turtlemimic.launch
傳送資料
$ rostopic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'
rosed是rosbash套件的一部分。利用它可以直接通過軟體包名編輯包中的檔案,而無需鍵入完整路徑。
rosed是rosbash套件的一部分。利用它可以直接通過軟體包名編輯包中的檔案,而無需鍵入完整路徑。