參考https://blog.csdn.net/vampirewolf/article/details/90051086尾序;https://blog.csdn.net/weixin_42018112/article/details/82429883;
https://blog.csdn.net/qq_21950671/article/details/101703451#launch_5;
launch文件功能
使用launch文件君珠,可以同時(shí)啟動(dòng)多個(gè)ros節(jié)點(diǎn)惰帽,包括master節(jié)點(diǎn)婚温,可以同時(shí)啟動(dòng)roscore和多個(gè)節(jié)點(diǎn)程序歹篓。
roslaunch package-name launch-file-name
如何創(chuàng)建launch文件
- 確定存放launch文件的地方
launch文件可以存放在功能包的根目錄下
launch文件可以存放在功能包下單獨(dú)的launch文件夾下
- launch文件的基本編寫(xiě)結(jié)構(gòu)
根元素中間包含了若干個(gè)節(jié)點(diǎn)元素
每個(gè)節(jié)點(diǎn)包含了其相應(yīng)的節(jié)點(diǎn)屬性信息
launch標(biāo)簽用法說(shuō)明
- launch文件中的根元素采用標(biāo)簽定義,文件其他內(nèi)容必須包含在這個(gè)標(biāo)簽中
<launch>
</launch>
node標(biāo)簽用法說(shuō)明
pkg:節(jié)點(diǎn)所在功能包名稱(chēng)
type: 節(jié)點(diǎn)可執(zhí)行文件名稱(chēng)
這兩個(gè)屬性等同于在終端中使用rosrun命令執(zhí)行節(jié)點(diǎn)
name:節(jié)點(diǎn)運(yùn)行時(shí)的名稱(chēng)咐容,將覆蓋節(jié)點(diǎn)init()賦予節(jié)點(diǎn)的名稱(chēng)
args=“arg1 arg2 arg3”(optional) 節(jié)點(diǎn)需要的輸入?yún)?shù)舆逃。
machine=“machine-name”(optional, see ) launch文件中運(yùn)行的每個(gè)節(jié)點(diǎn)可以指定該節(jié)點(diǎn)運(yùn)行的machine,
respawn=“true”(optional, default: False) 復(fù)位屬性,該節(jié)點(diǎn)停止時(shí)路狮,會(huì)自動(dòng)重啟虫啥,默認(rèn)為false。
respawn_delay=“30” (optional, default 0) 嘗試重新啟動(dòng)之前檢測(cè)到節(jié)點(diǎn)故障后等待時(shí)間奄妨。
required=“true”(optional) 必要節(jié)點(diǎn)涂籽,當(dāng)該節(jié)點(diǎn)停止時(shí),launch文件中的其他節(jié)點(diǎn)也會(huì)被終止展蒂。
ns=“foo”(optional) 命名空間,為節(jié)點(diǎn)內(nèi)的相對(duì)名稱(chēng)添加命名空間前綴
clear_params=“true|false”(optional) 在啟動(dòng)前刪除節(jié)點(diǎn)的私有命名空間中的所有參數(shù)苔咪。
output=“l(fā)og|screen”(optional) 將節(jié)點(diǎn)的標(biāo)準(zhǔn)輸出打印到終端屏幕锰悼,默認(rèn)輸出為日志文檔
cwd=“ROS_HOME|node”(optional) 如果為“node”,則節(jié)點(diǎn)的工作目錄將設(shè)置為與節(jié)點(diǎn)的可執(zhí)行文件相同的目錄团赏。
launch-prefix=“prefix arguments”(optional) 用于預(yù)先添加到節(jié)點(diǎn)的啟動(dòng)參數(shù)的命令/參數(shù)
參數(shù)設(shè)置——param
<param>可以添加在<node>中箕般。parameter是ROS系統(tǒng)運(yùn)行中的參數(shù),存儲(chǔ)在參數(shù)服務(wù)器中舔清。在launch文件中可以通過(guò)<param>元素加載parameter丝里。launch文件執(zhí)行后,parameter就加載到ROS的參數(shù)服務(wù)器上了体谒。每個(gè)活躍的節(jié)點(diǎn)都可以通過(guò) ros::param::get()接口來(lái)獲取parameter的值杯聚,用戶(hù)也可以在終端中通過(guò)rosparam命令獲得parameter的值。
name="namespace/name":參數(shù)的名字
value="value"(可選):定義參數(shù)的值抒痒,如果省略這個(gè)參數(shù)幌绍,則應(yīng)該指定一個(gè)文件(binfile/texfile)或命令
type="str|int|double|boot"(可選):指定參數(shù)的類(lèi)型
texfile="$(find pkg-name)/path/file" (可選)
binfile="$(find pkg-name)/path/file" (可選)
commadn="(find pkg-name)/exe '$(find pkg-name)/arg.txt'" (可選):exe是可執(zhí)行文件( .py或 .cpp),arg.txt是參數(shù)文件
但是在很多復(fù)雜的系統(tǒng)中故响,參數(shù)的數(shù)量很多傀广,如果這樣一個(gè)一個(gè)的設(shè)置會(huì)非常麻煩,ROS也為我們提供了另外一種類(lèi)似的參數(shù)加載方式——<rosparam>:
<rosparam file="$(find 2dnav_pr2)/config/costmap_common_params.yaml" command="load" ns="local_costmap" />
<rosparam>可以幫助我們將一個(gè)yaml格式文件中的參數(shù)全部加載到ROS參數(shù)服務(wù)器中彩届,需要設(shè)置command屬性為“l(fā)oad”伪冰,還可以選擇設(shè)置命名空間“ns”。
參數(shù)設(shè)置——arg
arg標(biāo)簽用來(lái)在launch文件中定義參數(shù)樟蠕,arg和param在ROS里有根本性的區(qū)別贮聂,就像局部變量和全局變量的區(qū)別一樣。arg不儲(chǔ)存在參數(shù)服務(wù)器中寨辩,不能提供給節(jié)點(diǎn)使用寂汇,只能在launch文件中使用。param則是儲(chǔ)存在參數(shù)服務(wù)器中捣染,可以被節(jié)點(diǎn)使用骄瓣。
重映射機(jī)制
launch文件中的<remap>標(biāo)簽顧名思義重映射,remap標(biāo)簽里包含一個(gè)original-name和一個(gè)new-name,及原名稱(chēng)和新名稱(chēng)榕栏。比如turtlebot的鍵盤(pán)控制節(jié)點(diǎn)畔勤,發(fā)布的速度控制指令話(huà)題可能是/turtlebot/cmd_vel,但是我們自己的機(jī)器人訂閱的速度控制話(huà)題是/cmd_vel扒磁,這個(gè)時(shí)候使用<remap>就可以輕松解決問(wèn)題庆揪,將/turtlebot /cmd_vel重映射為/cmd_vel,我們的機(jī)器人就可以接收到速度控制指令了妨托。
嵌套復(fù)用——include
在復(fù)雜的系統(tǒng)當(dāng)中缸榛,launch文件往往有很多,這些launch文件之間也會(huì)存在依賴(lài)關(guān)系兰伤。如果需要直接復(fù)用一個(gè)已有l(wèi)aunch文件中的內(nèi)容内颗,可以使用<include>標(biāo)簽包含其他launch文件,這和C語(yǔ)言中的include幾乎是一樣的敦腔。
file指明我們要包含進(jìn)來(lái)的文件
ns作用:相對(duì)NAME_SPACE命名空間導(dǎo)入文件