Double Pendulum Tool

Double Pendulum

We created a custom double pendulum writing the VEX code from scratch. The point at the top is fixed where mass 1 and mass 2 are updated using the Explicit Euler method.

// get gravity
 f@get_gravity = point(0, "gravity", 1);
 // get length and angle and mass and omega of first pendulum
 f@get_length_1 = point(0, "len_1", 1);
 f@get_angle_1 = point(0, "theta_1", 1);
 f@get_mass_1 = point(0, "mass_1", 1);
 f@get_omega_1 = point(0, "omega_1", 1);

 // get length and angle and mass and omega of second pendulum
 f@get_length_2 = point(0, "len_2", 2);
 f@get_angle_2 = point(0, "theta_2", 2);
 f@get_mass_2 = point(0, "mass_2", 2);
 f@get_omega_2 = point(0, "omega_2", 2);
 // First Pendulum
 if (@ptnum == 1)
 {
    // Explicit Euler Theta 1 Update
    f@theta_1 += f@omega_1 * f@TimeInc;
 // Omega 1 denominator
    f@denom_1 = f@get_length_1 * (2.0 * f@get_mass_1 + f@get_mass_2 - f@get_mass_2 * cos(2.0 * f@get_angle_1 - 2.0 * f@get_angle_2));
 // Omega 1 numerator
    f@num_1 = -f@get_gravity * (2.0 * f@get_mass_1 + f@get_mass_2) * sin(f@get_angle_1);
    f@num_1 = f@num_1 - f@get_mass_2 * f@get_gravity * sin(f@get_angle_1 - 2.0 * f@get_angle_2);
    f@num_1 = f@num_1 - 2.0 * sin(f@get_angle_1 - f@get_angle_2) * f@get_mass_2 * (f@get_omega_2 * f@get_omega_2 * f@get_length_2 + f@get_omega_1 * f@get_omega_1 * f@get_length_1 * cos(f@get_angle_1 - f@get_angle_2));
 // Explicit Euler Omega 1 Update
    f@omega_1 += (f@num_1/f@denom_1) * f@TimeInc;
 // Convert to Cartesian Coordinates
    @P.x = f@get_length_1 * sin(f@theta_1);
    @P.y = -f@get_length_1 * cos(f@theta_1);
 }
 if (@ptnum == 2)
 {
    // Explicit Euler Theta 2 Update
    f@theta_2 += f@omega_2 * f@TimeInc;
 // Omega 2 denominator
    f@denom_2 = f@get_length_2 * (2.0 * f@get_mass_1 + f@get_mass_2 - f@get_mass_2 * cos(2.0 * f@get_angle_1 - 2.0 * f@get_angle_2));
 // Omega 2 numerator
    f@num_2 = 2.0 * sin(f@get_angle_1 - f@get_angle_2);
    f@num_2 = f@num_2 * (f@get_omega_1 * f@get_omega_1 * f@get_length_1  * (f@get_mass_1 + f@get_mass_2) + f@get_gravity * (f@get_mass_1 + f@get_mass_2) * cos(f@get_angle_1) + f@get_omega_2 * f@get_omega_2 * f@get_length_2 * f@get_mass_2 * cos(f@get_angle_1 - f@get_angle_2));
 // Explicit Euler Omega 2 Update
    f@omega_2 += (f@num_2/f@denom_2) * f@TimeInc;
 // Convert to Cartesian Coordinates
    @P.x = f@get_length_2 * sin(f@theta_2) + f@get_length_1 * sin(f@get_angle_1);
    @P.y = -f@get_length_2 * cos(f@theta_2) - f@get_length_1 * cos(f@get_angle_1);
 }

Leave a comment