Ubuntu 开机自启动 .py / .sh 脚本,可通过脚本启动 roslaunch/roscore等

前言

        项目中要求上电自启动定位程序,所以摸索了一种 Ubuntu 系统下开机自启动的方法,开机自启动 .sh 脚本,加载 ROS 环境的同时启动 .py 脚本。在 . py 脚本中启动一系列 ROS 节点。

一、 .sh 脚本的编写

#!/bin/bash
# gnome-terminal -- bash -c "/home/wu/startup.sh; exec bash"
sleep 2echo "----------加载 ROS 环境----------"
source /opt/ros/noetic/setup.bash 
sleep 2
echo $ROS_PACKAGE_PATHecho "----------启动 python 脚本----------"
/usr/bin/python3 /home/wu/test.py# sh脚本等待所有后台进程完成后结束
wait
exit 0

        启动 .sh 脚本时,首先沉睡 2 秒,等待其它部分启动完成后加载 ROS 环境,之后输出 $ROS_PACKAGE_PATH 确定 ROS 环境是否加载好,最后启动 .py 脚本。

二、 .py 脚本的编写

        首先安装依赖 wmctrl。wmctrl 是一个用于控制 X Window 管理器的命令行工具,通常用于 Linux 系统,特别是对窗口进行操作和管理。

sudo apt-get update
sudo apt-get install wmctrl
#!/usr/bin/python3.8
# coding=utf8
import subprocess
import rospyi = 101def close_terminal_by_name(terminal_name):# 使用 wmctrl -l 来列出所有窗口和其标题wmctrl_process = subprocess.Popen(["wmctrl", "-l"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)stdout, _ = wmctrl_process.communicate()# 在输出中查找指定名称的终端for line in stdout.splitlines():if terminal_name in line:# 获取终端的窗口 ID,并使用 wmctrl -i -c 命令关闭该终端window_id = line.split()[0]subprocess.run(["wmctrl", "-i", "-c", window_id])print("已关闭终端:", terminal_name)return# 如果未找到指定名称的终端print("未找到名称为", terminal_name, "的终端")def step(commands):command_str = " && ".join(commands)  # 将命令列表连接为一个字符串,使用 && 分隔# print(command_str)# 使用 exec bash 保持终端窗口打开command_str = command_str + "; exec bash"# subprocess.run() 函数用于执行外部命令。它会创建一个新的子进程,并等待子进程执行完成后返回。# gnome-terminal" 是要执行的命令,即打开一个新的终端# "--" 表示后面的参数将被传递给 gnome-terminal 命令# 使用 bash -c 执行命令rospy.sleep(1)subprocess.run(["gnome-terminal", "--", "bash", "-c", command_str]) # title 无效???# 添加标题:"--title", str(i),def step_name(commands):global icommand_str = " && ".join(commands)  # 将命令列表连接为一个字符串,使用 && 分隔# print(command_str)# 使用 exec bash 保持终端窗口打开command_str = command_str + "; exec bash"# subprocess.run() 函数用于执行外部命令。它会创建一个新的子进程,并等待子进程执行完成后返回。# gnome-terminal" 是要执行的命令,即打开一个新的终端# "--" 表示后面的参数将被传递给 gnome-terminal 命令# 使用 bash -c 执行命令rospy.sleep(1)subprocess.run(["gnome-terminal", "--title", str(i), "--", "bash", "-c", command_str]) # title 无效???# 添加标题:"--title", str(i),i = i + 1def start_roscore():command = "roscore"print("---启动{}".format(command))subprocess.Popen(["gnome-terminal", "--", "bash", "-c", command])def kill_roscore():close_terminal_by_name("roscore http://WP:11311/")if __name__ == '__main__':start_roscore() # 第一时间启动roscorerospy.sleep(2)rospy.init_node('test')rospy.loginfo('*****************************')command_str = ["cd /","sudo apt-get update"]rospy.sleep(1)step(command_str)rospy.sleep(1)

        .py 脚本主要包括 3 个函数, step(commands), step_name(commands) 和 close_terminal_by_name(terminal_name)

  • step(commands):将要输入到终端的命令以如下方式定义
    # 雷达驱动command_drive = ["cd /home/wu/3rdparty/driver/ws_livox","source ./devel/setup.bash","roslaunch livox_ros_driver2 msg_MID360.launch"]

        然后将 command_drive 以参数形式传入 step(commands) 函数中,启动 rosrun 节点。

        当以这种方式启动 rosrun 节点时,wmctrl 中没有相应标题,无法通过 title 关闭该节点。

        当以这种方式启动 roslaunch 节点时,wmctrl 中有相应标题,可通过 title 关闭该节点,默认 title 如下:

/home/wu/3rdparty/driver/ws_livox/src/livox_ros_driver2/launch_ROS1/msg_MID360.launch http://localhost:11311

        前半部分为 .roslaunch 文件路径,后半部分 http://localhost:11311 是 ROS 中的 ROS Master 运行的地址。

  • step_name(commands)

        通过 step_name(commands) 函数启动 rosrun 节点时,可以为其定义 title,定义的 title 为字符串 101。当启动多个step_name(commands) 函数时,title 以 101 为起点递增。此时,可将 101 作为参数传入 close_terminal_by_name(terminal_name) 函数中关闭 ros 节点。

  • close_terminal_by_name(terminal_name)

        将 wmctrl 的 title 作为参数传入该函数,关闭相应的 ros 节点。

三、sudo 无需输入密码

        当 command 中包含 sudo 命令时,需要手动输入密码,会影响脚本的自动化,故通过修改 ubuntu 设置 sudo 时无需输入密码。

        使用 visudo 命令编辑 sudoers 文件:

sudo visudo

        在最后一行添加如下命令,然后 ctrl + X 离开。

UserName ALL=(ALL) NOPASSWD: ALL

        设置成功后输入 sudo 命令将不会要求输入密码。

四、Ubuntu 启动应用程序 设置开机自启动 .sh 脚本

        完成上述设置后,按照如下配置

 

 

        输入以下命令开机自启动 .sh 脚本 

gnome-terminal -- bash -c "/home/wu/startup.sh; exec bash"

参考

        gnome-terminal - A terminal emulator for GNOME

        Ubuntu 开机自启动python程序或roslaunch的方法

        ubuntu中的sudoers文件损坏,修复办法(附图、详细)

        普通用户执行 sudo 命令而不用输入密码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/53743.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试经典150题 堆

215.数组中的第K个最大元素 建堆算法实现-CSDN博客 215. 数组中的第K个最大元素 中等 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 你必…

python 图像绘制问题: 使用turtle库绘制蟒蛇

turtle (海龟)库是turtle绘图体系的python实现。 1969年诞生,主要用于程序设计入门。 import turtle turtle.setup(650, 350, 200, 200) turtle.penup() turtle.fd(-250) turtle.pendown() turtle.pensize(25) turtle.pencolor("purple") tur…

Leetcode - 周赛416

目录 一,3295. 举报垃圾信息 二,3296. 移山所需的最少秒数 三,3297. 统计重新排列后包含另一个字符串的子字符串数目 I 四,3298. 统计重新排列后包含另一个字符串的子字符串数目 II 一,3295. 举报垃圾信息 本题就是…

Linux 安装nginx

下载安装 https://nginx.org/en/download.html 解压 tar -zxvf nginx-1.26.2.tar.gz -C /opt chmod 777 -R /opt/nginx-1.26.2/编译 && 安装 # 安装到同目录以免乱套,一定要先创建目录 mkdir /opt/nginx-1.26.2/nginx/# 编译 make # 安装,大…

kubernets镜像工具skopeo

文章目录 Skopeo是什么?主要功能与特性使用场景安装与配置 Skopeo常用命令行1. 查看帮助信息2. 镜像操作复制镜像删除镜像检查镜像 3. 镜像仓库交互登录镜像仓库退出镜像仓库 4. 镜像签名与验证5. 其他常用选项注意事项 Skopeo是什么? Skopeo是一个轻量…

Excel 获取某列不为空的值【INDEX函数 | SMALL函数或 LARGE函数 | ROW函数 | ISBLANK 函数】

〇、需求 Excel 获取某列不为空的值(获取某列中第一个非空值 或 获取某列中最后一个非空值)。 一、知识点讲解 INDEX函数 和 SMALL函数 两个函数搭配使用都可以实现上述需求 获取某列中第一个非空值 。 INDEX函数 和 LARGE函数 两个函数搭配使用都可以实现上述需求 获取某…

将Mixamo的模型和动画导入UE5

首先进入Mixamo的官网 , 点击 Character 选择一个模型 (当然你也可以自己上传模型/绑定动画) 然后点击下载 , 这个作为带骨骼的模型 选择FBX格式 , T Pose 直接下载 点击 Animations 选择动画 , 搜索 idle 默认站立动画 点击下载 , 格式选择 FBX , 不带模型只要骨骼 , 帧数选6…

MySQL_表_进阶(2/2)

上一章我们谈了排序子句,使用ORDER BY 字段 DESC/ASC。以及左右连接的多关系查询。 今天,没错,四张表最后两个需求 ✨涉及聚合函数查询与指定别名 四张表: 学院表:(testdb.dept) 课程表:(testdb.course) 选…

Rust编程的if选择语句

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 Rust语言实现选择结构时,根据某种条件的成立与否而采用不同的程序段进行…

【VUE】axios组件

1. 快速使用 npm install axiosLoginView.vueimport axios from "axios" axios.get("...") axios.post("...") axios.axios({method: "get" })2. 通用配置 npm install axiosplugins/axios.jsimport axios from "axios";l…

基于nodejs+vue的农产品销售管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…

C++学习笔记----8、掌握类与对象(一)---- 对象中的动态内存分配(4)

2.4、使用Move语法处理移动 类的move语法要求一个move构造函数和一个move赋值操作符。这些可以用于编译器,当源对象是一个临时对象在操作完成时就会被析构,你马上就会看到,显式地使用std::move()。move移动内存的属主以及从一个对象到另一个对…

FortiGate 无线组网

无线管理与配置 FortiAP 连接 internal 接口之后自动获得 ip 地址:192.168.1.xxx/24在 FortiGate 中创建 SSIDFortiGate 自动发现 FortiAP,将 FortiAP 添加到 FortiGate将 SSID 和 FortiAP 关联创建防火墙策略 下面我们就来一起看看在 FortiGate 中该如…

ModbusTCP通讯错误的排查

Modbus是一种由MODICON公司开发的工业现场总线协议标准,是一项应用层报文传输协议。该协议用于传输数字和模拟变量[1]。有关该协议的报文具体格式,以及一些基本概念,见[1]。 本文以一个例子,阐述当ModbusTCP通讯出现错误的时候&a…

开源鸿蒙OpenHarmony系统更换开机Logo方法,瑞芯微RK3566鸿蒙开发板

本文适用于开源鸿蒙OpenHarmony系统更换开机Logo,本次使用的是触觉智能的Purple Pi OH鸿蒙开源主板,搭载了瑞芯微RK3566芯片,类树莓派设计,是Laval官方社区主荐的一款鸿蒙开发主板。 介绍 OpenHarmony的品牌标志、版本信息、项目…

计算机毕业设计 基于Hadoop的智慧校园数据共享平台的设计与实现 Python 数据分析 可视化大屏 附源码 文档

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

探索EasyCVR视频融合平台:在视频编解码与转码领域的灵活性优势

随着视频监控技术的飞速发展,各类应用场景对视频数据的处理需求日益复杂多样。从公共安全到智慧城市,再到工业监控,高效、灵活的视频处理能力成为衡量视频融合平台性能的重要标准。在众多解决方案中,EasyCVR视频融合平台凭借其在视…

大觅网之自动化部署(Automated Deployment of Da Mi Network)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

音视频整体解码流程和同步流程

目录 1. 整体解码流程1. 初始化 FFmpeg2. 打开媒体文件3. 查找解码器4. 打开解码器5. 读取和解码数据6. 处理解码后的帧7. 释放资源 2. 音视频同步整体流程1. 解复用媒体流2. 解码3. 以音频为时钟源进行音视频同步的策略4. 缓冲区设计 现在先说大体流程,不分析代码 …

使用python爬取豆瓣网站?如何简单的爬取豆瓣网站?

1.对python爬虫的看法 首先说说我对python的看法,我的专业是大数据,我从事的工作是java开发,但是在工作之余,我对python又很感兴趣,因为我觉得python是一门很好的语言,第一:它可以用来爬取数据…