报错及异常现象处理
开始运动阶段
开始运动时轻微下坠
负载设置
- 检查负载设置是否正常,开启实时模式后,需要使用
setLoad(tool_load, ec); - 注意区分实时运动控制中的
void setLoad(const Load &load, error_code &ec)与算法模型库中的void setLoad(double mass, const std::array<double, 3> &cog, const std::array<double, 3> &inertia)以及力控模块的void setLoad(const Load &load, error_code &ec)
指令下发
- 重力补偿打开后,下发当前点位作为初始点,若出现点头现象,检查下发指令是否为重力补偿前数据
- 重力补偿前关节位置获取:
jntPos = robot.jointPos(ec); - 重力补偿前tcp位姿获取:
robot.getStateData(rokae::RtSupportedFields::tcpPoseAbc_m, tcp_pose)
开始运动报错
运动中报错
如何捕获运动报错
void funRTControl() {
try {
auto rtCon = robot.getRtMotionController().lock();
rtCon->startMove(RtControllerMode::jointPosition);
// 调用方式一:阻塞运行,运动中报错会抛出异常
rtCon->startLoop(true);
// 调用方式二:非阻塞运行,运动中如果出错,stopLoop时会抛出异常
rtCon->startLoop(false);
rtCon->stopLoop();
} catch (const std::exception &e) {
std::cerr << e.what();
}
}
报错原因及处理
实时模式一共有 20个错误类型。
报错 kInstabilityDetection
如果常出现 kInstabilityDetection,可在实时模式关闭状态下调高网络阈值(setRtNetworkTolerance),建议 60% 以上。
速度/加速度超出阈值
- 若在
startMove刚开始即停止,通常是起始位置不是当前位置。 - 若在运动中出现,可能和上位机实时性、网络波动有关。
- 自定义轨迹规划时,通常是相邻指令差距过大,需要优化规划。
- 存在交换机等复杂链路时,建议先改为直连验证。
如何正确设置起始位置
比如 MoveJ(start_pos, target_pos, speed) 中 start_pos 可按以下方式获取:
- 推荐:用
posture()/jointPos()读取。
std::array<double, 16> init_position{};
Utils::postureToTransArray(
robot.posture(rokae::CoordinateType::flangeInBase, ec),
init_position);
- 循环
updateRobotState清空旧帧,读最新状态。
while (robot.updateRobotState(chrono::steady_clock::duration::zero()));
- 在回调首帧读取并更新起始位姿。
std::function<CartesianPosition()> callback = [&, rtCon]() {
if (init) {
robot.getStateData(RtSupportedFields::tcpPose_m, init_pos);
init = false;
}
};
rtCon->setControlLoop(callback, 0, true);
位置控制过程中发生异响或抖动
处理方式
- 运行 SDK 示例时:
- 建议设置滤波(
setFilterFrequency、setFilterLimit)。 - Windows 上通常更需要滤波。
- 建议直连,减少网络抖动。
- 网卡差异会影响实时性(现场反馈 Realtek 稳定性更好)。
- 建议设置滤波(
- 自定义规划时:
- 除上述项外,重点排查回调是否超时(单周期是否超过 1ms)。
- 必要时检查结合诊断曲线、或获取状态数据检查速度曲线是否平滑。
更多示教器生效范围、回调实时性与跟随延迟问题,请参考 其它使用与实时性问题。
如何查看诊断数据
诊断曲线含义说明(4.0控制器新增)
指令值
- rci_q_c:关节位置模式,用户下发的指令位置(可以根据此数据判断指令是否平滑)
测量值
- rci_q_m:当前关节空间位置测量值
- rci_cart_m:当前笛卡尔空间位姿测量值
- rci_qv_m:当前关节空间速度测量值
- rci_cart_v_m:当前笛卡尔空间速度测量值
滤波值
- rci_q_c_hw:关节空间,用户下发指令位置滤波后下发伺服数据,滤波截止频率由rtCon->setFilterFrequency控制
- rci_cart_c_hw:笛卡尔空间,用户下发指令位置滤波后下发伺服数据,滤波截止频率由rtCon->setFilterFrequency控制