做试卷挣钱的网站,腾讯企点和企业qq区别,进销存,织梦网站图片修改不了0x00 为何需要开机自启动launch文件在ROS开发后期阶段由于功能已经趋于稳定#xff0c;因此就需要系统在一上电启动后就自动把ROS下的各节点程序加载运行#xff0c;这样就省去了我们还得手动输入roslaunch命令来加载bringup的launch文件的操作。经过我的实际测试目前有两种方…0x00 为何需要开机自启动launch文件在ROS开发后期阶段由于功能已经趋于稳定因此就需要系统在一上电启动后就自动把ROS下的各节点程序加载运行这样就省去了我们还得手动输入roslaunch命令来加载bringup的launch文件的操作。经过我的实际测试目前有两种方式可以实现开机自启动一种就是使用系统自带的Startup Applications另外一种就是编写一个service开机后自动启动在这里我们以树梅派下ubuntuMate安装ros kinetic系统作为示例来分别演示这两种方式各如何操作。0x01 下载雷达源码并编译运行在这里我以在树梅派下开机后自启动ydlidar-x4作为演示首先就需要在树梅派中下载该雷达源码在ROS工作空间的src目录下使用如下命令下载源码下载源码后就可以先来配置雷达的设备挂载点使其挂载点从/dev/ttyUSBx映射到/dev/ydlidar这样方便我们获取雷达的设备挂载点。当编译完成后就可以来测试雷达是否可以正常启动了需要首先source devel/setup.bash配置当前工作空间的环境变量这样我们才能使用roslauch来启动ydlidar软件包下的lidar.launch在这里需要注意的是由于雷达的USB口供电能力较弱因此我们除了需要接上雷达的数据接口后还得接上供电接口这样ydlidar-x4才能正常工作。当编译完成后我们可以来使用roslaunch启动雷达看看是否能正常工作可以先source devel/setup.bash配置好环境变量后使用如下命令来启动雷达roslaunch ydlidar lidar.launch接下来就会发现雷达开始转动起来。0x02 使用StartupApplication方式来自启动这种方式的主要思路就是通过编写一个bash脚本在脚本中来执行roslaunch命令启动相应的ros节点然后我们在系统提供的startupApplication中添加我们要执行的脚本即可这样就可以在每次开机的时候执行我们自定义的脚本了。在这里我们在当前ros工作空间源码目录创建一个软件包用于存放我们的脚本具体操作如下所示在startup.sh脚本中添加如下代码#!/bin/bash# Copyright: 2016-2018 www.corvin.cn# Author: corvin# Description: In raspeberry ubuntu Mate16.04 poweron# startup ross launch file.# History:# 20180530: initial this file.source /opt/ros/kinetic/setup.bashsource ~/catkin_ws/devel/setup.bashroslaunch ydlidar lidar.launchexit 0接下来就可以在ubuntuMate的界面上来配置添加启动程序了如下图所示完整操作注意Command的添加完整的命令如下terminator -x /home/corvin/catkin_ws/src/auto_startup/scripts/startup.sh大家只需要修改terminator为mate_terminal如果在x64的ubuntu的系统上默认安装的终端是gnome-terminal另外就是需要修改后面的路径为自己脚本的路径就可以了。当点击Add后接下来就可以来重启树梅派来进行测试了看看重启后是否开机时能将雷达自动启动下图是树梅派刚启动时自动打开terminator终端然后自动来执行脚本中的roslaunch命令将雷达启动0x03 编写service启动相关代码我们仍然在创建的auto_startup软件包的scripts目录下创建需要的文件使用如下命令来操作在ros_startup.service中添加的代码如下[Unit]DescriptionpowerOn startup ros[Service]TypesimpleRestartalwaysRestartSec30ExecStart/usr/sbin/ros_startExecStop/usr/sbin/ros_stopExecRestart/usr/sbin/ros_restart[Install]WantedBymulti-user.target该文件就是我们自定义的服务我们可以使用systemctl来操作该服务使其可以开机时候来启动执行其中相应的命令里面的命令其实还是我们自定义的脚本下面来简要解析下该服务的内容service主要由三部分组成分别时UnitServiceInstall下面来分别介绍这三部分Unit:该服务的类型描述这里定义为单元类型Description是这个服务的一个描述信息可以自己根据需要来修改。Service:服务的关键部分需要配置的一些关键参数这里配置了如下几个参数(1)Typesimple表明这个服务主要由 ExecStart 设置的程序来启动启动后常驻于内存中。这个simple是默认的参数除了simple外还可以设置为oneShot该参数与simple类似区别在于这个ExecStart执行的命令执行完成后就退出了不会常驻在内存中。还可以设置为idel该参数与 simple 类似意思是要执行这个服务必须要所有的工作都顺利执行完毕后才会执行这类的服务通常是开机到最后才执行即可的服务。(2)Restartalways表明该服务具备重启功能如果服务意外关闭后会一直尝试重新启动。(3)RestartSec30表明服务在意外关闭后经过多少秒后再次重新尝试启动该服务。(4)ExecStart/usr/sbin/ros_start表明服务启动时需要执行的命令后面就是执行的命令所在路径这里的命令是我们自定义的脚本。(5)ExecStop/usr/sbin/ros_stop当需要停止该服务时需要执行的命令后面是命令的路径。(6)ExecStop/usr/sbin/ros_restart当服务需要重新启动时需要执行的命令后面是命令的路径。Install:需要将该unit安装到那个target上。然后开始编写需要启动的三个脚本分别是ros_startros_stopros_restart下面来依次介绍三个脚本的编写(1)编写ros_start脚本该脚本就是服务启动时需要执行的命令具体代码如下#!/bin/bash# Copyright: 2016-2018 www.corvin.cn# Author: corvin# Description: In raspeberry ubuntu Mate16.04 poweron# startup ross launch file.# History:# 20180531: initial this file.source /opt/ros/kinetic/setup.bashsource /home/corvin/catkin_ws/devel/setup.bashroslaunch ydlidar lidar.launchexit 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.bashsource /home/corvin/catkin_ws/devel/setup.bashfor i in $(rosnode list);dorosnode kill $i;donekillall roslaunchexit 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_stopsleep 3/usr/sbin/ros_startexit 00x04 配置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.serviceexit 0首先对该脚本进行简单解析前面通过cp拷贝将三个执行脚本放到/usr/sbin目录下然后将ros_startup.service拷贝到/lib/systemd/system目录下接下来的sudo systemctl enable ros_startup.service就是为了使该服务生效启用该服务。当为该脚本通过chmod x config_service.sh来增加执行权限后就可以来执行该脚本配置service了具体操作如下图当使用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在我们enable了自定义的服务后我们的服务就会在后台一直运行但是我们却不知道该服务在后台如何运行的因为看不到任何日志输出如果想查看服务运行的相关日志该如何操作呢在这里就需要使用journalctl标准日志服务来查看了Systemd通过其标准日志服务Journald将其管理的所有后台进程打印到到std:out(即控制台)的输出重定向到了日志文件。日志文件是二进制格式的因此必须使用特定的工具才能查看。Journald提供了配套的程序Journalctl用于处理日志内容Journalctl的使用非常简单默认不带任何参数的时候会输出系统和所有后台进程的混合日志常用的参数有--dmesg用于查看内核输出的日志--system用于查看系统输出的日志--unit加上Unit的名字来指定输出特定Unit的日志例如我们想查看自定义服务ros_startup.service的日志输出可以使用如下命令sudo journalctl --unit ros_startup.service下面来测试下该命令查看服务在后台的日志输出corvinrobot:~$ 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.corvinrobot:~$ sudo systemctl restart ros_startup.servicecorvinrobot:~$ 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_laser45月 31 15:59:24 robot ros_stop[1981]: killed5月 31 15:59:24 robot ros_stop[1981]: killing /rosout5月 31 15:59:24 robot ros_stop[1981]: killed5月 31 15:59:25 robot ros_stop[1981]: killing /ydlidar_node5月 31 15:59:25 robot ros_stop[1981]: killed5月 31 15:59:26 robot ros_start[615]: ... logging to /root/.ros/log/524e6f08-64a8-11e8-a578-b827eb1485月 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 interrupt5月 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]: SUMMARY5月 31 15:59:26 robot ros_start[615]: 5月 31 15:59:26 robot ros_start[615]: PARAMETERS5月 31 15:59:26 robot ros_start[615]: * /rosdistro: kinetic5月 31 15:59:26 robot ros_start[615]: * /rosversion: 1.12.135月 31 15:59:26 robot ros_start[615]: * /ydlidar_node/angle_fixed: True5月 31 15:59:26 robot ros_start[615]: * /ydlidar_node/angle_max: 180.05月 31 15:59:26 robot ros_start[615]: * /ydlidar_node/angle_min: -180.05月 31 15:59:26 robot ros_start[615]: * /ydlidar_node/baudrate: 1152005月 31 15:59:26 robot ros_start[615]: * /ydlidar_node/frame_id: laser_frame5月 31 15:59:26 robot ros_start[615]: * /ydlidar_node/frequency: 7.05月 31 15:59:26 robot ros_start[615]: * /ydlidar_node/heartbeat: False5月 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: False5月 31 15:59:26 robot ros_start[615]: * /ydlidar_node/port: /dev/ydlidar5月 31 15:59:26 robot ros_start[615]: * /ydlidar_node/range_max: 16.05月 31 15:59:26 robot ros_start[615]: * /ydlidar_node/range_min: 0.085月 31 15:59:26 robot ros_start[615]: * /ydlidar_node/resolution_fixed: True5月 31 15:59:26 robot ros_start[615]: * /ydlidar_node/samp_rate: 95月 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_stopsudo systemctl disable ros_startup.servicesudo rm /usr/sbin/ros_startsudo rm /usr/sbin/ros_stopsudo rm /usr/sbin/ros_restartsudo rm /lib/systemd/system/ros_startup.serviceexit 0可以发现当执行了卸载自定义service的脚本后我们已经无法执行start和stop相关操作了如果想再次启用自定义服务只要重新执行启用的脚本即可。0x05 参考资料0x06 问题反馈大家在按照教程操作过程中有任何问题可以关注ROS小课堂的官方微信公众号在公众号中给我发消息反馈问题即可我基本上每天都会处理公众号中的留言当然如果你要是顺便给ROS小课堂打个赏我也会感激不尽的打赏30块还会邀请进ROS小课堂的微信群与更多志同道合的小伙伴一起学习和交流