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

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

  • 由于 运动生成器的错误初始值(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 功能之前,请确保信号足够平滑。