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

news2024/11/17 7:23:10

前言

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

一、 .sh 脚本的编写

#!/bin/bash
# gnome-terminal -- bash -c "/home/wu/startup.sh; exec bash"
sleep 2

echo "----------加载 ROS 环境----------"
source /opt/ros/noetic/setup.bash 
sleep 2
echo $ROS_PACKAGE_PATH

echo "----------启动 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 rospy

i = 101

def 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 i
    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", "--title", str(i), "--", "bash", "-c", command_str]) # title 无效???
    # 添加标题:"--title", str(i),
    i = i + 1

def 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() # 第一时间启动roscore
    rospy.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.coloradmin.cn/o/2168314.html

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

相关文章

MyBatis-Plus代码生成器的使用

简介 AutoGenerator 是 MyBatis-Plus 的代码生成器&#xff0c;通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码&#xff0c;极大的提升了开发效率。 创建 Maven 工程 添加依赖 <?xml version"1.0" encod…

哈希表(一)

一、基础知识 哈希表的优点&#xff1a; 查找key的时间效率是O&#xff08;1&#xff09; 什么时候要用到哈希表&#xff1a; 查询元素的出现问题&#xff08;是否出现过&#xff0c;是否在集合里&#xff0c;出现次数等&#xff09; 哈希表的三种数据结构&#xff1a; 数组…

从自身经历浅谈对于C++/Java的认识

1.声明 因为一些其他的原因&#xff0c;我决定从C转到java方向学习&#xff0c;后期可能就要换方向了&#xff0c;以后主要学习这个java相关的这个技术了&#xff0c;起码暂时不会学习这个C里面的内容了&#xff1b; 2.我的感慨 当时选方向的时候&#xff0c;我自己就是选的…

甘蔗茎节检测系统源码分享

甘蔗茎节检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

插座检测系统源码分享

插座检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

Docker 天池代码提交

参考零基础入门Docker-cuda练习场_学习赛_天池大赛-阿里云天池的赛制 (aliyun.com) ​ 在Docker零基础入门-CSDN博客中我已经安装了docker,现在开始创建自己的镜像仓库。 1. 开通阿里云容器镜像服务(镜像仓库) 进入容器镜像服务 (aliyun.com) 1.1. 创建个人实例 点击“…

.net 未能加载文件或程序集“System.Diagnostics.DiagnosticSource, Version=6.0.0.1 解决方案

.net webapi 项目以前用的正常&#xff0c;重装server2019后&#xff0c;又把oracle客户端从11g升级成19c&#xff0c;修改了连接字符串后&#xff0c;其他网站都正常&#xff0c;唯独这个webapi报错 报错信息&#xff1a; 未能加载文件或程序集“System.Diagnostics.Diagnos…

Elasticsearch黑窗口启动乱码问题解决方案

问题描述 elasticsearch启动后有乱码现象 解决方案&#xff1a; 提示&#xff1a;这里填写该问题的具体解决方案&#xff1a; 到 \config 文件下找到 jvm.options 文件 打开后 在文件末尾空白处 添加 -Dfile.encodingGBK 保存后重启即可。

精密制造的革新:光谱共焦传感器与工业视觉相机的融合

在现代精密制造领域&#xff0c;对微小尺寸、高精度产品的检测需求日益迫切。光谱共焦传感器凭借其非接触、高精度测量特性脱颖而出&#xff0c;而工业视觉相机则以其高分辨率、实时成像能力著称。两者的融合&#xff0c;不仅解决了传统检测方式在微米级别测量上的局限&#xf…

MySQL 应对大量并发连接之道

《》 在当今的互联网时代&#xff0c;数据库面临着越来越多的并发连接请求。对于 MySQL 来说&#xff0c;如何有效地处理大量的并发连接成为了一个关键问题。本文将探讨 MySQL 处理大量并发连接的方法和策略。 一、并发连接带来的挑战 当 MySQL 数据库面临大量并发连接时&am…

使用 sponge + dtm 轻松实现秒杀抢购服务(HTTP),彻底解决库存与订单数据不一致的难题

秒杀场景的挑战 秒杀是电商中常见的抢购商品场景&#xff0c;其技术特点是瞬间请求量巨大&#xff0c;对服务的性能和一致性要求极高。即使服务出现崩溃&#xff0c;也必须确保库存扣减和订单生成保持一致&#xff0c;避免出现超卖或超买的现象。通过使用 dtm&#xff08;分布…

基于Springboot+Vue的高校体育运动会比赛系统(含源码+数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统…

根据软件架构设计与评估的叙述开发一套机器学习应用开发平台

案例 阅读以下关于软件架构设计与评估的叙述&#xff0c;回答问题 1和问题 2。 【说明】 某公司拟开发一套机器学习应用开发平台&#xff0c;支持用户使用浏览器在线进行基于机器学习的智能应用开发活动。该平台的核心应用场景是用户通过拖拽算法组件灵活定义机器学习流程&…

如何用一段文字或一张图片生成一段视频?

找了下AI视频工具的排行&#xff0c;发现在这款国内好多大模型的AI视频工具都排在前面。测试了好几款&#xff0c;整体感觉还是非常不错&#xff0c;除了生成的时间比较短&#xff0c;清晰度和效果比自己找的会好很多。 AI视频工具文成视频成品展示 一个视频生成的时间大概是5-…

【CTF刷题8】2024.9.26

ps:源自CTFhub 基础认证&#xff1a; 在HTTP中&#xff0c;基本认证&#xff08;英语&#xff1a;Basic access authentication&#xff09;是允许http用户代理&#xff08;如&#xff1a;网页浏览器&#xff09;在请求时&#xff0c;提供 用户名 和 密码 的一种方式。详情请查…

什么是智慧党建?可视化大屏如何推动高质量党建?

在数字化时代&#xff0c;党建工作迎来了新的发展机遇。智慧党建&#xff0c;作为新时代党建工作的创新模式&#xff0c;正逐渐成为推动党的建设向高质量发展的重要力量。它不仅改变了传统的党建工作方式&#xff0c;还通过现代信息技术的应用&#xff0c;提升了党建工作的效率…

HttpSession使用方法及原理

HttpSession使用方法及原理 一、HttpSession使用流程说明二、登录概述具体 三、访问过程概述具体 一、HttpSession使用流程说明 1.用户发送登录请求到服务器。 2.服务器处理登录请求&#xff0c;调用userService.login(loginUser)。 3.如果登录成功&#xff0c;服务器调用requ…

LeetCode(Python)-贪心算法

文章目录 买卖股票的最佳时机问题穷举解法贪心解法 物流站的选址&#xff08;一&#xff09;穷举算法贪心算法 物流站的选址&#xff08;二&#xff09;回合制游戏快速包装 买卖股票的最佳时机问题 给定一个数组&#xff0c;它的第 i 个元素是一支给定股票第 i 天的价格。如果你…

大数据新视界 --大数据大厂之数据清洗工具 OpenRefine 实战:清理与转换数据

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

linux命令:显示已安装在linux内核的模块的详细信息的工具modinfo详解

目录 一、概述 二、使用方法 1、基本的使用语法 2、常用选项 3、输出字段 4、获取帮助 三、示例 四、实际用途 1、诊断问题 2、模块依赖 3、参数配置 五、其他事项 一、概述 modinfo 是 Linux 系统中的一个工具&#xff0c;用于显示有关已安装内核模块的详细信息。…