昨天我們提到了使用cmd 下達publish topic的指令,今天來寫寫如何用腳本自動執行~~
兩年前寫的ROS筆記中有稍微提到一點roslaunch的部分,如今回頭看覺得也寫得太簡略了吧XD roslaunch明明就有更多好用的地方,且讓我娓娓道來~~
第一個功能就是如何將昨天寫的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就很好用囉!
剛剛寫完roslaunch 內的publiser,想來簡單說明一下node內的標籤<tag>
主要有哪些,因為我之前沒有寫得很完整,想在這邊補一下,從上面的範例可以看到主要有4種標籤:
其他還有:
gnome-terminal
就是新開一個視窗執行之類的ros 也支援gdb debug,其原理就是在launch檔內加上launch-prefix="xterm -e gdb -ex run --args "
,並且在編譯ros package的時候要寫是編debug模式,這樣在執行launch的時候就會多開一個視窗執行gdb囉! 筆者之前出現segmantation fault的時候用這個方法debug,覺得需要記錄下來避免以後還會用到(汗
跟腳本一樣,launch檔內可以使用簡單的邏輯判斷,不過目前只有if和unless可以用:
if=value
unless=value
最後這個是筆者覺得roslaunch 最好用的功能之一,也就是當我們跟別人合作執行專案時,訂的topic name有出入的時候可以進行的一個小撇步,不需要更改node內的topic名稱,只需要下remap的標籤,就可以無痛移植啦!
<remap from="/topic_1" to="/topic_2" if="$(arg sync)"/>
小提醒:這個tag轉換topic的前提是msg type 一樣呦!
http://wiki.ros.org/roslaunch/XML
https://www.itread01.com/content/1544492015.html
https://www.mobibrw.com/2017/8005