开机自动启动控制台并运行自己编译好的c++程序
笔记:
项目简介:在jetson tx2开发板上安装ubuntu16.04,然后用c/c++实现无人机感知与避撞。程序主要功能是:启动程序后等待地面站发送离线航点数据帧,收到后等待地面站发送开启避障指令,收到开启避障指令后,程序在一个大的循环里完成 :接收无人机遥测信息,接收雷达感知信息,控制双目摄像头感知环境,并根据各种信息完成避撞策略生成避障航点给无人机,过程中不断向地面站软件发送状态信息。
问题: 现在需要: 开机自动运行我们这个程序。
分析: 与网上普通的开机自启动问题相比 我们这个问题的特殊性有:
1.arm-linux
2.我的c++程序在终端上输出了很多参数与调试信息,开机后不能在后台运行,需要显示终端。
3.我的c++程序是开机打开串口然后等待串口输入数据,没有数据则程序一直等待,串口收到符合要求的数据后才继续运行。
解决过程: 网上的方法大都是修改/etc/rc.local文件或者在/etc/init.d里面编写shell来实现开机自启动。于是我按照网上的方法,在rc.local里exit 0之前加上了一句sudo ./home/nvidia/Desktop/obs01/build/obs (我的工程放在了桌面,build文件夹里的obs使我们make生成的可执行程序,注意这里要写可执行程序的完整目录,从/开始),重启之后没有任何反映,ps命令查看进程也没有(也有可能不会用ps命令),于是为了知道程序到底运行没有,我在我工程代码最前面加上了一句生成一个txt文件的语句,然后重启发现txt生成了,但是我在地面站发送指令,tx2也没什么反映(除了终端上的输出信息,应该还会实时显示摄像头采集的图片),然后我直接双击obs生成了txt,然后在地面站输入指令,实时显示了摄像头采集的图片。不知道什么原因。之后试了各种方法不能解决,最后试了这个 Ubuntu 开机自动启动roscore命令 自动打开终端执行脚本命令 博客的方法,成功了,特别简单。
解决方法总结: 打开终端,在终端中执行gnome-session-properties,会弹出一个“启动应用程序首选项”的菜单 点击添加
名称 注释随便输入
命令的地方输入 gnome-terminal -x ./home/nvidia/Desktop/obs01/build/obs
如果想要后台运行则换成
bash ./home/nvidia/Desktop/obs01/build/obs延伸:
这样就可以开机自动在终端上运行你的程序了。
如果你还想在你的c++程序中控制系统操作,比如控制重新启动运行程序,或者控制重启和关机。可以这样操作:
system("gnome-terminal -x ./home/nvidia/Desktop/obs01/build/obs");//重新打开一个终端重新运行此程序
system("shutdown");//关机
system("reboot"); //重启
希望能帮到大家!