利用qt实现机器人可视化界面,并在界面上控制机器人各个关节运动

这篇具有很好参考价值的文章主要介绍了利用qt实现机器人可视化界面,并在界面上控制机器人各个关节运动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 本工程借助于clion配置的qt环境,同时依赖eigen tinyxml2等开源库,也借鉴了博客上一些文章,具体哪些忘记了,十分抱歉。本工程仅供参考。机械臂模型为史陶比尔官网的TX2-60L-HB。可以去那下载对应的stp文件。

最终图:

qt机械臂,机器人,qt,开发语言,c++

 通过鼠标中键控制旋转 缩放,配合ctrl进行平移。加载模型文件路径是xml文件:书写类似于这种

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <Joint>../Mo/1.STL</Joint>
    <Joint>../Mo/2.STL</Joint>
    <Joint>../Mo/3.STL</Joint>
    <Joint>../Mo/4.STL</Joint>
    <Joint>../Mo/5.STL</Joint>
    <Joint>../Mo/6.STL</Joint>
    <Joint>../Mo/7.STL</Joint>
    <Joint>../Mo/1.STL</Joint>
</root>

 单独于机械臂模型之外的为环境模型(示意一下)设置目标关节值控制机器人当前关节。到机器人坐标系转换矩阵为环境模型到机械臂基坐标的转换矩阵。

代码十分粗糙。

robot_body_load.h

#ifndef NEWTRAVEL_ROBOT_BODY_LOAD_H
#define NEWTRAVEL_ROBOT_BODY_LOAD_H

//#include "glew.h"
#include <QMatrix3x3>
#include <QMatrix4x4>
#include <QOpenGLBuffer>
#include <QOpenGLExtraFunctions>
#include <QOpenGLShaderProgram>
#include <QOpenGLVertexArrayObject>
#include <QOpenGLWidget>
#include <QQuaternion>
#include <QStringList>
#include <QTime>
#include <QTimer>
#include <QVector2D>
#include <QVector>
#include "robot_camera.h"

#include "Log/log.h"

struct JointParameters
{
    QVector<float> vecJoint;                                 // joint position
    QOpenGLVertexArrayObject vaoJoint;       //声明VAO顶点数组对象
    QOpenGLBuffer vboJoint;                                //声明VBO数组缓冲对象
    GLsizei iNumberOfTriangle;
};

class RobotBody : public QOpenGLWidget, public QOpenGLExtraFunctions
{
    Q_OBJECT

public:
    RobotBody(QWidget *parent = nullptr);
    ~RobotBody();

protected:
    void initializeGL() override;
    void paintGL() override;
    void resizeGL(int w, int h) override;

public:
    void loadAscllStl(const QString& filename, int ratio, JointParameters &oJointPara); //文件名和放大系数
    void SetDrawParameters(JointParameters &oJointPara);
    void mousePressEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;
    void wheelEvent(QWheelEvent *event) override;
    void InitialTranslate();
    void SetRobotRotation(int iJointIndex);

private:
    bool ReadXml(std::vector<std::string> &vecNodePath);
    void SetJointValue();

public  Q_SLOTS:
    void SetRotationAngleOfJoint_0(double value);
    void SetRotationAngleOfJoint_1(double value);
    void SetRotationAngleOfJoint_2(double value);
    void SetRotationAngleOfJoint_3(double value);
    void SetRotationAngleOfJoint_4(double value);
    void SetRotationAngleOfJoint_5(double value);
public  Q_SLOTS:
    void SetFilePath(const QString &sFilePath);
    void setTargetJoints(const QString &sTrans);
    void SetTargetJointDegreeFlag(bool bDegreeFlag);

    void SetOtherModelTransform(QMatrix4x4 mat4Transform);
    void SetUnitOfLength(bool bIsMillimeter);
signals :
    void SetRotationOfJoint_0(double dValue);
    void SetRotationOfJoint_1(double dValue);
    void SetRotationOfJoint_2(double dValue);
    void SetRotationOfJoint_3(double dValue);
    void SetRotationOfJoint_4(double dValue);
    void SetRotationOfJoint_5(double dValue);
private:
    JointParameters m_aJointModel[9];

    QVector<float> Position;
    QVector<float> Normal;                //读文件时的俩个临时变量顶点位置,法向量
    QOpenGLShaderProgram shaderprogram;

    QMatrix4x4 view;
    QMatrix4x4 projection;

    QVector2D mousePos;
    QVector2D mousePosForTranslationView;
    QQuaternion rotation;
    QMatrix4x4 Rot;
    QMatrix4x4 m_matJointTrans[9];
    QMatrix4x4 m_matJointRot[7];
    QVector<float> m_vecRotDegree;
    std::map<int, QVector3D> m_mapRotVector;
    QVector3D m_v3dCamera;
    qreal  alpha;
    qreal  theta;
    double m_dEyeToModelDistance;
    QVector2D m_v2cMove;
    RobotCamera m_oRobotCamera;
    bool m_bIsFile;
    QString m_sXmlFile;

    bool m_bTargetJointRadianFlag;
    bool m_bMillimeterFlag;

};
#endif // NEWTRAVEL_ROBOT_BODY_LOAD_H

robot_body_load.cpp

#include "robot_body_load.h"
#include "Configure/configure_base.h"
#include <QFile>
#include <QMouseEvent>
#include <QOpenGLShaderProgram>
#include <QStringList>

RobotBody::RobotBody(QWidget *parent)
    : QOpenGLWidget(parent), alpha(0.0), theta(0.0), m_dEyeToModelDistance(0.00), m_v2cMove(0.0, 0.0)
{
    QSurfaceFormat format;
    format.setAlphaBufferSize(24); //设置alpha缓冲大小
    format.setVersion(3, 3);       //设置版本号
    format.setSamples(10);         //设置重采样次数,用于反走样
    m_bIsFile = false;
    m_bTargetJointRadianFlag = false;
    m_bMillimeterFlag = true;
    this->setFormat(format);

    // Set Joint rotation
    QVector3D qRotVector(0, -1, 0);
    m_mapRotVector[0] = qRotVector;
    qRotVector = {0, 0, 1};
    m_mapRotVector[1] = qRotVector;
    qRotVector = {0, 0, 1};
    m_mapRotVector[2] = qRotVector;
    qRotVector = {0, 0, 1};
    m_mapRotVector[3] = qRotVector;
    qRotVector = {0, 0, 1};
    m_mapRotVector[4] = qRotVector;
    qRotVector = {0, 0, 1};
    m_mapRotVector[5] = qRotVector;


    m_vecRotDegree.resize(6);
    for (float &ii : m_vecRotDegree)
    {
        ii = 0.0;
    }
    Rot.setToIdentity();
    m_v3dCamera = QVector3D(2, 0, 0.5);
    mousePosForTranslationView = QVector2D(0.0, 0.0);

    // External import fixed model
    m_matJointTrans[7].setToIdentity();
    m_matJointTrans[7].translate(0, -1, 0);
    m_matJointTrans[8].setToIdentity();
}

RobotBody::~RobotBody()
{
    makeCurrent();
}

void RobotBody::loadAscllStl(const QString &filename, int ratio, JointParameters &oJointPara)
{
    ZLOG << "load text file " << filename.toStdString();

    QFile file(filename);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        ZLOG << "Open stl_file failed.";
        return;
    }
    while (!file.atEnd())
    {
        QString line = file.readLine().trimmed(); // trimmed去除了开头和结尾的空白字符串
        QStringList words = line.split(' ', QString::SkipEmptyParts);
        if (words[0] == "facet")
        {
            Normal = {ratio * words[2].toFloat(), ratio * words[3].toFloat(), ratio * words[4].toFloat()};
        }
        else if (words[0] == "vertex")
        {
            Position = {ratio * words[1].toFloat(), ratio * words[2].toFloat(), ratio * words[3].toFloat()};
            oJointPara.vecJoint.append(Position);
            oJointPara.vecJoint.append(Normal);
        }
        else
        {
            continue;
        }
    }
    ZLOG << "write vertice_temp success!";
    file.close();
    oJointPara.iNumberOfTriangle = oJointPara.vecJoint.size()/6;
}

void RobotBody::SetDrawParameters(JointParameters &oJointPara)
{
    oJointPara.vaoJoint.create(); // 创建一个VAO对象,OpenGL会给它(顶点数组缓存对象)分配一个id
    oJointPara.vaoJoint.bind();   //将RC中的当前顶点数组缓存对象Id设置为VAO的id
    oJointPara.vboJoint.create();
    oJointPara.vboJoint.bind();
    oJointPara.vboJoint.allocate(oJointPara.vecJoint.data(),
        sizeof(float) *
            oJointPara.vecJoint.size()); //将顶点数据分配到VBO中,第一个参数为数据指针,第二个参数为数据的字节长度
    shaderprogram.setAttributeBuffer("aPos", GL_FLOAT, 0, 3, sizeof(GLfloat) * 6);
    shaderprogram.enableAttributeArray("aPos");
    shaderprogram.setAttributeBuffer("aNormal", GL_FLOAT, sizeof(GLfloat) * 3, 3, sizeof(GLfloat) * 6);
    shaderprogram.enableAttributeArray("aNormal");
    this->glEnable(GL_DEPTH_TEST);
    oJointPara.vaoJoint.release(); //释放
    oJointPara.vboJoint.release();
}

void RobotBody::initializeGL()
{
    this->initializeOpenGLFunctions(); //初始化opengl函数
    shaderprogram.create();            //生成着色器程序
    const char *vertexShaderSource =
        "#version 330 core \n"
        "layout (location = 0) in vec3 aPos; \n"
        "layout (location = 1) in vec3 aNormal; \n"
        "uniform mat4 view;\n"
        "uniform mat4 projection;\n"
        "uniform vec2 v2dMove;\n"
        "uniform mat4 baseTrans;\n"
        "uniform mat4 Rot;\n"
        "out vec3 FragPos;\n"
        "out vec3 Normal;\n"
        "void main()\n"
        "{\n"
        "gl_Position = Rot * projection * view * baseTrans * vec4(aPos[0] ,aPos[1] , aPos[2],1.0);\n"
        "Normal = vec3(baseTrans * vec4(aNormal,1.0));\n"
        "FragPos = vec3(vec4(aPos, 1.0));\n"
        "}\0";
    // 片段着色器
    const char *fragmentShaderSource = "#version 330 core\n"
                                       "out vec4 FragColor;\n"
                                       "uniform vec3 objectColor;\n"
                                       "uniform vec3 lightColor;\n"
                                       "in vec3 FragPos;\n"
                                       "in vec3 Normal;\n"
                                       "uniform vec3 lightPos;\n"
                                       "void main()\n"
                                       "{\n"
                                       "float ambientStrength = 0.05;\n"
                                       "vec3 ambient = ambientStrength * lightColor;\n"
                                       "vec3 norm = normalize(Normal);\n"
                                       "vec3 lightDir = normalize(lightPos - FragPos);\n"
                                       "float diff = max(dot(norm, lightDir), 0.0);\n"
                                       "vec3 diffuse = diff * lightColor;\n"
                                       "vec3 result = (ambient + diffuse) * objectColor;\n"
                                       "FragColor = vec4(result, 1.0);\n"
                                       "}\n\0";
    shaderprogram.addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource);
    shaderprogram.addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource);
    //将添加到此程序的着色器与addshader链接在一起
    if (!shaderprogram.link())
    {
        ZLOG << "ERROR: link error"; //如果链接出错,打印报错信息
    }
}

void RobotBody::resizeGL(int w, int h)
{
    this->glViewport(0, 0, w, h);
    projection.setToIdentity();
    projection.perspective(60.0f, (GLfloat)w / (GLfloat)h, 0.001f, 500.0f);
}

void RobotBody::paintGL()
{
    this->glClearColor(0.9f, 0.94f, 1.0f, 1.0f);              //设置清屏颜色
    this->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清空颜色缓冲区
    if (m_bIsFile)
    {
        std::vector<std::string> sPath;
        if (ReadXml(sPath))
        {
            for (size_t ii = 0; ii < sPath.size(); ++ii)
            {
                loadAscllStl(sPath[ii].c_str(), 1, m_aJointModel[ii]);
                ZLOG << sPath[ii];
            }
            for (auto &ii : m_aJointModel)
            {
                SetDrawParameters(ii);
            }
            m_bIsFile = false;
        }
    }
    shaderprogram.bind();
    //将此着色器程序绑定到活动的qopenglcontext,并使其成为当前着色器程序。任何先前绑定的着色器程序都将被释放
    //成功绑定返回ture,反之,返回false.
    {
        QVector3D lightColor(1.0f, 1.0f, 1.0f);
        QVector3D objectColor(1.0f, 0.5f, 0.31f);
        QVector3D lightPos(m_oRobotCamera.NewEye->x(), m_oRobotCamera.NewEye->y(), m_oRobotCamera.NewEye->z());

        GLfloat mat_ambient[] = {0.0f, 0.0f, 0.2f, 1.0f};
        glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);

        view.setToIdentity();
        view.lookAt(QVector3D(m_oRobotCamera.NewEye->x(), m_oRobotCamera.NewEye->y(), m_oRobotCamera.NewEye->z()),
            QVector3D(m_oRobotCamera.NewView->x(), m_oRobotCamera.NewView->y(), m_oRobotCamera.NewView->z()),
            QVector3D(m_oRobotCamera.NewUp->x(), m_oRobotCamera.NewUp->y(), m_oRobotCamera.NewUp->z()));

        shaderprogram.setUniformValue("objectColor", objectColor);
        shaderprogram.setUniformValue("lightColor", lightColor);
        shaderprogram.setUniformValue("lightPos", lightPos);

        Rot.translate(m_v2cMove.x(), -m_v2cMove.y(), 0);
        m_v2cMove = QVector2D(0, 0);
        shaderprogram.setUniformValue("Rot", Rot);
        shaderprogram.setUniformValue("view", view);
        projection.translate(0.0, 0.0, m_dEyeToModelDistance);
        m_dEyeToModelDistance = 0.0;
        shaderprogram.setUniformValue("projection", projection);
        InitialTranslate();
        for (int ii = 0; ii < 6; ii++)
        {
            SetRobotRotation(ii);
            shaderprogram.setUniformValue("baseTrans", m_matJointTrans[ii]);
            m_aJointModel[ii].vaoJoint.bind();
            this->glDrawArrays(GL_TRIANGLES, 0, m_aJointModel[ii].iNumberOfTriangle);
        }
        shaderprogram.setUniformValue("baseTrans", m_matJointTrans[6]);
        m_aJointModel[6].vaoJoint.bind();
        this->glDrawArrays(GL_TRIANGLES, 0, m_aJointModel[6].iNumberOfTriangle);

        shaderprogram.setUniformValue("baseTrans", m_matJointTrans[7]);
        m_aJointModel[7].vaoJoint.bind();
        this->glDrawArrays(GL_TRIANGLES, 0, m_aJointModel[7].iNumberOfTriangle);

        shaderprogram.setUniformValue("baseTrans", m_matJointTrans[8]);
        m_aJointModel[8].vaoJoint.bind();
        this->glDrawArrays(GL_LINES, 0, m_aJointModel[8].iNumberOfTriangle);
    }
}

void RobotBody::InitialTranslate()
{
    m_matJointTrans[0].setToIdentity();
    m_matJointTrans[1].setToIdentity();
    m_matJointTrans[1].translate(0, 0, 0.375);
    m_matJointTrans[1].rotate(-90, 1, 0, 0);
    m_matJointTrans[2].setToIdentity();
    m_matJointTrans[3].setToIdentity();
    m_matJointTrans[3].translate(0, -0.4, 0.02);
    m_matJointTrans[4].setToIdentity();
    m_matJointTrans[4].rotate(90, 1, 0, 0);
    m_matJointTrans[5].setToIdentity();
    m_matJointTrans[5].translate(0, 0, 0.45);
    m_matJointTrans[5].rotate(-90, 1, 0, 0);
    m_matJointTrans[6].setToIdentity();
    m_matJointTrans[6].translate(0, -0.07, 0.0);
    m_matJointTrans[6].rotate(90, 1, 0, 0);

}

void RobotBody::SetRobotRotation(int iJointIndex)
{
    m_matJointRot[iJointIndex].setToIdentity();
    m_matJointRot[iJointIndex].rotate(m_vecRotDegree[iJointIndex], m_mapRotVector[iJointIndex]);
    m_matJointTrans[iJointIndex + 1] =
        m_matJointTrans[iJointIndex] * m_matJointTrans[iJointIndex + 1] * m_matJointRot[iJointIndex];
}

void RobotBody::mousePressEvent(QMouseEvent *event)
{
    mousePos = QVector2D(event->pos());
    m_oRobotCamera.getInitPos(event->x(), event->y());
}

void RobotBody::mouseMoveEvent(QMouseEvent *event)
{
    if (event->buttons() & Qt::MiddleButton)
    {
        if (event->modifiers() == Qt::CTRL)
        {
            QVector2D newPos = (QVector2D)event->pos();
            m_v2cMove = (newPos - mousePos) / 500;
            mousePos = newPos;
        }
        else
        {
            m_oRobotCamera.executeRotateOperation(event->x(), event->y());
        }
    }
    this->update();
}

void RobotBody::wheelEvent(QWheelEvent *event)
{
    if (event->delta() >= 0)
    {
        m_dEyeToModelDistance = 0.1f;
    }
    else
    {
        m_dEyeToModelDistance = -0.1f;
    }
    this->update();
}

void RobotBody::SetRotationAngleOfJoint_0(double value)
{
    InitialTranslate();
    m_vecRotDegree[0] = (float)value;
    SetRobotRotation(0);
    m_v2cMove = QVector2D(0, 0);
    m_dEyeToModelDistance = 0.0;
    update();
}

void RobotBody::SetRotationAngleOfJoint_1(double value)
{
    InitialTranslate();
    m_vecRotDegree[1] = (float)value;
    SetRobotRotation(1);
    m_v2cMove = QVector2D(0, 0);
    m_dEyeToModelDistance = 0.0;
    update();
}

void RobotBody::SetRotationAngleOfJoint_2(double value)
{
    InitialTranslate();
    m_vecRotDegree[2] = (float)value;
    SetRobotRotation(2);
    m_v2cMove = QVector2D(0, 0);
    m_dEyeToModelDistance = 0.0;
    update();
}

void RobotBody::SetRotationAngleOfJoint_3(double value)
{
    InitialTranslate();
    m_vecRotDegree[3] = (float)value;
    SetRobotRotation(3);
    m_v2cMove = QVector2D(0, 0);
    m_dEyeToModelDistance = 0.0;
    update();
}

void RobotBody::SetRotationAngleOfJoint_4(double value)
{
    InitialTranslate();
    m_vecRotDegree[4] = (float)value;
    SetRobotRotation(4);
    m_v2cMove = QVector2D(0, 0);
    m_dEyeToModelDistance = 0.0;
    update();
}

void RobotBody::SetRotationAngleOfJoint_5(double value)
{
    InitialTranslate();
    m_vecRotDegree[5] = (float)value;
    SetRobotRotation(5);
    m_v2cMove = QVector2D(0, 0);
    m_dEyeToModelDistance = 0.0;
    update();
}

void RobotBody::SetFilePath(const QString &sFilePath)
{
    m_sXmlFile = sFilePath;
    ZLOG << "The path is: " << sFilePath.toStdString();
    m_bIsFile = true;
    update();
}

bool RobotBody::ReadXml(std::vector<std::string> &vecNodePath)
{
    LoadConfigre oConfig;
    oConfig.ReadXML(m_sXmlFile.toStdString());

    std::string sNodePath = "/Joint";
    int iCount = oConfig.GetCountBrotherElement(sNodePath);

    std::string sResult;
    for (int ii = 0; ii < iCount; ++ii)
    {
        ZLOG << "sNodePath: " << sNodePath + "[" + std::to_string(ii) + "]";
        if (!oConfig.GetElementValue(sNodePath + "[" + std::to_string(ii) + "]", sResult))
        {
            ZLOG << "Failed to load xml " << sNodePath;
            return false;
        }
        vecNodePath.push_back(sResult);
    }
    return true;
}

void RobotBody::setTargetJoints(const QString &sTrans)
{
    std::string sTargetJoint = sTrans.toStdString();
    ZLOG << "The path is: " << sTargetJoint;
    int iIndex = sTargetJoint.find(',');
    int iCount = 0;
    while (std::string::npos != iIndex)
    {
        std::string sJointValue = sTargetJoint.substr(0, sTargetJoint.find(','));
        m_vecRotDegree[iCount] = strtod(sJointValue.c_str(), nullptr);
        iCount++;
        sTargetJoint = sTargetJoint.substr(sTargetJoint.find(',') + 1, std::string::npos);
        iIndex = sTargetJoint.find(',');
    }
    m_vecRotDegree[5] = strtod(sTargetJoint.c_str(), nullptr);
    if (m_bTargetJointRadianFlag)
    {
        for (int ii = 0; ii < m_vecRotDegree.size(); ++ii)
        {
            double dDegree = m_vecRotDegree[ii] * 180 / 3.1415926;
            m_vecRotDegree[ii] = dDegree;
        }
    }
    SetJointValue();
}

void RobotBody::SetJointValue()
{
    emit SetRotationOfJoint_0(m_vecRotDegree[0]);
    emit SetRotationOfJoint_1(m_vecRotDegree[1]);
    emit SetRotationOfJoint_2(m_vecRotDegree[2]);
    emit SetRotationOfJoint_3(m_vecRotDegree[3]);
    emit SetRotationOfJoint_4(m_vecRotDegree[4]);
    emit SetRotationOfJoint_5(m_vecRotDegree[5]);
}
void RobotBody::SetTargetJointDegreeFlag(bool bDegreeFlag)
{
    m_bTargetJointRadianFlag = bDegreeFlag;
    ZLOG << " Degree flag is " << m_bTargetJointRadianFlag;
}

void RobotBody::SetOtherModelTransform(QMatrix4x4 mat4Tansform)
{
    if (mat4Tansform(3,0) != 1)
    {
        QVector4D vecPos;
        if (m_bMillimeterFlag)
        {
            vecPos[0] = mat4Tansform(0, 3)/1000;
            vecPos[1] = mat4Tansform(1, 3)/1000;
            vecPos[2] = mat4Tansform(2, 3)/1000;
            vecPos[3] = 1;
            mat4Tansform.setColumn(3,vecPos);
        }
        m_matJointTrans[7] = mat4Tansform;
        ZLOG << "TransForm is: " << mat4Tansform(0, 0) << ", " << mat4Tansform(1, 1) << ", " << mat4Tansform(1, 2) << ", "
             << mat4Tansform(0, 3);
        ZLOG << "TransForm is: " << mat4Tansform(1, 0) << ", " << mat4Tansform(2, 1) << ", " << mat4Tansform(2, 2) << ", "
             << mat4Tansform(1, 3);
        ZLOG << "TransForm is: " << mat4Tansform(2, 0) << ", " << mat4Tansform(2, 1) << ", " << mat4Tansform(2, 2) << ", "
             << mat4Tansform(2, 3);
        update();
    }
}
void RobotBody::SetUnitOfLength(bool bIsMillimeter)
{
    m_bMillimeterFlag = bIsMillimeter;
}

robot_camera.h

#ifndef NEWTRAVEL_ROBOT_CAMERA_H
#define NEWTRAVEL_ROBOT_CAMERA_H

#include "Eigen/Eigen"
#include <iostream>

 class RobotCamera
{
 public:
    RobotCamera()
    {
        OldMouse = new Eigen::Vector2d(0,0);
        Mouse = new Eigen::Vector2d(0,0);

        NewEye = new Eigen::Vector3d(2, 0, 0.5);
        NewUp = new Eigen::Vector3d(0, 0, 1);
        NewView = new Eigen::Vector3d(0, 0, 0.5);

        AuxY = new Eigen::Vector3d(0, 1, 0);
        AuxZ = new Eigen::Vector3d();
        *AuxZ = *NewEye - *NewView;
        AuxX = new Eigen::Vector3d();
        *AuxX = (*AuxY).cross(*AuxZ);
        AuxX->normalize();
    }

    Eigen::Matrix<double, 3, 3> getRotateMatrix(float angle, const Eigen::Vector3d &vector)
    {
        angle = angle / 2 * M_PI / 180;
        Eigen::Vector3d vec = vector.normalized();
        float cosa = cos(angle);
        float sina = sin(angle);

        double a = vec.x() * sina;
        double b = vec.y() * sina;
        double c = vec.z() * sina;

        Eigen::Matrix<double, 3, 3> matrix;
        matrix(0, 0) = 1.0 - 2.0 * (b * b + c * c);
        matrix(1, 1) = 1.0 - 2.0 * (c * c + a * a);
        matrix(2, 2) = 1.0 - 2.0 * (a * a + b * b);

        matrix(0, 1) = 2.0 * (a * b - c * cosa);
        matrix(0, 2) = 2.0 * (a * c + b * cosa);

        matrix(1, 0) = 2.0 * (a * b + c * cosa);
        matrix(1, 2) = 2.0 * (b * c - a * cosa);

        matrix(2, 0) = 2.0 * (a * c - b * cosa);
        matrix(2, 1) = 2.0 * (b * c + a * cosa);
        return matrix;
    }

     void getInitPos(int x, int y)
     {
         Mouse->x() = x;
         Mouse->y() = y;
         *OldMouse = *Mouse;
     }

    void executeRotateOperation(int x, int y)
    {
        Mouse->x() = x;
        Mouse->y() = y;
        Eigen::Vector3d MouseTrace = *AuxY * (OldMouse->y() - Mouse->y()) + *AuxX * (Mouse->x() - OldMouse->x());
        Eigen::Vector3d RotateAsix = MouseTrace.cross(*AuxZ);
        RotateAsix.normalize();

        float angle = MouseTrace.norm();
        Eigen::Matrix<double, 3, 3> rotatMatrix = getRotateMatrix(angle, RotateAsix);
        *NewEye = rotatMatrix * (*NewEye);
        *NewUp = rotatMatrix * (*NewUp);
        NewUp->normalized();

        *AuxY = *NewUp;
        *AuxZ = *NewEye - *NewView;
        *AuxX = (*AuxY).cross(*AuxZ);
        AuxX->normalize();
        *OldMouse = *Mouse;
    }



    //旋转后观察点方向与视线向上方向
    Eigen::Vector3d *NewEye;
    Eigen::Vector3d *NewUp;
    Eigen::Vector3d *NewView;

 private:
    //辅助坐标系三根轴
    Eigen::Vector3d *AuxX;
    Eigen::Vector3d *AuxY;
    Eigen::Vector3d *AuxZ;



    Eigen::Vector2d *OldMouse;
    Eigen::Vector2d *Mouse;
};

#endif // NEWTRAVEL_ROBOT_CAMERA_H

robot_joint_degree_control_slider.cpp

#include "robot_joint_degree_control_slider.h"

RobotJointDegreeControlSlider::RobotJointDegreeControlSlider(QWidget *parent) : QSlider(parent), m_Multiplier(10000.0)
{

    connect(this, SIGNAL(valueChanged(int)), this, SLOT(setValue(int)));
    setSingleStep(1);
    setOrientation(Qt::Horizontal);
    setFocusPolicy(Qt::NoFocus);
}

RobotJointDegreeControlSlider::~RobotJointDegreeControlSlider() noexcept {}

void RobotJointDegreeControlSlider::Initial(int iIndex)
{
    setMaximum(180);
    setMinimum(-180);
    setOrientation(Qt::Horizontal);
    resize(260, 30);
    move(920, iIndex * 40 + 10);
    setSingleStep(5);
    show();
}

int RobotJointDegreeControlSlider::GetCurrent()
{
    int iValue = value();
    std::cout << iValue << std::endl;
    return iValue;
}

void RobotJointDegreeControlSlider::setValue(int Value)
{
    emit valueChanged((double)Value / m_Multiplier);
}

void RobotJointDegreeControlSlider::setValue(double Value, bool BlockSignals)
{
    QSlider::blockSignals(BlockSignals);

    QSlider::setValue(Value * m_Multiplier);

    if (!BlockSignals)
        emit valueChanged(Value);

    QSlider::blockSignals(false);
}

void RobotJointDegreeControlSlider::setRange(double Min, double Max)
{
    QSlider::setRange(Min * m_Multiplier, Max * m_Multiplier);

    emit rangeChanged(Min, Max);
}

void RobotJointDegreeControlSlider::setMinimum(double Min)
{
    QSlider::setMinimum(Min * m_Multiplier);

    emit rangeChanged(minimum(), maximum());
}

double RobotJointDegreeControlSlider::minimum() const
{
    return QSlider::minimum() / m_Multiplier;
}

void RobotJointDegreeControlSlider::setMaximum(double Max)
{
    QSlider::setMaximum(Max * m_Multiplier);

    emit rangeChanged(minimum(), maximum());
}

double RobotJointDegreeControlSlider::maximum() const
{
    return QSlider::maximum() / m_Multiplier;
}

double RobotJointDegreeControlSlider::value() const
{
    int Value = QSlider::value();
    return (double)Value / m_Multiplier;
}

robot_joint_degree_control_slider.h

#ifndef NEWTRAVEL_ROBOT_JOINT_DEGREE_CONTROL_SLIDER_H
#define NEWTRAVEL_ROBOT_JOINT_DEGREE_CONTROL_SLIDER_H

#include <QSlider>
#include <iostream>
#include <QtGui/QtGui>

class RobotJointDegreeControlSlider :  public  QSlider
{
Q_OBJECT
public:
    RobotJointDegreeControlSlider(QWidget *parent = nullptr);
    ~RobotJointDegreeControlSlider();
    void setRange(double Min, double Max);
    void setMinimum(double Min);
    double minimum() const;
    void setMaximum(double Max);
    double maximum() const;
    double value() const;

public slots:
    void setValue(int value);
    void setValue(double Value, bool BlockSignals = false);

private slots:

signals :
    void valueChanged(double Value);
    void rangeChanged(double Min, double Max);

private:
    double m_Multiplier;
public:
    void Initial(int iIndex);
    int  GetCurrent();

};

#endif // NEWTRAVEL_ROBOT_JOINT_DEGREE_CONTROL_SLIDER_H

robot_joint_degree_spinbox.cpp

#include "robot_joint_degree_spinbox.h"

RobotJointSpinBox::RobotJointSpinBox(QWidget *parent) : QDoubleSpinBox(parent)
{
}

RobotJointSpinBox::~RobotJointSpinBox() noexcept {

}

void RobotJointSpinBox::Initial(int iIndex)
{
    resize(50, 30);
    move(860, iIndex * 40 + 10);
    setMinimum(-180);
    setMaximum(180);
    setSingleStep(1);
    show();
}

void RobotJointSpinBox::SetLimitValue(double iMaxValue,double iMinValue,double iStep)
{
    setMaximum(iMaxValue);
    setMinimum(iMinValue);
    setSingleStep(iStep);
    setValue(0);
}

robot_joint_degree_spinbox.h

#ifndef NEWTRAVEL_ROBOT_JOINT_DEGREE_SPINBOX_H
#define NEWTRAVEL_ROBOT_JOINT_DEGREE_SPINBOX_H

#include <QSpinBox>
#include <QTextEdit>

class RobotJointSpinBox :  public  QDoubleSpinBox
{
Q_OBJECT
public:
    RobotJointSpinBox(QWidget *parent = nullptr);
    ~RobotJointSpinBox();

public:
    void Initial(int iIndex);
    void SetLimitValue(double iMaxValue,double iMinValue,double iStep);
};

#endif // NEWTRAVEL_ROBOT_JOINT_DEGREE_SPINBOX_H

robot_joint_label.cpp

#include "robot_joint_label.h"

RobotJointLabel::RobotJointLabel(QWidget *parent) : QLabel(parent) {}

RobotJointLabel::~RobotJointLabel() noexcept = default;

void RobotJointLabel::Initial(int iIndex)
{
//    move(800, iIndex * 40 + 10);
//    resize(50, 30);
    setText(QString::fromStdString("Joint_" + std::to_string(iIndex)));
//    show();
}

robot_joint_label.h

#ifndef NEWTRAVEL_ROBOT_JOINT_LABEL_H
#define NEWTRAVEL_ROBOT_JOINT_LABEL_H

#include <QLabel>
#include <iostream>

class RobotJointLabel  :  public  QLabel
{
Q_OBJECT
public:
    RobotJointLabel(QWidget *parent = nullptr);
    ~RobotJointLabel();

public:
    void Initial(int iIndex);

};

#endif // NEWTRAVEL_ROBOT_JOINT_LABEL_H

robot_main.cpp

#include "ui_robot_simulation_platform.h"
#include "simulation.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Ui::RobotSimulation w;
   w.show();
    return a.exec();
}

robot_other_model_transform.cpp

#include "robot_other_model_transform.h"
#include "Log/log.h"
OtherModelTrans::OtherModelTrans(QWidget *parent) : QTextEdit(parent) {}

void OtherModelTrans::SetValue()
{
    emitValue();
}

void OtherModelTrans::emitValue()
{
    QString sValue = toPlainText();
    ZLOG << sValue.toStdString();
    std::string sTransValue = sValue.toStdString();
    QMatrix4x4 mat4Trans;
    mat4Trans.setToIdentity();
    QVector<std::string> vecRPY;
    std::string sRPY = sTransValue.substr(sTransValue.find('{'),std::string::npos);
    int iRPYIndex = sRPY.find('{');
    while (std::string::npos != iRPYIndex)
    {
        std::string sRPYValue = sRPY.substr(iRPYIndex + 1,sRPY.find_first_of('}') - iRPYIndex - 1);
        vecRPY.push_back(sRPYValue);
        sRPY = sRPY.substr(sRPY.find_first_of('}') + 1 ,std::string::npos);
        iRPYIndex = sRPY.find('{');
    }
    QVector4D vecRot;
    for (int i = 0; i < vecRPY.size(); ++i)
    {
        size_t iRPYIndex = vecRPY[i].find(',');
        int iIndex = 0;
        while (std::string::npos != iRPYIndex)
        {
            std::string sPPYValue = vecRPY[i].substr(0,iRPYIndex);
            vecRot[iIndex] = (strtod(sPPYValue.c_str(), nullptr));
            vecRPY[i] = vecRPY[i].substr(iRPYIndex + 1,std::string::npos);
            iRPYIndex = vecRPY[i].find(',');
            iIndex ++ ;
        }
        vecRot[iIndex] =  (strtod(vecRPY[i].c_str(), nullptr));
        mat4Trans.setColumn(i,vecRot);
    }
    QVector4D vecPose;
    if(std::string::npos != sTransValue.find("Vector3D("))
    {
        int iInd = 0;
        int iIndex = sTransValue.find("Vector3D(") + 9;
        std::string sPos = sTransValue.substr(iIndex,sTransValue.find_first_of(')') - iIndex);
        size_t iCount = sPos.find(',');
        while (std::string::npos != iCount)
        {
            std::string sPoseValue = sPos.substr(0,iCount);
            vecPose[iInd] = (strtod(sPoseValue.c_str(), nullptr));
            sPos = sPos.substr(iCount + 1,std::string::npos);
            iCount = sPos.find(',');
            iInd++;
        }
        vecPose[iInd] = (strtod(sPos.c_str(), nullptr));
        vecPose[3] = 1;
    }
    mat4Trans.setColumn(3,vecPose);
    emit SetValue(mat4Trans);
}

OtherModelTrans::~OtherModelTrans() {}

robot_other_model_transform.h

#ifndef NEWTRAVEL_ROBOT_OTHER_MODEL_TRANSFORM_H
#define NEWTRAVEL_ROBOT_OTHER_MODEL_TRANSFORM_H

#include <QtWidgets/QTextEdit>
#include <QMatrix4x4>

class OtherModelTrans : public QTextEdit
{
Q_OBJECT
public:
    OtherModelTrans(QWidget *parent = nullptr);
    ~OtherModelTrans() override;

signals :
    void SetValue(QMatrix4x4 oFilePath);
public  Q_SLOTS:
    void SetValue();
public:
    void emitValue();
};

#endif // NEWTRAVEL_ROBOT_OTHER_MODEL_TRANSFORM_H

robot_pushbutton_openfile.cpp

#include "robot_pushbutton_openfile.h"

OpenFile::OpenFile(FileDialog *pFileDialog,QWidget *parent) : QPushButton(parent)
{
    m_pQFileDialog = pFileDialog;
}

OpenFile::~OpenFile() {}

robot_pushbutton_openfile.h

#ifndef NEWTRAVEL_ROBOT_PUSHBUTTON_OPENFILE_H
#define NEWTRAVEL_ROBOT_PUSHBUTTON_OPENFILE_H

#include <QtWidgets/QPushButton>
#include "robot_qfile_dialog.h"
#include <iostream>
class OpenFile : public QPushButton
{
Q_OBJECT
public:
    OpenFile(FileDialog *pFileDialog,QWidget *parent = nullptr);
    ~OpenFile();

    void mousePressEvent(QMouseEvent *event) override
    {
        openfile();
    }
    void openfile()
    {
        QString strFileName = FileDialog::getOpenFileName(this, "Open File", "",
                                                           tr("XML(*.xml)"), nullptr, QFileDialog::DontResolveSymlinks);
        strFileName = QDir::toNativeSeparators(strFileName);
        if (!strFileName.isEmpty())
        {
            m_pQFileDialog->SetPath(strFileName);
            std::cout << "strFileName : "  << strFileName.toStdString() <<std::endl;
        }
    }

private:
    FileDialog *m_pQFileDialog;
};


#endif // NEWTRAVEL_ROBOT_PUSHBUTTON_OPENFILE_H

robot_pushbutton_send_message.cpp


#include "robot_pushbutton_send_message.h"

SendButton::SendButton(QWidget*parent):QPushButton(parent){}

SendButton::~SendButton() {}

void SendButton::mousePressEvent(QMouseEvent *event)
{
    emit SendMessage();
}

robot_pushbutton_send_message.h

#ifndef NEWTRAVEL_ROBOT_PUSHBUTTON_SEND_MESSAGE_H
#define NEWTRAVEL_ROBOT_PUSHBUTTON_SEND_MESSAGE_H

#include "robot_target_joint.h"
#include <QtWidgets/QPushButton>

class SendButton : public QPushButton
{
    Q_OBJECT
public:
    SendButton(QWidget *parent = nullptr);
    ~SendButton();
    void mousePressEvent(QMouseEvent *event) override;
signals :
    void SendMessage();
};
#endif // NEWTRAVEL_ROBOT_PUSHBUTTON_SEND_MESSAGE_H

robot_qfile_dialog.cpp

#include "robot_qfile_dialog.h"

FileDialog::FileDialog(QWidget *parent):QFileDialog(parent)
{
//    connect(this, SIGNAL(fileSelected(QString)), this, SLOT(SetPath(QString)));
}


FileDialog::~FileDialog()
{
}
void FileDialog::emitSelectFile(QString oFilePath)
{

    {

    }
}
void FileDialog::SetPath(QString sPath)
{
    emit fileSelected(sPath);
}

robot_qfile_dialog.h

#ifndef NEWTRAVEL_ROBOT_QFILE_DIALOG_H
#define NEWTRAVEL_ROBOT_QFILE_DIALOG_H

#include <QtWidgets/QFileDialog>

class FileDialog : public QFileDialog
{
    Q_OBJECT
public:
    explicit FileDialog(QWidget *parent = nullptr);
    ~FileDialog() override;
public  Q_SLOTS:
    void SetPath(QString sPath);
signals :
    void fileSelected(QString oFilePath);

public:
    void emitSelectFile(QString oFilePath);

};


#endif // NEWTRAVEL_ROBOT_QFILE_DIALOG_H

robot_simulation.cpp

#include "robot_simulation.h"
#include "robot_simulation_main_platform.h"

RobotSimulationPlatform::RobotSimulationPlatform(QWidget *parent) : QWidget(parent), ui(new Ui::RobotSimulation)
{
    ui->setupUi(this);
    m_pWidget = new RobotBody(this);
    m_pWidget->resize(800,600);
    m_pWidget->show();
    for (int ii = 0; ii < 6; ++ii)
    {
        m_pRobotJointLabel[ii] = new RobotJointLabel(this);
        m_pRobotJointLabel[ii]->Initial(ii);
        m_pSpinBox[ii] = new RobotJointSpinBox(this);
        m_pSpinBox[ii]->Initial(ii);

        m_pMySlider[ii] = new RobotJointDegreeControlSlider(this);
        m_pMySlider[ii]->Initial(ii);
        connect(m_pMySlider[ii], SIGNAL(valueChanged(int)),m_pSpinBox[ii], SLOT(setValue(int)));
    }
    connect(m_pMySlider[0], SIGNAL(valueChanged(int)),m_pWidget, SLOT(SetRotationAngleOfJoint_0(int)));
    connect(m_pMySlider[1], SIGNAL(valueChanged(int)),m_pWidget, SLOT(SetRotationAngleOfJoint_1(int)));
    connect(m_pMySlider[2], SIGNAL(valueChanged(int)),m_pWidget, SLOT(SetRotationAngleOfJoint_2(int)));
    connect(m_pMySlider[3], SIGNAL(valueChanged(int)),m_pWidget, SLOT(SetRotationAngleOfJoint_3(int)));
    connect(m_pMySlider[4], SIGNAL(valueChanged(int)),m_pWidget, SLOT(SetRotationAngleOfJoint_4(int)));
    connect(m_pMySlider[5], SIGNAL(valueChanged(int)),m_pWidget, SLOT(SetRotationAngleOfJoint_5(int)));

}

RobotSimulationPlatform::~RobotSimulationPlatform()
{
    delete ui;
}

robot_simulation.h

#ifndef NEWTRAVEL_ROBOT_SIMULATION_H
#define NEWTRAVEL_ROBOT_SIMULATION_H

#include "robot_body_load.h"
#include "robot_joint_degree_control_slider.h"
#include "robot_joint_degree_spinbox.h"
#include "robot_joint_label.h"
#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui
{
class RobotSimulation;
}
QT_END_NAMESPACE

class RobotSimulationPlatform : public QWidget
{
    Q_OBJECT

public:
    explicit RobotSimulationPlatform(QWidget *parent = nullptr);
    ~RobotSimulationPlatform() override;

private:
    Ui::RobotSimulation *ui;
    RobotBody *m_pWidget;
    RobotJointDegreeControlSlider *m_pMySlider[6];
    RobotJointSpinBox *m_pSpinBox[6];
    RobotJointLabel *m_pRobotJointLabel[6];
};

#endif // NEWTRAVEL_ROBOT_SIMULATION_H

robot_simulation_main_platform.h

#ifndef UI_MY_ROBOT_H
#define UI_MY_ROBOT_H

#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class UiWindowOfRobot
{
public:

    void setupUi(QWidget *my_robot)
    {
        if (my_robot->objectName().isEmpty())
            my_robot->setObjectName(QString::fromUtf8("my_robot"));
        my_robot->resize(1200, 600);

        retranslateUi(my_robot);

        QMetaObject::connectSlotsByName(my_robot);
    } // setupUi

    void retranslateUi(QWidget *my_robot)
    {
        my_robot->setWindowTitle(QApplication::translate("my_robot", "my_robot", nullptr));
    } // retranslateUi

};

namespace Ui {
    class RobotSimulation : public UiWindowOfRobot
{};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MY_ROBOT_H

robot_simulation_platform.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>RobotSimulationPlatform</class>
 <widget class="QWidget" name="RobotSimulationPlatform">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>1210</width>
    <height>916</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>RobotSimulationPlatform</string>
  </property>
  <widget class="QWidget" name="m_pMainWidget">
   <property name="geometry">
    <rect>
     <x>10</x>
     <y>10</y>
     <width>1151</width>
     <height>791</height>
    </rect>
   </property>
   <layout class="QGridLayout" name="m_pMainGridLayout" columnstretch="2,1">
    <item row="0" column="0">
     <layout class="QVBoxLayout" name="m_pRobotShowAndButtonVerticalLayout" stretch="6,1">
      <property name="spacing">
       <number>6</number>
      </property>
      <item>
       <widget class="QGroupBox" name="m_pRobotGroup">
        <property name="title">
         <string/>
        </property>
        <widget class="QOpenGLWidget" name="openGLWidget">
         <property name="enabled">
          <bool>true</bool>
         </property>
         <property name="geometry">
          <rect>
           <x>20</x>
           <y>40</y>
           <width>721</width>
           <height>611</height>
          </rect>
         </property>
         <property name="minimumSize">
          <size>
           <width>650</width>
           <height>600</height>
          </size>
         </property>
        </widget>
       </widget>
      </item>
      <item>
       <widget class="QGroupBox" name="m_pPushButtonGroup">
        <property name="title">
         <string>GroupBox</string>
        </property>
        <widget class="QSplitter" name="m_pSplitterPushButton">
         <property name="geometry">
          <rect>
           <x>0</x>
           <y>20</y>
           <width>311</width>
           <height>41</height>
          </rect>
         </property>
         <property name="orientation">
          <enum>Qt::Horizontal</enum>
         </property>
         <widget class="QPushButton" name="pushButton">
          <property name="text">
           <string>PushButton</string>
          </property>
         </widget>
         <widget class="QPushButton" name="pushButton_2">
          <property name="text">
           <string>PushButton</string>
          </property>
         </widget>
        </widget>
       </widget>
      </item>
     </layout>
    </item>
    <item row="0" column="1">
     <layout class="QVBoxLayout" name="m_pVerticalLayoutRobotController" stretch="2,1,1">
      <item>
       <widget class="QGroupBox" name="m_pGroupBoxRobotJoints">
        <property name="minimumSize">
         <size>
          <width>2</width>
          <height>12</height>
         </size>
        </property>
        <property name="tabletTracking">
         <bool>false</bool>
        </property>
        <property name="title">
         <string/>
        </property>
        <widget class="QWidget" name="m_pMainWidget">
         <property name="geometry">
          <rect>
           <x>10</x>
           <y>30</y>
           <width>361</width>
           <height>250</height>
          </rect>
         </property>
         <layout class="QVBoxLayout" name="m_pVerticalLayoutRobotJoints">
          <property name="spacing">
           <number>16</number>
          </property>
          <item>
           <layout class="QHBoxLayout" name="m_pHorizontalLayoutJoint_1">
            <item>
             <widget class="QLabel" name="m_pLabelRobotJoint_1">
              <property name="text">
               <string>Joint_1</string>
              </property>
             </widget>
            </item>
            <item>
             <widget class="QDoubleSpinBox" name="m_pDoubleSpinBoxJoint_1"/>
            </item>
            <item>
             <widget class="QSlider" name="m_pHorizontalSliderJoint_1">
              <property name="minimum">
               <number>-180</number>
              </property>
              <property name="maximum">
               <number>180</number>
              </property>
              <property name="orientation">
               <enum>Qt::Horizontal</enum>
              </property>
             </widget>
            </item>
           </layout>
          </item>
          <item>
           <layout class="QHBoxLayout" name="m_pHorizontalLayoutJoint_2">
            <item>
             <widget class="QLabel" name="m_pLabelRobotJoint_2">
              <property name="text">
               <string>Joint_2</string>
              </property>
             </widget>
            </item>
            <item>
             <widget class="QDoubleSpinBox" name="m_pDoubleSpinBoxJoint_2"/>
            </item>
            <item>
             <widget class="QSlider" name="m_pHorizontalSliderJoint_2">
              <property name="orientation">
               <enum>Qt::Horizontal</enum>
              </property>
             </widget>
            </item>
           </layout>
          </item>
          <item>
           <layout class="QHBoxLayout" name="m_pHorizontalLayoutJoint_3">
            <item>
             <widget class="QLabel" name="m_pLabelRobotJoint_3">
              <property name="text">
               <string>Joint_3</string>
              </property>
             </widget>
            </item>
            <item>
             <widget class="QDoubleSpinBox" name="m_pDoubleSpinBoxJoint_3"/>
            </item>
            <item>
             <widget class="QSlider" name="m_pHorizontalSliderJoint_3">
              <property name="orientation">
               <enum>Qt::Horizontal</enum>
              </property>
             </widget>
            </item>
           </layout>
          </item>
          <item>
           <layout class="QHBoxLayout" name="m_pHorizontalLayoutJoint_4">
            <item>
             <widget class="QLabel" name="m_pLabelRobotJoint_4">
              <property name="text">
               <string>Joint_4</string>
              </property>
             </widget>
            </item>
            <item>
             <widget class="QDoubleSpinBox" name="m_pDoubleSpinBoxJoint_4"/>
            </item>
            <item>
             <widget class="QSlider" name="m_pHorizontalSliderJoint_4">
              <property name="orientation">
               <enum>Qt::Horizontal</enum>
              </property>
             </widget>
            </item>
           </layout>
          </item>
          <item>
           <layout class="QHBoxLayout" name="m_pHorizontalLayoutJoint_5">
            <item>
             <widget class="QLabel" name="m_pLabelRobotJoint_5">
              <property name="text">
               <string>Joint_5</string>
              </property>
             </widget>
            </item>
            <item>
             <widget class="QDoubleSpinBox" name="m_pDoubleSpinBoxJoint_5"/>
            </item>
            <item>
             <widget class="QSlider" name="m_pHorizontalSliderJoint_5">
              <property name="orientation">
               <enum>Qt::Horizontal</enum>
              </property>
             </widget>
            </item>
           </layout>
          </item>
          <item>
           <layout class="QHBoxLayout" name="m_pHorizontalLayoutJoint_6">
            <item>
             <widget class="QLabel" name="m_pLabelRobotJoint_6">
              <property name="text">
               <string>Joint_6</string>
              </property>
             </widget>
            </item>
            <item>
             <widget class="QDoubleSpinBox" name="m_pDoubleSpinBoxJoint_6"/>
            </item>
            <item>
             <widget class="QSlider" name="m_pHorizontalSliderJoint_6">
              <property name="orientation">
               <enum>Qt::Horizontal</enum>
              </property>
             </widget>
            </item>
           </layout>
          </item>
         </layout>
        </widget>
       </widget>
      </item>
      <item>
       <widget class="QGroupBox" name="m_pGroupBoxTargetJointsSettingCenter">
        <property name="title">
         <string/>
        </property>
        <widget class="QWidget" name="m_pMainWidget">
         <property name="geometry">
          <rect>
           <x>10</x>
           <y>30</y>
           <width>361</width>
           <height>141</height>
          </rect>
         </property>
         <layout class="QVBoxLayout" name="m_pVerticalLayoutTargetJointsSettingCenter">
          <item>
           <layout class="QHBoxLayout" name="m_pHorizontalLayoutTargetJointsLabel">
            <item>
             <widget class="QLabel" name="m_pLabelSettingJoints">
              <property name="text">
               <string>末端关节值</string>
              </property>
             </widget>
            </item>
            <item>
             <widget class="QCheckBox" name="m_pCheckBoxDegree">
              <property name="text">
               <string>弧度</string>
              </property>
             </widget>
            </item>
           </layout>
          </item>
          <item>
           <widget class="QTextEdit" name="m_pTextEditTargetJoints"/>
          </item>
         </layout>
        </widget>
       </widget>
      </item>
      <item>
       <widget class="QGroupBox" name="m_pGroupBoxOtherModelSetting">
        <property name="title">
         <string/>
        </property>
        <widget class="QWidget" name="m_pMainWidget">
         <property name="geometry">
          <rect>
           <x>10</x>
           <y>30</y>
           <width>361</width>
           <height>151</height>
          </rect>
         </property>
         <layout class="QVBoxLayout" name="m_pVerticalLayoutOtherModel">
          <item>
           <layout class="QHBoxLayout" name="m_pHorizontalLayoutOtherModel">
            <item>
             <widget class="QLabel" name="m_pLabelOtherModelTransformName">
              <property name="text">
               <string>头部到机器人坐标转换矩阵:</string>
              </property>
             </widget>
            </item>
            <item>
             <widget class="QCheckBox" name="m_pCheckBoxTransformUnitOfLength">
              <property name="text">
               <string>米</string>
              </property>
             </widget>
            </item>
            <item>
             <widget class="QCheckBox" name="m_pCheckBoxOtherModelDegree">
              <property name="text">
               <string>弧度</string>
              </property>
             </widget>
            </item>
           </layout>
          </item>
          <item>
           <widget class="QTextEdit" name="m_pTextEditOtherModelTransform"/>
          </item>
         </layout>
        </widget>
       </widget>
      </item>
     </layout>
    </item>
   </layout>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

robot_target_joint.cpp

#include "robot_target_joint.h"
InputText::InputText(QWidget *parent) : QTextEdit(parent) {}

InputText::~InputText() = default;

void InputText::emitValue()
{
    QString sValue = toPlainText();
    emit SetValue(sValue);
}

void InputText::SetValue()
{
    emitValue();
}

robot_target_joint.h

#ifndef NEWTRAVEL_ROBOT_TARGET_JOINT_H
#define NEWTRAVEL_ROBOT_TARGET_JOINT_H
#include <QtWidgets/QTextEdit>

class InputText : public QTextEdit
{
Q_OBJECT
public:
    InputText(QWidget *parent = nullptr);
    ~InputText() override;

signals :
    void SetValue(const QString &oFilePath);
public  Q_SLOTS:
    void SetValue();
public:
    void emitValue();
};

#endif // NEWTRAVEL_ROBOT_TARGET_JOINT_H

simulation.h

#ifndef NEWTRAVEL_SIMULATION_H
#define NEWTRAVEL_SIMULATION_H
#include <QFileDialog>

#include "robot_body_load.h"
#include "robot_joint_degree_control_slider.h"
#include "robot_joint_degree_spinbox.h"
#include "robot_joint_label.h"
#include "robot_other_model_transform.h"
#include "robot_pushbutton_openfile.h"
#include "robot_pushbutton_send_message.h"
#include "robot_target_joint.h"
#include "ui_robot_simulation_platform.h"
#include <QGroupBox>
#include <QKeyEvent>
#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui
{
class RobotSimulationPlatform;
}

namespace Ui
{

class RobotSimulation : public RobotSimulationPlatform, public QWidget
{
public:
    RobotSimulation(QWidget *parent = nullptr);
    void Init();

    void InitIconInitialPosition();
    void InitSignalConnection();
    void SetUpUI(QWidget *RobotSimulationPlatform);
    void RetranslateUi(QWidget *RobotSimulationPlatform);

public:
    void InitMainWindow(QWidget *RobotSimulationPlatform);
    void InitRobotShowGroupt(QWidget *pQWidget);

    void InitRobotShowAndButtonVerticalLayout();
    void InitMainGridLayout(QWidget *pQWidget);
    void InitPushButtonGroup();
    void InitRobotControllerVerticalLayout();
    void InitRobtJointsGroup();
    void InitRobtJointsWidget();
    void InitRobotJointsVerticalLayout();
    void InitRobtJoint_1HorizontalLayout();
    void InitRobotJointsController();

    void InitRobotTargetJointSettingFormat();
    void InitRobotTargetJointSettingComponent();

    void InitLoadOtherModelComponent();
    void InitLoadOtherModelFormat();

    void SetMainGridLayout();
    void SetRobotShowAndButtonVerticalLayout();
    void SetRobotControllerVerticalLayout();
    void SetRobotJointsController();
    void SetRobotJointsVerticalLayout();

    void SetRobotTargetJointsFormat();
    void SetLoadOtherModelFormat();

    void keyPressEvent(QKeyEvent *ev) override;

private:
    RobotJointSpinBox *m_pMySpinBox[6]{};
    RobotJointDegreeControlSlider *m_pMySlider[6]{};
    RobotJointLabel *m_pMyJointLabel[6]{};
    QHBoxLayout *m_pRobotJointsHorizontalLayout[6]{};
    OpenFile *pOpenFile{};
    FileDialog *m_pFileDialog{};
    InputText *m_pTargetJoints;
    SendButton *m_pSendButton;
    OtherModelTrans *m_pOtherModelTrans;
};

RobotSimulation::RobotSimulation(QWidget *parent) : QWidget(parent)
{
    Init();
    SetUpUI(this);
    InitIconInitialPosition();
    InitSignalConnection();
}

void RobotSimulation::SetUpUI(QWidget *RobotSimulationPlatform)
{
    if (RobotSimulationPlatform->objectName().isEmpty())
        RobotSimulationPlatform->setObjectName(QString::fromUtf8("RobotSimulationPlatform"));

    InitMainWindow(RobotSimulationPlatform);
    InitMainGridLayout(m_pMainWidget);

    InitRobotShowGroupt(m_pMainWidget);
    InitPushButtonGroup();

    InitRobotShowAndButtonVerticalLayout();
    SetRobotShowAndButtonVerticalLayout();

    InitRobtJointsGroup();
    InitRobtJointsWidget();

    InitRobtJoint_1HorizontalLayout();

    InitRobotJointsController();
    SetRobotJointsController();

    InitRobotJointsVerticalLayout();
    SetRobotJointsVerticalLayout();

    InitRobotTargetJointSettingFormat();

    InitRobotTargetJointSettingComponent();

    SetRobotTargetJointsFormat();

    InitLoadOtherModelFormat();
    InitLoadOtherModelComponent();
    //

    SetLoadOtherModelFormat();

    InitRobotControllerVerticalLayout();
    SetRobotControllerVerticalLayout();

    SetMainGridLayout();

    QMetaObject::connectSlotsByName(RobotSimulationPlatform);
    RetranslateUi(RobotSimulationPlatform);
}

void RobotSimulation::RetranslateUi(QWidget *RobotSimulationPlatform)
{
    RobotSimulationPlatform->setWindowTitle(
        QApplication::translate("RobotSimulationPlatform", "RobotSimulationPlatform", nullptr));

} // retranslateUi

void RobotSimulation::InitIconInitialPosition()
{
    for (int ii = 0; ii < 6; ++ii)
    {
        m_pMySpinBox[ii]->SetLimitValue(180, -180, 1);
        m_pMySlider[ii]->setMaximum(180);
        m_pMySlider[ii]->setMinimum(-180);
        m_pMySlider[ii]->setValue(0);
    }
}

void RobotSimulation::InitSignalConnection()
{
    for (int ii = 0; ii < 6; ++ii)
    {
        QObject::connect(m_pMySlider[ii], SIGNAL(valueChanged(double)), m_pMySpinBox[ii], SLOT(setValue(double)));
        QObject::connect(m_pMySpinBox[ii], SIGNAL(valueChanged(double)), m_pMySlider[ii], SLOT(setValue(double)));
    }
    QObject::connect(
        m_pMySlider[0], SIGNAL(valueChanged(double)), openGLWidget, SLOT(SetRotationAngleOfJoint_0(double)));
    QObject::connect(
        m_pMySlider[1], SIGNAL(valueChanged(double)), openGLWidget, SLOT(SetRotationAngleOfJoint_1(double)));
    QObject::connect(
        m_pMySlider[2], SIGNAL(valueChanged(double)), openGLWidget, SLOT(SetRotationAngleOfJoint_2(double)));
    QObject::connect(
        m_pMySlider[3], SIGNAL(valueChanged(double)), openGLWidget, SLOT(SetRotationAngleOfJoint_3(double)));
    QObject::connect(
        m_pMySlider[4], SIGNAL(valueChanged(double)), openGLWidget, SLOT(SetRotationAngleOfJoint_4(double)));
    QObject::connect(
        m_pMySlider[5], SIGNAL(valueChanged(double)), openGLWidget, SLOT(SetRotationAngleOfJoint_5(double)));
    QObject::connect(
        m_pFileDialog, SIGNAL(fileSelected(const QString &)), openGLWidget, SLOT(SetFilePath(const QString &)));

    QObject::connect(m_pSendButton, SIGNAL(SendMessage()), m_pTargetJoints, SLOT(SetValue()));
    QObject::connect(
        m_pTargetJoints, SIGNAL(SetValue(const QString &)), openGLWidget, SLOT(setTargetJoints(const QString &)));

    QObject::connect(m_pSendButton, SIGNAL(SendMessage()), m_pOtherModelTrans, SLOT(SetValue()));
    QObject::connect(
        m_pOtherModelTrans, SIGNAL(SetValue(QMatrix4x4)), openGLWidget, SLOT(SetOtherModelTransform(QMatrix4x4)));

    QObject::connect(openGLWidget, SIGNAL(SetRotationOfJoint_0(double)), m_pMySlider[0], SLOT(setValue(double)));
    QObject::connect(openGLWidget, SIGNAL(SetRotationOfJoint_1(double)), m_pMySlider[1], SLOT(setValue(double)));
    QObject::connect(openGLWidget, SIGNAL(SetRotationOfJoint_2(double)), m_pMySlider[2], SLOT(setValue(double)));
    QObject::connect(openGLWidget, SIGNAL(SetRotationOfJoint_3(double)), m_pMySlider[3], SLOT(setValue(double)));
    QObject::connect(openGLWidget, SIGNAL(SetRotationOfJoint_4(double)), m_pMySlider[4], SLOT(setValue(double)));
    QObject::connect(openGLWidget, SIGNAL(SetRotationOfJoint_5(double)), m_pMySlider[5], SLOT(setValue(double)));

    QObject::connect(m_pCheckBoxDegree, SIGNAL(clicked(bool)), openGLWidget, SLOT(SetTargetJointDegreeFlag(bool)));
    QObject::connect(
        m_pCheckBoxTransformUnitOfLength, SIGNAL(clicked(bool)), openGLWidget, SLOT(SetUnitOfLength(bool)));
}

void RobotSimulation::InitRobotShowGroupt(QWidget *pQWidget)
{
    m_pRobotGroup = new QGroupBox(pQWidget);
    m_pRobotGroup->setObjectName(QString::fromUtf8("groupBox_4"));
    openGLWidget = new RobotBody(m_pRobotGroup);
    openGLWidget->setObjectName(QString::fromUtf8("openGLWidget"));
    openGLWidget->setEnabled(true);
    openGLWidget->setGeometry(QRect(20, 40, 721, 611));
    openGLWidget->setMinimumSize(QSize(650, 600));
}

void RobotSimulation::InitMainGridLayout(QWidget *pQWidget)
{
    m_pMainGridLayout = new QGridLayout(pQWidget);
    m_pMainGridLayout->setObjectName(QString::fromUtf8("gridLayout"));
}

void RobotSimulation::InitRobotShowAndButtonVerticalLayout()
{
    m_pRobotShowAndButtonVerticalLayout = new QVBoxLayout();
    m_pRobotShowAndButtonVerticalLayout->setSpacing(6);
    m_pRobotShowAndButtonVerticalLayout->setObjectName(QString::fromUtf8("verticalLayout_4"));
}

void RobotSimulation::InitMainWindow(QWidget *RobotSimulationPlatform)
{
    RobotSimulationPlatform->resize(1200, 850);
    RobotSimulationPlatform->setWindowTitle("史陶比尔机器人三维仿真软件");

    m_pMainWidget = new QWidget(RobotSimulationPlatform);
    m_pMainWidget->setObjectName(QString::fromUtf8("layoutWidget"));
    m_pMainWidget->setGeometry(QRect(10, 10, 1151, 791));
}

void RobotSimulation::InitPushButtonGroup()
{
    m_pPushButtonGroup = new QGroupBox(m_pMainWidget);
    m_pPushButtonGroup->setObjectName(QString::fromUtf8("groupBox_5"));
    m_pSplitterPushButton = new QSplitter(m_pPushButtonGroup);
    m_pSplitterPushButton->setObjectName(QString::fromUtf8("splitter_3"));
    m_pSplitterPushButton->setGeometry(QRect(0, 20, 311, 41));
    m_pSplitterPushButton->setOrientation(Qt::Horizontal);
    m_pFileDialog = new FileDialog(m_pSplitterPushButton);
    pOpenFile = new OpenFile(m_pFileDialog, m_pSplitterPushButton);
    pOpenFile->setObjectName(QString::fromUtf8("pushButton"));
    pOpenFile->setText("加载存储模型路径文件");

    m_pSplitterPushButton->addWidget(pOpenFile);
    m_pSendButton = new SendButton(m_pSplitterPushButton);
    m_pSendButton->setObjectName(QString::fromUtf8("pushButton"));
    m_pSendButton->setText("确认");
    m_pSplitterPushButton->addWidget(m_pSendButton);
}

void RobotSimulation::SetRobotShowAndButtonVerticalLayout()
{
    m_pRobotShowAndButtonVerticalLayout->addWidget(m_pRobotGroup);
    m_pRobotShowAndButtonVerticalLayout->addWidget(m_pPushButtonGroup);

    m_pRobotShowAndButtonVerticalLayout->setStretch(0, 6);
    m_pRobotShowAndButtonVerticalLayout->setStretch(1, 1);
}

void RobotSimulation::SetMainGridLayout()
{
    m_pMainGridLayout->setContentsMargins(0, 0, 0, 0);
    m_pMainGridLayout->addLayout(m_pRobotShowAndButtonVerticalLayout, 0, 0, 1, 1);
    m_pMainGridLayout->addLayout(m_pVerticalLayoutRobotController, 0, 1, 1, 1);
    m_pMainGridLayout->setColumnStretch(0, 2);
    m_pMainGridLayout->setColumnStretch(1, 1);
}

void RobotSimulation::InitRobotControllerVerticalLayout()
{
    m_pVerticalLayoutRobotController = new QVBoxLayout();
    m_pVerticalLayoutRobotController->setObjectName(QString::fromUtf8("verticalLayout_5"));
}
void RobotSimulation::SetRobotControllerVerticalLayout()
{
    m_pVerticalLayoutRobotController->addWidget(m_pGroupBoxRobotJoints);
    m_pVerticalLayoutRobotController->addWidget(m_pGroupBoxTargetJointsSettingCenter);
    m_pVerticalLayoutRobotController->addWidget(m_pGroupBoxOtherModelSetting);

    m_pVerticalLayoutRobotController->setStretch(0, 2);
    m_pVerticalLayoutRobotController->setStretch(1, 1);
    m_pVerticalLayoutRobotController->setStretch(2, 1);
}
void RobotSimulation::InitRobtJointsGroup()
{
    m_pGroupBoxRobotJoints = new QGroupBox(m_pMainWidget);
    m_pGroupBoxRobotJoints->setObjectName(QString::fromUtf8("groupBox"));
    m_pGroupBoxRobotJoints->setMinimumSize(QSize(2, 12));
    m_pGroupBoxRobotJoints->setTabletTracking(false);
}
void RobotSimulation::InitRobtJointsWidget()
{
    m_pQWidgetRobotJoint = new QWidget(m_pGroupBoxRobotJoints);
    m_pQWidgetRobotJoint->setObjectName(QString::fromUtf8("layoutWidget1"));
    m_pQWidgetRobotJoint->setGeometry(QRect(10, 30, 361, 250));
}

void RobotSimulation::InitRobotJointsVerticalLayout()
{
    m_pVerticalLayoutRobotJoints = new QVBoxLayout(m_pQWidgetRobotJoint);
    m_pVerticalLayoutRobotJoints->setSpacing(16);
    m_pVerticalLayoutRobotJoints->setObjectName(QString::fromUtf8("verticalLayout"));
    m_pVerticalLayoutRobotJoints->setContentsMargins(0, 0, 0, 0);
}

void RobotSimulation::InitRobtJoint_1HorizontalLayout()
{
    for (auto &ii : m_pRobotJointsHorizontalLayout)
    {
        ii = new QHBoxLayout();
        ii->setObjectName(QString::fromUtf8("horizontalLayout"));
    }
}

void RobotSimulation::Init()
{
    m_pRobotJointsHorizontalLayout[0] = m_pHorizontalLayoutJoint_1;
    m_pRobotJointsHorizontalLayout[1] = m_pHorizontalLayoutJoint_2;
    m_pRobotJointsHorizontalLayout[2] = m_pHorizontalLayoutJoint_3;
    m_pRobotJointsHorizontalLayout[3] = m_pHorizontalLayoutJoint_4;
    m_pRobotJointsHorizontalLayout[4] = m_pHorizontalLayoutJoint_5;
    m_pRobotJointsHorizontalLayout[5] = m_pHorizontalLayoutJoint_6;
}

void RobotSimulation::InitRobotJointsController()
{
    for (int ii = 0; ii < 6; ++ii)
    {
        m_pMyJointLabel[ii] = new RobotJointLabel();
        m_pMyJointLabel[ii]->Initial(ii);

        m_pMySpinBox[ii] = new RobotJointSpinBox(m_pQWidgetRobotJoint);
        m_pMySpinBox[ii]->setObjectName(QString::fromUtf8("doubleSpinBox"));

        m_pMySlider[ii] = new RobotJointDegreeControlSlider(m_pQWidgetRobotJoint);
        m_pMySlider[ii]->setObjectName(QString::fromUtf8("horizontalSlider"));
        m_pMySlider[ii]->setOrientation(Qt::Horizontal);
    }
}
void RobotSimulation::SetRobotJointsController()
{
    for (int ii = 0; ii < 6; ++ii)
    {
        m_pRobotJointsHorizontalLayout[ii]->addWidget(m_pMyJointLabel[ii]);
        m_pRobotJointsHorizontalLayout[ii]->addWidget(m_pMySpinBox[ii]);
        m_pRobotJointsHorizontalLayout[ii]->addWidget(m_pMySlider[ii]);
    }
}

void RobotSimulation::SetRobotJointsVerticalLayout()
{
    m_pVerticalLayoutRobotJoints->addLayout(m_pRobotJointsHorizontalLayout[0]);
    m_pVerticalLayoutRobotJoints->addLayout(m_pRobotJointsHorizontalLayout[1]);
    m_pVerticalLayoutRobotJoints->addLayout(m_pRobotJointsHorizontalLayout[2]);
    m_pVerticalLayoutRobotJoints->addLayout(m_pRobotJointsHorizontalLayout[3]);
    m_pVerticalLayoutRobotJoints->addLayout(m_pRobotJointsHorizontalLayout[4]);
    m_pVerticalLayoutRobotJoints->addLayout(m_pRobotJointsHorizontalLayout[5]);
}
void RobotSimulation::InitRobotTargetJointSettingFormat()
{
    m_pGroupBoxTargetJointsSettingCenter = new QGroupBox(m_pMainWidget);
    m_pGroupBoxTargetJointsSettingCenter->setObjectName(QString::fromUtf8("groupBox_3"));

    m_pWidgetTargetJointsSettingCenter = new QWidget(m_pGroupBoxTargetJointsSettingCenter);
    m_pWidgetTargetJointsSettingCenter->setObjectName(QString::fromUtf8("layoutWidget2"));
    m_pWidgetTargetJointsSettingCenter->setGeometry(QRect(10, 30, 361, 141));

    m_pVerticalLayoutTargetJointsSettingCenter = new QVBoxLayout(m_pWidgetTargetJointsSettingCenter);
    m_pVerticalLayoutTargetJointsSettingCenter->setObjectName(QString::fromUtf8("verticalLayout_2"));
    m_pVerticalLayoutTargetJointsSettingCenter->setContentsMargins(0, 0, 0, 0);

    m_pHorizontalLayoutTargetJointsLabel = new QHBoxLayout();
    m_pHorizontalLayoutTargetJointsLabel->setObjectName(QString::fromUtf8("horizontalLayout_7"));
}

void RobotSimulation::InitRobotTargetJointSettingComponent()
{
    m_pLabelSettingJoints = new QLabel(m_pWidgetTargetJointsSettingCenter);
    m_pLabelSettingJoints->setObjectName(QString::fromUtf8("Target joints"));
    m_pLabelSettingJoints->setText("目标关节值");

    m_pCheckBoxDegree = new QCheckBox(m_pWidgetTargetJointsSettingCenter);
    m_pCheckBoxDegree->setObjectName(QString::fromUtf8("Angular unit about target joint"));
    m_pCheckBoxDegree->setText("弧度");

    //    m_pTextEditTargetJoints = new QTextEdit(m_pWidgetTargetJointsSettingCenter);
    //    m_pTextEditTargetJoints->setObjectName(QString::fromUtf8("textEdit"));

    m_pTargetJoints = new InputText(m_pWidgetTargetJointsSettingCenter);
    m_pTargetJoints->setObjectName(QString::fromUtf8("textEdit"));
    m_pTargetJoints->setText("0,0,0,0,0,0");
}
void RobotSimulation::SetRobotTargetJointsFormat()
{
    m_pHorizontalLayoutTargetJointsLabel->addWidget(m_pLabelSettingJoints);
    m_pHorizontalLayoutTargetJointsLabel->addWidget(m_pCheckBoxDegree);
    m_pVerticalLayoutTargetJointsSettingCenter->addLayout(m_pHorizontalLayoutTargetJointsLabel);
    m_pVerticalLayoutTargetJointsSettingCenter->addWidget(m_pTargetJoints);
}
void RobotSimulation::InitLoadOtherModelComponent()
{

    m_pLabelOtherModelTransformName = new QLabel(m_pWidgetOtherModelSetting);
    m_pLabelOtherModelTransformName->setObjectName(QString::fromUtf8("Transform from other model to robot"));
    m_pLabelOtherModelTransformName->setText("到机器人坐标系的转换矩阵");

    m_pCheckBoxTransformUnitOfLength = new QCheckBox(m_pWidgetOtherModelSetting);
    m_pCheckBoxTransformUnitOfLength->setObjectName(QString::fromUtf8("Unit Of Length"));
    m_pCheckBoxTransformUnitOfLength->setText("毫米");
    m_pCheckBoxTransformUnitOfLength->setChecked(true);

    m_pCheckBoxOtherModelDegree = new QCheckBox(m_pWidgetOtherModelSetting);
    m_pCheckBoxOtherModelDegree->setObjectName(QString::fromUtf8("Angular Unit"));
    m_pCheckBoxOtherModelDegree->setText("弧度");

    m_pOtherModelTrans = new OtherModelTrans(m_pWidgetOtherModelSetting);
    m_pOtherModelTrans->setObjectName(QString::fromUtf8("textEdit_2"));
    m_pOtherModelTrans->setText("Transform(Vector3D(0, -1000, 0), Rotation({1, 0, "
                                "0},{0, 1, 0},{0, 0, 1}))");
}
void RobotSimulation::InitLoadOtherModelFormat()
{
    m_pGroupBoxOtherModelSetting = new QGroupBox(m_pMainWidget);
    m_pGroupBoxOtherModelSetting->setObjectName(QString::fromUtf8("groupBox_2"));

    m_pWidgetOtherModelSetting = new QWidget(m_pGroupBoxOtherModelSetting);
    m_pWidgetOtherModelSetting->setObjectName(QString::fromUtf8("layoutWidget3"));
    m_pWidgetOtherModelSetting->setGeometry(QRect(10, 30, 361, 151));

    m_pVerticalLayoutOtherModel = new QVBoxLayout(m_pWidgetOtherModelSetting);
    m_pVerticalLayoutOtherModel->setObjectName(QString::fromUtf8("verticalLayout_3"));
    m_pVerticalLayoutOtherModel->setContentsMargins(0, 0, 0, 0);

    m_pHorizontalLayoutOtherModel = new QHBoxLayout();
    m_pHorizontalLayoutOtherModel->setObjectName(QString::fromUtf8("horizontalLayout_8"));
}

void RobotSimulation::SetLoadOtherModelFormat()
{
    m_pHorizontalLayoutOtherModel->addWidget(m_pLabelOtherModelTransformName);
    m_pHorizontalLayoutOtherModel->addWidget(m_pCheckBoxTransformUnitOfLength);
    m_pHorizontalLayoutOtherModel->addWidget(m_pCheckBoxOtherModelDegree);
    m_pVerticalLayoutOtherModel->addLayout(m_pHorizontalLayoutOtherModel);
    m_pVerticalLayoutOtherModel->addWidget(m_pOtherModelTrans);
}

void RobotSimulation::keyPressEvent(QKeyEvent *ev)
{
    if (ev->key() == Qt::Key_Escape)
    {
        close();
    }
    else if (ev->key() == Qt::Key_E)
    {
        m_pTargetJoints->emitValue();
    }
}

} // namespace Ui

QT_END_NAMESPACE

#endif // NEWTRAVEL_SIMULATION_H

ui_robot_simulation_platform.h

/********************************************************************************
** Form generated from reading UI file 'robot_simulation_platform.ui'
**
** Created by: Qt User Interface Compiler version 5.12.8
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_ROBOT_SIMULATION_PLATFORM_H
#define UI_ROBOT_SIMULATION_PLATFORM_H

#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QCheckBox>
#include <QtWidgets/QDoubleSpinBox>
#include <QtWidgets/QGridLayout>
#include <QtWidgets/QGroupBox>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QLabel>
#include <QtWidgets/QOpenGLWidget>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QSlider>
#include <QtWidgets/QSplitter>
#include <QtWidgets/QTextEdit>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_RobotSimulationPlatform
{
public:
    QWidget *m_pMainWidget;
    QGridLayout *m_pMainGridLayout;
    QVBoxLayout *m_pRobotShowAndButtonVerticalLayout;
    QGroupBox *m_pRobotGroup;
    QOpenGLWidget *openGLWidget;
    QGroupBox *m_pPushButtonGroup;
    QSplitter *m_pSplitterPushButton;
    QPushButton *pushButton;
    QPushButton *pushButton_2;
    QVBoxLayout *m_pVerticalLayoutRobotController;
    QGroupBox *m_pGroupBoxRobotJoints;
    QWidget *m_pQWidgetRobotJoint;
    QVBoxLayout *m_pVerticalLayoutRobotJoints;

    QHBoxLayout *m_pHorizontalLayoutJoint_1;
    QLabel *m_pLabelRobotJoint_1;
    QDoubleSpinBox *m_pDoubleSpinBoxJoint_1;
    QSlider *m_pHorizontalSliderJoint_1;

    QHBoxLayout *m_pHorizontalLayoutJoint_2;
    QLabel *m_pLabelRobotJoint_2;
    QDoubleSpinBox *m_pDoubleSpinBoxJoint_2;
    QSlider *m_pHorizontalSliderJoint_2;

    QHBoxLayout *m_pHorizontalLayoutJoint_3;
    QLabel *m_pLabelRobotJoint_3;
    QDoubleSpinBox *m_pDoubleSpinBoxJoint_3;
    QSlider *m_pHorizontalSliderJoint_3;

    QHBoxLayout *m_pHorizontalLayoutJoint_4;
    QLabel *m_pLabelRobotJoint_4;
    QDoubleSpinBox *m_pDoubleSpinBoxJoint_4;
    QSlider *m_pHorizontalSliderJoint_4;

    QHBoxLayout *m_pHorizontalLayoutJoint_5;
    QLabel *m_pLabelRobotJoint_5;
    QDoubleSpinBox *m_pDoubleSpinBoxJoint_5;
    QSlider *m_pHorizontalSliderJoint_5;

    QHBoxLayout *m_pHorizontalLayoutJoint_6;
    QLabel *m_pLabelRobotJoint_6;
    QDoubleSpinBox *m_pDoubleSpinBoxJoint_6;
    QSlider *m_pHorizontalSliderJoint_6;

    QGroupBox *m_pGroupBoxTargetJointsSettingCenter;
    QWidget *m_pWidgetTargetJointsSettingCenter;
    QVBoxLayout *m_pVerticalLayoutTargetJointsSettingCenter;
    QHBoxLayout *m_pHorizontalLayoutTargetJointsLabel;
    QLabel *m_pLabelSettingJoints;
    QCheckBox *m_pCheckBoxDegree;
    QTextEdit *m_pTextEditTargetJoints;

    QGroupBox *m_pGroupBoxOtherModelSetting;
    QWidget *m_pWidgetOtherModelSetting;
    QVBoxLayout *m_pVerticalLayoutOtherModel;
    QHBoxLayout *m_pHorizontalLayoutOtherModel;
    QLabel *m_pLabelOtherModelTransformName;
    QCheckBox *m_pCheckBoxTransformUnitOfLength;
    QCheckBox *m_pCheckBoxOtherModelDegree;
    QTextEdit *m_pTextEditOtherModelTransform;

    void setupUi(QWidget *RobotSimulationPlatform)
    {
        if (RobotSimulationPlatform->objectName().isEmpty())
            RobotSimulationPlatform->setObjectName(QString::fromUtf8("RobotSimulationPlatform"));
        RobotSimulationPlatform->resize(1210, 916);
        m_pMainWidget = new QWidget(RobotSimulationPlatform);
        m_pMainWidget->setObjectName(QString::fromUtf8("layoutWidget"));
        m_pMainWidget->setGeometry(QRect(10, 10, 1151, 791));
        m_pMainGridLayout = new QGridLayout(m_pMainWidget);
        m_pMainGridLayout->setObjectName(QString::fromUtf8("gridLayout"));
        m_pMainGridLayout->setContentsMargins(0, 0, 0, 0);
        m_pRobotShowAndButtonVerticalLayout = new QVBoxLayout();
        m_pRobotShowAndButtonVerticalLayout->setSpacing(6);
        m_pRobotShowAndButtonVerticalLayout->setObjectName(QString::fromUtf8("verticalLayout_4"));
        m_pRobotGroup = new QGroupBox(m_pMainWidget);
        m_pRobotGroup->setObjectName(QString::fromUtf8("groupBox_4"));
        openGLWidget = new QOpenGLWidget(m_pRobotGroup);
        openGLWidget->setObjectName(QString::fromUtf8("openGLWidget"));
        openGLWidget->setEnabled(true);
        openGLWidget->setGeometry(QRect(20, 40, 721, 611));
        openGLWidget->setMinimumSize(QSize(650, 600));

        m_pRobotShowAndButtonVerticalLayout->addWidget(m_pRobotGroup);

        m_pPushButtonGroup = new QGroupBox(m_pMainWidget);
        m_pPushButtonGroup->setObjectName(QString::fromUtf8("groupBox_5"));
        m_pSplitterPushButton = new QSplitter(m_pPushButtonGroup);
        m_pSplitterPushButton->setObjectName(QString::fromUtf8("splitter_3"));
        m_pSplitterPushButton->setGeometry(QRect(0, 20, 311, 41));
        m_pSplitterPushButton->setOrientation(Qt::Horizontal);
        pushButton = new QPushButton(m_pSplitterPushButton);
        pushButton->setObjectName(QString::fromUtf8("pushButton"));
        m_pSplitterPushButton->addWidget(pushButton);
        pushButton_2 = new QPushButton(m_pSplitterPushButton);
        pushButton_2->setObjectName(QString::fromUtf8("pushButton_2"));
        m_pSplitterPushButton->addWidget(pushButton_2);

        m_pRobotShowAndButtonVerticalLayout->addWidget(m_pPushButtonGroup);

        m_pRobotShowAndButtonVerticalLayout->setStretch(0, 6);
        m_pRobotShowAndButtonVerticalLayout->setStretch(1, 1);

        m_pMainGridLayout->addLayout(m_pRobotShowAndButtonVerticalLayout, 0, 0, 1, 1);

        m_pVerticalLayoutRobotController = new QVBoxLayout();
        m_pVerticalLayoutRobotController->setObjectName(QString::fromUtf8("verticalLayout_5"));
        m_pGroupBoxRobotJoints = new QGroupBox(m_pMainWidget);
        m_pGroupBoxRobotJoints->setObjectName(QString::fromUtf8("groupBox"));
        m_pGroupBoxRobotJoints->setMinimumSize(QSize(2, 12));
        m_pGroupBoxRobotJoints->setTabletTracking(false);
        m_pQWidgetRobotJoint = new QWidget(m_pGroupBoxRobotJoints);
        m_pQWidgetRobotJoint->setObjectName(QString::fromUtf8("layoutWidget1"));
        m_pQWidgetRobotJoint->setGeometry(QRect(10, 30, 361, 250));
        m_pVerticalLayoutRobotJoints = new QVBoxLayout(m_pQWidgetRobotJoint);
        m_pVerticalLayoutRobotJoints->setSpacing(16);
        m_pVerticalLayoutRobotJoints->setObjectName(QString::fromUtf8("verticalLayout"));
        m_pVerticalLayoutRobotJoints->setContentsMargins(0, 0, 0, 0);
        m_pHorizontalLayoutJoint_1 = new QHBoxLayout();
        m_pHorizontalLayoutJoint_1->setObjectName(QString::fromUtf8("horizontalLayout"));
        m_pLabelRobotJoint_1 = new QLabel(m_pQWidgetRobotJoint);
        m_pLabelRobotJoint_1->setObjectName(QString::fromUtf8("label"));

        m_pHorizontalLayoutJoint_1->addWidget(m_pLabelRobotJoint_1);

        m_pDoubleSpinBoxJoint_1 = new QDoubleSpinBox(m_pQWidgetRobotJoint);
        m_pDoubleSpinBoxJoint_1->setObjectName(QString::fromUtf8("doubleSpinBox"));

        m_pHorizontalLayoutJoint_1->addWidget(m_pDoubleSpinBoxJoint_1);

        m_pHorizontalSliderJoint_1 = new QSlider(m_pQWidgetRobotJoint);
        m_pHorizontalSliderJoint_1->setObjectName(QString::fromUtf8("horizontalSlider"));
        m_pHorizontalSliderJoint_1->setMinimum(-180);
        m_pHorizontalSliderJoint_1->setMaximum(180);
        m_pHorizontalSliderJoint_1->setOrientation(Qt::Horizontal);

        m_pHorizontalLayoutJoint_1->addWidget(m_pHorizontalSliderJoint_1);

        m_pVerticalLayoutRobotJoints->addLayout(m_pHorizontalLayoutJoint_1);

        m_pHorizontalLayoutJoint_2 = new QHBoxLayout();
        m_pHorizontalLayoutJoint_2->setObjectName(QString::fromUtf8("horizontalLayout_2"));
        m_pLabelRobotJoint_2 = new QLabel(m_pQWidgetRobotJoint);
        m_pLabelRobotJoint_2->setObjectName(QString::fromUtf8("label_2"));

        m_pHorizontalLayoutJoint_2->addWidget(m_pLabelRobotJoint_2);

        m_pDoubleSpinBoxJoint_2 = new QDoubleSpinBox(m_pQWidgetRobotJoint);
        m_pDoubleSpinBoxJoint_2->setObjectName(QString::fromUtf8("doubleSpinBox_2"));

        m_pHorizontalLayoutJoint_2->addWidget(m_pDoubleSpinBoxJoint_2);

        m_pHorizontalSliderJoint_2 = new QSlider(m_pQWidgetRobotJoint);
        m_pHorizontalSliderJoint_2->setObjectName(QString::fromUtf8("horizontalSlider_2"));
        m_pHorizontalSliderJoint_2->setOrientation(Qt::Horizontal);

        m_pHorizontalLayoutJoint_2->addWidget(m_pHorizontalSliderJoint_2);

        m_pVerticalLayoutRobotJoints->addLayout(m_pHorizontalLayoutJoint_2);

        m_pHorizontalLayoutJoint_3 = new QHBoxLayout();
        m_pHorizontalLayoutJoint_3->setObjectName(QString::fromUtf8("horizontalLayout_3"));
        m_pLabelRobotJoint_3 = new QLabel(m_pQWidgetRobotJoint);
        m_pLabelRobotJoint_3->setObjectName(QString::fromUtf8("label_3"));

        m_pHorizontalLayoutJoint_3->addWidget(m_pLabelRobotJoint_3);

        m_pDoubleSpinBoxJoint_3 = new QDoubleSpinBox(m_pQWidgetRobotJoint);
        m_pDoubleSpinBoxJoint_3->setObjectName(QString::fromUtf8("doubleSpinBox_3"));

        m_pHorizontalLayoutJoint_3->addWidget(m_pDoubleSpinBoxJoint_3);

        m_pHorizontalSliderJoint_3 = new QSlider(m_pQWidgetRobotJoint);
        m_pHorizontalSliderJoint_3->setObjectName(QString::fromUtf8("horizontalSlider_3"));
        m_pHorizontalSliderJoint_3->setOrientation(Qt::Horizontal);

        m_pHorizontalLayoutJoint_3->addWidget(m_pHorizontalSliderJoint_3);

        m_pVerticalLayoutRobotJoints->addLayout(m_pHorizontalLayoutJoint_3);

        m_pHorizontalLayoutJoint_4 = new QHBoxLayout();
        m_pHorizontalLayoutJoint_4->setObjectName(QString::fromUtf8("horizontalLayout_4"));
        m_pLabelRobotJoint_4 = new QLabel(m_pQWidgetRobotJoint);
        m_pLabelRobotJoint_4->setObjectName(QString::fromUtf8("label_4"));

        m_pHorizontalLayoutJoint_4->addWidget(m_pLabelRobotJoint_4);

        m_pDoubleSpinBoxJoint_4 = new QDoubleSpinBox(m_pQWidgetRobotJoint);
        m_pDoubleSpinBoxJoint_4->setObjectName(QString::fromUtf8("doubleSpinBox_4"));

        m_pHorizontalLayoutJoint_4->addWidget(m_pDoubleSpinBoxJoint_4);

        m_pHorizontalSliderJoint_4 = new QSlider(m_pQWidgetRobotJoint);
        m_pHorizontalSliderJoint_4->setObjectName(QString::fromUtf8("horizontalSlider_4"));
        m_pHorizontalSliderJoint_4->setOrientation(Qt::Horizontal);

        m_pHorizontalLayoutJoint_4->addWidget(m_pHorizontalSliderJoint_4);

        m_pVerticalLayoutRobotJoints->addLayout(m_pHorizontalLayoutJoint_4);

        m_pHorizontalLayoutJoint_5 = new QHBoxLayout();
        m_pHorizontalLayoutJoint_5->setObjectName(QString::fromUtf8("horizontalLayout_5"));
        m_pLabelRobotJoint_5 = new QLabel(m_pQWidgetRobotJoint);
        m_pLabelRobotJoint_5->setObjectName(QString::fromUtf8("label_5"));

        m_pHorizontalLayoutJoint_5->addWidget(m_pLabelRobotJoint_5);

        m_pDoubleSpinBoxJoint_5 = new QDoubleSpinBox(m_pQWidgetRobotJoint);
        m_pDoubleSpinBoxJoint_5->setObjectName(QString::fromUtf8("doubleSpinBox_5"));

        m_pHorizontalLayoutJoint_5->addWidget(m_pDoubleSpinBoxJoint_5);

        m_pHorizontalSliderJoint_5 = new QSlider(m_pQWidgetRobotJoint);
        m_pHorizontalSliderJoint_5->setObjectName(QString::fromUtf8("horizontalSlider_5"));
        m_pHorizontalSliderJoint_5->setOrientation(Qt::Horizontal);

        m_pHorizontalLayoutJoint_5->addWidget(m_pHorizontalSliderJoint_5);

        m_pVerticalLayoutRobotJoints->addLayout(m_pHorizontalLayoutJoint_5);

        m_pHorizontalLayoutJoint_6 = new QHBoxLayout();
        m_pHorizontalLayoutJoint_6->setObjectName(QString::fromUtf8("horizontalLayout_6"));
        m_pLabelRobotJoint_6 = new QLabel(m_pQWidgetRobotJoint);
        m_pLabelRobotJoint_6->setObjectName(QString::fromUtf8("label_6"));

        m_pHorizontalLayoutJoint_6->addWidget(m_pLabelRobotJoint_6);

        m_pDoubleSpinBoxJoint_6 = new QDoubleSpinBox(m_pQWidgetRobotJoint);
        m_pDoubleSpinBoxJoint_6->setObjectName(QString::fromUtf8("doubleSpinBox_6"));

        m_pHorizontalLayoutJoint_6->addWidget(m_pDoubleSpinBoxJoint_6);

        m_pHorizontalSliderJoint_6 = new QSlider(m_pQWidgetRobotJoint);
        m_pHorizontalSliderJoint_6->setObjectName(QString::fromUtf8("horizontalSlider_6"));
        m_pHorizontalSliderJoint_6->setOrientation(Qt::Horizontal);

        m_pHorizontalLayoutJoint_6->addWidget(m_pHorizontalSliderJoint_6);

        m_pVerticalLayoutRobotJoints->addLayout(m_pHorizontalLayoutJoint_6);

        m_pVerticalLayoutRobotController->addWidget(m_pGroupBoxRobotJoints);

        m_pGroupBoxTargetJointsSettingCenter = new QGroupBox(m_pMainWidget);
        m_pGroupBoxTargetJointsSettingCenter->setObjectName(QString::fromUtf8("groupBox_3"));
        m_pWidgetTargetJointsSettingCenter = new QWidget(m_pGroupBoxTargetJointsSettingCenter);
        m_pWidgetTargetJointsSettingCenter->setObjectName(QString::fromUtf8("layoutWidget2"));
        m_pWidgetTargetJointsSettingCenter->setGeometry(QRect(10, 30, 361, 141));
        m_pVerticalLayoutTargetJointsSettingCenter = new QVBoxLayout(m_pWidgetTargetJointsSettingCenter);
        m_pVerticalLayoutTargetJointsSettingCenter->setObjectName(QString::fromUtf8("verticalLayout_2"));
        m_pVerticalLayoutTargetJointsSettingCenter->setContentsMargins(0, 0, 0, 0);
        m_pHorizontalLayoutTargetJointsLabel = new QHBoxLayout();
        m_pHorizontalLayoutTargetJointsLabel->setObjectName(QString::fromUtf8("horizontalLayout_7"));
        m_pLabelSettingJoints = new QLabel(m_pWidgetTargetJointsSettingCenter);
        m_pLabelSettingJoints->setObjectName(QString::fromUtf8("label_7"));

        m_pHorizontalLayoutTargetJointsLabel->addWidget(m_pLabelSettingJoints);

        m_pCheckBoxDegree = new QCheckBox(m_pWidgetTargetJointsSettingCenter);
        m_pCheckBoxDegree->setObjectName(QString::fromUtf8("checkBox"));

        m_pHorizontalLayoutTargetJointsLabel->addWidget(m_pCheckBoxDegree);

        m_pVerticalLayoutTargetJointsSettingCenter->addLayout(m_pHorizontalLayoutTargetJointsLabel);

        m_pTextEditTargetJoints = new QTextEdit(m_pWidgetTargetJointsSettingCenter);
        m_pTextEditTargetJoints->setObjectName(QString::fromUtf8("textEdit"));

        m_pVerticalLayoutTargetJointsSettingCenter->addWidget(m_pTextEditTargetJoints);

        m_pVerticalLayoutRobotController->addWidget(m_pGroupBoxTargetJointsSettingCenter);

        m_pGroupBoxOtherModelSetting = new QGroupBox(m_pMainWidget);
        m_pGroupBoxOtherModelSetting->setObjectName(QString::fromUtf8("groupBox_2"));
        m_pWidgetOtherModelSetting = new QWidget(m_pGroupBoxOtherModelSetting);
        m_pWidgetOtherModelSetting->setObjectName(QString::fromUtf8("layoutWidget3"));
        m_pWidgetOtherModelSetting->setGeometry(QRect(10, 30, 361, 151));
        m_pVerticalLayoutOtherModel = new QVBoxLayout(m_pWidgetOtherModelSetting);
        m_pVerticalLayoutOtherModel->setObjectName(QString::fromUtf8("verticalLayout_3"));
        m_pVerticalLayoutOtherModel->setContentsMargins(0, 0, 0, 0);
        m_pHorizontalLayoutOtherModel = new QHBoxLayout();
        m_pHorizontalLayoutOtherModel->setObjectName(QString::fromUtf8("horizontalLayout_8"));
        m_pLabelOtherModelTransformName = new QLabel(m_pWidgetOtherModelSetting);
        m_pLabelOtherModelTransformName->setObjectName(QString::fromUtf8("label_8"));

        m_pHorizontalLayoutOtherModel->addWidget(m_pLabelOtherModelTransformName);

        m_pCheckBoxTransformUnitOfLength = new QCheckBox(m_pWidgetOtherModelSetting);
        m_pCheckBoxTransformUnitOfLength->setObjectName(QString::fromUtf8("checkBox_3"));

        m_pHorizontalLayoutOtherModel->addWidget(m_pCheckBoxTransformUnitOfLength);

        m_pCheckBoxOtherModelDegree = new QCheckBox(m_pWidgetOtherModelSetting);
        m_pCheckBoxOtherModelDegree->setObjectName(QString::fromUtf8("checkBox_2"));

        m_pHorizontalLayoutOtherModel->addWidget(m_pCheckBoxOtherModelDegree);

        m_pVerticalLayoutOtherModel->addLayout(m_pHorizontalLayoutOtherModel);

        m_pTextEditOtherModelTransform = new QTextEdit(m_pWidgetOtherModelSetting);
        m_pTextEditOtherModelTransform->setObjectName(QString::fromUtf8("textEdit_2"));

        m_pVerticalLayoutOtherModel->addWidget(m_pTextEditOtherModelTransform);

        m_pVerticalLayoutRobotController->addWidget(m_pGroupBoxOtherModelSetting);

        m_pVerticalLayoutRobotController->setStretch(0, 2);
        m_pVerticalLayoutRobotController->setStretch(1, 1);
        m_pVerticalLayoutRobotController->setStretch(2, 1);

        m_pMainGridLayout->addLayout(m_pVerticalLayoutRobotController, 0, 1, 1, 1);

        m_pMainGridLayout->setColumnStretch(0, 2);
        m_pMainGridLayout->setColumnStretch(1, 1);

        retranslateUi(RobotSimulationPlatform);

        QMetaObject::connectSlotsByName(RobotSimulationPlatform);
    } // setupUi

    void retranslateUi(QWidget *RobotSimulationPlatform)
    {
        RobotSimulationPlatform->setWindowTitle(QApplication::translate("RobotSimulationPlatform", "RobotSimulationPlatform", nullptr));
        m_pRobotGroup->setTitle(QString());
        m_pPushButtonGroup->setTitle(QApplication::translate("RobotSimulationPlatform", "GroupBox", nullptr));
        pushButton->setText(QApplication::translate("RobotSimulationPlatform", "PushButton", nullptr));
        pushButton_2->setText(QApplication::translate("RobotSimulationPlatform", "PushButton", nullptr));
        m_pGroupBoxRobotJoints->setTitle(QString());
        m_pLabelRobotJoint_1->setText(QApplication::translate("RobotSimulationPlatform", "Joint_1", nullptr));
        m_pLabelRobotJoint_2->setText(QApplication::translate("RobotSimulationPlatform", "Joint_2", nullptr));
        m_pLabelRobotJoint_3->setText(QApplication::translate("RobotSimulationPlatform", "Joint_3", nullptr));
        m_pLabelRobotJoint_4->setText(QApplication::translate("RobotSimulationPlatform", "Joint_4", nullptr));
        m_pLabelRobotJoint_5->setText(QApplication::translate("RobotSimulationPlatform", "Joint_5", nullptr));
        m_pLabelRobotJoint_6->setText(QApplication::translate("RobotSimulationPlatform", "Joint_6", nullptr));
        m_pGroupBoxTargetJointsSettingCenter->setTitle(QString());
        m_pLabelSettingJoints->setText(QApplication::translate("RobotSimulationPlatform", "\346\234\253\347\253\257\345\205\263\350\212\202\345\200\274", nullptr));
        m_pCheckBoxDegree->setText(QApplication::translate("RobotSimulationPlatform", "\345\274\247\345\272\246", nullptr));
        m_pGroupBoxOtherModelSetting->setTitle(QString());
        m_pLabelOtherModelTransformName->setText(QApplication::translate("RobotSimulationPlatform", "\345\244\264\351\203\250\345\210\260\346\234\272\345\231\250\344\272\272\345\235\220\346\240\207\350\275\254\346\215\242\347\237\251\351\230\265\357\274\232", nullptr));
        m_pCheckBoxTransformUnitOfLength->setText(QApplication::translate("RobotSimulationPlatform", "\347\261\263", nullptr));
        m_pCheckBoxOtherModelDegree->setText(QApplication::translate("RobotSimulationPlatform", "\345\274\247\345\272\246", nullptr));
    } // retranslateUi

};

namespace Ui {
    class RobotSimulationPlatform: public Ui_RobotSimulationPlatform {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_ROBOT_SIMULATION_PLATFORM_H

 文章来源地址https://www.toymoban.com/news/detail-669897.html

到了这里,关于利用qt实现机器人可视化界面,并在界面上控制机器人各个关节运动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器人控制算法——局部规划器TEB算法原理及C++可视化仿真

    1.背景介绍 最近一段时间,由于项目需要,一直在做TEB算法的工程化的工作,于是就考虑写下一篇系统些的文章,作为笔记,后续自己看也方便,TEB的英文名Time elastic band”,是一种局部规划器,它的核心思想是将路径规划问题转化为一个带有时间弹性的优化问题,通过对时间弹

    2024年02月04日
    浏览(44)
  • C#,人工智能,机器人,路径规划,A*(AStar Algorithm)算法、源代码及计算数据可视化

    Peter Hart  Nils Nilsson  Bertram Raphael  参考: C#,人工智能(AI)机器人路径规划(Path Planning)的ARA*(Anytime Replanning A* Algorithm)算法与源程序 https://blog.csdn.net/beijinghorn/article/details/125464754 A*算法最初由斯坦福研究院(Stanford Institute)的  Peter Hart,Nils Nilsson,Bertram Raphael  发表于

    2024年01月18日
    浏览(69)
  • 利用ROS做机器人手眼标定和Qt+rviz+图片话题显示的UI设计

            博主是在上一篇博文的基础上作的研究和总结,希望这篇文章可以对诸君有用,同时博主也对鱼香ROS、小鱼大佬、以及其他相关创作者的支持表示由衷的感谢,本文章内容也将继续公开且代码开源。         文章将讲述usb_cam(usb相机内参标定)、handeye-calib(手眼标

    2024年02月21日
    浏览(50)
  • 利用ECharts实现winform中的可视化图表

    如今web端的图表可以说是非常丰富且用起来方便,ECharts已经非常成熟了,如果在winform中使用那就太好了。 使用winfrom程序封装一个web控件,然后进行展示就可以了,说干就干! 按照ECharts官网搞了一个折线图,效果如下 这里重点强调一下,不要使用webBrowser,因为这个东西的

    2024年02月03日
    浏览(64)
  • 利用大数据分析工具,实现多场景可视化数据管理

    https://yanhuang.yuque.com/staff-sbytbc/rb5rur? 购买服务器 购买腾讯云服务器,1300 元新人价,一年时间 ●4核16G内存 ●CentOS 6.7 (补充说明:最新的 2.7.1 GA 版本,8G 内存也是可以跑的,可以先使用8G,不够再做升级)。 安装docker环境 安装docker,速度还挺快的,大概3~5分钟内 1、注册鸿

    2024年02月14日
    浏览(58)
  • 利用阿里云物联网平台(IoT)实现WEB数据可视化

    一年前在阿里物联网平台测试过一个项目,后来就搁置了,昨天有事需要用,发现出错了。 调整完后写一下使用思路,以便未来之需。 阿里云物联网(IoT)主页:https://iot.aliyun.com/ 阿里云物联网(IoT)市场:https://linkmarket.aliyun.com/ 阿里云物联网(IoT)平台管理:https://iot.

    2024年02月12日
    浏览(70)
  • 利用Nginx可视化管理工具+Cpolar实现本地服务远程访问

    Nginx Proxy Manager 是一个开源的反向代理工具,不需要了解太多 Nginx 或 Letsencrypt 的相关知识,即可快速将你的服务暴露到外部环境,并且支持 SSL 配置。基于 Tabler 的美观且安全的管理界面,无需了解 Nginx 即可轻松创建转发域、重定向、流和 404 主机。 下面介绍在Linux 安装Nginx

    2024年02月06日
    浏览(54)
  • 利用kibana可视化DevTools界面实现ElasticSearch的索引和文档的增删查改

            ElasticSearch(简称ES)相对于传统的MySQL数据库来说,ES更擅长的是海量数据的搜索,分析和计算;如果是复杂搜索,无疑可以使用ElasticSearch。但是,传统的MySQL也有自己的有点,MySQL更擅长的是事务类型的操作,可以确保数据的安全和一致性;如果是有事务要求,如

    2024年02月08日
    浏览(51)
  • 碳排放预测模型 | Python实现基于机器学习的碳排放预测模型——数据清理和可视化

    效果一览 文章概述 碳排放预测模型 | Python实现基于机器学习的碳排放预测模型——数据清理和可视化 研究内容 碳排放被认为是全球变暖的最主要原因之一。 该项目旨在提供各国碳排放未来趋势的概述以及未来十年的全球趋势预测。 其方法是分析这些国家各种经济因素的历

    2024年02月11日
    浏览(49)
  • 大数据毕设-基于hadoop+spark+大数据+机器学习+大屏的电商商品数据分析可视化系统设计实现 电商平台数据可视化实时监控系统 评论数据情感分析

    🔥作者:雨晨源码🔥 💖简介:java、微信小程序、安卓;定制开发,远程调试 代码讲解,文档指导,ppt制作💖 精彩专栏推荐订阅:在下方专栏👇🏻👇🏻👇🏻👇🏻 Java精彩实战毕设项目案例 小程序精彩项目案例 Python实战项目案例 ​💕💕 文末获取源码 本次文章主要是

    2024年02月03日
    浏览(116)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包