基于ROS的语音控制机器人(二):上位机的实现

2023-05-16

文章目录

目录

文章目录

前言

一、准备工作

1.python工作环境

2.ros环境

3.QT designer

二、界面程序设计

1.界面设计

2.ui文件转py文件

 三、上位机程序编写

1.具体思路

2.具体实现

3.遇到的问题

(1)花屏问题

(2)rospy.spin()问题

 四、运行结果

 1.打开摄像头

2.打开人脸识别 

 3.打开语音控制

4.打开键盘控制

 5.上位机控制

结语



前言

本文在基本功能实现的基础上,基于PyQT5编写了一个用来控制ros机器人的上位机

源码分享:https://gitee.com/sy_run/myroscar


提示:以下是本篇文章正文内容,下面案例可供参考

一、准备工作

1.python工作环境

本文选择的python环境为pycharm2021,安装教程在这里不再多说

所需要的核心库有PyQt5,rospy和opencv

2.ros环境

由于换了新电脑,安装了ubuntu20.04的版本,因此ros的版本更换为了noetic,但具体程序并没有太大变化。

3.QT designer

安装QT designer可以方便我们更好的设计界面,具体安装流程不在多说

二、界面程序设计

1.界面设计

打开QT designer,选择mainwindow,然后通过想要的控件,设计一个自己喜欢的界面即可,本文

设计的界面如下所示:

具有8个按钮和一个QLabel控件,点击保存即可生成ui文件。

2.ui文件转py文件

通过pyqt5自带的pyuic能够将ui文件转换成py文件,具体方式如下

(1)将ui文件导入至pycharm之后,然后点击文件->设置

选择工具->外部工具

(2)名称输入pyuic,然后程序输入python3,因为ros-noetic是通过python3运行python程序,如果是ros-kinetic版本的话,这里可能需要输入python。

参数这一栏输入下面内容

-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py

工作目录输入$FileDirs即可,也就是生成的py文件和ui文件在同一目录下

(3)点击确定,在左侧项目目录中找到ui文件,右键点击ui文件,选择External Tools,点击pyuic

 此时当前目录会生成一个py文件

 返回上一级目录,新建文件夹scripts,将生成的py文件移动到该目录下,具体的py文件内容如下,没有QT Designer的朋友可以直接复制下面这个代码。

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'MyRobotApp.ui'
#
# Created by: PyQt5 UI code generator 5.14.1
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(689, 529)
        MainWindow.setToolTipDuration(1)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.ButtonGo = QtWidgets.QPushButton(self.centralwidget)
        self.ButtonGo.setGeometry(QtCore.QRect(210, 350, 100, 50))
        self.ButtonGo.setObjectName("ButtonGo")
        self.ButtonLeft = QtWidgets.QPushButton(self.centralwidget)
        self.ButtonLeft.setGeometry(QtCore.QRect(110, 400, 100, 50))
        self.ButtonLeft.setObjectName("ButtonLeft")
        self.ButtonRight = QtWidgets.QPushButton(self.centralwidget)
        self.ButtonRight.setGeometry(QtCore.QRect(310, 400, 100, 50))
        self.ButtonRight.setObjectName("ButtonRight")
        self.ButtonBack = QtWidgets.QPushButton(self.centralwidget)
        self.ButtonBack.setGeometry(QtCore.QRect(210, 450, 100, 50))
        self.ButtonBack.setObjectName("ButtonBack")
        self.OpenFace = QtWidgets.QPushButton(self.centralwidget)
        self.OpenFace.setGeometry(QtCore.QRect(550, 100, 100, 50))
        self.OpenFace.setObjectName("OpenFace")
        self.OpenVoice = QtWidgets.QPushButton(self.centralwidget)
        self.OpenVoice.setGeometry(QtCore.QRect(550, 180, 100, 50))
        self.OpenVoice.setObjectName("OpenVoice")
        self.OpenKey = QtWidgets.QPushButton(self.centralwidget)
        self.OpenKey.setGeometry(QtCore.QRect(550, 260, 100, 50))
        self.OpenKey.setObjectName("OpenKey")
        self.OpenCamera = QtWidgets.QPushButton(self.centralwidget)
        self.OpenCamera.setGeometry(QtCore.QRect(550, 20, 100, 50))
        self.OpenCamera.setObjectName("OpenCamera")
        self.VeidoLabel = QtWidgets.QLabel(self.centralwidget)
        self.VeidoLabel.setGeometry(QtCore.QRect(20, 20, 480, 320))
        self.VeidoLabel.setText("摄像头未打开!")
        self.VeidoLabel.setWordWrap(False)
        self.VeidoLabel.setObjectName("VeidoLabel")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        self.retranslateUi(MainWindow)


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "My RobotCar"))
        self.ButtonGo.setText(_translate("MainWindow", "前进"))
        self.ButtonLeft.setText(_translate("MainWindow", "左转"))
        self.ButtonRight.setText(_translate("MainWindow", "右转"))
        self.ButtonBack.setText(_translate("MainWindow", "后退"))
        self.OpenFace.setText(_translate("MainWindow", "打开人脸识别"))
        self.OpenVoice.setText(_translate("MainWindow", "打开语音控制"))
        self.OpenKey.setText(_translate("MainWindow", "打开键盘控制"))
        self.OpenCamera.setText(_translate("MainWindow", "打开摄像头"))

 三、上位机程序编写

新建app.py文件,准备开始编写上位机。

1.具体思路

        上一篇内容提到过,pc和树莓派之间的通讯是通过发布和订阅主题实现的,因此我们可以通过按下按钮发送clicked信号,在相关联的槽去实现命令的发布即可通过上位机实现通信。

        而想要通过上位机启动按键控制和语音控制,在程序里编写是十分麻烦的,我们可以利用已经编写好的程序,利用python中os.fork()函数创建子进程,然后利用os.execl()去调用相关可执行文件,即可实现功能。

2.具体实现

#!/usr/bin/python3
import signal
import sys
import os
import rospy
import cv2
from cv_bridge import CvBridge
from sensor_msgs.msg import CompressedImage
from PyQt5 import QtCore, QtGui, QtWidgets
from std_msgs.msg import String
from MyRobotApp import Ui_MainWindow

class MyCallback(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MyCallback, self).__init__(parent)

        rospy.init_node("qtcmd")    # 初始化结点
        self.qtkeypub = rospy.Publisher("keycmd", String, queue_size=1000)      # 键盘指令发布者
        self.bridge = CvBridge()

        # 订阅压缩图像主题,提高帧率
        self.comimgsub = rospy.Subscriber("image_compressed/compressed", CompressedImage, self.compressedimagecallback)
        self.msg = String("")   # 发送的消息

        self.setupUi(self)  # 设置ui
        # 人脸模型
        self.face_cascade = cv2.CascadeClassifier(r'/usr/share/opencv4/haarcascades/haarcascade_frontalface_alt.xml')
        # 槽
        self.OpenCamera.clicked.connect(self.OpenCameraCallback)
        self.OpenFace.clicked.connect(self.OpenFaceCallback)
        self.OpenKey.clicked.connect(self.OpenKeyCallback)
        self.OpenVoice.clicked.connect(self.OpenVoiceCallback)
        self.ButtonGo.clicked.connect(self.ButtonGoCallback)
        self.ButtonLeft.clicked.connect(self.ButtonLeftCallback)
        self.ButtonBack.clicked.connect(self.ButtonBackCallback)
        self.ButtonRight.clicked.connect(self.ButtonRightCallback)
        # 声明
        self._translate = QtCore.QCoreApplication.translate
        self.compressed_image = None    # 压缩图像
        self.opencameraflag = False  # 摄像头开启标志
        self.openfaceflag = False  # 人脸识别开启标志
        self.openkeyflag = False  # 键盘开启标志
        self.openvoiceflag = False  # 语音开启标志
        self.keypid = -1  # 键盘进程号
        self.voicepubpid = -1  # 语音上报进程
        self.voicesubpid = -1  # 语音识别进程
        self.camerapid = -1  # 摄像头进程

    # 人脸识别函数
    def facedetect(self, data):
        gray = cv2.cvtColor(data, cv2.COLOR_BGR2GRAY)
        faces = self.face_cascade.detectMultiScale(
            gray,
            scaleFactor=1.15,
            minNeighbors=5,
            minSize=(5, 5),
            flags=cv2.CASCADE_SCALE_IMAGE)

        for face in faces:
            x,y,w,h = face
            # 画矩形
            cv2.rectangle(data, (x, y), (x+w, y+h), (50, 255, 50), 2)

    # QT显示图片函数
    def showimg(self, data):
        pixmap = QtGui.QImage(data, 480, 320, QtGui.QImage.Format_RGB888)
        pixmap = QtGui.QPixmap.fromImage(pixmap)
        self.VeidoLabel.setPixmap(pixmap)
        self.show()

    # ros图片主题回调函数,参数data为图片数据
    def compressedimagecallback(self, data):
        bridge = CvBridge()
        self.compressed_image = bridge.compressed_imgmsg_to_cv2(data, "bgr8")
        if self.openfaceflag:
            self.facedetect(self.compressed_image)
        self.compressed_image = cv2.cvtColor(self.compressed_image, cv2.COLOR_BGR2RGB)
        self.showimg(self.compressed_image)

    # 打开摄像头
    def OpenCameraCallback(self):       # 摄像头
        if not self.opencameraflag:     # 如果摄像头未打开
            self.opencameraflag = True  # 标志为打开
            self.OpenCamera.setText(self._translate("MainWindow", "关闭摄像头"))     # 修改按键文本
            self.msg = String("opencam")
            self.qtkeypub.publish(self.msg)     # 发布打开命令

        else:   # 如果已经打开
            self.opencameraflag = False # 标志关闭
            self.OpenCamera.setText(self._translate("MainWindow", "打开摄像头"))     # 修改文本
            self.msg = String("closecam")
            self.qtkeypub.publish(self.msg)     # 发布关闭命令
            rospy.sleep(0.5)        # 延时0.5s,否则会出现无法clear
            self.VeidoLabel.clear()     # 清屏
            self.VeidoLabel.setText("摄像头未打开!")  # 设置Qlabel文本
            self.openfaceflag = False   # 关闭人脸识别,无论是否打开
            self.OpenFace.setText(self._translate("MainWindow", "打开人脸识别"))      # 修改文本
        rospy.loginfo("send %s", self.msg)  # 发布调试信息

    # 人脸识别函数
    def OpenFaceCallback(self):
        if not self.openfaceflag:   # 如果没有打开人脸识别
            self.openfaceflag = True    # 打开
            self.OpenFace.setText(self._translate("MainWindow", "关闭人脸识别"))      # 修改文本
            if not self.opencameraflag:     # 如果没有打开摄像头
                self.opencameraflag = True  # 打开摄像头
                self.OpenCamera.setText(self._translate("MainWindow", "关闭摄像头"))  # 修改文本
                self.msg = String("opencam")
                self.qtkeypub.publish(self.msg)     # 发布打开命令
                rospy.loginfo("send %s", self.msg)  # 调试信息
        else:   # 如果已经打开
            self.openfaceflag = False   # 关闭人脸识别
            self.OpenFace.setText(self._translate("MainWindow", "打开人脸识别"))  # 修改文本

    # 键盘打开
    def OpenKeyCallback(self):      # 按键控制
        if self.openkeyflag:    # 如果键盘是打开的,则关闭键盘
            self.openkeyflag = False
            self.OpenKey.setText(self._translate("MainWindow", "打开键盘控制"))
            self.msg = String("openkey")
            if self.keypid > 0:      # 键盘控制父进程
                os.kill(self.keypid, signal.SIGKILL)    # 杀死子进程
                os.wait()
        else:
            self.openkeyflag = True
            self.OpenKey.setText(self._translate("MainWindow", "关闭键盘控制"))
            self.msg = String("closekey")
            self.keypid = os.fork()     # 创建子进程
            if self.keypid == 0:    # 键盘控制子进程
                os.execl('/opt/ros/noetic/bin/rosrun', 'rosrun', 'myrobot', 'keycontrol')
        rospy.loginfo("send %s", self.msg)

    # 语音控制
    def OpenVoiceCallback(self):
        if self.openvoiceflag:  # 如果语音已经打开,则关闭
            self.openvoiceflag = False
            self.OpenVoice.setText(self._translate("MainWindow", "打开语音控制"))
            self.msg = String("openvoice")

            if self.voicepubpid > 0:  # 父进程
                os.kill(self.voicepubpid, signal.SIGKILL)
                os.wait()

            if self.voicesubpid > 0:  # 父进程
                os.kill(self.voicesubpid, signal.SIGKILL)
                os.wait()
        else:
            self.openvoiceflag = True
            self.OpenVoice.setText(self._translate("MainWindow", "关闭语音控制"))
            self.msg = String("closevoice")
            self.voicepubpid = os.fork()    # 创建子进程发布语音命令
            self.voicesubpid = os.fork()    # 创建子进程接受语音命令
            if self.voicepubpid == 0:
                os.execl('/opt/ros/noetic/bin/rosrun', 'rosrun', 'myrobot', 'voicepub')     # 打开语音识别

            if self.voicesubpid == 0:
                os.execl('/opt/ros/noetic/bin/rosrun', 'rosrun', 'myrobot', 'voicesub')     # 打开命令接收

        rospy.loginfo("send %s", self.msg)

    # 前进
    def ButtonGoCallback(self):
        self.msg = String("go")
        self.qtkeypub.publish(self.msg)
        rospy.loginfo("send %s", self.msg)

    # 后退
    def ButtonBackCallback(self):
        self.msg = String("back")
        self.qtkeypub.publish(self.msg)
        rospy.loginfo("send %s", self.msg)

    # 左转
    def ButtonLeftCallback(self):
        self.msg = String("left")
        self.qtkeypub.publish(self.msg)
        rospy.loginfo("send %s", self.msg)

    # 右转
    def ButtonRightCallback(self):
        self.msg = String("right")
        self.qtkeypub.publish(self.msg)
        rospy.loginfo("send %s", self.msg)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    ui = MyCallback()
    ui.show()
    sys.exit(app.exec_())

3.遇到的问题

(1)花屏问题

QT上位机在接收图片时,产生了花屏现象,在请教了大佬之后,得到问题的根源,我得到的图片是640x480的,而我设置QtGui.QImage的大小确为480x320,小于我的图片。解决方法就是显示的大小得到的图片大小应当和QT设置显示的大小保持一致。

(2)rospy.spin()问题

在程序中加入rospy.spin()函数会导致QT界面黑屏,推测可能是一直进入回调函数中,无法显示qt界面,删除该句即可。

 四、运行结果

 1.打开摄像头

2.打开人脸识别 

 3.打开语音控制

4.打开键盘控制

 5.上位机控制


结语

qt的学习还是比较有意思的,也是我第一次设计上位机,这必须得记录下来。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于ROS的语音控制机器人(二):上位机的实现 的相关文章

  • ROS:开机自启动

    Ubuntu14 04 网上很多资料说在 etc rc local中添加脚本 实验之后完全没用 可能是系统版本不对 解决 Ubuntu14 04 开机项命令 gnome session properties 点击 add name 名字 c
  • Python 实现 Dijkstar 路径规划算法

    Dijstar 最短路径算法 用于计算起始点到最终点的最短路径 一般采用的是贪心算法策略 原理可以参考 图解 Open list 和 close list 环境 Terminal 需要预先安装两个库 matplotlib 和 math pi
  • Webots小车与Gampping建图仿真与ORB3算法实践

    此篇博客转自本作者在古月居的博客 https www guyuehome com 34537 前言 在研一的时候 由于XXX项目的需要 其中一项就是需要测试Gmapping建图 自然也要求使用ROS系统 由于之前经常在webots中进行仿真
  • SLAM-hector_slam 简介与使用

    hector slam功能包使用高斯牛顿方法 不需要里程计数据 只根据激光信息便可构建地图 所以他的总体框架如下 hector slam功能包 hector slam的核心节点是hector mapping 它订阅 scan 话题以获取SL
  • ros 中ERROR: cannot download default sources list from: https://raw.githubusercontent.com/ros/rosdist

    ros 中ERROR cannot download default sources list from https raw githubusercontent com ros rosdistro master rosdep sources
  • V-REP安装

    小知识 是当前目录 是父级目录 是根目录 1 下载V REP 官网地址 http www v rep eu downloads html 我用ubuntu16 04下载V REP PRO EDU V3 5 0 Linux tar 2 解压安
  • 1-如何安装ROS

    如何安装ROS 大家好 我是如何 今天尝试在Ubantu下安装ROS Robot Operating System 测试环境 虚拟机VMware Ubantu20 04 准备步骤 添加ROS软件源 sudo sh c echo deb ht
  • Hypervisor介绍及在智能驾驶的应用

    转自Hypervisor 智能座舱和智能驾驶融合的关键技术 腾讯新闻
  • Ubuntu18.04配置Seetaface6

    目录 一 下载安装Qt软件 1 安装包下载 2 安装Qt 3 配置 二 下载源码 三 编译工具 四 编译 1 编译OpenRoleZoo 2 编译SeetaAuthorize 3 编译TenniS 五 运行 1 修改lib路径 2 buil
  • rosprofiler 安装和使用

    rosprofiler wiki 页面 http wiki ros org rosprofiler rosprofiler package 下载rosprofiler和ros statistics msgs 放到工程目录下编译 https
  • 服务数据的定义和使用

    1 自定义数据服务 在包下创建srv文件夹 在文件夹下创建Person srv 在Person srv下输入以下内容 代表数据类型 string name uint8 age uint8 sex uint8 unknown 0 uint8
  • ubuntu18.04命令安装ros2

    ROS2官方文档 本教程为apt get命令安装方式 官网教程有点问题 借鉴一下大佬的安装方式 文章目录 1 安装ROS2 1 1 安装秘钥相关指令 1 2 授权秘钥 1 3 添加ROS2软件源 1 4 安装 2 设置环境 可选但是推荐 2
  • 无法加载 LZ4 支持的 Python 扩展。 LZ4 压缩将不可用

    我是 ROS 新手 我刚刚打开终端并输入roscore和另一个终端并键入rostopic node我收到这个错误 上面写着 无法加载 LZ4 支持的 Python 扩展 LZ4 压缩将不可用 我搜索并去了https pypi org pro
  • 在 Python 3 中导入 Rosbag

    我正在尝试从 Python 3 读取 rosbag 文件 我安装了 ROS2 Eloquent Elusor 它应该支持 Python 3 当我跑步时 import rosbag bag rosbag Bag test bag 从Pytho
  • 将 CUDA 添加到 ROS 包

    我想在 ros 包中使用 cuda 有人给我一个简单的例子吗 我尝试使用 cuda 函数构建一个静态库并将该库添加到我的包中 但总是出现链接错误 未定义的引用 cuda 我已经构建了一个可执行文件而不是库并且它可以工作 请帮忙 我自己找到了
  • Caught exception in launch(see debug for traceback)

    Caught exception in launch see debug for traceback Caught exception when trying to load file of format xml Caught except
  • 在 Ubuntu 18.10 上安装 ROS Melodic

    I can t是唯一对 Cosmic 与 Wayland 和 Melodic 的组合感兴趣的人 我会坦白说 我似乎已经在 XPS 13 9370 上成功管理了此操作 或者至少安装脚本 最终 成功完成 然而 有一个非常棘手的解决方法 无论结果
  • catkin_make 编译报错 Unable to find either executable ‘empy‘ or Python module ‘em‘...

    文章目录 写在前面 一 问题描述 二 解决方法 参考链接 写在前面 自己的测试环境 Ubuntu20 04 一 问题描述 自己安装完 anaconda 后 再次执行 catkin make 遇到如下问题 CMake Error at opt
  • 在 ROS - Python 中使用来自多个主题的数据

    我能够显示来自两个主题的数据 但无法在 ROS 中实时使用和计算这两个主题的数据 用 Python 代码编写 您有想法存储这些数据并实时计算吗 谢谢 usr bin env python import rospy import string
  • 使用 CMake 链接 .s 文件

    我有一个我想使用的 c 函数 但它是用Intel编译器而不是gnu C编译器 我在用着cmake构建程序 我实际上正在使用ROS因此rosmake但基础是cmake所以我认为这更多是一个 cmake 问题而不是ROS问题 假设使用构建的文件

随机推荐

  • Android注解(annotation)介绍及其应用

    我的新书 Android App开发入门与实战 已于2020年8月由人民邮电出版社出版 xff0c 欢迎购买 点击进入详情 文章目录 介绍自定义注解注解的应用 xff1a 反射注解的应用 xff1a APT其它 介绍 Annotation
  • 源代码管理的另类比较:TortoiseGit vs SourceTree

    文章目录 源代码得管理那就Git吧图形化Git管理软件对比暗色主题图形分支与提交历史仓库与工程代码改动对比分支切换提交到多个远端仓库编码UTF8与Ansi总结 Git提供网站免费部分对比GitHubGitee华为云总结 源代码得管理 以往用
  • kali Linux使用putty远程连接输入密码一直提示错误

    使用命令打开配置文件 xff1a leafpad etc ssh sshd config 修改AddressFamily any 前面的 删除修改PermitRootLogin yes 前面的 删除 修改PasswordAuthentica
  • ros安装并测试是否安装成功

    目录 一 xff0c 安装步骤二 xff0c 测试是否安装成功 一 xff0c 安装步骤 1 xff0c 首先前4项勾选 xff0c 然后源换成国内清华的源 2 xff0c 打开终端开始输入命令 xff1a span class token
  • C++ 双冒号::符号详解

    一 作用域符号 xff1a 作用域符号 的前面一般是类名称 xff0c 后面一般是该类的成员名称 xff0c C 43 43 为例避免不同的类有名称相同的成员而采用作用域的方式进行区分 例如 xff1a A B 表示两个类 xff0c 在
  • 嵌入式软件工程师前期职业生涯规划

    ARM 43 LINUX路线 xff0c 主攻嵌入式Linux操作系统及其上应用软件开发目标 xff1a xff08 1 xff09 掌握主流嵌入式微处理器的结构与原理 xff08 初步定为arm9 xff09 xff08 2 xff09
  • 【尚医通】微信扫码登录和手机号登录冲突问题解决思路

    尚医通 微信扫码登录和手机号登录冲突问题解决思路 问题描述 最近做尚医通遇到一个问题 xff0c 微信扫码登录和手机号登录在 特殊情况 下会发生冲突 xff0c 导致无法登录的问题 下面就描述一下几种情况 正常情况 xff1a 用户第一次一
  • GitHub awesome Resource

    各种Awesome技术资源的资源聚合 xff1a https github com sindresorhus awesome Contents PlatformsProgramming LanguagesFront End Developm
  • FreeRTOS ------ 栈、堆、任务栈

    1 任务的栈资源 xff08 创建任务分配的资源 xff0c 单位是4字节 xff09 来自 configTOTAL HEAP SIZE 定义的堆 xff0c 如果任务栈总量超过 configTOTAL HEAP SIZE xff0c 任务
  • STM32--微项目14-手撸I2C通讯、实现MPU6050六轴传感器控制

    一 微项目实现目标 xff1a STM32通过两个GPIO端口 xff0c 通过代码配置成I2C通讯状态 xff0c 通过I2C通讯与MPU6050进行信息交互 xff0c 包括配置MPU6050寄存器配置 获取MPU6050寄存器状态 x
  • ubuntu-查看文件系统

    ubuntu 查看文件系统 查看文件系统 deepfuture 64 deepfuture laptop df 文件系统 1K 块 已用 可用 已用 挂载点 dev sda1 75481116 3926204 67720600 6 tmpf
  • TypeError: Expected Ptr<cv::UMat> for argument ‘img‘

    使用opencv过程中报错 xff1a TypeError Expected Ptr for argument 39 img 39 请检查img参数是否是numpy数组 xff0c 以及其数据类型 dtype是否是np uint8 如果这两
  • TX2超详细,超实用刷机教程(亲测有效,所有步骤都是博主亲自实践过)

    本篇主要对TX2刷机流程以及刷机过程中遇到的坑和相应的解决办法做个记录 xff0c 以便再次刷机时能做个参考 如果你刚好收到TX2开发者套件 xff0c 还没有进行开箱 xff0c 那么请移步到我的前一篇博客进行TX2的开机测试 博客链接
  • MicroStrategy 简介 【Business Intelligent】

    下载地址 xff1a https www microstrategy com us resources microstrategy for students students Capabilities that power the Inte
  • crontab permission denied 解决办法,crontab 进程存在就不执行的方法

    crontab permission denied 出现场景 出现情况 xff0c sh文件在本地Win下面开发 xff0c 每次修改 xff0c 提交后在Linux上pull下来 xff0c 却发现x权限消失 导致crontab 里面定时
  • ROS入门之通信架构+实践问题+python版本切换解决

    运行起来后是什么样的通信结构 PR2机器人 这么多东西 xff0c 怎么管理进行 xff0c 并且怎么通信 节点管理器 xff08 作为管家管理进程 xff0c master xff09 node首先要向master注册 xff0c 之后就
  • matlab---s函数讲解之二连杆动力学仿真

    matlab虽然后simulink xff0c 但是再复杂系统的仿真的时候简单的simulink中模块不能满足要求 xff0c 因此需要自己建立s函数 xff0c 作为仿真中的一个模块 在控制系统中分为控制器和被控对象 matlab s函数
  • 全球定位系统的组成

    一 空间部分 1 GPS卫星 Block xff08 试验卫星 xff09 Block xff08 以下均为工作卫星 xff09 14天导航电文 xff0c 实施SA和AS的能力 Block A 180天导航电文 xff0c 卫星互相通信能
  • 前端疑难杂症集锦

    一 webpack打包时Cannot resolve module 39 fs 39 在webpack config js中添加 node fs 34 empty 34 二 typescript找不到fs模块 code npm instal
  • 基于ROS的语音控制机器人(二):上位机的实现

    文章目录 目录 文章目录 前言 一 准备工作 1 python工作环境 2 ros环境 3 QT designer 二 界面程序设计 1 界面设计 2 ui文件转py文件 三 上位机程序编写 1 具体思路 2 具体实现 3 遇到的问题 1