Skip to main content

A framework for hierarchical modelling and simulation of dynamic systems

Project description

.. image:: https://travis-ci.com/ralfgerlich/modypy.svg?branch=master :alt: Build Status :target: https://travis-ci.com/ralfgerlich/modypy

.. image:: https://codecov.io/gh/ralfgerlich/modypy/branch/master/graph/badge.svg :alt: Cove Coverage :target: https://codecov.io/gh/ralfgerlich/modypy

.. image:: https://www.code-inspector.com/project/17342/score/svg :alt: Code Quality Store

.. image:: https://www.code-inspector.com/project/17342/status/svg :alt: Code Grade

MoDyPy (rhymes with "modify") is a Python framework for Mo\ delling dy\ namic systems in Py\ thon. The framework provides methods for describing continous-time linear and non-linear systems in state-space representation <https://en.wikipedia.org/wiki/State-space_representation>. It was originally inspired by simupy <https://github.com/simupy/simupy> developed by Ben Margolis, but has a completely different philosophy and architecture than simupy.

The basic components of a dynamic system in MoDyPy are states and signals. States represent the internal state of the system, and signals represent the values calculated based on the state. Ports can be connected to signals, so that reusable blocks with input and output ports can be easily built.

For example, a simple combination of a DC-motor and a propeller can be built as follows:

.. code-block:: python

import matplotlib.pyplot as plt

from modypy.blocks.aerodyn import Propeller
from modypy.blocks.elmech import DCMotor
from modypy.blocks.sources import constant
from modypy.model import System
from modypy.simulation import Simulator
from modypy.utils.uiuc_db import load_static_propeller

# Import propeller data from UIUC database
thrust_coeff, torque_coeff = \
    load_static_propeller(
        'volume-1/data/apcsf_8x3.8_static_2777rd.txt',
        interp_options={
            "bounds_error": False,
            "fill_value": "extrapolate"
        }
    )

# Create the Engine
system = System()
dcmotor = DCMotor(system,
                  Kv=789.E-6,
                  R=43.3E-3,
                  L=1.9E-3,
                  J=5.284E-6)
propeller = Propeller(system,
                      thrust_coeff=thrust_coeff,
                      power_coeff=torque_coeff,
                      diameter=8*25.4E-3)

# Connect the signals
propeller.torque.connect(dcmotor.external_torque)
dcmotor.speed_rps.connect(propeller.speed_rps)

# Create the sources
voltage = constant(system, value=3.5)
density = constant(system, value=1.29)

# Connect the sources
voltage.connect(dcmotor.voltage)
density.connect(propeller.density)

# Run the simulator
simulator = Simulator(system=system, start_time=0)
simulator.run_until(t_bound=0.5)

# Plot the results
plt.plot(simulator.result.time, simulator.result.signals[:, propeller.thrust.signal_slice])
plt.title("Propeller Simulation")
plt.xlabel("Time (s)")
plt.ylabel("Thrust (N)")
plt.show()

.. image:: docs/propeller.png

Main Features

  • Simple architecture based on states, signals and connectible ports
  • Enables hierarchical modelling
  • Allows the establishment of reusable building blocks
  • Simulator for continuous-time, linear and non-linear systems
  • Steady state determination and linearization
  • Library of standard blocks, including 6-degree-of-freedom rigid body motion
  • Tested for 100% statement and branch coverage

Installation

MoDyPy is available via the pip installer:

.. code-block:: bash

$ pip install modypy

To install the development version,

.. code-block:: bash

$ git clone https://github.com/ralfgerlich/modypy.git $ pip install -e modypy

Examples

Check out the examples in the examples directory:

dcmotor.py A simple example using a DC-motor driving a propeller. rigidbody.py Some rigid-body simulation using moments and forces showing an object moving in a circle with constant velocity and turn-rate. bouncing_ball.py An example modelling a bouncing ball, demonstrating the use of events and event-handler functions. quadcopter_trim.py A larger example showcasing the steady-state-determination and linearisation of complex systems, in this case for a quadrocopter frame with four DC-motors with propellers.

They can be run from the sources using, e.g.,

.. code-block:: bash

$ pip install matplotlib $ python examples/bouncing_ball.py

Note that some of the examples require matplotlib to run and display the results.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

modypy-1.0.tar.gz (18.9 kB view hashes)

Uploaded Source

Built Distribution

modypy-1.0-py3-none-any.whl (30.4 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page