当前位置: 首页 > 工具软件 > Upstart > 使用案例 >

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

钱均
2023-12-01

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,才有内容的输出

int main()
{
    // ...;
    
    system("echo 'begin run' >> ~/check_suc");
    
    // ...;
    return 0;
}

该问题原因可能是:自启动脚本的默认运行用户是root用户,而root用户的home目录应该/root
可以尝试在rosrun robot_upstart install语句中添加--user参数,指定其他用户(e.g. nvidia)(我没试过,只是理论上猜测可行)

# e.g.
$ rosrun robot_upstart install --user nvidia ......

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 创建软链接,而不是拷贝启动脚本。
 类似资料: