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

ROS2 节点类中要避免While true 循环

在写ros2节点类中的成员函数时,有时候我们需要使用死循环如while true,但是这样会阻塞节点正常运行,如以下代码中如果不屏蔽while true 片段,那么节点将不会收到所订阅话题中的消息,也不会触发订阅回调函数,表现出明显的阻塞状态,但是将while true片段屏蔽后节点就可以正常运行,正确接收订阅话题中的消息,正确进入接收话题回调函数。

# 导入ros2的相关库
import rclpy
from rclpy.node import Node
from geometry_msgs.msg import Twist
from std_msgs.msg import String# 导入公共库
import sys
import os
import time
import math
import numpy as np# 导入python串口库
import serial
import serial.tools.list_ports
print("import done")class uartHelper(Node):def __init__(self,name):super().__init__(name)# 创建订阅者并绑定接收回调函数self.sub = self.create_subscription(Twist,"/cmd_vel",self.sub_callback,1)print("List of enabled UART:")os.system('ls /dev/tty[a-ZA-Z]*')uart_dev = input("请输出需要测试的川口设备名称:")   baudrate = input("请输入波特率(9600,19200,38400,57600,115200,921600):")try:self.ser = serial.Serial(uart_dev, int(baudrate), timeout=1) # 1s timeoutexcept Exception as e:print("open serial failed!\n")print("open seril success: ")print(self.ser)print("\n")#while True:#  print("Running uart3 now! Press CTRL+C ot exit \n")#  time.sleep(2)def sub_callback(self,msg_data):if not isinstance(msg_data,Twist): returnsend_data = "angular:"+str(msg_data.angular.z) + ";" + "linear:" + str(msg_data.linear.x)write_num = self.ser.wirte(send_data.encode('UTF-8'))print("Sending: ",send_data)def main(args=None):rclpy.init()uart_helper = uartHelper("uart_velctrl")rclpy.spin(uart_helper)uart_helper.destroy_node()rclpy.shutdown()

如果节点类程序中必须使用while true死循环函数,需在单独线程中开辟运行,避免阻塞ROS2的事件处理。

import rclpy
from rclpy.node import Node
import threadingclass MyNode(Node):def __init__(self):super().__init__('my_node')self.counter = 0# 启动单独线程运行循环threading.Thread(target=self.loop_thread, daemon=True).start()def loop_thread(self):"""在子线程中运行 while True 循环"""while True:self.get_logger().info(f"Thread Counter: {self.counter}")self.counter += 1self.sleep(1.0)  # 必须使用 ROS2 的 sleep,避免阻塞def main(args=None):rclpy.init(args=args)node = MyNode()rclpy.spin(node)rclpy.shutdown()

http://www.lqws.cn/news/161119.html

相关文章:

  • Spring AI(11)——SSE传输的MCP服务端
  • 拷贝构造函数
  • (头歌作业)-6.5 幻方(project)
  • 在使用一些不用驱动大电流的设备就可以用stm32的自己的上下拉但是本身上下拉不就是给iicspi这些他通信给信号的吗中怎么还跟驱动能力扯上了有什么场景嘛
  • ProfiNet 分布式 IO 在某污水处理厂的应用
  • 自定义注解facade 实现切面 进行日志记录和参数校验
  • 智能标志桩图像监测装置如何守护地下电缆安全
  • html-pre标签
  • LeetCode 461.汉明距离
  • Spring MVC 之 异常处理
  • 简化复杂系统的优雅之道:深入解析 Java 外观模式
  • 数字证书_CA_详解
  • 2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
  • 二叉树的遍历总结
  • jdbc查询mysql数据库时,出现id顺序错误的情况
  • C:\Users\中文名修改为英文名
  • delphi7 链表 使用方法
  • 性能优化之SSR、SSG
  • 【前端】vue3性能优化方案
  • sourcetree取消待推送
  • 《计算机是怎么跑起来的》第二章读后感
  • 算法题(162):火烧赤壁
  • 13.4 AI颠覆语言学习:预录制视频+GPT-4评估如何实现60%成本降低与40%留存飙升
  • Seata 分布式事务 AT 模式
  • 智慧供水运维管理系统
  • LeetCode 70 爬楼梯(Java)
  • 探索未知惊喜,盲盒抽卡机小程序系统开发新启航
  • 半监督学习:低密度分离假设 (Low-Density Separation Assumption)
  • mysql密码正确SpringBoot和Datagrip却连接不上
  • c++第七天--特殊运算符的重载练习