ROS设置开机自启launch文件

本文介绍在ROS环境中实现机器人系统开机自启的多种方法,包括使用robot_upstart包、通过Linux桌面系统启动程序、创建Service及利用rc.local等方式,并提供详细步骤与注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

<think>好的,用户想在Ubuntu系统中配置开机自动ROSlaunch文件。根据之前提供的引用内容,我需要整合这些信息给出步骤。首先,引用[1]提到使用systemd服务来创建自启动,这是标准的方法。步骤包括创建服务文件、填写相关内容,然后用服务。然后引用[2]补充了如果系统有登录密码,需要设置自动登录,否则服务可能无法在动时运行,因为图形环境可能未加载。另外,引用[3]虽然主要讲节点崩溃重,但里面的respawn参数可能对确保服务持续运行有帮助,不过用户的问题主要是开机动,所以可能暂时不需要这部分。 接下来要确保用户理解每一步的关键点。创建服务文件时,路径和权限很重要,必须使用sudo。服务文件中的ExecStart需要正确指向roslaunch,并指定包名和launch文件名。环境变量如DISPLAY和ROS_MASTER_URI可能需要根据具体情况进行调整,特别是如果ROS master运行在另一台机器的话。设置自动登录是为了避免因密码输入而阻止服务动,尤其是在需要图形界面的时候。最后,测试服务是否正常工作,可能需要重或者手动动服务进行调试。 用户可能遇到的问题包括服务文件中的路径错误、权限不足、环境变量配置不正确,或者自动登录未设置导致服务无法访问所需资源。需要提醒用户检查这些部分,并在遇到问题时查看日志。另外,不同的Ubuntu版本或ROS版本可能有细微差别,可能需要适当调整命令或配置。</think>### 如何配置Ubuntu系统实现开机自动运行ROS launch文件? 以下是基于引用内容的详细配置步骤: #### 方法1:通过systemd服务实现(推荐) 1. **创建systemd服务文件** ```bash sudo nano /etc/systemd/system/mylaunch.service ``` 2. **填写服务配置内容** 参考引用[1]中的模板,需注意以下关键参数: ```ini [Unit] Description=ROS Launch Service # 服务描述 After=network.target # 确保网络就绪后动 [Service] ExecStart=/usr/bin/roslaunch your_package your_launch_file.launch # 替换实际包名和文件名 Restart=always # 崩溃后自动重(引用[3]的respawn机制) User=ubuntu # 执行用户 Environment="DISPLAY=:0" # 图形界面支持 Environment="ROS_MASTER_URI=http://localhost:11311" # ROS核心地址 [Install] WantedBy=multi-user.target # 多用户模式下动 ``` 3. **用服务** ```bash sudo systemctl daemon-reload sudo systemctl enable mylaunch.service sudo systemctl start mylaunch.service ``` #### 方法2:通过自动登录实现(适用于图形界面依赖) 1. **设置自动登录** 进入系统设置 → 详情 → 用户 → 开自动登录(引用[2]) ```bash # 路径:Settings → Details → Users → Automatic Login → ON ``` 2. **将roslaunch命令添加到动程序** 在`~/.bashrc`末尾添加: ```bash gnome-terminal -- bash -c "roslaunch your_package your_launch_file.launch; exec bash" ``` #### 验证与调试 - **查看服务状态** ```bash journalctl -u mylaunch.service -b # 查看动日志 ``` - **环境变量检查** 若节点需要特定ROS环境,可在服务文件中添加: ```ini Environment="ROS_DISTRO=noetic" Environment="source /opt/ros/$ROS_DISTRO/setup.bash" ``` #### 常见问题 1. **服务无法动DISPLAY** 检查是否设置`Environment="DISPLAY=:0"`,或尝试`xhost +`开放显示权限 2. **ROS节点权限不足** 在服务文件中添加`WorkingDirectory=/path/to/workspace` 3. **网络未就绪导致失败** 在`[Unit]`部分增加`Requires=network-online.target`
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值