0

我目前正在尝试使用 Drake 在 kuka iiwa 7 上实现纯重力补偿控制。我已经将自己的代码实现到 2 个文件中:模拟和控制器。我的模拟包含我的可视化器,它接收命令并发送状态'。我的控制器接收状态并输出命令。为了创建它,我查看了 drake 的 kuka_simulation、move_iiwa_ee 和 kuka_plan_runner 示例代码。但是,我对这 3 个文件有一些疑问。

  1. 在 kuka_simulation 中,因为我想切换到扭矩控制器模式,所以我将变量 torque_control 设置为 true,将 InverseDynamicsController 替换为 KukaTorqueController。该扭矩控制器具有重力补偿。然而,由于模拟的全部目的是创建物理 kuka 手臂的副本,这是否意味着物理 kuka 手臂中已经存在扭矩控制器?

如果这是真的,向所有关节发送扭矩值 0 不应让手臂下降并保持其位置。但是,如果物理手臂中不存在扭矩控制器,我将不得不通过删除 KukaTorqueController 并将其放置在我的控制器代码中来更改我的模拟代码。

  1. 在 kuka_plan_runner, lcm_.publish(kLcmCommandChannel, &iiwa_command); 用于向仿真发送命令。但是,当我查看 iiwa_command 的源代码时,有一条注释说 /** * 参考关节位置。无论*臂处于位置控制模式还是扭矩控制模式,都应始终发送它们。*/ int32_t num_joints;

    std::vector<双>关节位置;

在扭矩控制模式下运行时,为什么我们需要发送手臂的命令位置?例如,如果手臂在 0 位置,如果我要向每个关节发送 0 的位置命令,同时向每个关节发送 1 的扭矩,这会不会产生矛盾?手臂在尝试施加扭矩时会尝试保持其当前位置。

4

1 回答 1

0

该扭矩控制器具有重力补偿。然而,由于模拟的全部目的是创建物理 kuka 手臂的副本,这是否意味着物理 kuka 手臂中已经存在扭矩控制器?

是的。我还没有找到任何方法来禁用物理 iiwa 手臂上的重力补偿。它始终处于活动状态,即使在向手臂发送扭矩时也是如此。在物理手臂上,发送的扭矩值(大致)与手臂已经命令到达目标位置的力相加。

这让我想到:

在扭矩控制模式下运行时,为什么我们需要发送手臂的命令位置?例如,如果手臂在 0 位置,如果我要向每个关节发送 0 的位置命令,同时向每个关节发送 1 的扭矩,这会不会产生矛盾?手臂在尝试施加扭矩时会尝试保持其当前位置。

简短版:位置控制始终有效,即使在扭矩控制模式下也是如此……是的,这有点矛盾。如果您发送位置和零扭矩,您将获得一个位置(以及阻抗)控制的机器人。在您的示例中,如果您发送位置 0 和扭矩 1,则手臂将以指定的扭矩从 0 点移开(直到它与命令位置偏离太多,在这种情况下会发生故障)。

在https://github.com/RobotLocomotion/drake/issues/11955中有更好的描述,其中更详细地介绍了真实手臂如何处理命令(以及 drake 如何尚未正确建模)。

于 2019-10-15T22:06:20.113 回答