下面我們將介紹,如何編寫一個啟動腳本程序:(.launch文件)
還記得我們在 創建ROS軟件包教程 中創建的第一個程序包(beginner_tutorials)嗎,現在我們要使用它。
在 beginner_tutorials 軟件包里新建一個名為 launch 的文件夾,(用來保存 launch 啟動腳本的):
$ roscd beginner_tutorials
$ mkdir launch
$ cd launch
$ gedit 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個 小海龜節點。

現在,我們讓: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

小練習
現在我們已經學會了,如何編寫一個簡單的 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>
現在我們來運行一下這個啟動腳本:
$ roslaunch beginner_tutorials turtle_key_control.launch
你可以在這個終端中,通過方向鍵來控制小海龜了。

