如何在代码中启动与关闭ROS节点

news2024/11/25 18:48:23

在ROS开发中,节点的管理是很重要的一部分,其中有一些节点大部分时候用不到,只会在特定情况下被启动(比如建图节点)同时这些节点在使用完后还需要被关闭,因此我们就需要在程序中对这些节点进行启动与关闭的管理。

在python中,针对这个问题ROS中可以使用roslaunch功能包解决这个问题。通过简单的几行代码就可以实现具体功能:

uuid = roslaunch.rlutil.get_or_generate_uuid(None, False)
roslaunch.configure_logging(uuid)
launch = roslaunch.parent.ROSLaunchParent(uuid, [launch_file])
launch.start()

我们可以通过一个简单的测试程序来看看这个代码是如何使用的:
首先,我们建立两个简单的节点node1.py与node2.py:

node1.py:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import math
import sagepy
import rospy
import copy

if __name__ == '__main__':
    rospy.init_node('node1')
    rospy.sleep(3)
    while not rospy.is_shutdown():
        print("node1")
        rospy.sleep(3)

node2.py:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import math
import sagepy
import rospy
import copy

if __name__ == '__main__':
    rospy.init_node('node2')
    rospy.sleep(3)
    while not rospy.is_shutdown():
        print("node2")
        rospy.sleep(3)
        pintt(node[2])

同时建立两个launch文件:

node1.launch:

<launch>
    <node pkg="rosnodekill" type="node1.py" name="node1" output="screen" respawn="true"/>
</launch>

node2.launch:

<launch>
    <node pkg="rosnodekill" type="node2.py" name="node2" output="screen" respawn="true"/>
</launch>

最后建立一个主函数:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import rospy
import os
import subprocess
import time
import roslaunch
from rosnodekill.srv import data
launch = None
file_to_launch = None

def switch_node_callback(msg):
    global file_to_launch
    file_to_launch = msg.data
    print("file_to_launch:"+file_to_launch)
    return

if __name__ == '__main__':
    rospy.init_node('get_robotid_db_server')
    rospy.loginfo(rospy.get_name()+" started!")
    get_map_pose_server = rospy.Service('switch_node', data, switch_node_callback)
    # main
    while not rospy.is_shutdown():   
        print('debug')
        if file_to_launch is not None:
            print(file_to_launch)
            launch_file = '/home/computer_name/addtxt/src/rosnodekill/launch/'+file_to_launch
            if launch is not None:
                launch.shutdown()
            uuid = roslaunch.rlutil.get_or_generate_uuid(None, False)
            roslaunch.configure_logging(uuid)
            launch = roslaunch.parent.ROSLaunchParent(uuid, [launch_file])
            launch.start()
            file_to_launch = None
            rospy.sleep(1)
        rospy.sleep(1)

简单看一下这个主函数,它可以分为两个部分:一个是回调函数接受来自外部给定的launch文件名称,一个是节点管理负责启动与关闭当前launch文件的节点。启动这个程序时,终端显示如下:
在这里插入图片描述
此时代表主程序已经开启,同时程序一直在执行while循环。此时新开一个终端,调用switch_node服务传入一个文件名:

rosservice call /switch_node "data: 'node1.launch'"

则主程序会响应该请求并打开node1.launch文件:
在这里插入图片描述根据这个我们可以看出node1已经被执行,主程序中开启了我们需要的节点。然后我们再次请求switch_node将节点进行切换到node2.launch:

rosservice call /switch_node "data: 'node2.launch'"

此时终端显示如下:
在这里插入图片描述
可以看到原来的node1被关闭后,node2被开启。如此,则完成了两个节点间的切换。

另外注意到一个问题:在前面的两个launch文件中,都加了respawn="true"选项,该选项的作用是当节点被关闭时会重新开启。但是在这里它的优先级是低于launch节点程序的。因为node1被关闭后并没有重启。所以launch管理相当于是关闭了这个launch问不是这个节点。

但同时,如果这个节点不是被launch.shutdown()的话,它是可以被重启的,例如在node2中,故意最后多加了个打印输出,该输出是异常输出会导致节点崩溃,但是崩溃后我们可以看到该节点是会再次重启的:
在这里插入图片描述如果这里不加respawn="true"的话则是不会重启的,所以最好在写launch文件的时候加一下。

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

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

相关文章

“GIF转PNG轻松转换,图片批量处理神器,提升你的图像管理效率!“

你是否曾经为转换GIF格式到PNG格式而感到困扰&#xff1f;或者为处理大量图片而感到烦恼&#xff1f;现在&#xff0c;我们为你推荐一款全新的GIF到PNG转换工具&#xff0c;以及一款图片批量处理工具&#xff0c;让你的图像管理工作变得轻松愉快&#xff01; 首先&#xff0c;…

通过分析波形,透彻理解 UART 通信

UART是一种异步全双工串行通信协议&#xff0c;由 Tx 和 Rx 两根数据线组成&#xff0c;因为没有参考时钟信号&#xff0c;所以通信的双方必须约定串口波特率、数据位宽、奇偶校验位、停止位等配置参数&#xff0c;从而按照相同的速率进行通信。 异步通信以一个字符为传输单位…

「媒体邀约」三农,农业类媒体资源有哪些?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 农业在我国国民经济中的地位是基础&#xff0c;农业是国民经济建设和发展的基础产业&#xff0c;因此围绕三农发展有很多的公司和企业&#xff0c;每年全国都有大大小小关于农业的展览&a…

C/C++内存管理(含C++中new和delete的使用)

文章目录 C/C内存管理&#xff08;含C中new和delete的使用&#xff09;1、C/C内存分布2、C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free3、C动态内存管理3.1、new/delete操作内置类型3.2、new/delete操作自定义类型 4、operator new与operator delete函数5、…

天眼销:B端销冠的私藏宝藏!

在B端销售的业务场景下&#xff0c;获取客户的联系方式是绕不开的一个话题&#xff0c;并且也有很多销售有自己的经验。 怎么去获取企业客户呢&#xff1f;你肯定想我得找到企业基本的信息还有联系方式&#xff0c;这时候你可能会想到去知名的查查平台。然后你会发现&#xff…

tomcat调优配置

一. 设置账户进入管理页面 通过浏览器进入Tomcat7的管理模块页面&#xff1a;http://localhost:8080/manager/status 按照提示&#xff0c;在Tomcat7服务器指定的位置修改配置文件&#xff08;conf/tomcat-users.xml&#xff09;&#xff0c;增加相应的用户和角色配置标签 <…

亲子开衫外套 I 真的好温柔好有气质

分享适合宝宝和麻麻 一起穿的开衫外套 包芯纱拼貂毛 软糯亲肤不扎人 上身体验感非常不错 这种面料还不易起球 质感满满&#xff0c;单穿内搭都可&#xff01;

SRGAN 使用指南:将低分辨率图像转换为高分辨率图像

SRGAN、ESRGAN、Real-ESRGAN 使用指南 SRGAN网络结构优化目标 ESRGANReal-ESRGAN SRGAN 超分辨率&#xff1a;从低分辨率(LR)图像来估计其对应高分辨率(HR)图像的任务&#xff0c;被称作超分辨率(SR)。 SRGAN 图像超分辨率的深度学习模型&#xff0c;通过生成对抗网络&#x…

如何保证缓存和数据库的双写一致性?

一、什么是数据库和缓存双写一致性&#xff1f; 在分布式系统中&#xff0c;数据库和缓存会搭配一起使用&#xff0c;以此来保证程序的整体查询性能。也就说&#xff0c;分布式系统为了缓解数据库查询的压力&#xff0c;会将查出来的数据保存在缓存中&#xff0c;下次再查询时…

【送书活动二期】Java和MySQL数据库中关于小数的保存问题

之前总结过一篇文章mysql数据库&#xff1a;decimal类型与decimal长度用法详解&#xff0c;主要是个人学习期间遇到的mysql中关于decimal字段的详解&#xff0c;最近在群里遇到一个小伙伴提出的问题&#xff0c;也有部分涉及&#xff0c;今天就再大致总结一下Java和MySQL数据库…

SpringCloudAlibaba之Nacos——详细讲解

目录 一、SpringCloudAlibaba简介 1. spring cloud alibaba 特点 2.springcloud 组件 二、环境搭建 1.构建项目并引入依赖 三、Nacos 1.什么是Nacos 2.安装Nacos 3.启动安装服务 4.访问nacos的web服务管理界面 四、开发服务注册到nacos 1.创建项目并引入依赖 2.配置注册地…

idea 导入外部包 打包失败

一、在项目中引入jar包 二、pom文件添加 引入外部包 <!--应用第三方包监听文件--><dependency><groupId>jnotify</groupId><artifactId>jnotify</artifactId><version>0.94.0</version><scope>system</scope><…

LDF文件之LDF Explorer工具

LDF Explorer工具 LDF文件比较像DBC文件&#xff0c;也是用来解析报文的&#xff0c;DBC文件是用在CAN通讯上的&#xff0c;LDF文件是用在LIN通讯上的。 我们可以用vector自带的工具LDF Explorer打开LDF文件&#xff0c;这个工具是最标准的&#xff0c;有些同学自己做了一个L…

西工大网络空间安全学院计算机系统基础实验零

首先&#xff0c;下载VMware17 Pro workstation。为什么要下载VMware17 Pro workstation呢&#xff1f;因为计算机系统基础实验有四个大部分&#xff1a;利用位运算实现诸如a*b&#xff0c;a/b&#xff0c;a*(2^4)等运算&#xff1b;C语言循环语句、switch语句等语句与汇编代码…

Linux基本指令总结(二)

1.man指令&#xff08;重要&#xff09; Linux的命令有很多参数&#xff0c;我们不可能全记住&#xff0c;我们可以通过查看联机手册获取帮助。访问Linux手册页的命令是 man 语法: man [选项] 命令 man指令就相当于一个精通linux的专家&#xff0c;你要查询的指令或者函数&…

正式版PS 2024 25新增功能 刚刚发布的虎标正式版

Adobe Photoshop 2024是一款业界领先的图像编辑软件&#xff0c;被广泛应用于设计、摄影、插图等领域。以下是这款软件的一些主要功能和特点&#xff1a; 丰富的工具和功能。Adobe Photoshop 2024提供了丰富的工具和功能&#xff0c;可以帮助用户对图像进行编辑、修饰和优化。…

嵌入式Linux学习(2)——经典CAN介绍(上)

目录 一. CAN与ISO-OSI Model 二. CAN通信 2.1 接线方式 2.1.1 闭环网络 2.1.2 开环网络 2.2 收发流程 2.2.1 发送 2.2.2 接收 三. CAN BUS访问与仲裁 3.1 “线与”机制​ 3.2 仲裁机制 REF CAN&#xff08;Controller Area Network&#xff09;总线协议是由 BOSC…

2024年湖北建筑企业申报助理工程师初级职称评审纸质版证书

2024年湖北建筑企业申报助理工程师初级职称评审纸质版证书 湖北省在2022年就发布了一个相关职称实行电子版文件&#xff0c;很多人就理所当然认为工程行业纸质版初级职称/助理工程师、中级职称有些局限。申报评审成功是否可以使用&#xff0c;怎么查询之类的一系列问题&#x…

C++算法入门练习——数据流第K大元素

现有一个初始为空的序列S&#xff0c;对其执行n个操作&#xff0c;每个操作是以下两种操作之一&#xff1a; 往序列S中加入一个正整数x&#xff1b;输出当前序列S​中第k​大的数。 其中&#xff0c;第k大是指将序列从大到小排序后的第k个数。 利用stl里的priority_queue自动…

【工具使用】Keil常用的调试操作整理介绍

目录 一、软件调试使用 1.1 基本调试操作 1.2 调试窗口 二、注意事项 一、软件调试使用 1.1 基本调试操作 上文已经说过在线调试和模拟调试的配置过程&#xff0c;但无论是在线还是模拟调试&#xff0c;调试技巧工具的使用都是一样的。 点击红色d&#xff0c;进入调试 可…