Scaling the World
Bullet physics works best for objects larger than 0.1 simulation units. This is important for us becasue many real soft robots are on the order of 0.1m in length, leaving us no room to discretize them into smaller links. We must scale the world up to avoid numerical precision errors in bullet.
Bullet physics guidelines
Unfortunately the bullet physics wiki has been down for over a year now, so we must use an archived version of the page HERE. In addition, there is a small typo in that wiki that makes a big difference in how we scale inertias as discussed HERE. We use the convention agreed upon in the forum post.
Standard scaling laws
If we scale all lengths by X, we need to correct other variables:
|Angle||1||Theta_sim = 1.0 * Theta_real|
|Angular Velocity||1||w_sim = 1.0 * w_real|
|Length||X||L_sim = X * L_real|
|Linear Velocity||X||v_sim = X * v_real|
|Gravity||X||g_sim = X * g_real|
|Forces||X||F_sim = X * F_real|
|Torques||X2||T_sim = X2 * T_real|
|Inertias||X2||I_sim = X2 * I_real|
In addition, we could scale masses by a factor Y, leading to more corrections:
|Forces||Y||F_sim = Y*F_real|
|Torques||Y||T_sim = Y*T_real|
|Inertias||Y||I_sim = Y*I_real|
Combining length and mass scaling, we get combined corrections:
|Forces||X*Y||F_sim = X*Y*F_real|
|Torques||X2*Y||T_sim = X2*Y*T_real|
|Inertias||X2*Y||I_sim = X2*Y*I_real|
Note: We could choose a constant density, thus setting Y=X:raw-html-m2r:`<sup>3</sup>`. However, we do not actually need to do mass scaling according to the forum post from above, so we chose to set Y=1 for simplicity.
We set the sizes of objects in our world according to these units in the various URDF and actuator definition files, and it’s up to us to scale these dimensions accordingly. We also need to correct the gravitational constant when setting up our simulation. All other forces, torques, etc are calculated internally.
Since we are discretizing the soft robots into rigid links with angular stiffness and damping terms, we need to correct these terms for the dimensional scale.
# Preserve Torque Scaling: # Rotational Springs: T = K * (Theta-Theta_0) X^2 * Y * T = X^2 * Y * K * (Theta-Theta_0) # Rotational Dampers: T = B * (w-w_0) X^2 * Y * T = X^2 * Y * B * (w-w_0)
Therefore, we get the following scaling laws for rotational springs and dampers:
|Spring Stiffness||X2||K_sim = X2*K_real|
|Damping||X2||B_sim = X2*B_real|
We set these values in the joint definition file for each joint.
Scaling data back to real units
Since the simulations run with a certain length scaling, X, and mass scaling, Y, we need to scale the output data back to real units. Doing this is easy, just inverting all the relationships from above.
|Angular Velocity||1||w_real = w_sim|
|Length||1/X||L_real = (1/X)*L|
|Linear Velocity||1/X||v_real = (1/X)*v_sim|
|Gravity||1/X||F_real = (1/X)*F_sim|
|Forces||1/X||F_sim = X * F_real|
|Torques||1/X2||T_real = (1/X2)*T_sim|
|Inertias||1/X2||I_real = (1/X2)*I_sim|