在一些案例中,我们代码主要是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()