纯重力补偿
Pure gravity compensation
我目前正在尝试使用 Drake 在 Kuka iiwa 7 上实现纯重力补偿控制。我已经将我的代码实现为 2 个文件:模拟和控制器。我的模拟包含我的可视化工具,它接收命令并发送状态。我的控制器接收状态并输出命令。为了创建它,我查看了 drake 的 kuka_simulation、move_iiwa_ee 和 kuka_plan_runner 示例代码。但是,我对这 3 个文件有一些疑问。
- 在kuka_simulation中,因为我想切换到扭矩控制器模式,所以我将变量torque_control设置为true,用KukaTorqueController替换了InverseDynamicsController。该扭矩控制器具有重力补偿。然而,由于模拟的全部目的是创建物理库卡臂的副本,这是否意味着扭矩控制器已经存在于物理库卡臂中?
如果这是真的,向所有关节发送一个0的扭矩值应该不会让手臂掉落并保持其位置。但是,如果物理手臂中不存在扭矩控制器,我将不得不通过删除 KukaTorqueController 并将其放入我的控制器代码中来更改我的模拟代码。
- 在kuka_plan_runner, lcm_.publish(kLcmCommandChannel, &iiwa_command);用于向模拟发送命令。但是,当我查看 iiwa_command 的源代码时,有一条评论说
/**
* The reference joint positions. They should always be sent regardless of
* whether the arm is in position control mode or torque control mode.
*/
int32_t num_joints;
std::vector< double > joint_position;
为什么我们需要在 运行 扭矩控制模式下发送手臂的指令位置?例如,如果手臂在 0 位置,如果我向每个关节发送 0 的位置命令,同时向每个关节发送 1 的扭矩,这不会产生矛盾吗?手臂会在尝试施加扭矩时尝试保持其当前位置。
This torque controller has gravity compensation. However, since the whole purpose of the simulation is create a copy of the physical kuka arm, does this mean that a torque controller already exists in the physical kuka arm?
是的。我还没有找到任何方法来禁用物理 iiwa 手臂上的重力补偿。它始终处于活动状态,即使在向手臂发送扭矩时也是如此。在物理手臂上,发送的扭矩值是(粗略地)添加到手臂已经命令到达目标位置的力。
这让我想到:
Why would we need to send commanded positions of the arm when running on torque control mode? For example, if the arm was at the 0 position and if I were to send a position command of 0 to each joint while sending a torque of 1 to each joint, wouldn't this create contradiction? The arm would try to keep it's current position while trying to apply a torque.
简短版本:位置控制始终有效,即使在扭矩控制模式下也是如此……是的,这有点矛盾。如果你发送位置和零扭矩,你会得到一个位置(嗯,阻抗)控制的机器人。在您的示例中,如果您发送位置 0 和扭矩 1,则手臂将以指定的扭矩从 0 点移开(直到它偏离命令位置太多,在这种情况下会发生故障)。
https://github.com/RobotLocomotion/drake/issues/11955 中有更好的描述,其中更详细地介绍了真实手臂如何处理命令(以及 drake 如何尚未正确建模)。
我目前正在尝试使用 Drake 在 Kuka iiwa 7 上实现纯重力补偿控制。我已经将我的代码实现为 2 个文件:模拟和控制器。我的模拟包含我的可视化工具,它接收命令并发送状态。我的控制器接收状态并输出命令。为了创建它,我查看了 drake 的 kuka_simulation、move_iiwa_ee 和 kuka_plan_runner 示例代码。但是,我对这 3 个文件有一些疑问。
- 在kuka_simulation中,因为我想切换到扭矩控制器模式,所以我将变量torque_control设置为true,用KukaTorqueController替换了InverseDynamicsController。该扭矩控制器具有重力补偿。然而,由于模拟的全部目的是创建物理库卡臂的副本,这是否意味着扭矩控制器已经存在于物理库卡臂中?
如果这是真的,向所有关节发送一个0的扭矩值应该不会让手臂掉落并保持其位置。但是,如果物理手臂中不存在扭矩控制器,我将不得不通过删除 KukaTorqueController 并将其放入我的控制器代码中来更改我的模拟代码。
- 在kuka_plan_runner, lcm_.publish(kLcmCommandChannel, &iiwa_command);用于向模拟发送命令。但是,当我查看 iiwa_command 的源代码时,有一条评论说
/**
* The reference joint positions. They should always be sent regardless of
* whether the arm is in position control mode or torque control mode.
*/
int32_t num_joints;
std::vector< double > joint_position;
为什么我们需要在 运行 扭矩控制模式下发送手臂的指令位置?例如,如果手臂在 0 位置,如果我向每个关节发送 0 的位置命令,同时向每个关节发送 1 的扭矩,这不会产生矛盾吗?手臂会在尝试施加扭矩时尝试保持其当前位置。
This torque controller has gravity compensation. However, since the whole purpose of the simulation is create a copy of the physical kuka arm, does this mean that a torque controller already exists in the physical kuka arm?
是的。我还没有找到任何方法来禁用物理 iiwa 手臂上的重力补偿。它始终处于活动状态,即使在向手臂发送扭矩时也是如此。在物理手臂上,发送的扭矩值是(粗略地)添加到手臂已经命令到达目标位置的力。
这让我想到:
Why would we need to send commanded positions of the arm when running on torque control mode? For example, if the arm was at the 0 position and if I were to send a position command of 0 to each joint while sending a torque of 1 to each joint, wouldn't this create contradiction? The arm would try to keep it's current position while trying to apply a torque.
简短版本:位置控制始终有效,即使在扭矩控制模式下也是如此……是的,这有点矛盾。如果你发送位置和零扭矩,你会得到一个位置(嗯,阻抗)控制的机器人。在您的示例中,如果您发送位置 0 和扭矩 1,则手臂将以指定的扭矩从 0 点移开(直到它偏离命令位置太多,在这种情况下会发生故障)。
https://github.com/RobotLocomotion/drake/issues/11955 中有更好的描述,其中更详细地介绍了真实手臂如何处理命令(以及 drake 如何尚未正确建模)。