概述
学习目标:
制作小乌龟的GUI控制器,可以控制线速度和角速度
学习内容:
学习基于Python的GUI控制器制作
学习产出:
Python采用面向对象的方式进行编写。
在hello_topic目录下新建两个python文件,分别是turtle_control.py和window.py
turtle_control.py
主要是用来执行初始化节点和引入GUI节面
window.py
主要是用来存放GUI编写的内容
先讲一下window.py
在图中我们有两个输入框和一个发送框,首先我们要引入pyqt5包
这里是基于Ubuntu20.04来进行,所以用的是Python3.8
安装pyqt5
pip3 install pyqt5
引入pyqt5的三个Qt包
window.py代码部分(一)
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
因为包含ros的信息,所以还要引入rospy
import rospy
接下来开始编写类,一些详细的东西请看注释:
class MainWindow(QWidget):
def __init__(self):
# 我们调用了QWidget,子类需要继承父类
super(MainWindow, self).__init__()
# 设置窗口名称
self.setWindowTitle("小乌龟控制")
# 设置窗口大小
self.resize(400, 80)
# 设置布局,这里采用的是Form形式
layout = QFormLayout()
# 把布局加载进窗口
self.setLayout(layout)
# 添加输入框和按钮
self.le_linear = QLineEdit()
self.le_angular = QLineEdit()
btn1 = QPushButton("发送")
# 把输入框和按钮固定到窗口布局里
layout.addRow("线速度", self.le_linear)
layout.addRow("角速度", self.le_angular)
layout.addRow(btn1)
# 添加按钮按下的链接,因为我们要将输入的数据发送出去
btn1.clicked.connect(self.btn1_clicked)
因为我们要发布数据,所以需要制作Pbulisher,需要添加我们的节点信息
# 添加节点
topic_name = "/turtle1/cmd_vel"
self.publisher = rospy.Publisher(topic_name, Twist, queue_size=100)
PS.节点信息的详解(如何得到)
这里的topic_name是根据小乌龟的控制节点名称来的,打开终端,输入
rosrun turtlesim turtlesim_node
再输入
rosnode info /turtlesim
从里面的Subscriptions里可以看到对应的topic_name
* /turtle1/cmd_vel
节点的data类型可以这样查看
rostopic type /turtle1/cmd_vel
可以得到如下信息
geometry_msgs/Twist
说明消息的类型是Twist,从geometry_msgs.msg中可以import进来。
window.py代码部分(二)
from geometry_msgs.msg import Twist
然后我们还要定义先前btn1.clicked.connect里self.btn1_clicked的内容
def btn1_clicked(self):
# 获取输入框中的数据
linear = float(self.le_linear.text())
angular = float(self.le_angular.text())
# 调用data的类型 Twist
twist = Twist()
# Twist里面有linear和angular 自己TAB一下就能出来了
twist.linear.x = linear
twist.angular.z = angular
# 最后需要通过publisher发送出去
self.publisher.publish(twist)
完整window.py代码
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import rospy
from geometry_msgs.msg import Twist
# geometry_msgs/Twist
class MainWindow(QWidget):
def __init__(self):
super(MainWindow, self).__init__()
self.setWindowTitle("小乌龟控制")
self.resize(400, 80)
# 设置布局
layout = QFormLayout()
self.setLayout(layout)
# 添加输入框和按钮
self.le_linear = QLineEdit()
self.le_angular = QLineEdit()
btn1 = QPushButton("发送")
layout.addRow("线速度", self.le_linear)
layout.addRow("角速度", self.le_angular)
layout.addRow(btn1)
btn1.clicked.connect(self.btn1_clicked)
# 添加节点
topic_name = "/turtle1/cmd_vel"
self.publisher = rospy.Publisher(topic_name, Twist, queue_size=100)
def btn1_clicked(self):
linear = float(self.le_linear.text())
angular = float(self.le_angular.text())
twist = Twist()
twist.linear.x = linear
twist.angular.z = angular
self.publisher.publish(twist)
接下来我们来讲一下turtle_control.py的部分,这一部分就比较简单
turtle_control.py代码部分
#!/usr/bin/env python3.8
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys
from window import MainWindow
import rospy
其中的 !/usr/bin/env python3.8 是让系统知道我们这是python文件而不是脚本文件
注:Ubuntu20.04默认的python版本是3.8
# 主函数
if __name__ == '__main__':
# 初始化节点
rospy.init_node("turtle_controller")
# 设置QApplication 这样才会导入系统内部
app = QApplication(sys.argv)
# 设置窗口,是由window.py中的Mainwindow来指定的
window = MainWindow()
# 展示窗口
window.show()
# 系统运行和退出
sys.exit(app.exec_())
完整turtle_control.py代码
#!/usr/bin/env python3.8
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys
from window import MainWindow
import rospy
if __name__ == '__main__':
rospy.init_node("turtle_controller")
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
最后
以上就是谨慎樱桃为你收集整理的ROS GUI控制小乌龟学习目标:学习内容:学习产出:的全部内容,希望文章能够帮你解决ROS GUI控制小乌龟学习目标:学习内容:学习产出:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复