ROS的開機自啟指令碼編寫

2021-07-31 07:08:37 字數 3085 閱讀 9297

1、聯網檢測**段:

while

true;do

ping -w 1 -c 1

192.168.1.132>/dev/null

ret=$?

if [ $ret

-eq0 ]

then

printf

"$prefix is up"

break;

else

printf

"$prefix is down \n"

fidone

2、在dash裡搜尋「啟動應用程式」裡將指令碼設定為開機自啟,指令碼將在開機後後台執行,在命令前加上gnome-terminal -x可以實現在終端執行,但是比較建議在指令碼裡需要在終端執行的地方加這個指令。

3、這種方式的開機自啟需要系統開啟圖形介面,比如樹莓派的ubuntu mate系統裡確保graphical enable,但具體有沒有顯示屏存在並不重要。另外需要注意的是如果安裝了xrdp這種遠端桌面的話,在同乙個ip開多個視窗遠端登入看到的是同一塊桌面,而不同ip則看到的是不同桌面,我們設定的開機啟動程式在每一塊桌面啟動時都會被執行!而vnc則有且僅有一塊桌面,與hdmi輸出保持一致。

4、在同乙個指令碼裡僅能執行乙個不return的指令,比如在同乙個指令碼裡先roscore再roslaunch是不行的,實際效果是只執行到roscore,除非ctrl+c結束core,指令碼才會繼續往下執行。因此,若要啟動乙個core和乙個roslaunch需要新增兩個開機啟動指令碼。

5、強大的screen指令:前面提到指令碼在終端執行,但是在隨後我們ssh後卻無法操控該終端,此時screen指令可以解決這個問題。新建乙個screen再在裡面操作即可方便後續attach回去,指令碼裡gnome-terminal -x screen -s windowname /the/path/of/the/shell 即可,分成兩條寫是不行的。

6、使用上面這種開screen就執行指令碼的方式有乙個問題,比如roslaunch裡某環節報錯掛了,screen會話將直接被終止,我們無從獲知程式報錯的原因。因此不能按上述命令寫,而應將新建screen會話和執行指令碼分開,正確的方式是:gnome-terminal -x screen -s windowname接gnome-terminal -x screen -s windowname -x screen /the/path/of/the/shell。其中screen的 -x 引數意思是指定在哪個screen中執行某個指令。

7、儘管我們加了gnome-terminal -x指定了後面的命令需在乙個終端裡執行,但screen 後緊跟的指令執行的時機是在終端執行.bashrc檔案之前,所以我們需要在指令碼裡自行source一些ros配置檔案,不要忘了export ros_master_uri=http://pi:11311

export ros_ip=10.42.0.64這兩個環境變數,否則其他計算機將無法與其正常通訊。正是這一feature使得我們若要啟動乙個core和乙個roslaunch的話需要用到四個指令碼!

8、必須保證先開core,因此可在launch的指令碼裡加延時,延時不能太短,否則core還沒開好就roslaunch了同樣會死得很難看,我看到的現象是兩個視窗裡都在反覆restart。目前使用25s延時,差不多。20s有點險。

newscreen_core

#!/bin/bash 

while

true;do

ping -w 1 -c 1

10.42.0.1>/dev/null

ret=$?

if [ $ret

-eq0 ]

then

printf

"$prefix is up"

break;

else

printf

"$prefix is down \n"

fidone

mate-terminal -x screen -s core ~/auto_runing/core_ros

#mate-terminal -x screen -s core -x screen ~/auto_runing/core_ros

core_ros

#!/bin/bash 

source /opt/ros/kinetic/setup.bash

source /home/pi/.bashrc

source /home/pi/catkin_ws/devel/setup.bash

cd /home/pi/catkin_ws

export ros_master_uri=

export ros_ip=10.42.0.1

roscore

newscreen_quad

#!/bin/bash 

while

true;do

ping -w 1 -c 1

10.42.0.1>/dev/null

ret=$?

if [ $ret

-eq0 ]

then

printf

"$prefix is up"

break;

else

printf

"$prefix is down \n"

fidone

sleep 25s

mate-terminal -x screen -s quad

mate-terminal -x screen -s quad -x screen ~/auto_runing/quadrotor

quadrotor

#!/bin/bash 

source /opt/ros/kinetic/setup.bash

source /home/pi/.bashrc

source /home/pi/catkin_ws/devel/setup.bash

cd /home/pi/catkin_ws

export ros_master_uri=

export ros_ip=10.42.0.1

roslaunch planning start_test.launch

linux設定開機自啟指令碼

系統初始化完成後會執行初始化指令碼 rc.local,想要實現開機自動啟動某個功能,可以在這個指令碼增加些執行命令。rc.local rc.sysinit,一般為路徑為 etc rc.d rc.local或 etc rc.d rc.sysinit 可以直接在指令碼退出之前執行某個指令碼或執行某個sh...

shell指令碼實現nginx開機自啟

vi etc init.d nginx 輸入下面的 wq 儲存並退出 設定檔案的訪問許可權 chmod a x etc init.d nginx a x all user can execute 所有使用者可執行 這樣在控制台就很容易的操作nginx了 檢視nginx當前狀態 啟動nginx 停止n...

Linux開機自啟指令碼與配置

場景 寫了個有趣的指令碼start.sh,需求是開機後自啟,最好還可以定義多久自啟。環境 linux ubuntu20.04 指令碼目錄 home bear start.sh method 1 使用 crontab 最為簡單的方式 建立乙個 cron 任務,這個任務在系統啟動後等待 5秒,然後執行命...