1 ROS Wiki 方案 (robot_upstart)
robot_upstart:
This package allows robot administrators to quickly and easily generate one or more background jobs to run roslaunch invocations on system startup. You can use it directly from the command-line, or via a simple Python API.
ROS Wiki:http://wiki.ros.org/robot_upstart
教程: http://docs.ros.org/jade/api/robot_upstart/html/
Clearpath 的 Husky等就是使用的这种自启方式。
1.1 安装(Kinetic版本)
cd catkin_ws/src
git clone https://github.com/clearpathrobotics/robot_upstart.git
cd ..
catkin_make
1.2 设置某个Package的launch文件为开机启动
假设需要启动功能包myrobot_bringup下的base.launch文件,运行如下命令:
rosrun robot_upstart install myrobot_bringup/launch/base.launch
默认下次启动时生效。其中myrobot 会被自动识别为service名,示例中service名就是myrobot。
1.3 service 手动启动和停止
sudo service myrobot start #启动服务
sudo service myrobot stop #关闭服务
1.4 查看log
sudo tail /var/log/upstart/myrobot.log -n 30
2 使用Linux桌面系统对应开机启动程序
不同的Linux桌面系统,开机启动并不相同,Ubuntu使用GNOME桌面系统。它使用启动应用程序来设置启动项,当然也可以在终端输入如下命令启动图形化设置界面
gnome-session-properties
假设启动的launch文件为:myrobot_bringup 包内的minimal.launch,可在myrobot_bringup下创建启动脚本start.sh
#! /bin/bash
source /opt/ros/kinetic/setup.sh
source /home/username/catkin_ws/devel/setup.bash
roslaunch myrobot_bringup minimal.launch
exit 0
然后启动图形化界面,添加启动项,并设置
gnome-terminal -x /home/username/catkin_ws/src/myrobot_bringup/start.sh
则系统每次启动后,会开启一个终端窗口,并执行脚本中的launch文件
此方法在大部分ubuntu+ROS下有用,但在本人在使用过程中只能自启终端,但无法启动launch文件,原因未知。
3 开机启动Service
3.1 创建Service
假设启动的launch文件为:myrobot_bringup 包内的minimal.launch,可在/etc/init.d/下创建启动服务文件start(无需.sh后缀)
内容如下:
#!/bin/sh
. /opt/ros/kinetic/setup.sh
. /home/username/catkin_ws/devel/setup.sh
roslaunch myrobot_bringup minimal.launch
exit 0
3.2 添加Service
使用以下命令将start加入到Ubuntu的启动服务中
cd /etc/init.d
sudo update-rc.d start defaults 95
运行后会将start文件加入到/etc/rcX.d/目录中。
其中X:0-6, 分别表示不同的启动级别,3为字符界面启动,5为GUI启动。最后的数字(95)表示启动顺序。
例如在/etc/rc3.d/可能会变为:S95start。
当然也有可能在运行第二条命令时会出现如下错误:
insserv: warning: script 'start' missing LSB tags and overrides
解决方案有两种,分别如下:
①修改start文件如下:
#!/bin/sh
### BEGIN INIT INFO
# Provides: php_fastcgi.sh
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the php_fastcgi daemon
# Description: starts php_fastcgi using start-stop-daemon
### END INIT INFO
. /opt/ros/kinetic/setup.sh
. /home/username/catkin_ws/devel/setup.sh
roslaunch myrobot_bringup minimal.launch
exit 0
②卸载 insserv
sudo apt-get remove insserv
3.3 删除服务
执行如下命令,删除Service:
cd /etc/init.d
sudo update-rc.d -f start remove
3.4 使用log文件查看服务失败原因
为了查看服务是否有效,可以重定向launch文件的输出到指定文件,在start文件中修改相关roslaunch命令,如:
roslaunch myrobot_bringup minimal.launch >> /home/username/catkin_ws/src/myrobot_bringup/start.log 2>&1
这样,就会把log 输出到指定目录。通过查看start.log文件来定位自启失败原因。
其中,一般可能会出现缺少环境变量的问题,那是因为这种自启方式不会启动bash,因此~/.bashrc中的所有export进来的环境变量均未载入,所以要在start文件将需要导入的环境变量添加进来,最终的start文件可能如下:
#!/bin/sh
### BEGIN INIT INFO
# Provides: php_fastcgi.sh
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the php_fastcgi daemon
# Description: starts php_fastcgi using start-stop-daemon
### END INIT INFO
export 3D_SENSER=Kinect
. /opt/ros/kinetic/setup.sh
. /home/username/catkin_ws/devel/setup.sh
roslaunch myrobot_bringup minimal.launch >> /home/username/catkin_ws/src/myrobot_bringup/start.log 2>&1
exit 0
此办法有个缺点:
如果有多个launch文件要启动,例如:其中一个launch加为S98, 另一个launch加为S99,则S98会被执行,而S99并未执行。虽然也可以后台执行,但会导致前一个退出。所以如果一定要采用此方法:可以把多个Launch合并。通常对于移动平台只需自启手柄远程控制。
4 简单暴力的 rc.local (不推荐):
原理与方法三相似,将方法三start中的如下内容写入到/etc/rc.d/rc.local文件中的exit 0之前,保存即可
export 3D_SENSER=Kinect
. /opt/ros/kinetic/setup.sh
. /home/username/catkin_ws/devel/setup.sh
roslaunch myrobot_bringup minimal.launch >> /home/username/catkin_ws/src/myrobot_bringup/start.log 2>&1
此办法有个和方法三类似的缺点,所以启动多个launch文件时需要把多个Launch合并。(并不建议)