我目前正在尝试使用 Drake 在 kuka iiwa 7 上实现纯重力补偿控制。我已经将自己的代码实现到 2 个文件中:模拟和控制器。我的模拟包含我的可视化器,它接收命令并发送状态'。我的控制器接收状态并输出命令。为了创建它,我查看了 drake 的 kuka_simulation、move_iiwa_ee 和 kuka_plan_runner 示例代码。但是,我对这 3 个文件有一些疑问。
- 在 kuka_simulation 中,因为我想切换到扭矩控制器模式,所以我将变量 torque_control 设置为 true,将 InverseDynamicsController 替换为 KukaTorqueController。该扭矩控制器具有重力补偿。然而,由于模拟的全部目的是创建物理 kuka 手臂的副本,这是否意味着物理 kuka 手臂中已经存在扭矩控制器?
如果这是真的,向所有关节发送扭矩值 0 不应让手臂下降并保持其位置。但是,如果物理手臂中不存在扭矩控制器,我将不得不通过删除 KukaTorqueController 并将其放置在我的控制器代码中来更改我的模拟代码。
在 kuka_plan_runner, lcm_.publish(kLcmCommandChannel, &iiwa_command); 用于向仿真发送命令。但是,当我查看 iiwa_command 的源代码时,有一条注释说 /** * 参考关节位置。无论*臂处于位置控制模式还是扭矩控制模式,都应始终发送它们。*/ int32_t num_joints;
std::vector<双>关节位置;
在扭矩控制模式下运行时,为什么我们需要发送手臂的命令位置?例如,如果手臂在 0 位置,如果我要向每个关节发送 0 的位置命令,同时向每个关节发送 1 的扭矩,这会不会产生矛盾?手臂在尝试施加扭矩时会尝试保持其当前位置。