ros qt gui机械臂ur robot正逆运动学界面

本文介绍了一个基于ROS的机械臂控制界面实现,涵盖了正逆运动学计算、ROS节点初始化、机械臂状态显示及rviz配置。通过交互式界面输入关节角度或末端位姿,调用Python脚本进行运动学求解,并展示结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

 

 

widget.cpp

#include "widget.h"
#include <QString>
#include <QDebug>
#include <QMessageBox>
#include <std_msgs/Int8.h>
#include <fstream>//文件读写
#include<vector>//提供向量头文件
#include<algorithm>//算法头文件,提供迭代器
#include<iomanip>//输出精度控制需要
#include <unistd.h>

Widget::Widget(int argc, char **argv, QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);    
    
    /*获取ip*/
    char name[256];
	gethostname(name, sizeof(name));
	struct hostent* host = gethostbyname(name);
	char ipStr[32];
	const char* ret = inet_ntop(host->h_addrtype, host->h_addr_list[0], ipStr, sizeof(ipStr));
	if (NULL==ret) {
		std::cout << "hostname transform to ip failed"<<endl;
	}
    else
    {
        std::cout<<ipStr<<endl;
        ui->edit_ip->setText(QString(ipStr));
    }//获取ip结束

    init_ros(argc, argv);//初始化ros
    /*获取ros master uri */
    XmlRpc::XmlRpcValue args, result, payload;
    args[0] = ros::this_node::getName();

    if (!ros::master::execute("getUri", args, result, payload, true)) {
        std::cout << "Failed!" << std::endl;
    }
    std::cout << "\n----------Master URI----------" << std::endl;
    std::cout << std::string(payload) << std::endl;
    QString uri=QString::fromStdString(std::string(payload));
    ui->edit_uri->setText(QString(uri));//获取ros master uri结束
    
    QObject::connect(ui->pushButton_start, SIGNAL(clicked()), this, SLOT(slot_btn_start()));
    QObject::connect(ui->pushButton_quit, SIGNAL(clicked()), this, SLOT(slot_btn_quit()));

    m_timer = new QTimer( this );
    QObject::connect( m_timer, SIGNAL(timeout()), this, SLOT(slot_timer()));
}

Widget::~Widget()
{
    delete m_timer;
    delete ui;
}

void Widget::init_ros(int argc, char **argv)
{
    ros::init(argc, argv, "ros_cmake");
    ros::NodeHandle private_nh("~");
    test_pub_ = private_nh.advertise<std_msgs::Int8>("test", 1000);
}

void Widget::on_btn_FKrun_clicked()
{
    std::cout<<"正运动学规划\n"<<endl;
    float joint1=ui->fk_joint_1->text().toFloat();
    float joint2=ui->fk_joint_2->text().toFloat();
    float joint3=ui->fk_joint_3->text().toFloat();
    float joint4=ui->fk_joint_4->text().toFloat();
    float joint5=ui->fk_joint_5->text().toFloat();
    float joint6=ui->fk_joint_6->text().toFloat();
    std::string path="/home/cbc/catkin_ws/src/ur4_simulation/src/";
    std::string inputPath= path+"fk_input.txt";
    std::ofstream fout(inputPath);
    fout<<joint1<<" "<<joint2<<" "<<joint3<<" "<<joint4<<" "<<joint5<<" "<<joint6;
    fout.close();
    system("gnome-terminal -x bash -c 'source ~/catkin_ws/devel/setup.bash; roslaunch ur4_description_moveit_config demo.launch'&");
    // sleep(5);//延时1s
    system("gnome-terminal -x bash -c 'source ~/catkin_ws/devel/setup.bash; rosrun ur4_simulation fk.py'&");
    // sleep(3);//延时1s
    // std::string path="/home/cbc/catkin_ws/src/ur4_simulation/src/";
    std::string outputpath=path+"fk_output.txt";
    std::vector<double> V;
    std::vector<double>::iterator it;
    std::ifstream data(outputpath);
    double d;
    while (data>>d)
    {
        V.push_back(d);//数据存入
    }
    data.close();
    int i=0;
    double pose[10];
    for(it=V.begin();it!=V.end();it++)
    {
        std::cout<<V[i]<<" ";
        pose[i]=*it;
        i++;
    }
    std::cout<<endl;
     ui->pose_x->setText(QString::number(pose[0], 10, 4));
     ui->pose_y->setText(QString::number(pose[1], 10, 4));
     ui->pose_z->setText(QString::number(pose[2], 10, 4));
}

void Widget::on_btn_IKrun_clicked()
{
    std::cout<<"逆运动学规划\n"<<endl;
    float input_x=ui->input_x->text().toFloat();
    float input_y=ui->input_y->text().toFloat();
    float input_z=ui->input_z->text().toFloat();
    float input_ox=ui->input_ox->text().toFloat();
    float input_oy=ui->input_oy->text().toFloat();
    float input_oz=ui->input_oz->text().toFloat();
    float input_ow=ui->input_ow->text().toFloat();
    std::string path="/home/cbc/catkin_ws/src/ur4_simulation/src/";
    std::string inputPath= path+"ik_input.txt";
    std::ofstream fout(inputPath);
    fout<<input_x<<" "<<input_y<<" "<<input_z<<" "<<input_ox<<" "<<input_oy<<" "<<input_oz<<" "<<input_ow;
    fout.close();
    system("gnome-terminal -x bash -c 'source ~/catkin_ws/devel/setup.bash; roslaunch ur4_description_moveit_config demo.launch'&");
    // sleep(2);//延时1s
    system("gnome-terminal -x bash -c 'source ~/catkin_ws/devel/setup.bash; rosrun ur4_simulation ik.py'&");
    // sleep(1);//延时1s
    // std::string path="/home/cbc/catkin_ws/src/ur4_simulation/src/";
    std::string outputpath=path+"ik_output.txt";
    std::vector<double> V;
    std::vector<double>::iterator it;
    std::ifstream data(outputpath);
    double d;
    while (data>>d)
    {
        V.push_back(d);//数据存入
    }
    data.close();
    int i=0;
    double pose[10];
    for(it=V.begin();it!=V.end();it++)
    {
        std::cout<<V[i]<<" ";
        pose[i]=*it;
        i++;
    }
    std::cout<<endl;
     ui->ik_joint_1->setText(QString::number(pose[0], 10, 4));
     ui->ik_joint_2->setText(QString::number(pose[1], 10, 4));
     ui->ik_joint_3->setText(QString::number(pose[2], 10, 4));
     ui->ik_joint_4->setText(QString::number(pose[3], 10, 4));
     ui->ik_joint_5->setText(QString::number(pose[4], 10, 4));
     ui->ik_joint_6->setText(QString::number(pose[5], 10, 4));
}

void Widget::closeEvent(QCloseEvent *ev)
{
    // int result = QMessageBox::question(this, QString("Tips"), QString("是否退出?"));
    // if(QMessageBox::Yes == result)
        ev->accept();
    // else
    //     ev->ignore();
}

void Widget::on_btn_show_robot_clicked()//机械臂展示按钮
{
    QImage img_robot;
    if(img_robot.load("/home/cbc/tool/ros_ur_gui/robot.png"))//加载该路径下的机械臂图片 需自行更改路径
    {
        ui->label_show_robot->setPixmap(QPixmap::fromImage(img_robot));
    }
}

void Widget::on_btn_rviz_clicked()
{
    system("gnome-terminal -x bash -c 'source ~/catkin_ws/devel/setup.bash; roslaunch ur4_description display.launch'&");//需自行更改catkin_ws路径,下同
}

void Widget::on_btn_boot_moveit_clicked()
{
    system("gnome-terminal -x bash -c 'source ~/catkin_ws/devel/setup.bash; roslaunch ur4_gazebo ur4_bringup_moveit.launch'&");
}

void Widget::on_btn_obstacle_clicked()
{
    system("gnome-terminal -x bash -c 'source ~/catkin_ws/devel/setup.bash; rosrun ur4_simulation obstacle-avoiding.py'&");
}

 

### UR5机器人手ROS中的正逆运动学解算方法 对于UR5机器人手而言,在ROS环境中执行正逆运动学(FK/IK)解算是实现精确控制的关键技术之一。通常情况下,这类操作依赖于MoveIt!框架的支持[^2]。 #### 使用MoveIt!进行运动学求解 MoveIt!提供了强大的工具集用于处理复杂的机器人运动规划问题,其中包括了对多种品牌机械的支持,自然也涵盖了Universal Robots出品的UR系列机型。具体到UR5型号上: - **安装配置**:首先需确保已正确安装并配置好`ur_modern_driver`以及对应的MoveIt!配套包。 - **加载模型描述文件**:通过加载包含几何形状、惯量参数在内的URDF/XACRO格式文件定义机器人结构特征。 - **初始化MoveGroup接口实例**:借助此API可方便调用内置的服务完成诸如查询当前状态、设定目标位置姿态等一系列交互指令。 ```cpp // C++代码片段展示如何创建MoveGroup对象并与之通信 #include <moveit/move_group_interface/move_group_interface.h> int main(int argc, char **argv){ ros::init(argc, argv, "tutorial"); moveit::planning_interface::MoveGroupInterface group("manipulator"); // 更多逻辑... } ``` 为了简化开发流程,官方文档建议开发者尽可能多地利用现成资源而非自行编写底层算法。例如,针对特定硬件平台优化过的插件可以直接应用于解决实际工程难题;而像KDL这样的库则被集成进来作为默认选项提供给用户快速搭建原型系统。 #### 自定义IK/FK Solver的选择与应用 尽管如此,某些应用场景或许要求更高的灵活性或是性能指标,则有必要探索其他途径来满足需求。此时可以考虑引入第三方解决方案如Trac-IK或Bio-IK等高效能求解器。特别是后者提到bio-ik solver能够在笛卡尔空间和关节空间的速度和加速度约束条件下计算从的关节角[^1]。 当决定采用非标准组件时务必注意版本兼容性和维护成本等问题,并充分评估其带来的收益是否值得投入额外精力去克服可能出现的技术障碍。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

樱桃木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值