我是靠谱客的博主 谨慎樱桃,最近开发中收集的这篇文章主要介绍ROS GUI控制小乌龟学习目标:学习内容:学习产出:,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

学习目标:

制作小乌龟的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控制小乌龟学习目标:学习内容:学习产出:所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部