Create a Simple Pendulum in MATLAB
This example constructs a simple pendulum in MATLAB®. It demonstrates various classes under the 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 build the simple pendulum. First, import MATLAB packages so the simscape.multibody.and Simscape.
qualifiers are not needed in front of class names.
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 swings 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 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:
addComponent(pendulum,"World",WorldFrame); addComponent(pendulum,"Rotator",rotator); addComponent(pendulum,"Link",link); addComponent(pendulum,"Pivot",RevoluteJoint);
Make appropriate connections between components. The connectVia
method on class Multibody 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
simscape.multibody.Multibody
| simscape.multibody.RigidBody