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;
}