使用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 创建软链接,而不是拷贝启动脚本。