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")