错误

使用 FCI 时,可能会遇到一些错误,这些错误可能是由于用户发送的命令不合规、通信问题或机器人行为造成的。以下小节详细介绍了最相关的内容。如需完整列表,请查看 Errors

提示

请注意,在发生错误后,可以自动清除它并使用 franka::Robot::automaticErrorRecovery() 命令继续运行程序,而无需用户干预。在进一步操作前检查异常字符串,以确保错误不是严重错误。

也可以通过切换外部激活设备或使用 Desk 中的错误恢复按钮手动清除某些错误。

由于不合规的命令值而导致的错误

如果用户发送的 指令值 不符合 接口要求 ,则会出现以下错误之一:

  • 由于 运动生成器的错误初始值(wrong initial values of a motion generator) 而导致的错误:

  • joint_motion_generator_start_pose_invalid

  • cartesian_position_motion_generator_start_pose_invalid

  • cartesian_motion_generator_start_elbow_invalid

  • cartesian_motion_generator_elbow_sign_inconsistent

这些错误表明当前机器人值与用户发送的初始值之间存在差异。要修复这些错误,请确保控制回路从机器人状态中观察到的最后一个命令值开始。例如,对于关节位置接口

double time{0.0};
robot.control(
 [=, &time](const franka::RobotState& robot_state, franka::Duration period) -> franka::JointPositions {
   time += period.toSec();
   if (time == 0) {
     // Send the last commanded q_c as the initial value
     return franka::JointPositions(robot_state.q_c);
   } else {
     // The rest of your control loop
     ...
   }
 });
  • 由于使用关节位置/速度运动生成器违反 位置限制 而导致的错误,这将产生 joint_motion_generator_position_limits_violation 报错. 解决此错误应该很简单:确保发送的值在 限制 范围内。笛卡尔接口对逆运动学计算之后得到的关节信号也有限制:如果 Control 的逆运动学求解器产生超出限制的某个关节配置,cartesian_motion_generator_joint_position_limits_violation 将被触发。

  • 由于违反 速度(velocity) 的限制产生的错误和不连续的错误,其指的违反 加速度(acceleration) 和/或 加加速度 (jerk) 的限制。如果使用关节运动生成器,则可能的错误是

  • joint_motion_generator_velocity_limits_violation

  • joint_motion_generator_velocity_discontinuity (违反加速度限制)

  • joint_motion_generator_acceleration_discontinuity (违反加加速度限制)

如果使用的是笛卡尔运动生成器,错误可能是

  • 笛卡尔限制

    • cartesian_motion_generator_velocity_limits_violation

    • cartesian_motion_generator_velocity_discontinuity (违反加速度限制)

    • cartesian_motion_generator_acceleration_discontinuity (违反加加速度限制)

  • 逆运动学解算后的关节限制

    • cartesian_motion_generator_joint_velocity_limits_violation

    • cartesian_motion_generator_joint_velocity_discontinuity (违反加速度限制)

    • cartesian_motion_generator_joint_acceleration_discontinuity (违反加加速度限制)

要减少速度不合规或不连续性错误,请确保命令的信号不违反 限制 。对于每个运动生成器,Control 都会使用反向欧拉法区分用户发送的信号。例如,如果使用关节位置运动生成器,在时间 k 用户发送命令 qc,k,由此产生的速度、加速度和加加速度将是

  • 速度 q˙c,k=qc,kqc,k1Δt

  • 加速度 q¨c,k=q˙c,kq˙c,k1Δt

  • 加加速度/急动度 qc,k=q¨c,kq¨c,k1Δt

这里 Δt=0.001. 注意 qc,k1,q˙c,k1 和  q˙c,k1 总是作为机器人状态(的一部分)发送回用户作为 qd,q˙dq¨d。因此,即使在数据包丢失的情况下,也可以提前计算结果的导数。有关更多详细信息,请查看 关于控制端接口的细节部分

最后,对于扭矩接口,违反 扭矩速率限制 torque rate 会触发错误

  • controller_torque_discontinuity

Control 还使用反向欧拉法(backwards Euler)计算扭矩变化率,即 τ˙d,k=τd,kτd,k1Δt. 用户先前期望的扭矩也在机器人状态下作为 τd 发回。因此,即使在数据包丢失的情况下,也可以提前计算产生的扭矩率。

提示

libfranka 版本中包含的速率限制器从 0.4.0 版本起修改用户发送的信号,使它们符合所有这些限制,除了逆向运动学之后的关节限制。可以查看 include/franka/rate_limiting.hsrc/rate_limiting.cpp 以获取有关如何计算由此限制的所有接口的速度、加速度和加加速度的示例代码。我们再次强调,在不连续信号上使用速率限制很容易产生不稳定行为,因此在启用此 稳健性 robustness 功能之前,请确保信号足够平滑。

通讯问题导致的错误

如果在实时循环中 Control 在 20 个周期(即 20ms)内没有收到任何数据包,将收到 communication_constraints_violation 错误消息。请注意,如果连接间歇性丢包,它可能不会停止,但即使源信号符合接口规范,它也可能触发不连续性错误。在这种情况下,请查看我们的 故障排除部分 并考虑启用 信号处理功能 以提高控制回路的稳健性。


行为错误

警告

这些监控功能并不符合任何安全规范,也不保证对用户的任何安全。他们的目的只是帮助研究人员开发和测试他们的控制算法。

  • 反射性错误 Reflex errors。如果估计的外部扭矩 τ^ext 或力 OF^ext 超过配置的阈值,将分别触发 cartesian_reflexjoint_reflex 错误。可以使用 franka::Robot::setCollisionBehavior 非实时命令配置阈值。

    提示

    如果希望机器人与环境接触,必须将碰撞阈值设置为更高的值。否则,一旦抓住一个物体或推向一个表面,就会触发反射错误。此外,如果阈值较低,在没有接触的情况下非常快速或突然的运动可能会触发反射错误;外部扭矩和力只是 估计值,根据机器人配置它们可能不准确,尤其是在高加速阶段。可以监视它们的值通过观察机器人状态中的 τ^extOF^ext

  • 自碰撞避免 Self-collision avoidance。如果机器人达到接近自碰撞的配置,则会触发 self_collision_avoidance_violation 错误。

    警告

    此错误并不能保证机器人在任何配置和速度下都能防止自碰撞。如果使用扭矩接口以全速驱动机器人,机器人可能会发生自我碰撞。

  • 如果达到 扭矩传感器限制tau_j_range_violation 错误将被触发。这并不能保证传感器在任何高扭矩相互作用或运动后不会损坏,但旨在防止其中一些。

  • 如果达到 最大允许功率power_limit_violation 错误将触发。它将阻止机器人移动并阻止控制循环继续。

  • 如果达到关节或笛卡尔极限,将分别得到一个 joint_velocity_violation 或一个 cartesian_velocity_violation 错误。