日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux开机启动roscore,树莓派ubuntuMate系统中开机自启动ROS的launch文件

發布時間:2023/12/1 linux 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux开机启动roscore,树莓派ubuntuMate系统中开机自启动ROS的launch文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

0x00 為何需要開機自啟動launch文件

在ROS開發后期階段由于功能已經趨于穩定,因此就需要系統在一上電啟動后就自動把ROS下的各節點程序加載運行,這樣就省去了我們還得手動輸入roslaunch命令來加載bringup的launch文件的操作。經過我的實際測試目前有兩種方式可以實現開機自啟動,一種就是使用系統自帶的Startup Applications,另外一種就是編寫一個service,開機后自動啟動,在這里我們以樹梅派下ubuntuMate安裝ros kinetic系統作為示例來分別演示這兩種方式各如何操作。

0x01 下載雷達源碼并編譯運行

在這里我以在樹梅派下開機后自啟動ydlidar-x4作為演示,首先就需要在樹梅派中下載該雷達源碼,在ROS工作空間的src目錄下使用如下命令下載源碼:

下載源碼后就可以先來配置雷達的設備掛載點,使其掛載點從/dev/ttyUSBx映射到/dev/ydlidar,這樣方便我們獲取雷達的設備掛載點。

當編譯完成后就可以來測試雷達是否可以正常啟動了,需要首先source devel/setup.bash配置當前工作空間的環境變量,這樣我們才能使用roslauch來啟動ydlidar軟件包下的lidar.launch,在這里需要注意的是由于雷達的USB口供電能力較弱,因此我們除了需要接上雷達的數據接口后還得接上供電接口,這樣ydlidar-x4才能正常工作。

當編譯完成后,我們可以來使用roslaunch啟動雷達看看是否能正常工作,可以先source devel/setup.bash配置好環境變量后,使用如下命令來啟動雷達roslaunch ydlidar lidar.launch,接下來就會發現雷達開始轉動起來。

0x02 使用StartupApplication方式來自啟動

這種方式的主要思路就是通過編寫一個bash腳本,在腳本中來執行roslaunch命令啟動相應的ros節點,然后我們在系統提供的startupApplication中添加我們要執行的腳本即可,這樣就可以在每次開機的時候執行我們自定義的腳本了。在這里我們在當前ros工作空間源碼目錄創建一個軟件包用于存放我們的腳本,具體操作如下所示:

在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的界面上來配置添加啟動程序了,如下圖所示完整操作:

注意Command的添加,完整的命令如下:

terminator -x /home/corvin/catkin_ws/src/auto_startup/scripts/startup.sh

大家只需要修改terminator為mate_terminal,如果在x64的ubuntu的系統上,默認安裝的終端是gnome-terminal,另外就是需要修改后面的路徑為自己腳本的路徑就可以了。當點擊Add后,接下來就可以來重啟樹梅派來進行測試了,看看重啟后是否開機時能將雷達自動啟動,下圖是樹梅派剛啟動時自動打開terminator終端,然后自動來執行腳本中的roslaunch命令將雷達啟動:

0x03 編寫service啟動相關代碼

我們仍然在創建的auto_startup軟件包的scripts目錄下創建需要的文件,使用如下命令來操作:

在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

該文件就是我們自定義的服務,我們可以使用systemctl來操作該服務使其可以開機時候來啟動,執行其中相應的命令,里面的命令其實還是我們自定義的腳本,下面來簡要解析下該服務的內容,service主要由三部分組成,分別時Unit,Service,Install下面來分別介紹這三部分:

Unit:該服務的類型描述,這里定義為單元類型,Description是這個服務的一個描述信息,可以自己根據需要來修改。

Service:服務的關鍵部分,需要配置的一些關鍵參數,這里配置了如下幾個參數:

(1)Type=simple:表明這個服務主要由 ExecStart 設置的程序來啟動,啟動后常駐于內存中。這個simple是默認的參數,除了simple外還可以設置為oneShot,該參數與simple類似,區別在于這個ExecStart執行的命令執行完成后就退出了,不會常駐在內存中。還可以設置為idel,該參數與 simple 類似,意思是要執行這個服務必須要所有的工作都順利執行完畢后才會執行,這類的服務通常是開機到最后才執行即可的服務。

(2)Restart=always:表明該服務具備重啟功能,如果服務意外關閉后會一直嘗試重新啟動。

(3)RestartSec=30:表明服務在意外關閉后,經過多少秒后再次重新嘗試啟動該服務。

(4)ExecStart=/usr/sbin/ros_start:表明服務啟動時需要執行的命令,后面就是執行的命令所在路徑,這里的命令是我們自定義的腳本。

(5)ExecStop=/usr/sbin/ros_stop:當需要停止該服務時需要執行的命令,后面是命令的路徑。

(6)ExecStop=/usr/sbin/ros_restart:當服務需要重新啟動時需要執行的命令,后面是命令的路徑。

Install:需要將該unit安裝到那個target上。

然后開始編寫需要啟動的三個腳本,分別是ros_start,ros_stop,ros_restart,下面來依次介紹三個腳本的編寫:

(1)編寫ros_start腳本,該腳本就是服務啟動時需要執行的命令,具體代碼如下:

#!/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腳本,該腳本是需要停止服務時執行的命令,具體代碼如下:

#!/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腳本,該腳本是當需要重啟服務時執行的命令,具體代碼如下:

#!/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并重啟測試

當編寫好service和相應的執行腳本后,接下來就需要將其放到指定的目錄下,由于需要執行的命令較多,我們仍然編寫一個bash腳本來執行配置的命令,該腳本仍然放在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

首先對該腳本進行簡單解析,前面通過cp拷貝將三個執行腳本放到/usr/sbin目錄下,然后將ros_startup.service拷貝到/lib/systemd/system目錄下,接下來的sudo systemctl enable ros_startup.service就是為了使該服務生效,啟用該服務。當為該腳本通過chmod +x config_service.sh來增加執行權限后就可以來執行該腳本配置service了,具體操作如下圖:

當使用systemctl is-enabled ros_startup.service命令就是為了查看我們的自定義服務是否已經啟用,當出現enable就說明我們的服務已經掛載在系統服務上,當系統啟動時會加載我們的服務來一起啟動的,下面我們就可以來重啟樹梅派系統來測試了,看看能否正常執行我們的ros_start腳本來加載雷達啟動。

當我們重啟后可以發現系統已經正常使用我們的ros_start腳本來將雷達啟動起來了,下面來詳細介紹下systemctl這個命令,我們來如何操控我們的自定義服務:

(1)當我們想停止我們的launch加載的雷達時,可以使用如下命令:

sudo systemctl stop ros_startup.service

(2)當我們想啟動我們的launch文件時,可以使用如下命令,當執行完以下命令后可以發現我們再次將雷達啟動起來:

sudo systemctl start ros_startup.service

(3)當我們在launch文件運行中,想重新啟動時可以執行如下命令,當執行完以下命令是會發現雷達首先停止了轉動,等待3秒鐘然后又再次重新啟動了:

sudo systemctl restart ros_startup.service

(4)如果想禁止我們的自定義服務在開機的時候啟動,可以使用如下命令:

sudo systemctl disable ros_startup.service

(5)如果想再次重新在開機時啟動我們的服務,可以使用如下命令:

sudo systemctl enable ros_startup.service

在我們enable了自定義的服務后,我們的服務就會在后臺一直運行,但是我們卻不知道該服務在后臺如何運行的,因為看不到任何日志輸出,如果想查看服務運行的相關日志該如何操作呢,在這里就需要使用journalctl標準日志服務來查看了,Systemd通過其標準日志服務Journald將其管理的所有后臺進程打印到到std:out(即控制臺)的輸出重定向到了日志文件。日志文件是二進制格式的,因此必須使用特定的工具才能查看。

Journald提供了配套的程序Journalctl用于處理日志內容,Journalctl的使用非常簡單,默認不帶任何參數的時候會輸出系統和所有后臺進程的混合日志,常用的參數有--dmesg用于查看內核輸出的日志,--system用于查看系統輸出的日志,--unit加上Unit的名字來指定輸出特定Unit的日志,例如我們想查看自定義服務ros_startup.service的日志輸出,可以使用如下命令:

sudo journalctl --unit ros_startup.service

下面來測試下該命令,查看服務在后臺的日志輸出:

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

現在我們已經可以使用自定義服務的方式來開啟引導啟動ROS的launch文件,但是如果我們現在想卸載相關的service文件該如何操作呢,那就需要將我們放置在相應目錄中的腳本和service文件刪除即可,我們可以編寫個腳本來完成該動作,腳本命名為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

可以發現當執行了卸載自定義service的腳本后,我們已經無法執行start和stop相關操作了,如果想再次啟用自定義服務只要重新執行啟用的腳本即可。

0x05 參考資料

0x06 問題反饋

大家在按照教程操作過程中有任何問題,可以關注ROS小課堂的官方微信公眾號,在公眾號中給我發消息反饋問題即可,我基本上每天都會處理公眾號中的留言!當然如果你要是順便給ROS小課堂打個賞,我也會感激不盡的,打賞30塊還會邀請進ROS小課堂的微信群與更多志同道合的小伙伴一起學習和交流!

總結

以上是生活随笔為你收集整理的linux开机启动roscore,树莓派ubuntuMate系统中开机自启动ROS的launch文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。