面向对象Python实现Qt

Node创建

1. python环境配置

为clion添加python2的支持,具体可以参考前面的讲解

在新建的py文件开头添加环境说明:

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

修改新建py文件的权限,添加可执行权限

1
chmod +x turtle_control.py

2. node源码编写

1
2
3
4
5
6
import rospy

if __name__ == '__main__':
    nodeName = "qt_turle_ctrl";
    # 创建ros node
    rospy.init_node(nodeName, anonymous=True)

Qt UI的创建

1. 窗体继承

1
2
3
class MainWindow1(QWidget):
    def __init__(self):
        super(MainWindow1, self).__init__()

2. 编写UI

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 设置title
self.setWindowTitle("小乌龟控制")
self.resize(400, 120)
# 设置布局
layout = QFormLayout()
self.setLayout(layout)
# 添加控件
self.editLinear = QLineEdit("0")
layout.addRow("线速度", self.editLinear)
self.editAngular = QLineEdit("0")
layout.addRow("角速度", self.editAngular)

self.btnSend = QPushButton("发送")
layout.addRow(self.btnSend)

3. 事件添加

1
2
3
4
5
# 添加事件
self.btnSend.clicked.connect(self.clickSend)

def clickSend(self):
    pass

4. Publisher整合

1
2
3
# 创建publisher
topicName = "/turtle1/cmd_vel"
self.publisher = rospy.Publisher(topicName, Twist, queue_size=1000)

5. 发送消息

1
2
3
4
5
6
7
# 创建消息
twist = Twist()
# 填充数据
twist.linear.x = linearX
twist.angular.z = angluarZ * math.pi / 180
# 发送消息
publisher.publish(twist)

完整示例代码

MainWindow1.py

turtle_ctrl1.py