iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 6
0
Software Development

ROS進階學習筆記系列 第 6

Day 06 - 好用的腳本 roslaunch

  • 分享至 

  • xImage
  •  

昨天我們提到了使用cmd 下達publish topic的指令,今天來寫寫如何用腳本自動執行~~

兩年前寫的ROS筆記中有稍微提到一點roslaunch的部分,如今回頭看覺得也寫得太簡略了吧XD roslaunch明明就有更多好用的地方,且讓我娓娓道來~~

publish topic

第一個功能就是如何將昨天寫的cmd publish topic寫入腳本,其實跟昨天的cmd有點像,不過前後要加一個{},並且內容填寫依照json格式,如下:

<node pkg="rostopic" type="rostopic" name="test" args=" pub /topic sensor_msgs/CameraInfo '{header:
    {stamp: now, frame_id: world},
    height: 0,                   
    width: 0,
    distortion_model: '',
    D: [0],
    K: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
    R: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
    P: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
    binning_x: 0,
    binning_y: 0,                                                  
    roi: {x_offset: 0, y_offset: 0, height: 0, width: 0, do_rectify: false}}'" />

這個功能我覺得在大型專案的時候很需要,有時候我們寫腳本讓他自動執行,但是需要手動下publisher的時候總不能都靠cmd line下吧~但是為了這麼一個小功能就寫node也是蠻大材小用的,所以這時候寫launch就很好用囉!

node tag

剛剛寫完roslaunch 內的publiser,想來簡單說明一下node內的標籤<tag>主要有哪些,因為我之前沒有寫得很完整,想在這邊補一下,從上面的範例可以看到主要有4種標籤:

  • pkg: 此node所隸屬的package名稱,roscore可以從這個package名稱找到其內的node,就是rosrun 後面的那個參數啦~
  • type: 此node的名稱,也就是rosrun 的第二個參數,roscore找到pkg名稱後,接著要根據這個type名稱來找到應該執行的node
  • name: 若有需求需要更改node名稱的時候使用的參數,通常是在你有需要將同一個node重複執行,但是code又沒有寫到匿名功能的時候可以用這個方式指派給他
  • args: 這邊就是下參數的地方啦~ 執行這個node的時候需要餵給他吃的參數,可以寫很多個都沒問題~

其他還有:

  • respawn: 此node若掛掉的話需不需要重新執行,true的話即表示要,否則就是不用(default為不用)
  • launch-prefix: 這個就是平常可能會下在cmd最前面的地方的一些prefix,例如gnome-terminal就是新開一個視窗執行之類的

debug mode (gdb)

ros 也支援gdb debug,其原理就是在launch檔內加上launch-prefix="xterm -e gdb -ex run --args ",並且在編譯ros package的時候要寫是編debug模式,這樣在執行launch的時候就會多開一個視窗執行gdb囉! 筆者之前出現segmantation fault的時候用這個方法debug,覺得需要記錄下來避免以後還會用到(汗

邏輯判斷if / unless

跟腳本一樣,launch檔內可以使用簡單的邏輯判斷,不過目前只有if和unless可以用:

  • if=value
  • unless=value
    兩者都是若value值為true的話才作動,筆者實測覺得沒有差別。

remap

最後這個是筆者覺得roslaunch 最好用的功能之一,也就是當我們跟別人合作執行專案時,訂的topic name有出入的時候可以進行的一個小撇步,不需要更改node內的topic名稱,只需要下remap的標籤,就可以無痛移植啦!

<remap from="/topic_1" to="/topic_2" if="$(arg sync)"/>

小提醒:這個tag轉換topic的前提是msg type 一樣呦!

Reference

http://wiki.ros.org/roslaunch/XML
https://www.itread01.com/content/1544492015.html
https://www.mobibrw.com/2017/8005


上一篇
Day 05 - Publish Topic 要做Header好麻煩?
下一篇
Day 07 - 好用的腳本 roslaunch (2)
系列文
ROS進階學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言