直角点动和关节点动
点动基本设置
点动操作时首先设置伺服状态参见 3.8 节,即调用 NRC_SetServoReadyStatus(int status)
函数切换伺服状态使其处于伺服就绪状态。再通过调用函数NRC_ServoEnable()
使伺服上电,成功调用该函数后,伺服将处于上电使能状态请注意安全。单独点动机器人的每一个轴,查看机器人每一个轴的正方向是否正确。
(1)点动关节速度设置是通过调用函数NRC_SetJogJointSpeedConfig(int axisNum, double maxSpeed, double acc)
来实现的。
- 参数 axisNum 是要设置的轴的序号,参数范围:1 <= axisNum <= 机器人轴总数。
- 参数 maxSpeed 指点动时,该轴可以达到的最大速度,单位:度/秒。
- 参数 acc 指 点动时,该轴的加速度,单位:度/平方秒。需要注意的是需要在伺服停止或伺服就绪状态下设置该参数。
(2)点动直角速度设置是通过调用函数NRC_SetJogRectangularSpeedConfig(double maxSpeed, double acc)
来实现的。
- 参数 axSpeed 是指 点动时,直角坐标可以达到的最大速度,单位:毫米/秒。
- 参数 acc 指点动时,直角坐标的加速度,单位:毫米/平方秒。需要注意的是需要在伺服停止或伺服就绪状态下设置该参数。
(3)设置点动灵敏度是通过调用函数NRC_SetJogSensitivitySpeedConfig(double sensitivity)
来时实现的, 参数 sensitivity 的 值越小,点动响应越慢,该值越大,点动误差越大,误差较大时,可能引起机器人抖动,单位:度,默认初始值 0.001,参数范围:0.0001 <= sensitivity < 1。需要注意的是需要在伺服停止或伺服就绪状态下设置该参数。
点动
(1)伺服上电使能后,开始点动某轴通过调用函数NRC_GetCurrentCoord()
可知机器人将在哪一坐标系下 axis 轴沿 dir 方向运动,调用NRC_JogMove(int axis, int dir)
函数进行点动操作时,为保障安全,该函数需要每 200ms 调用一次,一旦超时未调用,机器人将自动停止点动,进行微动操作时,即使连续调用该函数,也只会执行一次,需执行停止点动后,再次调用该函数,才能执行下一次,成功调用该函数后,机器人将开始运动,请注意安全。 axis 是要进行点动的轴,取值范围 1-6,dir 是轴运动方向,1 表示正向,-1 表示反向。
(2)通过调用函数NRC_JogMoveStop()
停止点动,机器人将会减速至停止。 查看当前机器人位置可以通过调用NRC_GetCurrentPos(NRC_COORD coord, NRC_Position& position)
获取当前位置,输出查看是否正确,即是否达到目标位置。即该函数可以获取在 coord 坐标系下点机器人位置,位置数据由参数引用 position 返回。
机器人位置结构体为:
struct NRC_Position
{
std::vector<double> v;
NRC_COORD coord; ///< 位置的坐标系
int usrNum; ///用户坐标系
int toolNum; ///工具坐标系
int configuration; ///形态值
/**
* @brief 位置的值
* - 关节坐标系下,pos[0]到pos[6]分别对于机器人的1到7轴
* - 其他坐标系下,pos[0]到pos[6]分别对于机器人的x轴、y轴、z轴、A轴、B轴、C轴、臂角(七轴机器人)
*/
double pos[7];
};
通过调用函数NRC_ServoDisable()
伺服下电,即成功调用该函数后,伺服将下电,处于未使能状态。点动结束。点动可以在关节坐标下也可以在直角坐标系下。
直角点动和关节点动 c++demo 程序
#include <iostream>
#include "nrcAPI.h"
#include<stdio.h>
using namespace std;
int main()
{
SystemStartup();//系统启动,详见3.3节
RobotMsg();//获取机器人配置,详见3.4节
SetServoMap();//设置伺服映射关系,见3.5节
SettingofRobotRelatedParameters();//机器人相关参数设置,详见3.6节
NRC_SetServoReadyStatus(1);//设置伺服允许,详见3.8节
//点动之前的基本设置
for (int i = 1; i < 7; i++)
{
NRC_SetJogJointSpeedConfig(i, 40, 800);
}//点动关节速度设置
NRC_SetJogRectangularSpeedConfig(200, 3000);//点动直角速度设置
NRC_SetJogSensitivitySpeedConfig(0.001);//点动灵敏度设置
cout << "config Success" << endl;
//关节点动
NRC_SetServoReadyStatus(1); //设置伺服允许(伺服就绪状态)
NRC_SetOperationMode(NRC_TEACH_);//设置操作模式为示教模式
NRC_SetTeachRunSpeedPer(80);//设置示教速度
NRC_Position inexbot1; //inexbot1是位置结构体的对象
NRC_SetCurrentCoord(NRC_ACS);//设置当前坐标系为关节坐标系
NRC_GetCurrentPos(NRC_ACS, inexbot1); //获取当前关节坐标位置,赋给inexbot1.关节点动之前的坐标位置
printf(" inexbot1.pos=%f,%f,%f,%f,%f,%f,%f,\n", inexbot1.pos[0], inexbot1.pos[1], inexbot1.pos[2], inexbot1.pos[3], inexbot1.pos[4], inexbot1.pos[5], inexbot1.pos[6]);
//printf(" inexbot1.pos=%f,%f,%f,%f,%f,%f,\n", inexbot1.pos[0], inexbot1.pos[1], inexbot1.pos[2], inexbot1.pos[3], inexbot1.pos[4], inexbot1.pos[5]);
NRC_Delayms(1000);//延时1000毫秒
NRC_ServoEnable();//伺服上电
for (int i = 1; i <7; i++)
{
for (int j = 1; j <7; j++)
{
NRC_JogMove(i, 1);
NRC_Delayms(200); //延时200ms
}
NRC_JogMoveStop(i);//停止点动
}//沿着正方向关节点动各轴
NRC_ServoDisable(); //伺服下电
NRC_Position inexbot2; //inexbot2是位置结构体的对象
NRC_GetCurrentPos(NRC_ACS, inexbot2);//获取当前关节坐标位置,赋给inexbot2,关节点动之后的坐标位置
printf(" inexbot2.pos=%f,%f,%f,%f,%f,%f,%f,\n",inexbot2.pos[0], inexbot2.pos[1], inexbot2.pos[2], inexbot2.pos[3], inexbot2.pos[4], inexbot2.pos[5],inexbot2.pos[6]);
// printf(" inexbot2.pos=%f,%f,%f,%f,%f,%f,\n", inexbot2.pos[0], inexbot2.pos[1], inexbot2.pos[2], inexbot2.pos[3], inexbot2.pos[4], inexbot2.pos[5]);
cout << "ACS Jog success" << endl;
//直角点动
NRC_SetServoReadyStatus(1); //设置伺服允许(伺服就绪状态)
NRC_SetOperationMode(NRC_TEACH_);//设置操作模式为示教模式
NRC_SetTeachRunSpeedPer(80);//设置示教速度
NRC_Position inexbot3; //inexbot3是位置结构体的对象
NRC_SetCurrentCoord(NRC_MCS);//设置当前坐标系为直角坐标系
NRC_GetCurrentPos(NRC_MCS, inexbot3); //获取当前直角坐标位置,赋给inexbot3。直角点动之前的坐标位置
printf(" inexbot3.pos=%f,%f,%f,%f,%f,%f,%f,\n",inexbot3.pos[0], inexbot3.pos[1], inexbot3.pos[2], inexbot3.pos[3], inexbot3.pos[4], inexbot3.pos[5],inexbot3.pos[6]);
NRC_Delayms(1000);//延时1000毫秒
NRC_ServoEnable();//伺服上电
for (int i = 1; i < 4; i++)
{
for (int j = 1; j < 7; j++)
{
NRC_JogMove(i, 1);
NRC_Delayms(200); //延时200ms
}
NRC_JogMoveStop(i);//停止点动
}//沿着正方向点动基本轴,点动7次
NRC_ServoDisable(); //伺服下电
NRC_Position inexbot4; //inexbot4是位置结构体的对象
NRC_GetCurrentPos(NRC_MCS, inexbot4);//获取当前直角坐标位置,赋给inexbot4。直角点动之后的坐标位置
printf("inexbot4.pos=%f,%f,%f,%f,%f,%f,%f,\n", inexbot4.pos[0], inexbot4.pos[1], inexbot4.pos[2], inexbot4.pos[3], inexbot4.pos[4], inexbot4.pos[5],inexbot3.pos[6]);
cout << "MCS Jog success" << endl;
while (1)
{
NRC_Delayms(1000);
}
}