当前位置: 首页 > news >正文

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 命令而不用输入密码

相关文章:

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

前言 项目中要求上电自启动定位程序,所以摸索了一种 Ubuntu 系统下开机自启动的方法,开机自启动 .sh 脚本,加载 ROS 环境的同时启动 .py 脚本。在 . py 脚本中启动一系列 ROS 节点。 一、 .sh 脚本的编写 #!/bin/bash # gnome-terminal -- …...

RabbitMQ 消息队列:生产者与消费者实现详解

在分布式系统中,消息队列(Message Queue, MQ)是一种重要的组件,用于解耦系统、异步处理任务以及实现系统间的通信。RabbitMQ 是一个流行的开源消息代理软件,它实现了高级消息队列协议(AMQP)。在…...

vue3项目中组件切换不起作用

以下这种方式写页面中组件切换&#xff0c;不起作用。 <component :is"steps[compIndex].comp" />解决&#xff1a;使用shallowReactive或者shallowRef把对应的组件名称重新定义下。 <component :is"compNames[steps[compIndex].comp]" /> &…...

YOLOv11改进策略【损失函数篇】| Slide Loss,解决简单样本和困难样本之间的不平衡问题

一、本文介绍 本文记录的是改进YOLOv11的损失函数&#xff0c;将其替换成Slide Loss&#xff0c;并详细说明了优化原因&#xff0c;注意事项等。Slide Loss函数可以有效地解决样本不平衡问题&#xff0c;为困难样本赋予更高的权重&#xff0c;使模型在训练过程中更加关注困难样…...

动静态库(Linux)

文章目录 前言一、静态库二、动态库三、深入理解动态库总结 前言 我们之前用过c语言的库.Linux中默认的都是使用动态库&#xff0c;如果想要使用静态库&#xff0c;就必须加上-static选项。默认都是安装的动态库&#xff0c;系统中一般没有静态库&#xff0c;如果要使用&#…...

51单片机和ARM单片机的区别

在嵌入式系统设计与应用中&#xff0c;单片机作为核心控制单元&#xff0c;扮演着至关重要的角色。其中&#xff0c;51单片机和ARM单片机作为两种常见的单片机类型&#xff0c;各自具有独特的特点和优势。本文将从多个维度深入探讨这两种单片机的区别&#xff0c;以便读者更好地…...

[Day 81] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈在食品安全中的應用 前言 食品安全一直是全球關注的問題&#xff0c;隨著全球供應鏈的複雜性增加&#xff0c;追踪食品從生產到消費的過程變得愈發困難。區塊鏈技術以其去中心化、不可篡改的特性&#xff0c;為食品安全提供了可靠的解決方案。在這篇文章中&#xff0c;…...

flac格式怎么转mp3?关于flac转为MP3的方法介绍

flac格式怎么转mp3&#xff1f;MP3格式经过压缩&#xff0c;相较于flac文件&#xff0c;显著减小了文件体积。这一特点使得音乐的存储和传输更加便捷&#xff0c;尤其适合移动设备以及存储空间有限的场景。由于MP3文件体积较小&#xff0c;分享音乐变得非常简单&#xff0c;无论…...

【笔记】KaiOS 系统框架和应用结构(APP界面逻辑)

KaiOS系统框架 最早自下而上分成Gonk-Gecko-Gaia层,代码有同名的目录,现在已经不用这种称呼。 按照官网3.0的版本迭代介绍,2.5->3.0已经将系统更新成如下部分: 仅分为上层web应用和底层平台核心,通过WebAPIs连接上下层,这也是kaios系统升级变更较大的部分。 KaiOS P…...

java项目实现钉钉异常告警实时监控

最近有个小伙伴问我&#xff0c;我们的项目核心业务的地方总是有异常&#xff0c;虽然有打印日志&#xff0c;但不能立马通知我&#xff1b;所以今天我就教大家如何实现异常报警实时提醒 1.需要有钉钉 自己新建的企业用户 2.建一个群&#xff0c;需要有三人以上&#xff1b;…...

Spring Boot应用:电子商务平台开发

第2章 关键技术简介 2.1 Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xf…...

怎么在Vue3项目中引入Vant组件库并使用?

文章目录 前言一、项目中使用步骤1.安装&#xff1a;2.样式的导入&#xff08;2种方法&#xff09;2.1 main.ts全局导入&#xff08;平常自己的项目用的这个全局&#xff09;2.2 按需引入组件样式 (简单介绍一下)1.安装插件2.配置插件 3.组件按需使用&#xff1a;App.vue 总结 …...

springboot中有哪些方式可以解决跨域问题

文章目录 什么是跨域解决方案CrossOrigin注解实现WebMvcConfigurer接口CorsFilter过滤器如何选择&#xff1f; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 Talk is cheap &#xff0…...

Temporal Dynamic Quantization for Diffusion Models阅读

文章目录 AbstractIntroductionBackgrounds and Related Works2.1 扩散模型2.2 量化2.3 量化感知训练和训练后量化 TemporalDynamic Quantization3.1 量化方法3.2 扩散模型量化的挑战3.3 TDQ模块的实现3.4 工程细节时间步的频率编码TDQ模块的初始化 Experimental SetupResults5…...

828华为云征文|华为云Flexus X实例性能实测:速度与稳定性的完美结合

828华为云征文&#xff5c;华为云Flexus X实例性能实测&#xff1a;速度与稳定性的完美结合 前言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点1.3 Flexus云服务器X实例使用场景 二、实践环境介绍2.1 本次实践环境规划2.2 本次实践介绍 …...

【PyTorch】图像分割

图像分割是什么 Image Segmentation 将图像每一个像素分类 图像分割分类 超像素分割&#xff1a;少量超像素代替大量像素&#xff0c;常用于图像预处理语义分割&#xff1a;逐像素分类&#xff0c;无法区分个体实例分割&#xff1a;对个体目标进行分割全景分割&#xff1a;…...

如何快速建立自己的异地互联的远程视频监控系统,通过web浏览器可以直接查看公网上的监控视频(上)

目录 一、需求 二、方案 2.1、计划方案 2.2、实施准备 2.2.1所需配置的产品和服务 2.2.1.1云主机 &#xff08;1&#xff09;选择云平台 &#xff08;2&#xff09;配置云服务器 2.2.2.2视频监控平台软件 &#xff08;1&#xff09;视频监控平台软件 &#xff08;2&am…...

实验2思科网院项目2.7.2-packet-tracer---configure-single-area-ospfv2---实践练习

实践练习 2.7.2-packet-tracer---configure-single-area-ospfv2---实践练习physical-mode 实验拓扑 相关设备配置 实验目标: 第 1 部分&#xff1a;构建网络并配置设备的基本设置 第 2 部分&#xff1a;配置和验证单区域 OSPFv2 的基本部署 第 3 部分&#xff1a;优化和验…...

Nginx实战经验分享:从小白到专家的成长历程!

目录 一、Nginx概述1、Nginx简介&#xff08;1&#xff09;事件驱动模型&#xff08;2&#xff09;异步处理&#xff08;3&#xff09;模块化设计&#xff08;4&#xff09;高性能&#xff08;5&#xff09;反向代理&#xff08;6&#xff09;负载均衡&#xff08;7&#xff09…...

从画质设置看游戏引擎(其一)

前往我的博客&#xff0c;获取无广告&#xff0c;更好的阅读体验 1. 抗锯齿&#xff08;Anti-Aliasing&#xff09; 1.1 锯齿问题的起因 在三维模型的世界中&#xff0c;模型是连续的&#xff0c;但是屏幕像素是不连续&#xff0c;是离散的&#xff1b; 即当一个圆形显示在显…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...