使用robot-upstart开机自启动ROS程序

1、环境

桌面环境:ubuntu18.04
ROS环境:melodic

2、说明

本文章以一个单一节点为例:
路径:~/catkin_ws/src/mytest_pkg
包名:mytest_pkg
节点名(程序名):mytest

文中所有出现mytest_pkg和mytest的地方,请皆根据自己的环境做替换,当然还有一些相关的路径也要替换。

3、安装robot-upstart

sudo apt-get install ros-melodic-robot-upstart

4、编写launch文件

在mytest_pkg/launch/路径下创建start.launch文件,
编写文件内容:

<launch>
	<node pkg="mytest_pkg" type="mytest" name="mytest"/>
</launch>

该launch文件只包含mytest的启动,如有需要可以添加其他内容。

5、添加自启动任务

执行指令:

rosrun robot_upstart install --master "http://127.0.0.1:11311" --setup ~/catkin_ws/devel/setup.bash mytest_pkg/launch/start.launch --logdir ~/logs
#指令说明:
#参数
#        --master:指定ROS_MASTER_URI
#        --setup:需要添加的ROS环境,此处为mytest_pkg所属的setup.bash,请根据需要修改
#        --logdir:日志文件夹路径,本文选择了~/logs路径,无需自己创建文件夹,会自动生成
#        mytest_pkg/launch/start.launch:编写的launch路径,不可以是绝对路径,必须以包名开头

#选择性添加更多参数,如:
--user root#指定root用户启动
--interface lo#指定lo网络接口,可以通过ifconfig指令查看lo网络接口

自启动任务添加成功,则会出现下面的内容:

Filesystem operation succeeded.
** To complete installation please run the following command:
  sudo systemctl daemon-reload && sudo systemctl start mytest

此时执行内容的最后一行,即可完成自启动任务的添加,关机重启即可自启动程序:

sudo systemctl daemon-reload && sudo systemctl start mytest

6、upstart问题及其他事项

6.1 自启动程序不能正常发布话题、自启动ROS程序不能正常运行、发布了话题但是数据无法发布出去

部分略微复杂的程序(如:存在多线程的程序)需要在程序最开始添加sleep函数,使其休眠几秒(如3秒:sleep(3))才可以正常运行程序,否则可能会出现如topic无法启动、发布topic但不能发送数据等问题。

6.2 路径问题

使用robot upstart进行的自启动程序,程序内涉及到路径的必须使用不带’~’号的从根目录开始的绝对路径,包括需要执行的脚本文件内的路径。
假设nvidia用户,~/路径的完整写法是/home/nvidia/
那么程序中路径/home/nvidia/catkin_ws/,不可以写成~/catkin_ws。

本人是因为程序中存在下面这条语句,但是运行后没有内容输出到check_suc文件中,而后将路径~/check_suc改成完整的/home/nvidia/check_suc,才有内容的输出,这才发现了这个问题。
并且分别测试了在rosrun robot_upstart install语句中添加指定root用户(–user root)和不指定root用户,但结果都相同。

system("echo 'begin run' >> ~/check_suc");

6.3 确认是否完成自启动程序的添加

可以查看/etc/ros/melodic/mytest.d/.installed_files文件来确定是否完成自启动任务的添加。如果这个路径存在,则添加自启动任务成功。
该文件中存有自启动的其他相关配置文件路径。

6.4 内容输出注意事项(防止内存爆炸)

如果程序中存在大量的内容输出(循环地printf等),它会将内容输出到logs/lastest/rosout-2-stdout.log日志文件中。
如果程序持续运行,则该日志文件会变得非常庞大。

可以选择输出到screen——修改launch文件:

  • 1、如果已经添加了自启动任务,则修改/etc/ros/melodic/mytest.d/start.launch文件才可,不可修改~/catkin_ws/src/mytest_pkg/launch/start.launch文件。
    或者卸载自启动程序(查看第7节),修改~/catkin_ws/src/mytest_pkg/launch/start.launch文件,再重新添加自启动任务。
  • 2、如果没有添加自启动任务则直接修改~/catkin_ws/src/mytest_pkg/launch/start.launch文件。

修改内容:

<launch>
	<node pkg="mytest_pkg" type="mytest" name="mytest" output="screen"/>
</launch>

参数的官方解释:
output=“log|screen”(optional)
If ‘screen’, stdout/stderr from the node will be sent to the screen. If ‘log’, the stdout/stderr output will be sent to a log file in $ROS_HOME/log, and stderr will continue to be sent to screen. The default is ‘log’.
中文翻译:
output =“log | screen” (可选)
如果’screen’,stdout / stderr从节点将被发送到屏幕。如果是“log”,stdout / stderr输出将被发送到$ ROS_HOME/ log中的日志文件,stderr将继续发送到屏幕。默认值为“log”。

7、卸载(取消)自启动程序

rosrun robot_upstart uninstall mytest

8、关闭程序

在日志目录~/logs/下,查看文件mytest.pid,文件内有进程ID,通过向此进程发送9号信号,来杀死进程。
这不影响程序的自启动,下次重启依旧会自启动。

cat ~/logs/mytest.pid#获取进程ID,当然也可以用ps -aux|grep mytest来获取进程ID
sudo kill -9 进程ID

9、rosrun robot_upstart install所有参数说明

pkg/path 安装job launch的package和path名称,保持路径以包名开头(不可使用绝对或workspace最top路径)
--job 指定job(service)名称,如果没有制定,就使用package中的一部分 (一般为‘_’之前的单词)
--interface 指定网络接口
--user 指定用户启动launch脚本
--setup 指定使用特殊工程下的setup.bash文件。
--rosdistro 指定ros的发布版本
--master 指定ROS_MASTER_URI
--logdir 指定日志文件目录
--augment=False 不创建job,只是拷贝用户文件。默认job已经创建成功
--provider 指定 provider 在无法自动检测正确的 provider 情况下
--symlink=False 创建软链接,而不是拷贝启动脚本。

版权声明:本文为zxc1209642212原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。