当前位置: 首页 > news >正文

ROS回顾学习(7):ubuntu下设置(ROS)程序开机自启动

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

参考:https://blog.csdn.net/zong596568821xp/article/details/78596473

其它精华帖:http://blog.csdn.net/u011118482/article/details/76549144

[关于ubuntu终端开机自启动执行root权限](https://blog.csdn.net/u012899335/article/details/81158849)

0 背景

如果人工手动启动机器人,当给机器人加电时候,我们需要ssh到机器人端,然后启动激光的驱动launch文件,机器人启动的launch文件,导航的launch文件等,这对机器人的操作很不方便。 如果我们希望当机器人上电以后,会自动启动一些传感器的驱动文件,定位导航,建图所需要的文件,并能按照我们的设定实现一定的功能,比如相应客户端的命令,并按照客户端的指令来动作,或者开机以后,自动对所在的环境进行建图和导航等。我们需要进行开机自启动的设置。本文即介绍机器人开机自启动的方法和步骤.

目前关于机器人开机自启动的设置大体上有下面几种方法:  

  • 1、使用自启动的ros包upstart
  • 2、利用ubuntu自带的开机启动文件
  • 3. Linux 经典方式, 开机启动Service
  • 4. 简单暴力的 rc.local (问题较多的方法)

现依次介绍如下:

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 安装(kinetic-ROS下)

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

1.2 设置某个Package的launch文件为开机启动

假如有个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桌面系统对应开机启动程序:

(1)点击Dash home打开Dash home。在检索窗里键入Startup application;也可以在终端输入:gnome-session-properties来启动。
"da"
(2)显示出来的“Startup Applications”称为Startup Application Manager。点击打开Startup Application Manager,点击Add
"da"

“Name”可以是任意名称,给要启动的程序起个名字。当然是简单易懂明了的为好。

“Command”处记入启动电脑时要执行的命令或者是要启动的程序的所在,可以使用“Browse”这个按钮来设定要启动的程序的所在。

“Comment”处可记入一些说明。也可以不记入(当然“name”的地方也可以不记入。不过以后用起来很不方便)。

点击下面的“Add”按钮即可设定好想要在启动电脑时启动的程序了。

可ROS 程序如何启动呢?

其实思路很简单,就是运行一个终端程序,终端程序则运行一个脚本,这个脚本中设置ROS, 启动ROS应用程序。假如想启动的 .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.s

则系统每次启动后,会开启一个终端窗口,并执行脚本中的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 之前加入调用。例如:想要加入一个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合并。(并不建议)设置了程序自启动之后,需要把Ubuntu的开机密码取消掉,这样就不需要人为登录,设置方法参考如下:

https://jingyan.baidu.com/article/0320e2c1d4da0b1b87507b31.html

 

相关文章:

  • RTAB-Map学习和测试详解
  • ROS回顾学习(8): 项目研究中遇到问题和难点记录
  • 菜鸟专学:明确自己编程习惯的变量命名法
  • OpenCV第一讲: 常规函数和类的使用 -- HighGui Core模块
  • kinect V2 驱动安装说明
  • C++11回顾学习(2): 一些常用的函数和小技巧
  • ROS回顾学习(9): 单通道深度图像转化为彩色图发布
  • C++11回顾学习(3): CPU多核与多线程、并行与并发
  • OpenCV第二讲:图像滤波及几何变换
  • OpenCV第三讲: 方框滤波、均值滤波、高斯滤波
  • 机器学习第一课:基础概念扫盲
  • 机器学习第二课:神经网络结构和专业术语
  • OpenCV第四讲: 非线性滤波
  • OpenCV第五讲: 形态学滤波
  • OpenCV第六讲: 漫水填充、图像金字塔
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • Docker容器管理
  • echarts的各种常用效果展示
  • Java小白进阶笔记(3)-初级面向对象
  • magento2项目上线注意事项
  • Python 反序列化安全问题(二)
  • Python打包系统简单入门
  • Rancher如何对接Ceph-RBD块存储
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • ViewService——一种保证客户端与服务端同步的方法
  • 初识 webpack
  • 关于Java中分层中遇到的一些问题
  • 机器学习 vs. 深度学习
  • 简单易用的leetcode开发测试工具(npm)
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 使用API自动生成工具优化前端工作流
  • 我的业余项目总结
  • 我感觉这是史上最牛的防sql注入方法类
  • 用Python写一份独特的元宵节祝福
  • 怎么把视频里的音乐提取出来
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • linux 淘宝开源监控工具tsar
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • (6)STL算法之转换
  • (windows2012共享文件夹和防火墙设置
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (三十五)大数据实战——Superset可视化平台搭建
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .net下简单快捷的数值高低位切换
  • .NET应用架构设计:原则、模式与实践 目录预览
  • ::前边啥也没有