Main Content

Creating a Simple Pendulum in MATLAB

This example constructs a simple pendulum in MATLAB. It demostrates various classes under simscape.multibody.* package to build a simple multibody system in MATLAB.

The pendulum consists of a single link suspended at one end from a pivot. It is considered to swing in the X-Y plane with gravity in the -Y direction. The zero position corresponds to the pendulum hanging straight down and the positive velocities correspond to counter-clockwise motion about the pivot when the pendulum is viewed from the +Z axis.

The following sections of code builds the simple pendulum.

% Import MATLAB Classes package so the "simscape.multibody." qualifier is not needed in front of class names.  
% Also import useful classes from Simscape.  (This shortcut can also be used at the command line.)
import simscape.multibody.* simscape.Value simscape.op.*

Construct the pendulum link with a brick geometry.

linkDimensions = Value([20 2 1], "cm");
link = RigidBody;
color = [0 1 1];
addComponent(link, "Body", "reference", Solid(Brick(linkDimensions),SimpleVisualProperties(color)));
addFrame(link, "pin", "reference", ...
         RigidTransform(StandardAxisTranslation(linkDimensions(1)/2, Axis.NegX)));
addConnector(link, "pin");

Construct a rigid transform that aligns the +X axis of the follower frame with the -Y direction of the base frame. This is used to position the pivot so that the pendulum swigs in the X-Y plane and that it hangs straight down at the zero position.

rotator = RigidTransform(AlignedAxesRotation(Axis.PosX, Axis.NegY, Axis.PosZ, Axis.PosZ));

Create the multibody object, and modify gravitational acceleration to be in the -Y direction instead of the default -Z direction.

pendulum = Multibody;
pendulum.Gravity = circshift(pendulum.Gravity, -1);

Add the necessary components to the multibody object

addComponent(pendulum, "World", WorldFrame);
addComponent(pendulum, "Rotator", rotator);
addComponent(pendulum, "Link", link);
addComponent(pendulum, "Pivot", RevoluteJoint);

Make appropriate connections between components. Multibody object's connectVia method is used to connect two frames together across a joint.

connect(pendulum, "World/W", "Rotator/B");
connectVia(pendulum, "Pivot", "Rotator/F", "Link/pin");

Construct an operating point to position the pendulum link 30 degrees counter-clockwise from the vertical, and rotating counter-clockwise at 1 revolution/sec.

op = OperatingPoint;
op("Pivot/Rz/q") = Target(simscape.Value(30, "deg"), "High");
op("Pivot/Rz/w") = Target(simscape.Value(1, "rev/s"), "High");

Visualize the pendulum.

compiledPendulum = compile(pendulum);
state = computeState(compiledPendulum, op);
visualize(compiledPendulum, state, "simple_pendulum");

Generate a Simulink model of the pendulum

makeBlockDiagram(pendulum, op, "simple_pendulum")

See Also