Skip to content

Kp / Kd Parameter Description

In Simulation (Isaac Gym)

PD Controller:

\[\tau = K_p e_p + K_d e_v\]
  • \(K_p\): Stiffness
  • \(K_d\): Damping
  • \(e_p\): Position error
  • \(e_v\): Velocity error

On Real Robot Actuators

PID Controller:

\[I = P_p P_v e_p + P_v e_v\]
\[\tau' = g I K_t = g(P_p P_v K_t e_p + P_v K_t e_v)\]
  • \(P_p\): Position loop proportional gain
  • \(P_v\): Velocity loop proportional gain
  • \(g\): Gear ratio
  • \(K_t\): Torque constant

Sim-to-Real Parameter Alignment

When \(\tau = \tau'\), the relationship between simulation and real-robot parameters is as follows:

\[K_p = g P_p P_v K_t\]
\[K_d = g P_v K_t\]

Derived real-robot configuration parameters:

\[P_v = \frac{K_d}{K_t \cdot g}\]
\[P_p = \frac{K_p}{K_d}\]

Joint Logic Code Snippet

void RealRobot::computeJointPdParams() {
  joint_Kp_s = joint_Kp_;
  joint_Kd_s = joint_Kd_;

  for (int i = 0; i < robot_dof_nums_; i++) {
    if (bAdam_u_) {
      // Adam-U 逻辑
      joint_Kp_(i) = joint_Kp_(i) / joint_Kd_(i);
      joint_Kd_(i) = joint_Kd_(i) / PConfig::getInstance().kdScale()(i);
    } else {
      // Adam 逻辑:踝关节特殊处理
      if (i == kAnkleJoint1 || i == kAnkleJoint2) {
        joint_Kp_(i) = joint_Kp_(i - 1);
        joint_Kd_(i) = joint_Kd_(i - 1);
      } else {
        joint_Kp_(i) = joint_Kp_(i) / joint_Kd_(i);
        joint_Kd_(i) = joint_Kd_(i) / PConfig::getInstance().kdScale()(i);
      }
    }
  }

  std::cout << "joint_Kp: " << joint_Kp_.transpose() << std::endl;
  std::cout << "joint_Kd: " << joint_Kd_.transpose() << std::endl;
}