ROS程序開機自啟動


1. ROS官方方法:

Robot_upstart:

The robot_upstart package provides scripts which may be used to install and uninstall Ubuntu Linux upstart jobs which launch groups of roslaunch files.

所以,這個方法可能僅支持Ubuntu Linux。它提供scripte來安裝和卸載隨機啟動的ROS工作。 可以使用roslaunch等。

1.1:安裝(indigo-ROS下):

$sudo apt-get install ros-indigo-robot-upstart

1.2: 設置某個Package的launch文件為開機啟動 .launch:

Sam有個Package:beacool_bringup, 它其中有個 .launch文件----beacool_bringup/launch/minimal.launch

$rosrun robot_upstart install beacool_bringup/launch/minimal.launch

這里容易出以下幾個問題:

A. 找不到launch文件:

A1:確保package_name/launch/目錄的正確。

A2:確保roscd package_name 可以進入。(說明:source ~/catkin_ws/devel/setup.bash 已經起效)

另一點要注意的是Log:

Preparing to install files to the following paths:

/etc/init/beacool.conf

/etc/ros/indigo/beacool.d/.installed_files

此時,Ubuntu啟動時,這個Launch就會被調用。

1.3: 其它關鍵信息:

1.3.1: service名:

service名為:包名的一部分,在以上例子中,Package_Name: beacool_bringup.  所以service名為:beacool

1.3.2: 停止開機啟動:

rosrun robot_upstart uninstall service名

rosrun robot_upstart uninstall beacool

1.3.3: service 啟動和停止:

sudo service beacool start

sudo service beacool stop

1.3.4: 察看log:

sudo vi /var/log/upstart/beacool.log

網絡上不少地方在描述這部分工作時:均不講清楚 service名從何而來。帶來不少誤解。所以專門用紅色標記service名


2. 使用Linux桌面系統對應開機啟動程序:

不同的Linux桌面系統,開機啟動並不相同。Ubuntu實用GNOME桌面系統。它使用啟動應用程序來設置隨機啟動。也可以在終端輸入:gnome-session-properties來啟動。

其它桌面系統對應軟件並不一定相同:例如KDE----System Settings->System Administration->Startup and Shutdown

可以看到,Sam使用這個工具,啟動了計算器。

可ROS 程序如何啟動呢?

其實思路很簡單,就是運行一個終端程序,終端程序則運行一個腳本,這個腳本中設置ROS, 啟動ROS應用程序。

Sam想啟動的 .launch為: beacool_bringup 包內的minimal.launch

所以創建啟動腳本如下:

#! /bin/bash

source /opt/ros/indigo/setup.sh

source /home/exbot/devel/setup.bash

roslaunch beacool_bringup minimal.launch

其次:在啟動程序的命令列表中,使用:

gnome-terminal -x /home/exbot/catkin_ws/beacool_ros/beacool_run.sh

001Ld2gwzy7aBpCyFu65e&690

則系統每次啟動后,會開啟一個終端窗口,並執行腳本中的launch.

此方法在大部分ubuntu+ROS下有用。但在TK1 Ubuntu下未起作用。暫時不知怎么回事。


3. Linux 經典方式, 開機啟動Service:

首先介紹背景知識:Linux啟動時,可以啟動一些Service。 Sam很早之前搞Linux機頂盒,Android機頂盒時。很多程序就是以Service形式啟動的。

3.1: 創建Service的方法:

A: 在/etc/init.d/目錄下,創建要啟動的腳本。例如名為:beacool_rfkill 這個腳本用來啟動 bluetooth.

內容如下:

rfkill unblock bluetooth

B: 把腳本增加入Service:

$ cd /etc/init.d

$ sudo update-rc.d beacool_rfkill defaults 95

此時,會把腳本beacool_rfkill 加入到/etc/rcX.d/目錄中。X:0-6, 分別表示不同的啟動級別。3為字符界面啟動,5為GUI啟動。其它不關鍵。

腳本名則在/etc/rc3.d/中變為:S95beacool_rfkill

命令中,最后的數字表示表示啟動順序。

C: 如果想要去掉此Service:

$ cd /etc/init.d
$ sudo update-rc.d -f beacool_rfkill remove

3.2: ROS程序使用Service方式啟動:

為了查看腳本是否有效,可以查看log. Sam在腳本中作了如下動作:

roslaunch beacool_nav amcl_demo.launch >> /home/ubuntu/catkin_ws/src/beacool.log 2>&1

這樣,就會把log 發送到指定目錄。

Log如下:

/etc/rc2.d/S96dashgo_launch: 1: /etc/rc2.d/S96dashgo_launch: roslaunch: not found

這說明 ros沒加入環境變量中。需要先把環境變量設置好。

可參見后面的寫法:

.  /opt/ros/indigo/setup.sh

.  /home/ubuntu/catkin_ws/devel/setup.sh

roslaunch beacool_bringup minimal.launch

此辦法有個缺點:

如果有多個ROS工程要加入,例如:其中一個加為S98, 另一個加為S99。則S98會被執行。而S99並未執行。

雖然也可以后台執行,但會導致前一個退出。

所以如果一定要采用此方法:

可以把多個Launch合並。(並不建議)


4. 簡單暴力的 rc.local (問題較多的方法):

/etc/rcX.d/中,都包含了/etc/init.d/rc.local.  通常都是最后一刻加入的,例如:S99rc.local

而它又引用了 /etc/rc.local

所以,可以簡單的在/etc/rc.local 的exit 0 之前加入調用。

例如:Sam想要加入一個ROS項目:beacool_bringup 的minimal.launch.

A: 先創建一個script:

.  /opt/ros/indigo/setup.sh

.  /home/ubuntu/catkin_ws/devel/setup.sh

roslaunch beacool_bringup minimal.launch

請注意:此時並沒有使用source /opt/ros/indigo/setup.bash.

而是采用 .  /opt/ros/indigo/setup.sh

是因為此時bash還未啟動,而source是bash內部命令。此時找不到source.

B: 修改其權限:

sudo chmod 777 beacool_launch

C: 加入rc.local:

/etc/init.d/beacool_launch

此辦法有個和方法3類似的缺點:

1. 加入后,如果ROS 程序不退出,則阻塞在這里。這意味着如果要啟動多個launch. 則下一個不會被執行。

2. 當然有朋友會說,可以后台執行嘛。

/etc/init.d/beacool_launch &

但如果后面再啟一個launch, 前面beacool_launch所啟動的ROS項目會退出。

所以如果一定要采用此方法:

可以把多個Launch合並。(並不建議)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM