基于PyQt5的ROS移动机器人的人机交互UI界面

 

百度云链接失效了,上传了github:https://github.com/1508912767/ros_car 和https://github.com/1508912767/ros_car_py


每次做实验的时候,手动rosrun,roslaunch太过麻烦,通过 ui界面的话,只需要点点按钮就可以啦

ros_car_py包括运动,建图,导航,ui界面的程序全部打包上传,相互依赖关系见ros_car_py包。

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import os
import paramiko


# 控制小车运动,启动服务器线程
class WorkThread(QThread):
    """
    使用 pyqtsignalo函数创建信号时,信号可以传递多个参数,并指定信号传递参
    数的类型,参数类型是标准的 Python数据类型(字符串、日期、布尔类型、数字、
    列表、元组和字典)
    """
    # 写在这里是有讲究的,类外也用到了这个trigger
    trigger = pyqtSignal()

    def __int__(self):
        super(WorkThread, self).__init__()

    def run(self):
        os.system(
            "gnome-terminal -x bash -c 'source ~/catkin_ws/devel/setup.bash; roslaunch ros_car_py car_running.launch'"
        )
        # 循环完毕后发出信号
        self.trigger.emit()


# 使用ssh连接板子,启动客户端线程
class WorkThreadA(QThread):
    trigger = pyqtSignal()

    def __int__(self):
        super(WorkThreadA, self).__init__()
        self.hostname = "192.168.7.2"
        self.port = 22
        self.username = "root"
        self.password = ""
        self.execmd = "python"

    def run(self):
        s = paramiko.SSHClient()
        s.set_missing_host_key_policy(paramiko.AutoAddPolicy())

        s.connect(hostname=self.hostname, port=self.port, username=self.username, password=self.password)
        stdin, stdout, stderr = s.exec_command(self.execmd)
        stdin.write("Y")  # Generally speaking, the first connection, need a simple interaction.
        # print(stdout.read())
        s.close()
        # 循环完毕后发出信号
        self.trigger.emit()

# 启动建图线程
class WorkThreadB(QThread):
    trigger = pyqtSignal()

    def __int__(self):
        super(WorkThreadB, self).__init__()

    def run(self):
        os.system(
            "gnome-terminal -x bash -c 'source ~/catkin_ws/devel/setup.bash; roslaunch ros_car_py car_gmapping.launch'"
        )
        # 循环完毕后发出信号
        self.trigger.emit()

# 启动导航线程
class WorkThreadC(QThread):
    trigger = pyqtSignal()

    def __int__(self):
        super(WorkThreadC, self).__init__()

    def run(self):
        os.system(
           "gnome-terminal -x bash -c 'source ~/catkin_ws/devel/setup.bash; roslaunch ros_car_py car_navigation.launch'"
        )
        # 循环完毕后发出信号
        self.trigger.emit()

# 显示小车状态,速度信息窗口
class ThirdWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("小车的速度状态")
        self.resize(600, 300)
        self.center()

        # 实例化指针
        self.pointer = QPixmap()     
### 使用 PyQtROS 开发移动机器人 #### 集成PyQtROS环境 为了实现图形界面控制移动机器人,在ROS2环境中可以利用Python Qt绑定库(PyQt)。这允许创建直观的用户交互界面来操作基于ROS节点构建的服务或话题。由于直接在ROS2环境下开发被建议[^1],因此应确保所使用的PyQt版本兼容于当前的操作系统以及Python解释器。 #### 创建简单的PyQt应用连接至ROS服务 下面是一个简化例子展示怎样通过PyQt按钮触发调用ROS中的`/move_base/cancel_goal`服务取消导航目标: ```python import sys from PySide6.QtWidgets import QApplication, QPushButton # 或者使用 PyQt5 / PyQt6 import rclpy from rclpy.node import Node from actionlib_msgs.msg import GoalID from std_srvs.srv import Empty class CancelGoalClient(Node): def __init__(self): super().__init__('cancel_goal_client') self.client = self.create_client(Empty, '/move_base/cancel_goal') async def send_request(self): while not self.client.wait_for_service(timeout_sec=1.0): self.get_logger().info('service not available, waiting again...') future = self.client.call_async(Empty.Request()) await future.result() def cancel_goal(): global node loop.run_until_complete(node.send_request()) app = QApplication(sys.argv) node = CancelGoalClient() button = QPushButton("Cancel Goal") loop = asyncio.get_event_loop() button.clicked.connect(cancel_goal) button.show() sys.exit(app.exec_()) ``` 这段代码展示了如何建立一个基本的应用程序框架,其中包含了一个用于发送请求给指定ROS服务的异步方法。需要注意的是这里采用了`PySide6`作为GUI库;如果偏好其他变体如`PyQt5`或`PyQt6`也可以相应调整导入语句[^2]。 #### 关联资源和进一步探索 对于更深入的学习,可以从官方文档获取更多有关ROS集成外部软件的信息,并参考特定主题的教学材料。虽然提供的链接主要针对ROS1版本的内容[^3],但许多概念仍然适用,特别是当涉及到通用编程实践时。此外,实际项目可能还需要考虑Gazebo仿真平台下的测试场景配置[^4]。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值