在 roslaunch 的 XML 標籤中,沒有可以用來呼叫 service 的標籤。但是,有些呼叫 service 的動作,想要添加到 Launch 文件中自動執行,該怎麼做呢?網路上有高手提供了一個可行的做法,經過簡單的實測,確實可以使用。下面大致說明一下做法,文章最末的參考資料裡面有相關的連結可以參考。
延續前一篇文章《使用 roslaunch 啟動多個節點》,在這篇文章裡面一樣使用 turtlesim 套件來做示範。假設已經撰寫好 mytest.launch 文件,來執行 turtlesim 的兩個主要的程式:turtlesim_node 和 turtle_teleop_key,如下:
<launch> <node pkg="turtlesim" type="turtlesim_node" name="turtlesim" /> <node pkg="turtlesim" type="turtle_teleop_key" name="teleop_turtle" /> </launch> |
當 turtlesim_node 啟動之後,透過 rosservice list 指令可以看到 /spawn 和 /turtle1/set_pen 這兩個 service。接下來,將示範如何修改 mytest.launch 文件來呼叫這兩個 service。
$ rosservice list /clear /kill /reset /rosout/get_loggers /rosout/set_logger_level /spawn /turtle1/set_pen /turtle1/teleport_absolute /turtle1/teleport_relative /turtlesim/get_loggers /turtlesim/set_logger_level |
一般會使用下列指令來呼叫 /spawn,這個 service 會在 turtlesim_node 顯示的視窗中,生出另一隻小烏龜。在參數的部分,可以指定新小烏龜的位置、方位和名稱。
$ rosservice call /spawn <x> <y> <theta> "<name>" e.g. $ rosservice call /spawn 3 3 0.2 "new_turtle" |
呼叫 /turtle1/set_pen 則會使用下列指令,這個 service 可以用來設定烏龜移動時劃出的線條顏色和寬度。在參數的部分,可以指定線條的 RGB 顏色和寬度,以及是否隱藏線條。
$ rosservice call /turtle1/set_pen <r> <g> <b> <width> <off> e.g. $ rosservice call /turtle1/set_pen 255 255 0 15 0 |
要透過 roslaunch 來呼叫上面兩個 service,只要在 mytest.launch 文件加入下列兩行即可。使用 <node> 標籤,在屬性 pkg 和 type 指定為 rosservice 就可以呼叫 service,name 可以任意取一個不重複的名稱,args 則指定要呼叫的 service,以及要帶入的參數。
<launch> <node pkg="turtlesim" type="turtlesim_node" name="turtlesim" /> <node pkg="turtlesim" type="turtle_teleop_key" name="teleop_turtle" /> <node pkg="rosservice" type="rosservice" name="spawn" args="call /spawn 3 3 0.2 'new_turtle'" /> <node pkg="rosservice" type="rosservice" name="set_pen" args="call /turtle1/set_pen 255 255 0 15 0" /> </launch> |
最後,執行 roslaunch 來啟動 mytest.launch,就可以看到呼叫 service 的動作已經生效。在下方畫面中,可以看到生出一隻新的小烏龜,並且烏龜移動的線條也如設定更改了。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9bIyKxR9NtT451w5qLpuezBPk5KUqgMYEoU2Iayx4Ia5isM1odR-65ugqDrAKe_pgNq3pRFnMbF0KeCOAgMc-xLrFsHqK9CTZVJDuR4wPQe03sj8gB2Nlraib8wREQSEJD9Dp69EG9SI/s0/roslaunch_service.png)
參考資料
- Call a service at startup with a launch file
https://answers.ros.org/question/11271/call-a-service-at-startup-with-a-launch-file/
沒有留言:
張貼留言