ros学习心得(十)topic通信-ros和Qt主线程

本文探讨了在ROS和Qt结合的代码中,如何处理主线程的优先级问题。当ROS节点订阅消息与Qt界面更新同时在主线程进行时,可能出现消息处理延迟和界面卡顿。通过创建Qt自定义的刷新定时器,可以避免这种情况,确保Qt界面的流畅更新,并防止Qt阻塞ROS消息的接收。关键在于理解和分离两者的执行逻辑,实现异步处理,以保证系统的稳定运行。
摘要由CSDN通过智能技术生成

 

在一些案例中,我们代码主要是ROS和Qt的结合,Qt是图形化,在所有的编程和现实中基本上,我们都是在主线程中运行的,主线程的优先级是最高的,主线程的含义是我们看不到的代码部分,我们称之为UI的渲染(死循环),ros中节点启动没有做太多的事情,但是如果ros具备了消息订阅功能,即以下这类代码:

rospy.Subscriber(pose_topic_name,Pose,self.pose_callback)

他就会接收消息,这个ros的那个节点就会创建一个消息接受的容器,默认的时候是在主线程,        qt是在主线程接收,ros也是在主线程接收,而且都是死循环,可能会存在ros的消息收不到,       Qt的界面卡住了,消息收不到。但在python代码中不会出现,pyqt相当于是调用qt的C++,而且qyqt用的是异步的,所以两者之间不会有冲突。

其中要知道的是Qt是可以卡ros的,处理思路是将ros与Qt整合

接管渲染:(QT创建自己的刷新定时器)

#QT创建自己的刷新定时器(self是之前定义的窗口)
updateTimer = QTimer(self)
#设置定时器频率(16毫秒刷新一次,1000除以16大该是一秒刷新60次,即60帧)
updateTimer.setInterval(16)
#启动timer
updateTime.start()
#监听timer事件
update.timeout.connect(self.onUpdate)

渲染逻辑:

def onUpdate(self):
    #手动渲染 在命令行中(按下CTRL键)   
    self.update()
    if rospy.is_shutdown():
    #关闭了
    #需要关闭UI窗口
        self.close()

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值