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
則系統每次啟動后,會開啟一個終端窗口,並執行腳本中的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合並。(並不建議)

