跳到主要内容

渐入式教程

视频教程

我们为您准备了视频教程,可以在这里观看全部知识。

点击这里进入视频教程

基础教程

我们将在这个教程开发一个具有如下功能的程序:

  1. 启动控制系统;
  2. 设置操作模式;
  3. 设置示教速度;
  4. 设置示教坐标系;
  5. 伺服使能;
  6. 示教机器人关节 1 轴正向运动;
  7. 伺服下使能;
  8. 获取机器人当前位置。

项目初始化

引入基础库与nrcAPI.h头文件,并新建 main 函数:

#include <iostream>
#include "unistd.h"
#include "nrcAPI.h"
#include <string.h>
#include <queue>
#include <list>
#include <sstream>
#include<stdio.h>
using namespace std;

int main()
{

}

这样我们的项目便初始化完成。

注:为了节约空间,以下代码不再包含#include等无关代码

系统启动

开机是一切的开始。所以我们需要在程序中让控制系统启动起来。

定义一个函数SystemStartup()

void  SystemStartup(){
cout<<"库版本:"<< NRC_GetNexMotionLibVersion()<<endl;//输出Nexmotion版本库信息
NRC_StartController(); //启动控制系统
while(NRC_GetControlInitComplete() != 1) //检测控制系统是否初始化完成
{
NRC_Delayms(100); //延时100ms
cout << "Starting Controller" << endl;
}
}

代码中我们主要使用了以下接口:

  • NRC_GetNexMotionLibVersion():获取 NexMotion 的版本库信息
  • NRC_StartController():启动控制系统
  • NRC_GetControlInitComplete():获取控制器初始化状态,true 为成功,false 为还未初始化成功
  • NRC_Delayms():延时函数,单位为毫秒(ms)

并在 main 函数中调用

int main()
{
SystemStartup()
}

切换操作模式

控制系统的操作模式分为示教模式、运行模式、远程模式。在这次教程中因为我们要实现机器人的点动(示教运动),所以我们需要在程序里将操作模式切换到示教模式

在 main 函数中加入NRC_SetOperationMode(NRC_TEACH_);,即可将操作模式切换到示教模式。

int main (){
SystemStartup();
NRC_SetOperationMode(NRC_TEACH_);
}

代码中我们使用了NRC_TEACH_,可以在 nrcAPI.h 文件中查到定义,意为示教模式。

设置伺服状态

在让机器人使能前,我们需要将伺服切换到就绪状态。

NRC_SetServoReadyStatus(1)

设置示教运动坐标系

坐标系分为关节坐标系、直角坐标系、工具坐标系、用户坐标系。由于我们要使机器人关节 1 轴运动,所以我们要先切换到关节坐标系。切换坐标系使用如下接口。

NRC_SetCurrentCoord(NRC_ACS)

代码中使用了NRC_ACS,可以在 nrcAPI.h 文件中查到定义,意为关节坐标系。

设置示教速度

要设置好机器人在示教模式下的运动速度。

示教下的速度为百分比,例如我们要将示教的运动速度设置为 20%,那么可以使用如下接口。

NRC_SetTeachRunSpeedPer(20)

前期准备完成

至此,我们现在的代码应该是这样的:

void  SystemStartup(){
cout<<"库版本:"<< NRC_GetNexMotionLibVersion()<<endl;//输出Nexmotion版本库信息
NRC_StartController(); //启动控制系统
while(NRC_GetControlInitComplete() != 1) //检测控制系统是否初始化完成
{
NRC_Delayms(100); //延时100ms
cout << "Starting Controller" << endl;
}
}
int main (){
SystemStartup(); //启动控制系统
NRC_SetOperationMode(NRC_TEACH_); //切换到示教模式
NRC_SetServoReadyStatus(1); //切换伺服到就绪状态
NRC_SetCurrentCoord(NRC_ACS); //切换坐标系到关节坐标系
NRC_SetTeachRunSpeedPer(20); //设置运行速度为20%
}

现在,我们已经做好了运行前的准备

伺服上电

在伺服状态设置为伺服就绪状态后,通过调用 NRC_ServoEnable();来使伺服上电。

让一轴动起来

示教移动机器人使用NRC_JogMove(1,1)。第一个参数为轴,根据坐标系来决定是关节运动或合成运动。例如在关节坐标系下,1 表示关节 1 轴,在直角坐标系下,1 表示 X 轴。第二个是正反向,1 为正向运动,-1 为反向运动。

但是仅仅一个指令是不可以的!

为了防止在发出这条指令后通讯中断导致机器人撞机,我们规定必须每 200ms 发送一次才可连续运动。

比如我们要让 1 轴在正向连续运动 2 秒钟,那么我们需要加入以下代码:

for(int i = 0 ; i < 10 ; i++)
{
NRC_JogMove(1,1);
NRC_Delayms(200); //延时200ms
}
NRC_JogMoveStop(1);//停止1轴点动

伺服下电

运动完后,执行NRC_ServoDisable()

看一下当前的位置

我们需要知道机器人当前的位置,首先需要定义一个对象来接收位置的值。

NRC_Position position

NRC_Position 在 nrcAPI.h 中可以查到该位置结构体定义。

然后在代码中加入

NRC_GetCurrentPos(NRC_ACS, position);
printf("position.pos=%f,%f,%f,,%f,%f,%f,\n",position.pos[0],position.pos[1],position.pos[2],position.pos[3],position.pos[4],position.pos[5]);

意为获取关节坐标系的数据,并将数据存入 inexbot 对象,然后打印出来。

完成

此时我们的代码应该长这样:

void  SystemStartup(){
cout<<"库版本:"<< NRC_GetNexMotionLibVersion()<<endl;//输出Nexmotion版本库信息
NRC_StartController(); //启动控制系统
while(NRC_GetControlInitComplete() != 1) //检测控制系统是否初始化完成
{
NRC_Delayms(100); //延时100ms
cout << "Starting Controller" << endl;
}
}
int main (){
SystemStartup(); //启动控制系统
NRC_SetOperationMode(NRC_TEACH_); //切换到示教模式
NRC_SetServoReadyStatus(1); //切换伺服到就绪状态
NRC_SetCurrentCoord(NRC_ACS); //切换坐标系到关节坐标系
NRC_SetTeachRunSpeedPer(20); //设置运行速度为20%
NRC_ServoEnable(); //伺服上电
for(int i = 0 ; i < 10 ; i++)
{
NRC_JogMove(1,1);
NRC_Delayms(200); //延时200ms
NRC_JogMoveStop(1);//停止1轴点动
}
NRC_ServoDisable(); //伺服下使能
NRC_Position position; //定义position对象
NRC_GetCurrentPos(NRC_ACS, position); //获取关节坐标系下的当前位置到position对象
printf("position.pos=%f,%f,%f,,%f,%f,%f,\n",position.pos[0],position.pos[1],position.pos[2],position.pos[3],position.pos[4],position.pos[5]); //打印位置
}

至此,一个集成了启动控制系统、设置操作模式、设置示教速度、设置示教坐标系、伺服使能、示教机器人关节 1 轴正向运动、伺服下使能、获取机器人当前位置等功能的 DEMO 程序就完成了!

下面就可以 参考此处 将我们的代码编译为可执行文件,并传输到控制器中运行!

项目进阶

报错与消息

运行过程中难免会发生问题,这时控制系统会传出报错信息。我们需要在程序中接收这些信息。

回调函数

首先我们需要定义一个接收到信息之后的回调函数

void msgHook()
{
NRC_Messsage tmp; //定义一个消息结构体对象
NRC_GetMesssage(1, tmp); //将消息队列中最早的消息赋值给对象tmp
printf("msgHook localTime=%d:%d::%d, 0x%x,0x%x,text=%s,size=%d\n",tmp.localTime.minute, tmp.localTime.second, tmp.localTime.milliseconds, tmp.kind, tmp.type, tmp.text.c_str(),NRC_GetMesssageSize());
}

其中用到了 NRC_Message 结构体,可以在 nrcAPI.h 文件中查阅到相关定义。

设置

然后在启动系统的 SystemStartup()函数中调用

NRC_SetMsgHappenCallback(msgHook)

NRC_SetMsgHappenCallback()用来设置消息发生时的回调函数。

清除报错

发生错误后需要清除掉错误才可以继续运行。

调用NRC_ClearAllError()可以清除所有错误,包括消息的队列。但不是所有问题都可以清除,有一些伺服相关的报错需要检查接线等问题后才可以清除。

设置机器人类型

设置机器人类型是机器人能正常运行的前提。了解机器人本体类型后,此接口支持四种机器人类型。通过调用函数NRC_SetRobotTypeConfig(std::string type)来设置机器人类型。

参数 type 表示机器人类型:

  • "R_GENERAL_6S" 表示六轴,

  • "R_SCARA"表示 四轴 SCAR

  • "R_FOURAXIS_PALLET" 表示四轴码垛 ,

  • "R_FOURAXIS" 表示四轴。

例如要设置机器人类型为六轴机器人,插入以下代码:

int main(){
NRC_SetRobotTypeConfig("R_GENERAL_6S");
}

机器人参数设置好后,需重启示教器才能够生效。

伺服映射

设置伺服映射可调用NRC_SetAllServoMapRelation函数。

std::vector<int> servoMap = { 0,0, 0,0, 0,0 };//机器人映射
int syncGroupNum = 0;//外部轴组数
int syncType[]={0,0,0};//外部轴类型
std::vector<std::vector<int>> syncServoMap={{0,0},{0,0},{0,0}};//外部轴映射
NRC_SetAllServoMapRelation(servoMap,syncGroupNum, syncType, syncServoMap);

设置机器人参数

机器人 DH 参数配置

//结构体
struct NRC_RobotDHConfig
{
double L1; ///<L1杆长
double L2; ///<L2杆长
double L3; ///<L3杆长
double L4; ///<L4杆长
double L5; ///<L5杆长
double L6; ///<L6杆长
double L7; ///<L7杆长
double theta; ///<5轴方向,仅对六轴机器人有效,参数可选:0、90
double CoupleCoe12; ///<1/2轴耦合比
double CoupleCoe23; ///<2/3轴耦合比
double CoupleCoe32; ///<3/2轴耦合比
double CoupleCoe34; ///<3/4轴耦合比
double CoupleCoe45; ///<4/5轴耦合比
double CoupleCoe46; ///<4/6轴耦合比
double CoupleCoe56; ///<5/6轴耦合比
};

使用时使用结构体类 NRC_RobotDHConfig 定义一个对象 config,然后可以使用接口设置机器人 DH 参数即通过使用函数 NRC_SetRobotDHConfig(NRC_RobotDHConfig config)实现的,需要注意的是 DH 参数设置时请在伺服停止或伺服就绪状态下设置该参数。

示例:

NRC_RobotDHConfig robotDHConfig = {321.5, 270,70,299, 78.5, 50, 0, 90, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};//DH参数配置
NRC_SetRobotDHConfig(robotDHConfig );//设置DH参数配置

在填写 DH 参数时按照机器人的实际参数填写。

机器人关节参数配置

//结构体
struct NRC_RobotJointConfig
{
double reducRatio; ///<减速比
int encoderResolution; ///<编码器位数
double posSWLimit; ///<轴正限位,单位:度
double negSWLimit; ///<轴反限位,单位:度
double ratedRotSpeed; ///<电机额定正转速,单位:转/分钟
double ratedDeRotSpeed; ///<电机额定反转速,单位:转/分钟
double maxRotSpeed; ///<电机最大正转速,为电机额定正转速的倍数,单位:倍数
double maxDeRotSpeed; ///<电机最大反转速,为电机额定反转速的倍数,单位:倍数
double maxAcc; ///<最大加速度,为额定正速度的倍数,单位:倍数,额定正速度 = 电机额定正转速 / 减速比 * 6
double maxDecel; ///<最大减速度,为额定反速度的倍数,单位:倍数,额定反速度 = 电机额定反转速 / 减速比 * 6
int direction; ///<模型方向,1:正向,-1:反向.若要改变机器人单关节运动的方向,通常修改模型方向
int AxisDirection;///<关节实际方向
};

设置机器人关节参数配置结构体中,轴正限位指机关节正方向最大范围,轴反限位指机器人关节负方向最大范围(此数值须为负数)。

同机器人 DH 参数配置,使用结构体类 NRC_RobotJointConfig 定义一个对象 config,写入合适参数。

设置机器人关节参数是通过调用函数 NRC_SetRobotJointConfig(int axisNum, NRC_RobotJointConfig config)来实现的,参数 axisNum 是要设置的轴的序号,参数范围:1 <= axisNum <= 机器人轴总数。 其中参数配置参考函数 NRC_RobotJointConfig,需要注意的是机器人关节参数设置时请在伺服停止或伺服就绪状态下设置该参数。

示例:

NRC_RobotJointConfig robotJointConfig = {121,17,  55, -55, 4000, -4000, 1,-1,2.12, -2.12, 1,1};//关节参数配置
for (int i=1; i<7; i++)
{
NRC_SetRobotJointConfig(i,robotJointConfig);
}//设置

在填写关节参数时将各轴关节限位根据实际作业环境进行设置,各关节限位设置为-9999 到 9999,然后单独点动机器人的每一个轴,查看机器人每一个轴的正方向是否正确。