Whats New in OpenSim 4.6?

Whats New in OpenSim 4.6?

We are pleased to announce the following new features, bug fixes, and other improvements in OpenSim 4.6. The new software includes a brand new visualizer with improved visualization quality, smoother playback animations, and seamless image and video generation tools, along with other improvements to the look and feel of the application.

For API users, we now provide official PyPI packages, meaning that you can now pip-install OpenSim:

pip install opensim

We will also continue to provide official Conda packages. Learn more about using OpenSim in Python here: Scripting in Python. For those looking for an introduction to the OpenSim API through Python, check out the series Jupyter notebooks which can be directly in Google Colab.

Finally, OpenSim 4.6 also includes many new modeling and simulation features including several addition to Moco, OpenSim’s direct collocation optimal control package library. Release notes are provided below along with links to the full change logs for more detail.

Changes from OpenSim 4.5
Note that the following list summarizes all changes since OpenSim 4.5, including changes introduced in the API-only OpenSim versions 4.5.1 and 4.5.2.

OpenSim GUI, featuring the new OpenSim Viewer

The OpenSim GUI now features the new OpenSim Viewer, a new browser-based 3D visualizer designed to improve the quality, performance, and user experience when viewing OpenSim models, both in animation playback and media creation.

opensim_viewer.png
The new OpenSim Viewer, embedded in the OpenSim GUI’s visualizer window.

The OpenSim Viewer features the following visualization improvements:

  • Native support for Apple Silicon machines.

  • Smoother playback animations (i.e., no dropped frames or inconsistent frame rates) and overall improved performance via hardware acceleration.

  • Loaded motions can now be saved to video directly in the MP4, MOV, and GIF formats with options for different quality and frame rate settings.

  • Snapshot creation now supports custom resolutions and transparent backgrounds.

  • Intuitive viewer navigation controls, quick component selection and focus, and smooth view reorientation.

  • A modern user interface with an intuitive component tree representing the viewer scene, where users can easily control the configuration and visibility of lighting elements, floor and background displays, and models.

opensim-video_2026-04-20_10-00-44.gif
A walking trial from the Rajagopal et al. (2016) model distribution, saved as a GIF directly from the OpenSim GUI.

OpenSim API

With OpenSim 4.6, we’ve introduced new features to expand modeling capabilities, speed up simulation performance, and improve the overall user experience:

  • The Manager class has been updated to improve documentation and add new features. Notably, support for the implicit integrator CPodes (i.e., Manager::IntegratorMethod::CPodes) has been added. CPodes is designed for integrating stiff numerical systems and therefore can significantly improve performance when simulating musculoskeletal models.

  • Added ExponentialContactForce, a foot-ground contact model based on exponential spring functions that can provide up to a 10X performance improvement over the Hunt-Crossley contact model.

  • Added StatesDocument, a new class that enables direct serialization of all states in a StatesTrajectory, including discrete states.

  • Added SynergyController, a new subclass of Controller that computes model controls based on linear combination of a set of Input control signals and a set of synergy vectors. This class enables embedding a control structure based on muscle synergies directly in an OpenSim model that is compatible with forward simulation and optimization (e.g., Moco, see below).

  • Added StationDefinedFrame, a new class for defining a Frame based on three Station (i.e., body-fixed points). Use this class to define joint frames based on ISB recommendations. See the associated OpenSim Creator tutorial for StationDefineFrames for more information.

  • Added ExpressionBasedPathForce and ExpressionBasedFunction to provide additional options for defining model components based on user-defined expressions.

  • Added the following new ModelProcessor features:

    • ModOpAddReserves now has an option to skip “residual coordinates”, i.e., coordinates belonging to joints whose parent frame is Ground.

    • Added ModOpAddResiduals for adding CoordinateActuators to “residual coordinates” (see previous bullet).

    • Added ModOpPrescribeCoordinateValues for prescribing the motion of coordinates based on a table of coordinate values.

  • Add the following new TableProcessor features:

    • TabOpLowPassFilter now trims the filtered trajectory to the original time range (i.e., removes padded time points).

    • Added TabOpAppendCoupledCoordinateValues. Given a TimeSeriesTable containing values of independent coordinates in CoordinateCouplerConstraints, this operator computes the dependent coordinate values and appends them to the table.

    • Added TabOpAppendCoordinateValueDerivativesAsSpeeds. Given a TimeSeriesTable containing coordinate values, this operator computes the derivative of the coordinate values using a spline fit and appends it to the table as a coordinate speed. For example, the derivative of column /jointset/ankle_r/ankle_angle_r/value will be appended as a new column with label /joinset/ankle_r/ankle_angle_r/speed.

Moco’s example3DWalking (see below) shows how to use TabOpAppendCoupledCoordinateValues and TabOpAppendCoordinateValueDerivativesAsSpeedsto construct a reference trajectory for a tracking optimization problem from an inverse kinematics solution.

Scholz2015GeometryPath is currently an experimental class. We do not yet support visualizing wrapping paths in the GUI, and current default settings and behavior may change in future versions of OpenSim.

OpenSim Moco

OpenSim 4.6 includes several updates to Moco, the direct collocation optimal control library:

  • The tropter library, and subsequently MocoTropterSolver, have been removed. Since users overwhelmingly prefer MocoCasADiSolver, this decision was made to unify future Moco development around the CasADi numerical optimization framework.

  • Added example3DWalking (C++, Python, and Matlab), which demonstrates best practices for creating muscle-driven tracking simulations in Moco when using foot-ground contact models.

  • Moco now supports OpenSim models that include a PrescribedController. Model controls defined by a PrescribedController will not be included in the trajectory optimization problem solved by Moco.

  • Moco also supports the new SynergyController class. See exampleMocoInverse for a demonstration on how to use SynergyController within a MocoStudy.

  • Added new features to PolynomialPathFitter, including an option to find a minimal set of polynomial coefficients via stepwise regression and support for muscle paths dependent on more than 6 coordinates. In addition, performance in MultivariatePolynomialFunction has been improved by ~25%.

  • Several Moco examples have been updated to use FunctionBasedPaths fitted via PolynomialPathFitter, which significantly improves convergence time (i.e., 5X to 10X faster).

  • Added support for the projection method for enforcing kinematic constraints from Bordalba et al. (2023). This method can be enabled in MocoCasADSolver via solver.set_kinematic_constraint_method('Bordalba2023'). This method is compatible with all transcription in Moco, including the recently added legendre-gauss-# or legendre-gauss-radau-# schemes. The original (and default) kinematic constraint method from Posa et al. (2016) can be explicitly selected with 'Posa2016' (but is only compatible with the hermite-simpson scheme).

  • Added MocoGeneralizedForceTrackingGoal to support tracking inverse dynamics moments directly in a MocoStudy. See exampleMocoTrack for a demonstration of this goal and the associated new utility MocoStudy::calcGeneralizedForces(), which enable computing joint moments directly from a MocoTrajectory.

  • Added MocoExpressionBasedParameterGoal to support defining cost functions based on MocoParameters.

  • Added MocoOutputBase::setSecondOutputPath and MocoOutputBase::setOperation to support defined goals based on the composite of two Output values.

  • Added the following new scripting variants of MocoStudy::analyze(): MocoStudy::analyzeVec3(), MocoStudy::analyzeSpatialVec(), MocoStudy::analyzeRotation().

Bug Fixes

  • Exposed the "dissipated energy" state variable allocated by the SimTK::Force::LinearBushing that is internal to BushingForce. This change fixed a bug in Moco where adding a BushingForce led to a segfault due to a mismatch between the size of the auxiliary state vector reserved by Moco and SimTK::State::getZ().

  • Fixed bug in C3DFileAdapter where there was an error when reading C3D files with more than 255 markers.

  • Several issues in OpenSim::ExpressionBasedBushingForce::generateDecorations were fixed: the method now checks for zero property values and NaNed vectors before emitting decorations.

  • Fixed various issues in PolynomialPathFitter including failures when too few coordinate samples were provided and hardware threads being assigned to Force elements without a geometry-based path.

  • Fixed bug in Logger::cout, it now it works at any logger level.

  • Fixed various memory leak issues in OpenSim models and model components.

  • Fixed an issue where a copy of an OpenSim::Model containing a OpenSim::ExternalLoads could not be finalized.

Packaging and Availability

Note, if you are downloading on a Mac, you will need a newer version of Java (between 8 and 17) installed on your computer.

  • The OpenSim 4.6 release and other “bleeding edge” release candidates can also be downloaded directly from GitHub: Releases · opensim-org/opensim-gui.

  • Conda and PyPI packages containing the Python interface of the OpenSim 4.6 API are also available for install. See Scripting in Python for full installation instructions, versioning, supported platforms, and more.

    • conda: conda install -c opensim-org opensim

    • PyPI: pip install opensim

Full Change Logs

 

 

OpenSim is supported by the Mobilize Center , an NIH Biomedical Technology Resource Center (grant P41 EB027060); the Restore Center , an NIH-funded Medical Rehabilitation Research Resource Network Center (grant P2C HD101913); and the Wu Tsai Human Performance Alliance through the Joe and Clara Tsai Foundation. See the People page for a list of the many people who have contributed to the OpenSim project over the years. ©2010-2024 OpenSim. All rights reserved.