下面我們將介紹,如何編寫一個啟動腳本程序:(.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
你可以在這個終端中,通過方向鍵來控制小海龜了。