Qt开发实现SCARA机械手正反解的建立

今天,正运动小助手给大家分享一下ethercat运动控制卡开发教程之qt,主要介绍一下scara机械手正反解的建立。
eci2828运动控制卡的硬件介绍
eci2828系列控制卡支持最多达16轴直线插补、任意圆弧插补、空间圆弧、螺旋插补、电子凸轮、电子齿轮、同步跟随、虚拟轴、机械手指令等;采用优化的网络通讯协议可以实现实时的运动控制。
eci2828系列运动控制卡支持以太网,232通讯接口和电脑相连,接收电脑的指令运行,可以通过ethercat总线和can总线去连接各个扩展模块,从而扩展输入输出点数或运动轴。
eci2828系列运动控制卡的应用程序可以使用vc、vb、vs、c++、c#等多种高级语言编程来开发,程序运行时需要动态库zmotion.dll。调试时可以把zdevelop软件同时连接到控制器,从而方便调试、方便观察。
一、qt进行运动控制卡开发流程
1.新建qt项目。
图1:新建qt项目
图2:选择项目路径
图3:选择qt编译套件(kits)
图4:选择基类
2.将函数库相关的文件复制到新建的项目中。
3.向新建的项目里面添加函数库的静态库。(zmotion.lib)
第一步:添加函数库1
第二步:添加函数库2
第三步:添加函数库3
4.添加函数库相关的头文件到项目中。
5.声明相关头文件,并定义连接句柄。
二、pc函数介绍
1.pc函数手册也在光盘资料里面,具体路径如下:“光盘资料\8.pc函数\函数库2.1\zmotion函数库编程手册 v2.1.pdf”。
2.pc编程,一般如果网口对控制器和工控机进行链接。网口链接函数接口是zaux_openeth();如果链接成功,该接口会返回一个链接句柄。通过操作这个链接句柄可以实现对控制器的控制。
zaux_openeth()接口说明:
3.机械手逆解指令zaux_direct_connframe介绍。
4.机械手正解指令zaux_direct_connreframe介绍。3.机械手逆解指令zaux_direct_connframe介绍。
三、qt开发实现scara机械手的正逆解
1.scara机械手正逆解例程界面如下。
2.scara机械手模型如下。
3.在构造函数里面调用链接控制器的接口zaux_openeth(),与控制器进行链接,链接成功后启动定时器监控控制器的轴信息。
mainwindow::mainwindow(qwidget *parent) :
    qmainwindow(parent),
    ui(new ui::mainwindow)
{
    int rint=0;
    //初始化窗体
    ui->setupui(this);
    //定义按钮组并进行绑定
    btngroup = new qbuttongroup(this);
    btngroup->addbutton(ui->manualrev1,1);
    btngroup->addbutton(ui->manualfwd1,2);
    btngroup->addbutton(ui->manualrev2,3);
    btngroup->addbutton(ui->manualfwd2,4);
    btngroup->addbutton(ui->manualrev3,5);
    btngroup->addbutton(ui->manualfwd3,6);
    btngroup->addbutton(ui->manualrev4,7);
    btngroup->addbutton(ui->manualfwd4,8);
    connect(btngroup, signal(buttonpressed(int)), this, slot(manualrev1_pressed(int)));
    connect(btngroup, signal(buttonreleased(int)), this, slot(manualrev1_released(int)));
    //系统启动自动连接控制器
    rint = zaux_openeth(127.0.0.1, &g_handle);
    //如果链接成功则启动定时器
    if(rint==0)
    {
        starttimer(50);
    }
}
4.通过定时器更新控制器各个轴的位置和速度信息。
//定时器事件
void mainwindow::timerevent(qtimerevent *event)
{
    qstring str;
    float tempdata;
    //获取j1的位置数据
    zaux_direct_getmpos(g_handle, ui->axisidj1->text().toint(), &tempdata);
    str = qstring(%1).arg(tempdata);
    ui->dposj1->settext(str);
    //获取j2的位置数据
    zaux_direct_getmpos(g_handle, ui->axisidj2->text().toint(), &tempdata);
    str = qstring(%1).arg(tempdata);
    ui->dposj2->settext(str);
    //获取ju的位置数据
    zaux_direct_getmpos(g_handle, ui->axisidju->text().toint(), &tempdata);
    str = qstring(%1).arg(tempdata);
    ui->dposju->settext(str);
    //获取jz的位置数据
    zaux_direct_getmpos(g_handle, ui->axisidjz->text().toint(), &tempdata);
    str = qstring(%1).arg(tempdata);
    ui->dposjz->settext(str);
    //获取x的位置数据
    zaux_direct_getmpos(g_handle, ui->axisidx->text().toint(), &tempdata);
    str = qstring(%1).arg(tempdata);
    ui->dposx->settext(str);
    //获取y的位置数据
    zaux_direct_getmpos(g_handle, ui->axisidy->text().toint(), &tempdata);
    str = qstring(%1).arg(tempdata);
    ui->dposy->settext(str);
    //获取u的位置数据
    zaux_direct_getmpos(g_handle, ui->axisidu->text().toint(), &tempdata);
    str = qstring(%1).arg(tempdata);
    ui->dposu->settext(str);
    //获取z的位置数据
    zaux_direct_getmpos(g_handle, ui->axisidz->text().toint(), &tempdata);
    str = qstring(%1).arg(tempdata);
    ui->dposz->settext(str);
}
5.通过正逆解切换按钮实现scara机械手正逆解的切换。
//建立机械手模型
void mainwindow::on_manipulmodel_clicked()
{
    int jogaxislist[4]={ui->axisidj1->text().toint(),ui->axisidj2->text().toint(),ui->axisidju->text().toint(),ui->axisidjz->text().toint()};
    int axislist[4]={ui->axisidx->text().toint(),ui->axisidy->text().toint(),ui->axisidu->text().toint(),ui->axisidz->text().toint()};
    int mtypej=0,mtypex=0;
    //初始化机械手参数
    manipulparainit();
    zaux_direct_getmtype(g_handle,ui->axisidj1->text().toint(),&mtypej);
    zaux_direct_getmtype(g_handle,ui->axisidx->text().toint(),&mtypex);
    //停止轴运动
    zaux_direct_rapidstop(g_handle,2);
    if(mtypej == 33)
    {
        zaux_direct_base(g_handle,4,axislist);
        zaux_direct_connreframe(g_handle ,4 , axislist, 1, 0, 4,jogaxislist);
        ui->manipulmodel->settext(正解模式);
        //修改手动按钮的文本信息
        ui->manualrev1->settext(j1-);
        ui->manualrev2->settext(j2-);
        ui->manualrev3->settext(ju-);
        ui->manualrev4->settext(jz-);
        ui->manualfwd1->settext(j1+);
        ui->manualfwd2->settext(j2+);
        ui->manualfwd3->settext(ju+);
        ui->manualfwd4->settext(jz+);
    }
    else
    {
        zaux_direct_base(g_handle,4,jogaxislist);
        zaux_direct_connframe(g_handle ,4 , jogaxislist, 1, 0, 4,axislist);
        ui->manipulmodel->settext(逆解模式);
        ui->manualrev1->settext(x-);
        ui->manualrev2->settext(y-);
        ui->manualrev3->settext(u-);
        ui->manualrev4->settext(z-);
        ui->manualfwd1->settext(x+);
        ui->manualfwd2->settext(y+);
        ui->manualfwd3->settext(u+);
        ui->manualfwd4->settext(z+);
    }
}
6.通过手动按钮,根据当前的机械手模式进行手动运动。
//按钮1按下
void mainwindow::manualrev1_pressed(int id)
{
    int mtypej,mtypex;
    zaux_direct_getmtype(g_handle,ui->axisidj1->text().toint(),&mtypej);
    zaux_direct_getmtype(g_handle,ui->axisidx->text().toint(),&mtypex);
    //如果是逆解
    if(mtypej == 33)
    {
        switch (id)
        {
            case 1: zaux_direct_single_vmove(g_handle,ui->axisidx->text().toint(),-1);
                    break;
            case 2: zaux_direct_single_vmove(g_handle,ui->axisidx->text().toint(),1);
                    break;
            case 3: zaux_direct_single_vmove(g_handle,ui->axisidy->text().toint(),-1);
                    break;
            case 4: zaux_direct_single_vmove(g_handle,ui->axisidy->text().toint(),1);
                    break;
            case 5: zaux_direct_single_vmove(g_handle,ui->axisidu->text().toint(),-1);
                    break;
            case 6: zaux_direct_single_vmove(g_handle,ui->axisidu->text().toint(),1);
                    break;
            case 7: zaux_direct_single_vmove(g_handle,ui->axisidz->text().toint(),-1);
                    break;
            case 8: zaux_direct_single_vmove(g_handle,ui->axisidz->text().toint(),1);
                    break;
            default:
                    break;
        }
    }
    //如果是正解
    else if(mtypex == 34)
    {
        switch (id)
        {
            case 1: zaux_direct_single_vmove(g_handle,ui->axisidj1->text().toint(),-1);
                    break;
            case 2: zaux_direct_single_vmove(g_handle,ui->axisidj1->text().toint(),1);
                    break;
            case 3: zaux_direct_single_vmove(g_handle,ui->axisidj2->text().toint(),-1);
                    break;
            case 4: zaux_direct_single_vmove(g_handle,ui->axisidj2->text().toint(),1);
                    break;
            case 5: zaux_direct_single_vmove(g_handle,ui->axisidju->text().toint(),-1);
                    break;
            case 6: zaux_direct_single_vmove(g_handle,ui->axisidju->text().toint(),1);
                    break;
            case 7: zaux_direct_single_vmove(g_handle,ui->axisidjz->text().toint(),-1);
                    break;
            case 8: zaux_direct_single_vmove(g_handle,ui->axisidjz->text().toint(),1);
                    break;
            default:
                    break;
        }
    }
}
//按钮1松开
void mainwindow::manualrev1_released(int id)
{
    int mtypej,mtypex;
    zaux_direct_getmtype(g_handle,ui->axisidj1->text().toint(),&mtypej);
    zaux_direct_getmtype(g_handle,ui->axisidx->text().toint(),&mtypex);
    //如果是逆解
    if(mtypej == 33)
    {
       switch (id)
       {
           case 1: zaux_direct_single_cancel(g_handle,ui->axisidx->text().toint(),2);
                   break;
           case 2: zaux_direct_single_cancel(g_handle,ui->axisidx->text().toint(),2);
                   break;
           case 3: zaux_direct_single_cancel(g_handle,ui->axisidy->text().toint(),2);
                   break;
           case 4: zaux_direct_single_cancel(g_handle,ui->axisidy->text().toint(),2);
                   break;
           case 5: zaux_direct_single_cancel(g_handle,ui->axisidu->text().toint(),2);
                   break;
           case 6: zaux_direct_single_cancel(g_handle,ui->axisidu->text().toint(),2);
                   break;
           case 7: zaux_direct_single_cancel(g_handle,ui->axisidz->text().toint(),2);
                   break;
           case 8: zaux_direct_single_cancel(g_handle,ui->axisidz->text().toint(),2);
                   break;
           default:
                   break;
       }
    }
    //如果是正解
    else if(mtypex == 34)
    {
       zaux_direct_single_cancel(g_handle,ui->axisidj1->text().toint(),2);
       switch (id)
       {
           case 1: zaux_direct_single_cancel(g_handle,ui->axisidj1->text().toint(),2);
                   break;
           case 2: zaux_direct_single_cancel(g_handle,ui->axisidj1->text().toint(),2);
                   break;
           case 3: zaux_direct_single_cancel(g_handle,ui->axisidj2->text().toint(),2);
                   break;
           case 4: zaux_direct_single_cancel(g_handle,ui->axisidj2->text().toint(),2);
                   break;
           case 5: zaux_direct_single_cancel(g_handle,ui->axisidju->text().toint(),2);
                   break;
           case 6: zaux_direct_single_cancel(g_handle,ui->axisidju->text().toint(),2);
                   break;
           case 7: zaux_direct_single_cancel(g_handle,ui->axisidjz->text().toint(),2);
                   break;
           case 8: zaux_direct_single_cancel(g_handle,ui->axisidjz->text().toint(),2);
                   break;
           default:
                   break;
       }
    }
}
四、例程移植到linux设备上
1.linux对应架构的库复制到项目文件夹里面。
2.向新建的项目里面添加函数库的静态库。(libzmotion.so)
添加函数库1
添加函数库2
添加函数库3
3.重新编译即可运行。
效果运行图
五、调试与监控
编译运行例程,同时连接zdevelop软件进行调试,对运动控制的轴参数和运动情况进行监控。
同时可以通过机械手仿真工具zrobotview,对机械手进行仿真测试。
1.zdevelop软件监控机械手参数。
(1)例程效果图。
(2)关节轴mtype=33,表示机械手为逆解模式。
(3)虚拟轴mtype=34,表示机械手为正解模式。
2.zrobotview的机械手仿真效果图。
本次,正运动技术ethercat运动控制卡开发教程之qt(下):scara机械手正反解的建立,就分享到这里。


看看你是否上榜,兰和智能锁帮你解决!
历时24个月,300人研发团队,vivo发布VI ISP芯片!手机摄影进入硬件级算法时代
海尔生物业绩持续改善 成功“圆梦”科创板
2018年12月破产清算后首次发布新品,预示着金立即将“复活”?
UPS电源的运作框图
Qt开发实现SCARA机械手正反解的建立
人工智能产业标准化制定要来了
日本未来十年高达10GW的太阳能将为农业供电
2019Q2印度智能手机份额:小米依然领跑,三星位列第二
OPPO公布全新子品牌Reno宣传海报 Logo将换新
新能源汽车推荐 看看有没有你喜欢的款式吧
芯明天压电宏微复合运动平台的组成及特点
小米6处理器已确定?小米6处理器终极曝光
台积电:规划1万亿晶体管芯片封装策略
PCB Layout and SI设计问答集锦
MEMS市场简报:2013磁力计营业收入今年劲增16%
使用VFC制作简单的电容表
德尔福的新工厂将专门生产电动车电子零部件
如何在安防大数据时代让视频监控脱颖而出
关于FinFET与集成电路的对比分析介绍