ROS设置开机自启launch文件

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合并。(并不建议)

参考:http://blog.sina.com.cn/s/blog_602f87700102wqy9.html

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值