跳到主要内容

非实时指令常见问题

非实时接口的报错都是通过error_code错误码反馈的,调试以及实际使用中,务必检查每次调用的error_code。

运动相关

下发运动指令后机器人不动

现象:调用 moveAppend + moveStart之后机器人不运动。 排查步骤:

  1. 确认函数调用是否成功 检查办法:
std::string id;
error_code ec;
MoveLCommand cmd {};
robot.moveAppend(cmd, id, ec);
if(ec) {
// 下发指令出错
}
robot.moveStart(ec);
if(ec) {
// 开始运动出错
}

一定要在每次调用SDK函数后都检查是否有错误码。运动指令会返回错误码的情况:

  • 机器人没有上电,或按下急停等无法运动的状态
  • 打开了拖动/RL工程运行中,等等机器人处于非空闲的状态
  • 一次moveAppend调用传入指令个数超过100条
  1. 接收并检查运动报错

运动过程中如果出现错误,比如超限位、奇异点等,可以用如下方式接收到:

void printInfo(const rokae::EventInfo &info) {
using namespace rokae::EventInfoKey::MoveExecution;
print(std::cout, "[运动执行信息] ID:", std::any_cast<std::string>(info.at(ID)), "Index:", std::any_cast<int>(info.at(WaypointIndex)),
"已完成: ", std::any_cast<bool>(info.at(ReachTarget)) ? "YES": "NO", std::any_cast<error_code>(info.at(Error)),
std::any_cast<std::string>(info.at(Remark)));
}
// 设置监听运动执行信息
robot.setEventWatcher(Event::moveExecution, printInfo, ec);

建议调试过程中将报错打印出来,或输出日志。如果连接了示教器,也会有控制器日志上报,如下: SDK运动指令报错日志

  1. 运动报错如何解决

运动报错一般统称为不可达。示例程序中的点位是根据不同机型给出的,多数时候如果想顺利运行,需要确认点位是可达的。

首先确认程序中给的点位数值含义以及单位:

// MoveAbsJ指令的目标点是关节角度,单位是弧度
MoveAbsJCommand moveAbsj({0.0, 0.2215, 1.4779, 0.0, 1.267, 0.0});
// MoveL和MoveJ指令的目标点是笛卡尔位姿,前三个数是XYZ位置,单位是米;后三个数是姿态,单位是弧度
MoveLCommand moveL({0.562, 0, 0.432, M_PI, 0, -M_PI});
MoveJCommand moveJ({0.2434, -0.314, 0.591, 1.5456, 0.314, 2.173});

如果位置出现几百几十的,那么单位错当成毫米了;如果角度出现180这种,那么一定是度数值。

确认点位数值无误后,参考点位不可达如何解决

点位不可达如何解决

关节点位一般只要不超过关节限位就是可达的。这里主要讨论笛卡尔点位不可达

  • 所有的笛卡尔点位都是工具相对于工件的,所以如果有设置工具工件,点位也需要调整
  • 不能超出机械臂工作范围
  • MoveL/MoveC等笛卡尔空间的运动,需要整条直线上的点都没有奇异点。能Jog过去不代表直线轨迹能走过去,和起始位置有直接关系。如遇奇异点,就需要调整点位,或者换成MoveJ
  • 对于MoveL/MoveJ,轴配置数据(confdata)也需要注意。confdata是示教的点位才有的,计算不了。
    • 对于示教的点位,cartPosture()函数返回的结果是包含confdata的,之后下发的运动指令也要带上。
    • 对于非示教点,confdata无法得知,那么需要告诉控制器不要用confdata计算逆解:
// 关闭使用conf
robot.setDefaultConfOpt(false, ec);

示教器上也能看到这项设置: 示教器默认conf设置

机器人没有运动到给定位置就停了

排查步骤:

  • 先检查是否运动过程中出现报错,参考前面两节的内容
  • 没有报错,那么可能是程序逻辑问题。Robot类在析构的时候会暂停机器人运动。所以如果机器人还在运动中程序就退出了,也会造成没运动到位就停了。解决办法:参考示例中waitRobot() 和 waitForFinish() 等方法阻塞进程,等待运动结束。

运动速度很慢/达不到期望速度

  • 检查程序速率。程序速率可以这样设置:
// 1代表100%的速率比例
robot.adjustSpeedOnline(1, ec);

示教器上也可以看到: 示教器程序速率

  • 检查设置速度的部分setDefaultSpeed(), cmd.speed用法是否正确

下发的指令个数是否有上限

没有数量限制。通过moveAppend下发后,会直接发送给控制器,如果条数过多,SDK自身会缓存一部分,并负责持续发送给控制器。这个条数默认是300,可通过setMaxCacheSize设置上限为1000。

与RobotAssist同时使用

目前如果使用 xCore SDK 控制机器人,并不会限制通过 RobotAssist 的控制。机器人的一些状态,通过 xCore SDK 更改后也会体现在 Robot Assist 界面上;一些工程运行,运动控制则是分离的。大致总结如下:

分类实现
会同步更新的组件- 底部状态栏:手自动,机器人状态,上下电;
- 状态监控窗口;
- 日志上报;
双方可控,即通过 RobotAssist 修改会生效的组件- RL 工程运行速率和循环/单次模式;
- 非实时模式运动的暂停;
- 工具工件组:更改 RobotAssist 右上角选择的工具工件会改变 toolset;通过 setToolset 设置了工具工件,右上角会显示 “toolx ”,“wobjx ”
不会同步更新的组件,包括但不限于- 下发的运动指令无法通过点击开始按钮让机器人开始执行;
- 加载的 RL 工程,以及前瞻指针、运动指针等,不会同步显示;
- 大部分机器人设置界面显示的功能打开状态和设定值等;

建议的控制方式是单一控制源,避免混淆。