linux开机启动roscore,树莓派ubuntuMate系统中开机自启动ROS的launch文件

0x00 为何需要开机自启动launch文件

在ROS开发后期阶段由于功能已经趋于稳定,因此就需要系统在一上电启动后就自动把ROS下的各节点程序加载运行,这样就省去了我们还得手动输入roslaunch命令来加载bringup的launch文件的操作。经过我的实际测试目前有两种方式可以实现开机自启动,一种就是使用系统自带的Startup Applications,另外一种就是编写一个service,开机后自动启动,在这里我们以树梅派下ubuntuMate安装ros kinetic系统作为示例来分别演示这两种方式各如何操作。

0x01 下载雷达源码并编译运行

在这里我以在树梅派下开机后自启动ydlidar-x4作为演示,首先就需要在树梅派中下载该雷达源码,在ROS工作空间的src目录下使用如下命令下载源码:

下载源码后就可以先来配置雷达的设备挂载点,使其挂载点从/dev/ttyUSBx映射到/dev/ydlidar,这样方便我们获取雷达的设备挂载点。

9c21d57c1a5bd012da18660ba13dc7a5.gif

当编译完成后就可以来测试雷达是否可以正常启动了,需要首先source devel/setup.bash配置当前工作空间的环境变量,这样我们才能使用roslauch来启动ydlidar软件包下的lidar.launch,在这里需要注意的是由于雷达的USB口供电能力较弱,因此我们除了需要接上雷达的数据接口后还得接上供电接口,这样ydlidar-x4才能正常工作。

9c21d57c1a5bd012da18660ba13dc7a5.gif

当编译完成后,我们可以来使用roslaunch启动雷达看看是否能正常工作,可以先source devel/setup.bash配置好环境变量后,使用如下命令来启动雷达roslaunch ydlidar lidar.launch,接下来就会发现雷达开始转动起来。

0x02 使用StartupApplication方式来自启动

这种方式的主要思路就是通过编写一个bash脚本,在脚本中来执行roslaunch命令启动相应的ros节点,然后我们在系统提供的startupApplication中添加我们要执行的脚本即可,这样就可以在每次开机的时候执行我们自定义的脚本了。在这里我们在当前ros工作空间源码目录创建一个软件包用于存放我们的脚本,具体操作如下所示:

9c21d57c1a5bd012da18660ba13dc7a5.gif

在startup.sh脚本中添加如下代码:

#!/bin/bash

# Copyright: 2016-2018 www.corvin.cn

# Author: corvin

# Description: In raspeberry ubuntu Mate16.04 poweron

#   startup ros's launch file.

# History:

#    20180530: initial this file.

source /opt/ros/kinetic/setup.bash

source ~/catkin_ws/devel/setup.bash

roslaunch ydlidar lidar.launch

exit 0

接下来就可以在ubuntuMate的界面上来配置添加启动程序了,如下图所示完整操作:

9c21d57c1a5bd012da18660ba13dc7a5.gif

注意Command的添加,完整的命令如下:

terminator -x /home/corvin/catkin_ws/src/auto_startup/scripts/startup.sh

大家只需要修改terminator为mate_terminal,如果在x64的ubuntu的系统上,默认安装的终端是gnome-terminal,另外就是需要修改后面的路径为自己脚本的路径就可以了。当点击Add后,接下来就可以来重启树梅派来进行测试了,看看重启后是否开机时能将雷达自动启动,下图是树梅派刚启动时自动打开terminator终端,然后自动来执行脚本中的roslaunch命令将雷达启动:

9c21d57c1a5bd012da18660ba13dc7a5.gif

0x03 编写service启动相关代码

我们仍然在创建的auto_startup软件包的scripts目录下创建需要的文件,使用如下命令来操作:

9c21d57c1a5bd012da18660ba13dc7a5.gif

在ros_startup.service中添加的代码如下:

[Unit]

Description=powerOn startup ros

[Service]

Type=simple

Restart=always

RestartSec=30

ExecStart=/usr/sbin/ros_start

ExecStop=/usr/sbin/ros_stop

ExecRestart=/usr/sbin/ros_restart

[Install]

WantedBy=multi-user.target

该文件就是我们自定义的服务,我们可以使用systemctl来操作该服务使其可以开机时候来启动,执行其中相应的命令,里面的命令其实还是我们自定义的脚本,下面来简要解析下该服务的内容,service主要由三部分组成,分别时Unit,Service,Install下面来分别介绍这三部分:

Unit:该服务的类型描述,这里定义为单元类型,Description是这个服务的一个描述信息,可以自己根据需要来修改。

Service:服务的关键部分,需要配置的一些关键参数,这里配置了如下几个参数:

(1)Type=simple:表明这个服务主要由 ExecStart 设置的程序来启动,启动后常驻于内存中。这个simple是默认的参数,除了simple外还可以设置为oneShot,该参数与simple类似,区别在于这个ExecStart执行的命令执行完成后就退出了,不会常驻在内存中。还可以设置为idel,该参数与 simple 类似,意思是要执行这个服务必须要所有的工作都顺利执行完毕后才会执行,这类的服务通常是开机到最后才执行即可的服务。

(2)Restart=always:表明该服务具备重启功能,如果服务意外关闭后会一直尝试重新启动。

(3)RestartSec=30:表明服务在意外关闭后,经过多少秒后再次重新尝试启动该服务。

(4)ExecStart=/usr/sbin/ros_start:表明服务启动时需要执行的命令,后面就是执行的命令所在路径,这里的命令是我们自定义的脚本。

(5)ExecStop=/usr/sbin/ros_stop:当需要停止该服务时需要执行的命令,后面是命令的路径。

(6)ExecStop=/usr/sbin/ros_restart:当服务需要重新启动时需要执行的命令,后面是命令的路径。

Install:需要将该unit安装到那个target上。

然后开始编写需要启动的三个脚本,分别是ros_start,ros_stop,ros_restart,下面来依次介绍三个脚本的编写:

(1)编写ros_start脚本,该脚本就是服务启动时需要执行的命令,具体代码如下:

#!/bin/bash

# Copyright: 2016-2018 www.corvin.cn

# Author: corvin

# Description: In raspeberry ubuntu Mate16.04 poweron

#   startup ros's launch file.

# History:

#    20180531: initial this file.

source /opt/ros/kinetic/setup.bash

source /home/corvin/catkin_ws/devel/setup.bash

roslaunch ydlidar lidar.launch

exit 0

(2)编写ros_stop脚本,该脚本是需要停止服务时执行的命令,具体代码如下:

#!/bin/bash

# Copyright: 2016-2018 www.corvin.cn

# Author: corvin

# Description: when stop service should execute cmd

# History:

#    20180531: initial this file.

source /opt/ros/kinetic/setup.bash

source /home/corvin/catkin_ws/devel/setup.bash

for i in $(rosnode list);do

rosnode kill $i;

done

killall roslaunch

exit 0

(3)编写ros_restart脚本,该脚本是当需要重启服务时执行的命令,具体代码如下:

#!/bin/bash

# Copyright: 2016-2018 www.corvin.cn

# Author: corvin

# Description: when should restart service execute this bash.

# History:

#    20180531: initial this bash file.

/usr/sbin/ros_stop

sleep 3

/usr/sbin/ros_start

exit 0

0x04 配置service并重启测试

当编写好service和相应的执行脚本后,接下来就需要将其放到指定的目录下,由于需要执行的命令较多,我们仍然编写一个bash脚本来执行配置的命令,该脚本仍然放在scripts目录下,文件命名为config_service.sh,脚本代码如下:

#!/bin/bash

# Copyright: 2016-2018 www.corvin.cn

# Author: corvin

# Description: config ros startup service and bash files.

# History:

#    20180531: initial this file.

sudo cp ros_start /usr/sbin/

sudo cp ros_stop /usr/sbin/

sudo cp ros_restart /usr/sbin/

sudo cp ros_startup.service /lib/systemd/system/

sudo systemctl enable ros_startup.service

exit 0

首先对该脚本进行简单解析,前面通过cp拷贝将三个执行脚本放到/usr/sbin目录下,然后将ros_startup.service拷贝到/lib/systemd/system目录下,接下来的sudo systemctl enable ros_startup.service就是为了使该服务生效,启用该服务。当为该脚本通过chmod +x config_service.sh来增加执行权限后就可以来执行该脚本配置service了,具体操作如下图:

9c21d57c1a5bd012da18660ba13dc7a5.gif

当使用systemctl is-enabled ros_startup.service命令就是为了查看我们的自定义服务是否已经启用,当出现enable就说明我们的服务已经挂载在系统服务上,当系统启动时会加载我们的服务来一起启动的,下面我们就可以来重启树梅派系统来测试了,看看能否正常执行我们的ros_start脚本来加载雷达启动。

当我们重启后可以发现系统已经正常使用我们的ros_start脚本来将雷达启动起来了,下面来详细介绍下systemctl这个命令,我们来如何操控我们的自定义服务:

(1)当我们想停止我们的launch加载的雷达时,可以使用如下命令:

sudo systemctl stop ros_startup.service

(2)当我们想启动我们的launch文件时,可以使用如下命令,当执行完以下命令后可以发现我们再次将雷达启动起来:

sudo systemctl start ros_startup.service

(3)当我们在launch文件运行中,想重新启动时可以执行如下命令,当执行完以下命令是会发现雷达首先停止了转动,等待3秒钟然后又再次重新启动了:

sudo systemctl restart ros_startup.service

(4)如果想禁止我们的自定义服务在开机的时候启动,可以使用如下命令:

sudo systemctl disable ros_startup.service

(5)如果想再次重新在开机时启动我们的服务,可以使用如下命令:

sudo systemctl enable ros_startup.service

9c21d57c1a5bd012da18660ba13dc7a5.gif

在我们enable了自定义的服务后,我们的服务就会在后台一直运行,但是我们却不知道该服务在后台如何运行的,因为看不到任何日志输出,如果想查看服务运行的相关日志该如何操作呢,在这里就需要使用journalctl标准日志服务来查看了,Systemd通过其标准日志服务Journald将其管理的所有后台进程打印到到std:out(即控制台)的输出重定向到了日志文件。日志文件是二进制格式的,因此必须使用特定的工具才能查看。

Journald提供了配套的程序Journalctl用于处理日志内容,Journalctl的使用非常简单,默认不带任何参数的时候会输出系统和所有后台进程的混合日志,常用的参数有--dmesg用于查看内核输出的日志,--system用于查看系统输出的日志,--unit加上Unit的名字来指定输出特定Unit的日志,例如我们想查看自定义服务ros_startup.service的日志输出,可以使用如下命令:

sudo journalctl --unit ros_startup.service

下面来测试下该命令,查看服务在后台的日志输出:

corvin@robot:~$ sudo journalctl --unit ros_startup.service

[sudo] password for corvin:

-- Logs begin at 五 2016-02-12 00:28:02 CST, end at 四 2018-05-31 15:58:43 CST. --

5月 31 15:57:46 robot systemd[1]: Started powerOn startup ros.

corvin@robot:~$ sudo systemctl restart ros_startup.service

corvin@robot:~$ sudo journalctl --unit ros_startup.service

-- Logs begin at 五 2016-02-12 00:28:02 CST, end at 四 2018-05-31 15:59:39 CST. --

5月 31 15:57:46 robot systemd[1]: Started powerOn startup ros.

5月 31 15:59:21 robot systemd[1]: Stopping powerOn startup ros...

5月 31 15:59:24 robot ros_stop[1981]: killing /base_link_to_laser4

5月 31 15:59:24 robot ros_stop[1981]: killed

5月 31 15:59:24 robot ros_stop[1981]: killing /rosout

5月 31 15:59:24 robot ros_stop[1981]: killed

5月 31 15:59:25 robot ros_stop[1981]: killing /ydlidar_node

5月 31 15:59:25 robot ros_stop[1981]: killed

5月 31 15:59:26 robot ros_start[615]: ... logging to /root/.ros/log/524e6f08-64a8-11e8-a578-b827eb148

5月 31 15:59:26 robot ros_start[615]: Checking log directory for disk usage. This may take awhile.

5月 31 15:59:26 robot ros_start[615]: Press Ctrl-C to interrupt

5月 31 15:59:26 robot ros_start[615]: Done checking log file disk usage. Usage is <1GB.

5月 31 15:59:26 robot ros_start[615]: [59B blob data]

5月 31 15:59:26 robot ros_start[615]: started roslaunch server http://robot:34151/

5月 31 15:59:26 robot ros_start[615]: SUMMARY

5月 31 15:59:26 robot ros_start[615]: ========

5月 31 15:59:26 robot ros_start[615]: PARAMETERS

5月 31 15:59:26 robot ros_start[615]:  * /rosdistro: kinetic

5月 31 15:59:26 robot ros_start[615]:  * /rosversion: 1.12.13

5月 31 15:59:26 robot ros_start[615]:  * /ydlidar_node/angle_fixed: True

5月 31 15:59:26 robot ros_start[615]:  * /ydlidar_node/angle_max: 180.0

5月 31 15:59:26 robot ros_start[615]:  * /ydlidar_node/angle_min: -180.0

5月 31 15:59:26 robot ros_start[615]:  * /ydlidar_node/baudrate: 115200

5月 31 15:59:26 robot ros_start[615]:  * /ydlidar_node/frame_id: laser_frame

5月 31 15:59:26 robot ros_start[615]:  * /ydlidar_node/frequency: 7.0

5月 31 15:59:26 robot ros_start[615]:  * /ydlidar_node/heartbeat: False

5月 31 15:59:26 robot ros_start[615]:  * /ydlidar_node/ignore_array:

5月 31 15:59:26 robot ros_start[615]:  * /ydlidar_node/low_exposure: False

5月 31 15:59:26 robot ros_start[615]:  * /ydlidar_node/port: /dev/ydlidar

5月 31 15:59:26 robot ros_start[615]:  * /ydlidar_node/range_max: 16.0

5月 31 15:59:26 robot ros_start[615]:  * /ydlidar_node/range_min: 0.08

5月 31 15:59:26 robot ros_start[615]:  * /ydlidar_node/resolution_fixed: True

5月 31 15:59:26 robot ros_start[615]:  * /ydlidar_node/samp_rate: 9

5月 31 15:59:26 robot ros_start[615]: NODES

现在我们已经可以使用自定义服务的方式来开启引导启动ROS的launch文件,但是如果我们现在想卸载相关的service文件该如何操作呢,那就需要将我们放置在相应目录中的脚本和service文件删除即可,我们可以编写个脚本来完成该动作,脚本命名为uninstall_ros_service.sh,具体代码如下所示:

#!/bin/bash

# Copyright: 2016-2018 www.corvin.cn

# Author: corvin

# Description: Remove ourself service files,include bash file.

# History:

#    20180531: initial this file.

/usr/sbin/ros_stop

sudo systemctl disable ros_startup.service

sudo rm /usr/sbin/ros_start

sudo rm /usr/sbin/ros_stop

sudo rm /usr/sbin/ros_restart

sudo rm /lib/systemd/system/ros_startup.service

exit 0

9c21d57c1a5bd012da18660ba13dc7a5.gif

可以发现当执行了卸载自定义service的脚本后,我们已经无法执行start和stop相关操作了,如果想再次启用自定义服务只要重新执行启用的脚本即可。

0x05 参考资料

0x06 问题反馈

大家在按照教程操作过程中有任何问题,可以关注ROS小课堂的官方微信公众号,在公众号中给我发消息反馈问题即可,我基本上每天都会处理公众号中的留言!当然如果你要是顺便给ROS小课堂打个赏,我也会感激不尽的,打赏30块还会邀请进ROS小课堂的微信群与更多志同道合的小伙伴一起学习和交流!

9c21d57c1a5bd012da18660ba13dc7a5.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle ADF移动世界! 你好!

您好&#xff0c;ADF Mobile&#xff0c;世界&#xff01; 您可能已经知道... ADF Mobile在这里&#xff01; 以下是一些链接&#xff0c;这些链接会让您有宾至如归的感觉。 ADF Mobile主页&#xff1a; http://www.oracle.com/technetwork/developer-tools/adf/overview/ad…

css 小知识点:inline/inline-block/line-height

inline: 此元素会被显示为内联元素&#xff0c;元素前后没有换行符。因此&#xff1a;无法设置宽度和高度&#xff5e; inline-block: 行内块元素。元素前后没有换行符&#xff08;CSS2.1 新增的值&#xff09; 用通俗的话讲&#xff0c;就是不独占一行的块级元素。然后拥有…

协同过滤算法_机器学习 | 简介推荐场景中的协同过滤算法,以及SVD的使用

本文始发于个人公众号&#xff1a;TechFlow&#xff0c;原创不易&#xff0c;求个关注今天是机器学习专题的第29篇文章&#xff0c;我们来聊聊SVD在上古时期的推荐场景当中的应用。推荐的背后逻辑有没有思考过一个问题&#xff0c;当我们在淘宝或者是某东这类电商网站购物的时候…

JavaOne 2012:观察与印象

当我坐在旧金山国际机场等待登上飞机返回家中时&#xff0c;我一次又一次令人满意但累人的JavaOne&#xff08;2012&#xff09;体验&#xff0c;我正在开始写这篇特别的博客文章。 自上周日的主题演讲以来&#xff0c;在会议上疯狂地撰写了约30篇博客文章之后&#xff0c;很难…

用imspost制作catia后处理_新产品开发需要做原型验证,怎么样成型制作才省钱?...

有一天一个朋友拿着一个公仔机器人的项目过来找我&#xff0c;说做200套外壳&#xff0c;问我如何省成本用最少的钱做好产品。类似一下图片的机器人一样。组装起来高200mm左右&#xff0c;内外配件总共是62个。我当时看到产品小估算重量也很轻&#xff0c;就跟他说用3D打印有快…

如何把大段文字转为带html标签的文字

开发网页的时候&#xff0c;有时候会遇到大段的隐私声明&#xff0c;用户协议等等&#xff0c;我们呀要复制粘贴展示出来&#xff0c;必须加大量的p标签&#xff0c;h1,h2&#xff0c;空格符&#xff0c;br标签&#xff0c;这对我们来说无疑是泪崩的&#xff0c;有个很好的办法…

使用MongoDB进行事件流

MongoDB是一个非常出色的“ NoSQL”数据库&#xff0c;具有广泛的应用程序。 在SoftwareMill开发的一个项目中&#xff0c;我们将其用作复制的事件存储&#xff0c;然后将事件从事件流传输到其他组件。 介绍 基本思想非常简单&#xff08;另请参阅Martin Fowler关于Event Sou…

c语言实训作业总结,c语言程序设计上机实践心得报告

c语言程序设计上机实践心得报告 班级:11 电信 2 姓名:莫金波 学号:1107032242012.12.28 惠州学院 HUIZHOU UNIVERSITY 我们专业的学生在专业老师的带领下进行了 c 语言设计基础教程的 实践学习。在这之前&#xff0c;我们已经对 c 语言这门课程学习了差不多一 个学期&#xff0…

JavaOne 2012:在JVM上诊断应用程序

值得参加Staffan Larsen &#xff08;Oracle Java Serviceability Architect&#xff09;的演讲“ 在JVM上诊断应用程序 ”&#xff08;Hilton Plaza A / B&#xff09;&#xff0c;只是为了学习Oracle JVM 7随附的新jcmd命令行工具。该演示对我来说是“奖金”&#xff0c;这对…

文档词频矩阵_论文理解:从词嵌入到文档距离

论文作者简介本论文第一作者Matt J. Kusner是牛津大学的副教授&#xff0c;致力于设计适应现实世界问题需求的新机器学习模型&#xff08;例如&#xff0c;fair algorithms, discrete generative models, document distances, privacy, dataset compression, budgeted learning…

c语言主调函数和被调函数,在C语言中,何为主调函数和被调函数,他们之 – 手机爱问...

2007-08-30请详细一些~最好举出例子你好。评价宝宝的标准基本上是&#xff1a;技能>资质>成长因为宝宝的评价是一项 仁者见仁的活儿&#xff0c;但其中有些规律我想是可以具体话的&#xff0c;希望能对你有帮助&#xff1a;1&#xff1a;技能&#xff1a;技能的意义有多大…

学习关于display :flex 布局问题!

很多人不明白这个display:flex是到底是什么东西&#xff0c;如何使用的 。 1.什么是display&#xff1a;flex呢&#xff1f; 答&#xff1a;flex是 flexible box的缩写&#xff0c;意为弹性布局 &#xff1b;这个东西的引入&#xff0c;为盒模型提供了最大的灵活性&#xf…

note同步不及时 one_一辆理想ONE又“跪了”?理想官方紧急发文回应

汽车行业关注(autochat.com.cn)10月16日报道——10月15日&#xff0c;有网友在社交媒体上发布视频&#xff0c;从视频可以看到&#xff0c;一辆理想ONE在遭遇事故后&#xff0c;左前轮脱落在车外疑似断轴,从视频未能判定是断轴引起的事故&#xff0c;还是事故引起的断轴。针对该…

Skywalking 中 Agent 自动同步配置源码解析

文章目录 前言正文实现架构实现模型OAP 同步 ApolloConfigWatcherRegisterConfigChangeWatcher Agent 侧 前言 本文代码 OAP 基于 v9.7&#xff0c;Java Agent 基于 v9.1&#xff0c;配置中心使用 apollo。 看本文需要配合代码“食用”。 正文 Skywalking 中就使用这种模型…

华为5720设置静态路由不通_【干货分享】交换机与路由器在环路中的处理机制了解一下!...

点击蓝字关注我们-今天小盟带大家来讨论一下交换机与路由器在环路中的处理机制-01基础配置1---如图配置路由器各接口地址&#xff0c;AR-2为PC-1的网关路由器2---AR-1配置静态默认路由&#xff0c;下一跳地址指向AR-2&#xff1b;[AR-1]ip route-static 0.0.0.0 0 12.1.1.2AR-2…

VisualVM介绍使用

1 打开VisualVM&#xff08;这个工具放在JDK安装目录的bin目录下&#xff0c;双击jvisualvm.exe即可打开&#xff09;&#xff0c;如下图所示 以VisualVM自身为例&#xff0c;VisualVM本身也是一个java程序&#xff0c;当然也而已用VisualVM来分析 2 概述页面主要显示程序…

Java功能的适用性

Java语言和标准库功能强大&#xff0c;但功能强大&#xff0c; 责任重大 。 一方面看到很多用户代码滥用或滥用稀有的Java功能&#xff0c;另一方面却完全忘记了大多数基本功能之后&#xff0c;我决定撰写此摘要。 这不是每个Java开发人员都应该探索&#xff0c;了解和使用的要…

台达b3伺服modbus通讯_【数控系统】台达伺服压机控制灵活 精准压合满足各种工序需求...

引言压机是一种利用压力改变工件形状的机械设备。随着制造业少量多样与客制化的日趋发展&#xff0c;压机的的优势逐渐显现&#xff0c;在汽车、五金与电子制造等产业中的应用不断增多。传统压机在使用操作上耗费人力并需要诸多压机元件才能完整运作&#xff0c;维修成本高&…

yolov4Linux,基于Darknet的YOLOv4目标检测

目录一、Windows环境下的YOLOv4目标检测1、环境配置环境准备&#xff1a;Win10、CUDA10.1、cuDNN7.65、Visual Studio 2019、OpenCV 3.4(1)Visual Studio2019企业版安装(3)下载并安装CUDA10.1&#xff0c;下载安装cuDNN7.65对于cudnn直接将其解开压缩包&#xff0c;然后需要将b…

二元置信椭圆r语言_医学统计与R语言:圆形树状图(circular dendrogram)

微信公众号&#xff1a;医学统计与R语言如果你觉得对你有帮助&#xff0c;欢迎转发输入1&#xff1a; "ggraph")结果1&#xff1a; name 输入2&#xff1a; <- graph_from_data_frame(myedges1, verticesmyvertices,directed T)ggraph(mygraph, layout dend…