上位机二次开发-连续运动模式

2022-01-19

上位机二次开发中的连续运动模式是一个可以摆脱指令化运行的运动模式,可以抛开作业程序直接控制机器人做连续运动。

环境搭建

新建一个工程

img
预览

工程创建完成

img
预览

将官网下载的库文件 lib_nrc.a 和 interface.h 文件放到工程目录内

img
预览

右击工程选择添加库

img
预览

选择外部库

img
预览

选择刚刚放到同级目录的库文件,然后勾选 Windows 和静态

img
预览

点击完成静态库就添加成功了

如果.pro 中无 network 需手动添加

img
预览

开发

右击头文件选择添加现有文件,选择 interface.h 文件然后点击打开

img
预览

在 mainwindow.cpp 中添加#include "interface.h"

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "interface.h"

选择 ui 界面添加 3 个按钮

img
预览

分别右击按钮选择转到槽

img
预览

选择 clicked()信号,点击 OK

img
预览

在第一个按钮的槽函数中添加机器人连接接口

void MainWindow::on_pushButton_clicked()
{
    char ip[100] = "192.168.1.13";
    if(connect_robot(ip))
    {
        qDebug()<<"连接成功";
    }
    else
    {
        qDebug()<<"连接失败";
    }
}

使用接口 connect_robot(char *ip),填写需要连接的控制器 IP 地址

连续运动模式

在第二个按钮的槽函数中添加连续运动模式打开接口

void MainWindow::on_pushButton_2_clicked()
{
    if(get_current_mode() != 2)
    {
        set_current_mode(2);
    }
    continuous_motion_mode(1);
}

使用接口get_current_mode()

判断当前模式是否在运行模式下,不在则需要使用接口set_current_mode(2)

切换到运行模式下

使用接口continuous_motion_mode(1)打开连续运动模式

get_current_mode()获取当前模式,返回值 0:示教模式,1:远程模式,2:运行模式

set_current_mode(int num)设置当前模式,0:示教模式,1:远程模式,2:运行模式

continuous_motion_mode(int num)设置连续运动模式,0:关闭,1:打开

在第三个按钮的槽函数中添加需要发送的连续运动指令队列

void MainWindow::on_pushButton_3_clicked()
{
    //以下点位为测试点位,谨慎使用!
    cmdPara cmd[6];

    cmd[0].cmdType = cmdPara::MOVJ;
    cmd[0].m_velocity = 30;
    cmd[0].m_acc = 30;
    cmd[0].m_dec = 30;
    cmd[0].m_pl = 0;

    cmd[0].m_coord[0] = 0;
    cmd[0].m_coord[1] = 0;
    cmd[0].m_coord[2] = 0;
    cmd[0].m_coord[3] = 0;
    cmd[0].m_coord[4] = 0;
    cmd[0].m_coord[5] = 0;
    cmd[0].m_coord[6] = 0;

    cmd[0].m_position[0] = 0;
    cmd[0].m_position[1] = 0;
    cmd[0].m_position[2] = 0;
    cmd[0].m_position[3] = 0;
    cmd[0].m_position[4] = 0;
    cmd[0].m_position[5] = 0;


    cmd[1].cmdType = cmdPara::MOVL;
    cmd[1].m_velocity = 300;
    cmd[1].m_acc = 30;
    cmd[1].m_dec = 30;
    cmd[1].m_pl = 0;

    cmd[1].m_coord[0] = 0;
    cmd[1].m_coord[1] = 0;
    cmd[1].m_coord[2] = 0;
    cmd[1].m_coord[3] = 0;
    cmd[1].m_coord[4] = 0;
    cmd[1].m_coord[5] = 0;
    cmd[1].m_coord[6] = 0;

    cmd[1].m_position[0] = 10;
    cmd[1].m_position[1] = 10;
    cmd[1].m_position[2] = 10;
    cmd[1].m_position[3] = 10;
    cmd[1].m_position[4] = 10;
    cmd[1].m_position[5] = 10;


    cmd[2].cmdType = cmdPara::MOVC;
    cmd[2].m_velocity = 300;
    cmd[2].m_acc = 30;
    cmd[2].m_dec = 30;
    cmd[2].m_pl = 0;

    cmd[2].m_coord[0] = 0;
    cmd[2].m_coord[1] = 0;
    cmd[2].m_coord[2] = 0;
    cmd[2].m_coord[3] = 0;
    cmd[2].m_coord[4] = 0;
    cmd[2].m_coord[5] = 0;
    cmd[2].m_coord[6] = 0;

    cmd[2].m_position[0] = 20;
    cmd[2].m_position[1] = 20;
    cmd[2].m_position[2] = 0;
    cmd[2].m_position[3] = 0;
    cmd[2].m_position[4] = 0;
    cmd[2].m_position[5] = 0;


    cmd[3].cmdType = cmdPara::MOVC;
    cmd[3].m_velocity = 300;
    cmd[3].m_acc = 30;
    cmd[3].m_dec = 30;
    cmd[3].m_pl = 0;
    cmd[3].m_spin = 0;

    cmd[3].m_coord[0] = 0;
    cmd[3].m_coord[1] = 0;
    cmd[3].m_coord[2] = 0;
    cmd[3].m_coord[3] = 0;
    cmd[3].m_coord[4] = 0;
    cmd[3].m_coord[5] = 0;
    cmd[3].m_coord[6] = 0;

    cmd[3].m_position[0] = 0;
    cmd[3].m_position[1] = 0;
    cmd[3].m_position[2] = 0;
    cmd[3].m_position[3] = 0;
    cmd[3].m_position[4] = 0;
    cmd[3].m_position[5] = 0;


    cmd[4].cmdType = cmdPara::MOVCA;
    cmd[4].m_velocity = 300;
    cmd[4].m_acc = 30;
    cmd[4].m_dec = 30;
    cmd[4].m_pl = 0;
    cmd[4].m_spin = 0;

    cmd[4].m_coord[0] = 0;
    cmd[4].m_coord[1] = 0;
    cmd[4].m_coord[2] = 0;
    cmd[4].m_coord[3] = 0;
    cmd[4].m_coord[4] = 0;
    cmd[4].m_coord[5] = 0;
    cmd[4].m_coord[6] = 0;

    cmd[4].m_position[0] = 0;
    cmd[4].m_position[1] = 5;
    cmd[4].m_position[2] = 5;
    cmd[4].m_position[3] = 5;
    cmd[4].m_position[4] = 5;
    cmd[4].m_position[5] = 5;


    cmd[5].cmdType = cmdPara::MOVCA;
    cmd[5].m_velocity = 300;
    cmd[5].m_acc = 30;
    cmd[5].m_dec = 30;
    cmd[5].m_pl = 0;
    cmd[5].m_spin = 0;

    cmd[5].m_coord[0] = 0;
    cmd[5].m_coord[1] = 0;
    cmd[5].m_coord[2] = 0;
    cmd[5].m_coord[3] = 0;
    cmd[5].m_coord[4] = 0;
    cmd[5].m_coord[5] = 0;
    cmd[5].m_coord[6] = 0;

    cmd[5].m_position[0] = 15;
    cmd[5].m_position[1] = 15;
    cmd[5].m_position[2] = 15;
    cmd[5].m_position[3] = 15;
    cmd[5].m_position[4] = 15;
    cmd[5].m_position[5] = 15;

    send_continuous_motion_queue(cmd,6);
}

创建指令队列结构体数组cmdPara cmd[6];

  1. 第一组关节运动速度 30%,加速度 30,减速度 30,平滑 0,目标点位关节坐标系(0,0,0,0,0,0)
  2. 第二组直线运动速度 300mm/s,加速度 30,减速度 30,平滑 0,目标点位关节坐标系(10,10,10,10,10,10)
  3. 第三四组圆弧运动速度 300mm/s,加速度 30,减速度 30,平滑 0,过目标点位关节坐标系(20,20,0,0,0,0)和关节坐标系(0,0,0,0,0,0)的圆弧运动
  4. 第五六组整圆运动速度 300mm/s,加速度 30,减速度 30,平滑 0,过目标点位关节坐标系(0,5,5,5,5,5)和关节坐标系(15,15,15,15,15,15)的整圆运动

指令结构体说明:

  • MOVJ:关节运动
  • MOVL:直线运动
  • MOVC:圆弧运动
  • MOVCA:整圆运动
  • MOVJEXT:带外部轴的关节运动
  • MOVLEXT:带外部轴的直线运动
  • MOVCEXT:带外部轴的圆弧运动
  • double m_velocity:速度。关节运动速度范围是 1~100%,非关节运动速度范围是 2~1000mm/s
  • double m_acc:加速度。范围是 1~100
  • double m_dec:减速度。范围是 1~100
  • double m_pl:平滑。范围是 0~5
  • int m_spin:姿态(仅 MOVCA 需要这个参数) 0:姿态不变 1:六轴不转 2:六轴旋转
  • double m_coord[7]:第 1,2 位表示坐标 第 3 位左右手(0-无 1-左 2-右)/姿态(0-8) 第 4 位工具手 第 5 位坐标系 第 6,7 位备用
  • double m_position[7]:第 1 位到第 7 位代表机器人点位坐标(最多支持到七轴机器人,没有位置补 0 即可)
  • double m_syncPosition[5]:第 1 位到第 5 位代表外部轴点位坐标(最多支持到五轴外部轴,没有位置补 0 即可)

注:

圆弧运动,整圆运动,带外部轴的圆弧运动必须 2 条指令为一组指令来使用,否则无法运行

连续运动模式速度如想提速可以在当前模式内修改全局速度,使用接口 void set_jogging_speed(int speed);speed 范围(0~100)

运行中若未按自己需求运行完所设置的目标点位可能出现的情况如下:

  1. 目标位置不可达
  2. 部分轴目标位置超限
  3. 速度过大导致伺服报错
  4. 程序编写内容有问题
  5. 未在运行模式的连续运动模式内
  6. 伺服状态有问题

建议点位事先通过示教调试一下,看是否可以达到,之后再使用上位机二次开发来设置点位

如果本文有错误请向我们反馈,我们很珍惜您的意见或建议。