1. 程式人生 > >ROS Learning-010 beginner_Tutorials 編寫簡單的啟動指令碼檔案(.launch 檔案)

ROS Learning-010 beginner_Tutorials 編寫簡單的啟動指令碼檔案(.launch 檔案)

ROS Indigo beginner_Tutorials-09 編寫簡單的啟動指令碼檔案

我使用的虛擬機器軟體:VMware Workstation 11
使用的Ubuntu系統:Ubuntu 14.04.4 LTS
ROS 版本:ROS Indigo

.launch檔案 :

下面我們將介紹,如何編寫一個啟動指令碼程式:(.launch檔案)

還記得我們在 建立ROS軟體包教程 中建立的第一個程式包(beginner_tutorials)嗎,現在我們要使用它。在 beginner_tutorials 軟體包裡新建一個名為 launch 的資料夾。(用來儲存 launch 啟動指令碼的):

$ roscd  beginner_tutorials
$ mkdir launch
$ cd launch
$ gedit turtlemimic.launch    #使用你喜歡的編譯器開啟turtlemimic.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> </launch>

解釋程式:

上面的程式碼,建立了2個 ros 節點, 並以不同名稱空間標籤區分,所以兩個節點的名字都是一樣的也沒關係。

  • <launch> : 這個標籤是其他標籤的根標籤,簡單的說,它就是其他標籤的容器。
  • <group> : 它可以做成一個組, 簡單的比喻, 就像是 C++裡面的namespace
    一樣,並且這個標籤裡的”ns” 指的就是:namespace(名稱空間)。
  • <node> : 這個標籤的效果:就是在終端中使用 rosrun 命令來啟動一個節點。 “pkg”引數:軟體(或程式)包名;

如何執行這個 launch 檔案: (執行指令碼檔案,不像執行rosrun命令,不需要提前在一個終端中執行 roscore 命令。如果你沒有啟動roscore命令,這個roslaunch 會自動啟動 /rosout 節點;如果你先前啟動了roscore,這個roslaunch就不會再啟動/rosout節點了。)

執行啟動檔案:

$ roslaunch beginner_tutorials turtlemimic.launch

執行完這個語句後,你會看到彈出了兩個一樣的視窗,如下圖所示。這就是這個啟動檔案的效果:建立了 2個 小海龜節點。

這裡寫圖片描述

我們在當前終端中按 Ctrl + C ,結束所有的節點。

現在,我們讓:turtlesim2名稱空間 中的 turtle1 海龜的所有動作都模仿 turtlesim1名稱空間 中的 turtle1 海龜。
所有我們需要再在 turtlemimic.launch 檔案中啟動一個 模仿節點

什麼叫 模仿 : 就是如果我們控制 /turtlesim1/turtle1 小海龜,那麼 /turtlesim2/turtle1 就跟著動。

重新開啟 turtlemimic.launch 檔案中,我們再在這個檔案中的<launch></launch> 標籤裡面,新增下面的程式碼:

        <node pkg="turtlesim" name="mimic" type="mimic">
                <remap from="input"  to="turtlesim1/turtle1" />
                <remap from="output" to="turtlesim2/turtle1" />
        </node>

完整的程式是下面這個樣子的:

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

我們一樣,執行 turtlemimic.launch 啟動指令碼檔案:

$ roslaunch beginner_tutorials turtlemimic.launch

先來看看現在有哪些話題正在釋出:

$ rostopic list

輸出:

/rosout
/rosout_agg
/turtlesim1/turtle1/cmd_vel
/turtlesim1/turtle1/color_sensor
/turtlesim1/turtle1/pose
/turtlesim2/turtle1/cmd_vel
/turtlesim2/turtle1/color_sensor
/turtlesim2/turtle1/pose

如果你想得到詳細的資訊,請執行 rostopic list -v 命令。

你看,這裡面沒有 /turtle1/cmd_vel 這個話題,有的是:/turtlesim1/turtle1/cmd_vel
所以,我們新開一個終端,執行下面的命令,就可以讓 /turtlesim1/turtle1 小海龜動起來:

$ rostopic pub  /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]'  '[0.0, 0.0, -1.8]'

執行完上面的命令後,小海龜/turtlesim1/turtle1 就按照一定的線速度和角速度進行運動,因為 模仿節點 的原因,所以小海龜/turtlesim2/turtle1 模仿 小海龜/turtlesim1/turtle1 做同樣的運動。

這裡寫圖片描述

我們執行一下 rqt_graph ,來看看當前節點之間的關係:

$ rqt_graph

這裡寫圖片描述

問題來了:

Q: 之前介紹過:使用鍵盤上的方向鍵來控制小海龜移動的命令 ( rosrun turtlesim turtle_teleop_key )。那麼對於這啟動指令碼檔案,我們可不可以使用那個節點程式來控制我們的小海龜 /turtlesim1/turtle1 呢?

A: 這個指令是無法控制小海龜 /turtlesim1/turtle1 的 。 你知道為什麼嗎?
使用 rosrun turtlesim turtle_teleop_key 命令啟動的節點,它釋出的話題是: /turtle1/cmd_vel 這個話題。而對於我們現在這個啟動指令碼檔案所啟動的所有節點裡面都沒有訂閱 /turtle1/cmd_vel 這個話題的。我們需要訂閱的是 /turtlesim1/turtle1/cmd_vel 。它們是有差別的。

小練習

現在我們已經學會了,如何編寫一個簡單的 launch檔案,並且我們也知道了如何使用 roslaunch 命令來啟動一個啟動指令碼檔案。
下面我們來做一個小練習: 我們就將下面這一堆命令打包成一個啟動檔案:

$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key

beginner_tutorials 程式包中的launch 路徑裡新建一個 turlte_key_control.launch 檔案:

$ roscd  beginner_tutorials/launch
$ gedit turlte_key_control.launch    #使用你喜歡的編譯器開啟turlte_key_control.launch,對其進行編輯

將下面的程式碼複製過去:

<launch>
    <node pkg="turtlesim" name="turtle1" type="turtlesim_node"/>
    <node pkg="turtlesim" name="turtle1_key" type="turtle_teleop_key"/>
</launch>

OK,現在我們來執行一下這個啟動指令碼:

$ roslaunch beginner_tutorials turtle_key_control.launch

你可以在這個終端中,通過方向鍵來控制小海龜了。

這裡寫圖片描述

小結:

好了,這一節就這樣結束了,現在對於你來說,只要是使用過的命令都可以將它們寫到一個啟動指令碼檔案裡,你現在完全具備這個能力,所以足可以運用到實戰中去了。

但是 launch 啟動指令碼的內容很多,當我們使用到的時候,會在後面 ROS的學習中再次講解 launch 啟動指令碼程式:launch啟動指令碼的詳細教程
所以,對於現在剛剛入門 ROS 的你來說,不需要了解的太深,我的意思就是說,你現在瞭解的深,也使用不上,當你使用上的時候,你可能就忘記了,還不如邊用邊學,這樣輕鬆快樂。想主動學習這套教程的童靴一定也是這樣想的。

下一講,我終於要開始寫真正的 ROS 程式的程式碼了: 編寫ROS話題版的 Hello World 程式