linux开机启动roscore,树莓派ubuntuMate系统中开机自启动ROS的launch文件
0x00 為何需要開機(jī)自啟動(dòng)launch文件
在ROS開發(fā)后期階段由于功能已經(jīng)趨于穩(wěn)定,因此就需要系統(tǒng)在一上電啟動(dòng)后就自動(dòng)把ROS下的各節(jié)點(diǎn)程序加載運(yùn)行,這樣就省去了我們還得手動(dòng)輸入roslaunch命令來加載bringup的launch文件的操作。經(jīng)過我的實(shí)際測試目前有兩種方式可以實(shí)現(xiàn)開機(jī)自啟動(dòng),一種就是使用系統(tǒng)自帶的Startup Applications,另外一種就是編寫一個(gè)service,開機(jī)后自動(dòng)啟動(dòng),在這里我們以樹梅派下ubuntuMate安裝ros kinetic系統(tǒng)作為示例來分別演示這兩種方式各如何操作。
0x01 下載雷達(dá)源碼并編譯運(yùn)行
在這里我以在樹梅派下開機(jī)后自啟動(dòng)ydlidar-x4作為演示,首先就需要在樹梅派中下載該雷達(dá)源碼,在ROS工作空間的src目錄下使用如下命令下載源碼:
下載源碼后就可以先來配置雷達(dá)的設(shè)備掛載點(diǎn),使其掛載點(diǎn)從/dev/ttyUSBx映射到/dev/ydlidar,這樣方便我們獲取雷達(dá)的設(shè)備掛載點(diǎn)。
當(dāng)編譯完成后就可以來測試?yán)走_(dá)是否可以正常啟動(dòng)了,需要首先source devel/setup.bash配置當(dāng)前工作空間的環(huán)境變量,這樣我們才能使用roslauch來啟動(dòng)ydlidar軟件包下的lidar.launch,在這里需要注意的是由于雷達(dá)的USB口供電能力較弱,因此我們除了需要接上雷達(dá)的數(shù)據(jù)接口后還得接上供電接口,這樣ydlidar-x4才能正常工作。
當(dāng)編譯完成后,我們可以來使用roslaunch啟動(dòng)雷達(dá)看看是否能正常工作,可以先source devel/setup.bash配置好環(huán)境變量后,使用如下命令來啟動(dòng)雷達(dá)roslaunch ydlidar lidar.launch,接下來就會(huì)發(fā)現(xiàn)雷達(dá)開始轉(zhuǎn)動(dòng)起來。
0x02 使用StartupApplication方式來自啟動(dòng)
這種方式的主要思路就是通過編寫一個(gè)bash腳本,在腳本中來執(zhí)行roslaunch命令啟動(dòng)相應(yīng)的ros節(jié)點(diǎn),然后我們?cè)谙到y(tǒng)提供的startupApplication中添加我們要執(zhí)行的腳本即可,這樣就可以在每次開機(jī)的時(shí)候執(zhí)行我們自定義的腳本了。在這里我們?cè)诋?dāng)前ros工作空間源碼目錄創(chuàng)建一個(gè)軟件包用于存放我們的腳本,具體操作如下所示:
在startup.sh腳本中添加如下代碼:
#!/bin/bash
#?Copyright:?2016-2018?www.corvin.cn
#?Author:?corvin
#?Description:?In?raspeberry?ubuntu?Mate16.04?poweron
#???startup?ros's?launch?file.
#?History:
#????20180530:?initial?this?file.
source?/opt/ros/kinetic/setup.bash
source?~/catkin_ws/devel/setup.bash
roslaunch?ydlidar?lidar.launch
exit?0
接下來就可以在ubuntuMate的界面上來配置添加啟動(dòng)程序了,如下圖所示完整操作:
注意Command的添加,完整的命令如下:
terminator -x /home/corvin/catkin_ws/src/auto_startup/scripts/startup.sh
大家只需要修改terminator為mate_terminal,如果在x64的ubuntu的系統(tǒng)上,默認(rèn)安裝的終端是gnome-terminal,另外就是需要修改后面的路徑為自己腳本的路徑就可以了。當(dāng)點(diǎn)擊Add后,接下來就可以來重啟樹梅派來進(jìn)行測試了,看看重啟后是否開機(jī)時(shí)能將雷達(dá)自動(dòng)啟動(dòng),下圖是樹梅派剛啟動(dòng)時(shí)自動(dòng)打開terminator終端,然后自動(dòng)來執(zhí)行腳本中的roslaunch命令將雷達(dá)啟動(dòng):
0x03 編寫service啟動(dòng)相關(guān)代碼
我們?nèi)匀辉趧?chuàng)建的auto_startup軟件包的scripts目錄下創(chuàng)建需要的文件,使用如下命令來操作:
在ros_startup.service中添加的代碼如下:
[Unit]
Description=powerOn?startup?ros
[Service]
Type=simple
Restart=always
RestartSec=30
ExecStart=/usr/sbin/ros_start
ExecStop=/usr/sbin/ros_stop
ExecRestart=/usr/sbin/ros_restart
[Install]
WantedBy=multi-user.target
該文件就是我們自定義的服務(wù),我們可以使用systemctl來操作該服務(wù)使其可以開機(jī)時(shí)候來啟動(dòng),執(zhí)行其中相應(yīng)的命令,里面的命令其實(shí)還是我們自定義的腳本,下面來簡要解析下該服務(wù)的內(nèi)容,service主要由三部分組成,分別時(shí)Unit,Service,Install下面來分別介紹這三部分:
Unit:該服務(wù)的類型描述,這里定義為單元類型,Description是這個(gè)服務(wù)的一個(gè)描述信息,可以自己根據(jù)需要來修改。
Service:服務(wù)的關(guān)鍵部分,需要配置的一些關(guān)鍵參數(shù),這里配置了如下幾個(gè)參數(shù):
(1)Type=simple:表明這個(gè)服務(wù)主要由 ExecStart 設(shè)置的程序來啟動(dòng),啟動(dòng)后常駐于內(nèi)存中。這個(gè)simple是默認(rèn)的參數(shù),除了simple外還可以設(shè)置為oneShot,該參數(shù)與simple類似,區(qū)別在于這個(gè)ExecStart執(zhí)行的命令執(zhí)行完成后就退出了,不會(huì)常駐在內(nèi)存中。還可以設(shè)置為idel,該參數(shù)與 simple 類似,意思是要執(zhí)行這個(gè)服務(wù)必須要所有的工作都順利執(zhí)行完畢后才會(huì)執(zhí)行,這類的服務(wù)通常是開機(jī)到最后才執(zhí)行即可的服務(wù)。
(2)Restart=always:表明該服務(wù)具備重啟功能,如果服務(wù)意外關(guān)閉后會(huì)一直嘗試重新啟動(dòng)。
(3)RestartSec=30:表明服務(wù)在意外關(guān)閉后,經(jīng)過多少秒后再次重新嘗試啟動(dòng)該服務(wù)。
(4)ExecStart=/usr/sbin/ros_start:表明服務(wù)啟動(dòng)時(shí)需要執(zhí)行的命令,后面就是執(zhí)行的命令所在路徑,這里的命令是我們自定義的腳本。
(5)ExecStop=/usr/sbin/ros_stop:當(dāng)需要停止該服務(wù)時(shí)需要執(zhí)行的命令,后面是命令的路徑。
(6)ExecStop=/usr/sbin/ros_restart:當(dāng)服務(wù)需要重新啟動(dòng)時(shí)需要執(zhí)行的命令,后面是命令的路徑。
Install:需要將該unit安裝到那個(gè)target上。
然后開始編寫需要啟動(dòng)的三個(gè)腳本,分別是ros_start,ros_stop,ros_restart,下面來依次介紹三個(gè)腳本的編寫:
(1)編寫ros_start腳本,該腳本就是服務(wù)啟動(dòng)時(shí)需要執(zhí)行的命令,具體代碼如下:
#!/bin/bash
#?Copyright:?2016-2018?www.corvin.cn
#?Author:?corvin
#?Description:?In?raspeberry?ubuntu?Mate16.04?poweron
#???startup?ros's?launch?file.
#?History:
#????20180531:?initial?this?file.
source?/opt/ros/kinetic/setup.bash
source?/home/corvin/catkin_ws/devel/setup.bash
roslaunch?ydlidar?lidar.launch
exit?0
(2)編寫ros_stop腳本,該腳本是需要停止服務(wù)時(shí)執(zhí)行的命令,具體代碼如下:
#!/bin/bash
#?Copyright:?2016-2018?www.corvin.cn
#?Author:?corvin
#?Description:?when?stop?service?should?execute?cmd
#?History:
#????20180531:?initial?this?file.
source?/opt/ros/kinetic/setup.bash
source?/home/corvin/catkin_ws/devel/setup.bash
for?i?in?$(rosnode?list);do
rosnode?kill?$i;
done
killall?roslaunch
exit?0
(3)編寫ros_restart腳本,該腳本是當(dāng)需要重啟服務(wù)時(shí)執(zhí)行的命令,具體代碼如下:
#!/bin/bash
#?Copyright:?2016-2018?www.corvin.cn
#?Author:?corvin
#?Description:?when?should?restart?service?execute?this?bash.
#?History:
#????20180531:?initial?this?bash?file.
/usr/sbin/ros_stop
sleep?3
/usr/sbin/ros_start
exit?0
0x04 配置service并重啟測試
當(dāng)編寫好service和相應(yīng)的執(zhí)行腳本后,接下來就需要將其放到指定的目錄下,由于需要執(zhí)行的命令較多,我們?nèi)匀痪帉懸粋€(gè)bash腳本來執(zhí)行配置的命令,該腳本仍然放在scripts目錄下,文件命名為config_service.sh,腳本代碼如下:
#!/bin/bash
#?Copyright:?2016-2018?www.corvin.cn
#?Author:?corvin
#?Description:?config?ros?startup?service?and?bash?files.
#?History:
#????20180531:?initial?this?file.
sudo?cp?ros_start?/usr/sbin/
sudo?cp?ros_stop?/usr/sbin/
sudo?cp?ros_restart?/usr/sbin/
sudo?cp?ros_startup.service?/lib/systemd/system/
sudo?systemctl?enable?ros_startup.service
exit?0
首先對(duì)該腳本進(jìn)行簡單解析,前面通過cp拷貝將三個(gè)執(zhí)行腳本放到/usr/sbin目錄下,然后將ros_startup.service拷貝到/lib/systemd/system目錄下,接下來的sudo systemctl enable ros_startup.service就是為了使該服務(wù)生效,啟用該服務(wù)。當(dāng)為該腳本通過chmod +x config_service.sh來增加執(zhí)行權(quán)限后就可以來執(zhí)行該腳本配置service了,具體操作如下圖:
當(dāng)使用systemctl is-enabled ros_startup.service命令就是為了查看我們的自定義服務(wù)是否已經(jīng)啟用,當(dāng)出現(xiàn)enable就說明我們的服務(wù)已經(jīng)掛載在系統(tǒng)服務(wù)上,當(dāng)系統(tǒng)啟動(dòng)時(shí)會(huì)加載我們的服務(wù)來一起啟動(dòng)的,下面我們就可以來重啟樹梅派系統(tǒng)來測試了,看看能否正常執(zhí)行我們的ros_start腳本來加載雷達(dá)啟動(dòng)。
當(dāng)我們重啟后可以發(fā)現(xiàn)系統(tǒng)已經(jīng)正常使用我們的ros_start腳本來將雷達(dá)啟動(dòng)起來了,下面來詳細(xì)介紹下systemctl這個(gè)命令,我們來如何操控我們的自定義服務(wù):
(1)當(dāng)我們想停止我們的launch加載的雷達(dá)時(shí),可以使用如下命令:
sudo systemctl stop ros_startup.service
(2)當(dāng)我們想啟動(dòng)我們的launch文件時(shí),可以使用如下命令,當(dāng)執(zhí)行完以下命令后可以發(fā)現(xiàn)我們?cè)俅螌⒗走_(dá)啟動(dòng)起來:
sudo systemctl start ros_startup.service
(3)當(dāng)我們?cè)趌aunch文件運(yùn)行中,想重新啟動(dòng)時(shí)可以執(zhí)行如下命令,當(dāng)執(zhí)行完以下命令是會(huì)發(fā)現(xiàn)雷達(dá)首先停止了轉(zhuǎn)動(dòng),等待3秒鐘然后又再次重新啟動(dòng)了:
sudo systemctl restart ros_startup.service
(4)如果想禁止我們的自定義服務(wù)在開機(jī)的時(shí)候啟動(dòng),可以使用如下命令:
sudo systemctl disable ros_startup.service
(5)如果想再次重新在開機(jī)時(shí)啟動(dòng)我們的服務(wù),可以使用如下命令:
sudo systemctl enable ros_startup.service
在我們enable了自定義的服務(wù)后,我們的服務(wù)就會(huì)在后臺(tái)一直運(yùn)行,但是我們卻不知道該服務(wù)在后臺(tái)如何運(yùn)行的,因?yàn)榭床坏饺魏稳罩据敵?#xff0c;如果想查看服務(wù)運(yùn)行的相關(guān)日志該如何操作呢,在這里就需要使用journalctl標(biāo)準(zhǔn)日志服務(wù)來查看了,Systemd通過其標(biāo)準(zhǔn)日志服務(wù)Journald將其管理的所有后臺(tái)進(jìn)程打印到到std:out(即控制臺(tái))的輸出重定向到了日志文件。日志文件是二進(jìn)制格式的,因此必須使用特定的工具才能查看。
Journald提供了配套的程序Journalctl用于處理日志內(nèi)容,Journalctl的使用非常簡單,默認(rèn)不帶任何參數(shù)的時(shí)候會(huì)輸出系統(tǒng)和所有后臺(tái)進(jìn)程的混合日志,常用的參數(shù)有--dmesg用于查看內(nèi)核輸出的日志,--system用于查看系統(tǒng)輸出的日志,--unit加上Unit的名字來指定輸出特定Unit的日志,例如我們想查看自定義服務(wù)ros_startup.service的日志輸出,可以使用如下命令:
sudo journalctl --unit ros_startup.service
下面來測試下該命令,查看服務(wù)在后臺(tái)的日志輸出:
corvin@robot:~$?sudo?journalctl?--unit?ros_startup.service
[sudo]?password?for?corvin:
--?Logs?begin?at?五?2016-02-12?00:28:02?CST,?end?at?四?2018-05-31?15:58:43?CST.?--
5月?31?15:57:46?robot?systemd[1]:?Started?powerOn?startup?ros.
corvin@robot:~$?sudo?systemctl?restart?ros_startup.service
corvin@robot:~$?sudo?journalctl?--unit?ros_startup.service
--?Logs?begin?at?五?2016-02-12?00:28:02?CST,?end?at?四?2018-05-31?15:59:39?CST.?--
5月?31?15:57:46?robot?systemd[1]:?Started?powerOn?startup?ros.
5月?31?15:59:21?robot?systemd[1]:?Stopping?powerOn?startup?ros...
5月?31?15:59:24?robot?ros_stop[1981]:?killing?/base_link_to_laser4
5月?31?15:59:24?robot?ros_stop[1981]:?killed
5月?31?15:59:24?robot?ros_stop[1981]:?killing?/rosout
5月?31?15:59:24?robot?ros_stop[1981]:?killed
5月?31?15:59:25?robot?ros_stop[1981]:?killing?/ydlidar_node
5月?31?15:59:25?robot?ros_stop[1981]:?killed
5月?31?15:59:26?robot?ros_start[615]:?...?logging?to?/root/.ros/log/524e6f08-64a8-11e8-a578-b827eb148
5月?31?15:59:26?robot?ros_start[615]:?Checking?log?directory?for?disk?usage.?This?may?take?awhile.
5月?31?15:59:26?robot?ros_start[615]:?Press?Ctrl-C?to?interrupt
5月?31?15:59:26?robot?ros_start[615]:?Done?checking?log?file?disk?usage.?Usage?is?<1GB.
5月?31?15:59:26?robot?ros_start[615]:?[59B?blob?data]
5月?31?15:59:26?robot?ros_start[615]:?started?roslaunch?server?http://robot:34151/
5月?31?15:59:26?robot?ros_start[615]:?SUMMARY
5月?31?15:59:26?robot?ros_start[615]:?========
5月?31?15:59:26?robot?ros_start[615]:?PARAMETERS
5月?31?15:59:26?robot?ros_start[615]:??*?/rosdistro:?kinetic
5月?31?15:59:26?robot?ros_start[615]:??*?/rosversion:?1.12.13
5月?31?15:59:26?robot?ros_start[615]:??*?/ydlidar_node/angle_fixed:?True
5月?31?15:59:26?robot?ros_start[615]:??*?/ydlidar_node/angle_max:?180.0
5月?31?15:59:26?robot?ros_start[615]:??*?/ydlidar_node/angle_min:?-180.0
5月?31?15:59:26?robot?ros_start[615]:??*?/ydlidar_node/baudrate:?115200
5月?31?15:59:26?robot?ros_start[615]:??*?/ydlidar_node/frame_id:?laser_frame
5月?31?15:59:26?robot?ros_start[615]:??*?/ydlidar_node/frequency:?7.0
5月?31?15:59:26?robot?ros_start[615]:??*?/ydlidar_node/heartbeat:?False
5月?31?15:59:26?robot?ros_start[615]:??*?/ydlidar_node/ignore_array:
5月?31?15:59:26?robot?ros_start[615]:??*?/ydlidar_node/low_exposure:?False
5月?31?15:59:26?robot?ros_start[615]:??*?/ydlidar_node/port:?/dev/ydlidar
5月?31?15:59:26?robot?ros_start[615]:??*?/ydlidar_node/range_max:?16.0
5月?31?15:59:26?robot?ros_start[615]:??*?/ydlidar_node/range_min:?0.08
5月?31?15:59:26?robot?ros_start[615]:??*?/ydlidar_node/resolution_fixed:?True
5月?31?15:59:26?robot?ros_start[615]:??*?/ydlidar_node/samp_rate:?9
5月?31?15:59:26?robot?ros_start[615]:?NODES
現(xiàn)在我們已經(jīng)可以使用自定義服務(wù)的方式來開啟引導(dǎo)啟動(dòng)ROS的launch文件,但是如果我們現(xiàn)在想卸載相關(guān)的service文件該如何操作呢,那就需要將我們放置在相應(yīng)目錄中的腳本和service文件刪除即可,我們可以編寫個(gè)腳本來完成該動(dòng)作,腳本命名為uninstall_ros_service.sh,具體代碼如下所示:
#!/bin/bash
#?Copyright:?2016-2018?www.corvin.cn
#?Author:?corvin
#?Description:?Remove?ourself?service?files,include?bash?file.
#?History:
#????20180531:?initial?this?file.
/usr/sbin/ros_stop
sudo?systemctl?disable?ros_startup.service
sudo?rm?/usr/sbin/ros_start
sudo?rm?/usr/sbin/ros_stop
sudo?rm?/usr/sbin/ros_restart
sudo?rm?/lib/systemd/system/ros_startup.service
exit?0
可以發(fā)現(xiàn)當(dāng)執(zhí)行了卸載自定義service的腳本后,我們已經(jīng)無法執(zhí)行start和stop相關(guān)操作了,如果想再次啟用自定義服務(wù)只要重新執(zhí)行啟用的腳本即可。
0x05 參考資料
0x06 問題反饋
大家在按照教程操作過程中有任何問題,可以關(guān)注ROS小課堂的官方微信公眾號(hào),在公眾號(hào)中給我發(fā)消息反饋問題即可,我基本上每天都會(huì)處理公眾號(hào)中的留言!當(dāng)然如果你要是順便給ROS小課堂打個(gè)賞,我也會(huì)感激不盡的,打賞30塊還會(huì)邀請(qǐng)進(jìn)ROS小課堂的微信群與更多志同道合的小伙伴一起學(xué)習(xí)和交流!
總結(jié)
以上是生活随笔為你收集整理的linux开机启动roscore,树莓派ubuntuMate系统中开机自启动ROS的launch文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 瑞风s2多少钱啊?
- 下一篇: 小森生活天守阁壁炉怎么获得