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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

javaWeb,Maven

前端打包的程序放在nginx中 查看哪个程序占用了80端口号 Maven:

rk3399开发环境的介绍

零. 前言 由于Bluez的介绍文档有限,以及对Linux 系统/驱动概念、D-Bus 通信和蓝牙协议都有要求,加上网络上其实没有一个完整的介绍Bluez系列的文档,所以不管是蓝牙初学者还是蓝牙从业人员,都有不小的难度,学习曲线也相…

生产绩效考核管理的六大指标

生产绩效考核管理的六大指标 绩效考核是指生产部所有人员通过不断丰富自己的知识、提高自己的技能、改善自己的工作态度,努力创造良好的工作环境及工作机会,不断提高生产效率、提高产品质量、提高员工士气、降低成本以及保证交期和安全生产的结果和行为…

极狐GitLab 17.4 升级指南

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab https://dl.gitlab.cn/6y2wxugm 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 本文分享极狐GitLab 17.4 升级…

9.24作业

将昨天的My_string类中的所有能重载的运算符全部进行重载 、[] 、>、<、、>、<、! 、&#xff08;可以加等一个字符串&#xff0c;也可以加等一个字符&#xff09;、输入输出(<< 、 >>) 代码如下 MyString.h #ifndef MYSTRING_H #define MYSTRING_…

检查一个CentOS服务器的配置的常用命令

在CentOS系统中&#xff0c;查看服务器配置的常用命令非常丰富&#xff0c;这些命令可以帮助用户快速了解服务器的硬件信息、系统状态以及网络配置等。以下是一些常用的命令及其简要说明&#xff1a; 1. 查看CPU信息 (1) cat /proc/cpuinfo&#xff1a;显示CPU的详细信息&…

react+antdMobie实现消息通知页面样式

一、实现效果 二、代码 import React, { useEffect, useState } from react; import style from ./style/index.less; import { CapsuleTabs, Ellipsis, Empty, SearchBar, Tag } from antd-mobile; //消息通知页面 export default function Notification(props) {const [opti…

国家推动工业制造业数字化转型的政策与措施综述

在全球化与信息化浪潮的推动下&#xff0c;工业制造业正经历着前所未有的数字化转型。这一变革不仅深刻重塑了生产方式与商业模式&#xff0c;更成为提升国家竞争力、促进经济高质量发展的关键驱动力。随着科技的飞速发展&#xff0c;数字化转型已成为工业制造业转型升级的必然…

基于微信小程序的健康管理系统(源码+定制+文档)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

叉车防撞系统方案,引领安全作业新时代

在现代工业的舞台上&#xff0c;叉车如同忙碌的“搬运工”&#xff0c;在仓储和制造环境中发挥着不可或缺的作用。然而&#xff0c;随着叉车使用频率的不断攀升&#xff0c;安全事故也如影随形&#xff0c;给企业带来经济损失的同时&#xff0c;更严重威胁着操作人员的生命安全…

拓扑结构的理解

拓扑结构是数学中的一个重要概念&#xff0c;主要研究空间的性质及其在连续变换下的保持不变的特征。它是拓扑学的基础内容之一&#xff0c;广泛应用于多个领域&#xff0c;包括数学、物理、计算机科学等。 基本概念 1. 拓扑空间&#xff1a; 一个集合 X 和一个拓扑T 的组合…

毕业设计选题:基于ssm+vue+uniapp的购物系统小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

基于Python可视化的学习系统的设计与实现(源码+文档+调试+答疑)

文章目录 一、项目介绍二、视频展示三、开发环境四、系统展示五、代码展示六、项目文档展示七、项目总结 大家可以帮忙点赞、收藏、关注、评论啦 &#x1f447;&#x1f3fb; 一、项目介绍 随着计算机技术发展&#xff0c;计算机系统的应用已延伸到社会的各个领域&#xff0c…

真正的Open AI ——LLaMA颠覆开源大模型

1. LLaMA 简介 LLaMA&#xff08;Large Language Model Meta AI&#xff09;是由Meta&#xff08;原Facebook&#xff09;推出的一个大型语言模型系列&#xff0c;旨在通过更小的模型规模和更少的计算资源&#xff0c;实现与其他主流语言模型&#xff08;如GPT&#xff09;相媲…

Linux-TCP重传

问题描述&#xff1a; 应用系统进行切换&#xff0c;包含业务流量切换&#xff08;即TongWeb主备切换&#xff09;和MYSQL数据库主备切换。首先进行流量切换&#xff0c;然后进行数据库主备切换。切换后发现备机TongWeb上有两批次慢请求&#xff0c;第一批慢请求响应时间在133…

完成UI界面的绘制

绘制UI 接上文&#xff0c;在Order90Canvas下创建Image子物体&#xff0c;图片资源ui_fish_lv1&#xff0c;设置锚点&#xff08;CountdownPanelImg同理&#xff09;&#xff0c;命名为LvPanelImg,创建Text子物体&#xff0c;边框宽高各50&#xff0c; &#xff0c;重名为LvT…

vue结合element-ui实现列表拖拽变化位置,点击拖动图标拖动整个列表元素,使用tsx格式编写

先来看下需要实现的效果 当鼠标放在左侧图标上时&#xff0c;可以拖动整个列表元素&#xff0c;调整顺序 思路介绍 使用draggable可以设置元素可拖动&#xff0c;然后分别设置三个事件处理函数&#xff0c;监听onDragstart、onDragover、onDragend三个事件 注意&#xff1a…

线性模型到神经网络

&#x1f680; 在初始神经网络那一节&#xff08;链接如下&#xff1a;初始神经网络&#xff09;的最后&#xff0c;我们通过加大考虑的天数使得我们最后得到的模型Loss最终停留在了0.32k&#xff0c;当我们在想让模型更加准确的时候&#xff0c;是做不到的&#xff0c;因为我们…

淘宝商品评论接口技术详解及代码示例

引言 淘宝商品评论接口是电商数据分析中不可或缺的一部分&#xff0c;它可以帮助商家和消费者更好地了解商品的质量、用户满意度等信息。本文将详细介绍如何使用淘宝商品评论接口&#xff0c;并提供相应的代码示例。 淘宝商品评论接口概述 淘宝商品评论接口主要用于获取商品…

【前端开发入门】前端开发环境配置

目录 引言一、Vscode编辑器安装1. 软件下载2. 软件安装3. 插件安装 二、Nodejs环境安装及版本控制1. 安装内容2. 使用nvm安装2.1 软件下载并安装2.2 nvm基本指令2.3 nvm下载过慢导致超时解决 三、git安装及配置1. 软件下载2. 软件安装3. 基础配置 四、总结 引言 本系列教程旨在…