错误
使用 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 都会使用反向欧拉法区分用户发送的信号。例如,如果使用关节位置运动生成器,在时间
用户发送命令 ,由此产生的速度、加速度和加加速度将是
速度
加速度
加加速度/急动度
这里
. 注意 和 总是作为机器人状态(的一部分)发送回用户作为 和 。因此,即使在数据包丢失的情况下,也可以提前计算结果的导数。有关更多详细信息,请查看 关于控制端接口的细节部分 。 最后,对于扭矩接口,违反 扭矩速率限制 torque rate 会触发错误
controller_torque_discontinuityControl 还使用反向欧拉法(backwards Euler)计算扭矩变化率,即
. 用户先前期望的扭矩也在机器人状态下作为 发回。因此,即使在数据包丢失的情况下,也可以提前计算产生的扭矩率。
提示
libfranka 版本中包含的速率限制器从 0.4.0 版本起修改用户发送的信号,使它们符合所有这些限制,除了逆向运动学之后的关节限制。可以查看 include/franka/rate_limiting.h 和 src/rate_limiting.cpp 以获取有关如何计算由此限制的所有接口的速度、加速度和加加速度的示例代码。我们再次强调,在不连续信号上使用速率限制很容易产生不稳定行为,因此在启用此 稳健性 robustness 功能之前,请确保信号足够平滑。
通讯问题导致的错误
如果在实时循环中 Control 在 20 个周期(即 20ms)内没有收到任何数据包,将收到 communication_constraints_violation 错误消息。请注意,如果连接间歇性丢包,它可能不会停止,但即使源信号符合接口规范,它也可能触发不连续性错误。在这种情况下,请查看我们的 故障排除部分 并考虑启用 信号处理功能 以提高控制回路的稳健性。
行为错误
警告
这些监控功能并不符合任何安全规范,也不保证对用户的任何安全。他们的目的只是帮助研究人员开发和测试他们的控制算法。
反射性错误 Reflex errors。如果估计的外部扭矩
或力 超过配置的阈值,将分别触发cartesian_reflex或joint_reflex错误。可以使用franka::Robot::setCollisionBehavior非实时命令配置阈值。提示
如果希望机器人与环境接触,必须将碰撞阈值设置为更高的值。否则,一旦抓住一个物体或推向一个表面,就会触发反射错误。此外,如果阈值较低,在没有接触的情况下非常快速或突然的运动可能会触发反射错误;外部扭矩和力只是 估计值,根据机器人配置它们可能不准确,尤其是在高加速阶段。可以监视它们的值通过观察机器人状态中的
和 。自碰撞避免 Self-collision avoidance。如果机器人达到接近自碰撞的配置,则会触发
self_collision_avoidance_violation错误。警告
此错误并不能保证机器人在任何配置和速度下都能防止自碰撞。如果使用扭矩接口以全速驱动机器人,机器人可能会发生自我碰撞。
如果达到 扭矩传感器限制,
tau_j_range_violation错误将被触发。这并不能保证传感器在任何高扭矩相互作用或运动后不会损坏,但旨在防止其中一些。如果达到 最大允许功率 ,
power_limit_violation错误将触发。它将阻止机器人移动并阻止控制循环继续。如果达到关节或笛卡尔极限,将分别得到一个
joint_velocity_violation或一个cartesian_velocity_violation错误。