跳到主要内容

机器人直接轨迹运动(点到点、直线、圆弧)

运动类指令

点到点

使用关节插补的方式移动到目标点。在机器人向目标点移动中,在不受轨迹约束的区间使用。

通过调用函数NRC_RobotMoveJoint(int vel, const NRC_Position& target int acc, int dec)机器人实现点到点运行,同样调用该函数前,请将伺服上电使能,可调用 NRC_ServoEnable() 函数将伺服上电参考 3.8 节。成功调用该函数后,机器人将开始运动,请注意安全。

  • vel 是机器人的运行速度,为机器人最大速度的百分比,参数范围:0 < vel <= 100。
  • target 是机器人运动目标位置,详见 NRC_Position。
  • 参数 acc/dec 机器人运行加速度/减速度,为机器人各关节最大加速度/减速度的百分比,参数范围:0 < vel <= 100。

点到点(PTP)运动是一种很常使用到的运动形式,通过 inexbot 提供的 API 接口给定目标位置。运动控制模块依据相关参数进行相关的速度曲线规划。

可调用函数NRC_GetProgramRunStatus()检测程序是否运行结束

直线

使用直线插补的方式移动到目标点。在机器人向目标点移动的过程中,机器人末端姿态不变。 调用函数NRC_RobotMoveLinear(int vel, const NRC_Position& target, int acc, int dec)机器人实现直线运动,同样调用该函数前,请将伺服上电使能,可调用 NRC_ServoEnable();函数将伺服上电参考 3.8,机器人以 vel 的速度从当前位置以直线方式运行到 target 位置,成功调用该函数后,机器人将开始运动,请注意安全。

  • vel 是机器人的运行速度,为机器人末端位置点绝对运行速度,单位为 毫秒每秒(mm/s),参数范围:vel > 1。
  • target 是机器人运动目标位置,详见 NRC_Position。
  • 参数 acc/dec 机器人运行加速度/减速度,为机器人各关节最大加速度/减速度的百分比,参数范围:0 < vel <= 100。

圆弧

圆弧运动采用作业文件实现(也可采用无文件运动队列实现),作业文件详见 3.13。

插补方式

设置机器人的插补方式通过调用函数NRC_SetInterpolationMethod(int method)来实现的,其中参数 method 是机器人运动时的插补方式,其值为 0,表示 S 型插补,机器人加减速较为平滑,但相对于梯形插补加减速较慢,一般大型机器人用该插补方式,其值为 1,表示梯形插补,机器人加减速较为迅速,但容易造成机器人抖动、过载等现象,一般小型机器人用该插补方式。需要注意的是需要在伺服停止或伺服就绪状态下设置该参数。

机器人点到点,直线,圆弧运动的 C++demo 程序

#include <iostream>
#include "nrcAPI.h"
#include<stdio.h>
using namespace std;
int main()
{
SystemStartup();//系统启动,详见3.3节
SetServoMap();//设置伺服映射关系,见3.5节
SettingofRobotRelatedParameters();//机器人相关参数设置,详见3.6节
//////以上调用函数可见附录一/////
NRC_SetServoReadyStatus(1);//设置伺服允许,详见3.8节
NRC_SetInterpolationMethod(1);//设置为S形插补方式
NRC_SetOperationMode(NRC_RUN_);//设置操作模式为运行模式,详见3.11节
NRC_SetAutoRunSpeedPer(80);//设置自动速度为80,详见3.11节
NRC_Delayms(1000);//延时1000ms
//设置三个点 (最新API中NRC_Position.pos长度由6增加到7)
double pos1[7]={ 296.71, -66.12, 606.38, 3.06, 0.15, -0.18,0.00} ;
double pos2[7]={ 303.3191, 20.0862, 606.3863, 3.1038, 0.1630, -0.4658,0.000};
double pos3[7]={ 315.4386, 21.1369, 595.0522, 3.1006, 0.1196, -0.4678,0.000};
double pos4[7]={ 315.6836, -16.5291, 595.0751, 3.0866, 0.1140, -0.3479,0.000};
NRC_Position inexbot1 = { NRC_MCS,0,0,0,pos1};
NRC_Position inexbot2 = { NRC_MCS,0,0,0,pos2};
NRC_Position inexbot3 = { NRC_MCS,0,0,0,pos3};
NRC_Position inexbot4= { NRC_MCS,0,0,0,pos4};
//点到点
NRC_Position inexbot7;//定义机器人位置结构体对象inexbot7
NRC_GetCurrentPos(NRC_MCS, inexbot7);//将机器人的直角坐标系赋值给inexbot7
printf("inexbot7.pos=%f,%f,%f,%f,%f,%f,%f,\n",inexbot7.pos[0],inexbot7.pos[1],inexbot7 .pos[2],inexbot7.pos[3],inexbot7.pos[4],inexbot7.pos[5],inexbot7.pos[6]);//将机器人最开始直角坐标位置输出
NRC_ServoEnable();//伺服上电
NRC_RobotMoveJoint(50, inexbot1,80,80); //以50%的速度点到点运动到inexbot1点
while (NRC_GetProgramRunStatus() != 0) //等待运行结束
{
NRC_Delayms(500); //延时100ms
}
NRC_ServoDisable(); //伺服下电
NRC_Position inexbot6;//定义机器人位置结构体对象inexbot6
NRC_GetCurrentPos(NRC_MCS, inexbot6);//将当前机器人的直角坐标系赋值给inexbot6
printf("inexbot6.pos=%f,%f,%f,%f,%f,%f,%f,\n",inexbot6.pos[0],inexbot6.pos[1],inexbot6.pos[2],inexbot6.pos[3],inexbot6.pos[4],inexbot6.pos[5],inexbot6.pos[6]);//将当前直角坐标位置输出,
//直线
NRC_ServoEnable();//伺服上电
NRC_RobotMoveLinear(50, inexbot2,80,80); //以50mm/s的速度直线运动到inexbot2点
while (NRC_GetProgramRunStatus() != 0) //等待运行结束
{
NRC_Delayms(100); //延时100ms
}
NRC_ServoDisable(); //伺服下电
NRC_Position inexbot5;//定义机器人位置结构体对象inexbot5
NRC_GetCurrentPos(NRC_MCS, inexbot5);//将当前机器人的直角坐标系赋值给inexbot5
printf("inexbot5.pos=%f,%f,%f,s%f,%f,%f%f,\n",inexbot5.pos[0],inexbot5.pos[1],inexbot5.pos[2],inexbot5.pos[3],inexbot5.pos[4],inexbot5.pos[5],inexbot5.pos[6]);//将当前直角坐标位置输出,

//圆弧采用作业文件实现(也可采用无文件运动队列实现),详见3.13节
if (NRC_JudgeJobIsExist("INEXBOT1") == 0)
{
cout << "作业文件不存在" << endl;
NRC_CreateJobfile("INEXBOT1");//创建作业文件INEXBOT1
}
else
NRC_OpenJobfile("INEXBOT1");//打开作业文件INEXBOT1
NRC_JobfileInsertMOVL(1, 500, 50, 50, inexbot2, 1);
NRC_JobfileInsertMOVC(2, 300, 50, 50, inexbot3, 5);
NRC_JobfileInsertMOVC(3, 300, 50, 50, inexbot4, 5);//机器人经点inexbot3圆弧运动到点inexbot4
cout << "file line sum is " << NRC_GetJobfileLineSum() << endl;
NRC_ServoEnable(); //伺服上电
NRC_StartRunJobfile("INEXBOT1");//开始运行作业文件
while (NRC_GetProgramRunStatus() != 0) //等待运行结束
{
NRC_Delayms(500); //延时100ms
printf("line=%d,time=%d\n",
NRC_GetJobfileCurrentRunLine(), NRC_GetCycleTimeSec());
}//获取当前运行作业文件的行号,获取当前作业文件已经运行的时间
NRC_ServoDisable(); //伺服下电
NRC_Position inexbot9;//定义机器人位置结构体对象inexbot9
NRC_GetCurrentPos(NRC_MCS, inexbot9);//将当前机器人的直角坐标系赋值给inexbot9
printf("inexbot9.pos=%f,%f,%f,%f,%f,%f%f,\n",inexbot9.pos[0],inexbot9.pos[1],inexbot9.pos[2],inexbot9.pos[3],inexbot9.pos[4],inexbot9.pos[5],inexbot9.pos[6]);//将当前直角坐标位置输出
while (1)//保持程序继续运行
{
NRC_Delayms(1000);
}
}