桌面环境:ubuntu18.04
ROS环境:melodic
本文章以一个单一节点为例:
路径:~/catkin_ws/src/mytest_pkg
包名:mytest_pkg
节点名(程序名):mytest
文中所有出现mytest_pkg和mytest的地方,请皆根据自己的环境做替换,当然还有一些相关的路径也要替换。
sudo apt-get install ros-melodic-robot-upstart
在mytest_pkg/launch/
路径下创建start.launch
文件,
编写文件内容:
<launch>
<node pkg="mytest_pkg" type="mytest" name="mytest"/>
</launch>
该launch文件只包含mytest的启动,如有需要可以添加其他内容。
执行指令:
$ 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
部分略微复杂的程序(如:存在多线程的程序)需要在程序最开始添加sleep函数,使其休眠几秒(如3秒:sleep(3))才可以正常运行程序,否则可能会出现如topic无法启动、发布topic但不能发送数据等问题。
使用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 ......
可以查看/etc/ros/melodic/mytest.d/.installed_files
文件来确定是否完成自启动任务的添加。如果这个路径存在,则添加自启动任务成功。
该文件中存有自启动的其他相关配置文件路径。
如果程序中存在大量的内容输出(循环地printf等),它会将内容输出到logs/lastest/rosout-2-stdout.log
日志文件中。
如果程序持续运行,则该日志文件会变得非常庞大。
可以选择输出到screen——修改launch文件:
/etc/ros/melodic/mytest.d/start.launch
文件才可,不可修改~/catkin_ws/src/mytest_pkg/launch/start.launch
文件。~/catkin_ws/src/mytest_pkg/launch/start.launch
文件,再重新添加自启动任务。~/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”。
$ rosrun robot_upstart uninstall mytest
在日志目录~/logs/
下,查看文件mytest.pid
,文件内有进程ID,通过向此进程发送9号信号,来杀死进程。
这不影响程序的自启动,下次重启依旧会自启动。
$ cat ~/logs/mytest.pid # 获取进程ID,当然也可以用 ps -aux|grep mytest 来获取进程ID
$ sudo kill -9 <进程ID>
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 创建软链接,而不是拷贝启动脚本。