Now uniform gravity value can be set for a subtree only after it is current. See the setUniformGravAccel method for details.
Now StatePropagator has separate setState() and setTime() methods for setting state and time. See the setTime method documentation for details.
Renamed evalForwardDynamics() to evalTreeForwardDynamics(). See evalTreeForwardDynamics documentation.
Added solver type enum to StatePropagator to support the different options for solving the equations of motion. See options documentation for details.
Moved Baumgarte params in StatePropagator to the options struct. See spOptions documentation.
Added the class Scene::GraphicalSceneCamera to act as an abstract base for camera classes in any GraphicalScene implementation. See GraphicalSceneCamera for details.
Refactored Scene::WebSceneCamera to be derived from and conform to the GraphicalSceneCamera API. As a result, WebSceneCamera has been removed from the Python bindings, and the type GraphicalSceneCamera should be used instead. See GraphicalSceneCamera for details.
Refactored Scene::BlenderSceneCamera to be derived from and conform to the GraphicalSceneCamera API. As a result, BlenderSceneCamera has been removed from the Python bindings, and the type GraphicalSceneCamera should be used instead. See GraphicalSceneCamera for details.
The KModel constructor was changed to take a StatePropagator as an input argument. This is available from the model using the state_propagator member variable. See KModel and KModel.state_propagator for details.
Renamed KModel::registerModel to KModel::_registerModel and KModel::unregisterModel to KModel::_unregisterModel. The Python versions have been renamed simiarly. These are now also protected. This helps users running simulations do registration correctly, i.e., via the public StatePropagator.registerModel. See KModel::_registerModel and KModel::_unregisterModel for details.
The DebugManager.enable_usage_tracking_map_errors has been modified to use a getter/setter by the names getUsageTrackingErrors/setUsageTrackingErrors. This now affects discard calls at the Python and C++ levels (previously just C++), and error messages have been improved. See setUsageTrackingErrors for details.
The collision detection and contact force calculation pipeline has been refactored to support using multiple collision engines and arbitrarily complex contact force calculations (heterogeneous terrain, different contact models depending on collision pair, etc.). See the collision dynamics section for more details.
New Features
Added support for computing flex system mass matrix inverse working. See evalTreeMassMatrixInverse() documentation.
Added support for computing extended OSCM working for flex bodies. See evalFramesOSCM() documentation.
Added the Math.floatingPointExceptions(enable) method to enable exceptions (for gcc only) when there are floating point errors. See floatingPointExceptions() documentation.
Added Multibody.kinematicsAnalysis() method. See kinematicsAnalysis() documentation.
Added CVodeIntegrator.getErrorContributions. This returns a vector indicating the error contribution for each component of the state vector. See getErrorContributions for details. This is computed from the component-wise products of the local errors and error weights using CVodeGetEstLocalErrors and CVodeGetErrWeights
Added the option to specify extra sets of edges to the MultibodyGraphServer, with each set of edges toggleable in the UI. See MultibodyGraphServer and showBodiesGraph for details.
Added Karana.KUtils.visjs.framesToGraph which returns a graph description that can be used to visualize the frame tree using Karana.KUtils.visjs.GraphServer. See framesToGraph and GraphServer for details.
Added python method FrameContainer.showFramesGraph to display the frame tree using a web-based graph visualization. See showFramesGraph for details.
Added the StatePropagator.getSubTree method to retrieve the SubTree associated with a StatePropagator. See StatePropagator.getSubTree for details.
Added the StatePropagator.hasRegisteredTimedEvent method for determining if an event with a given name has been registered with the StatePropagator. See StatePropagator.hasRegisteredTimedEvent for details.
Added the okay_not_exists optional argument to StatePropagator.unregisterTimedEvent. This allows one to unregister a TimedEvent, and just do nothing if an event with the specified name does not exist; previously, this always threw an error. See StatePropagator.unregisterTimedEvent for details.
Added the debug_model class-member variable to all KModels, which can be used to enable/disable debug prints per model. See the KModel section for details.
Added scatch, discrete states, and continuous states to KModels. See the KModel section for details.
Added the trace_state_propagator class-member variable to the StatePropagator class. This can be used to enable/disable tracing messages for the StatePropagator. See trace_state_propagator for details.
Added the stdDebugMsg method to BaseKModel. This can be used to print debug messages in a uniform way. See KModel section for details.,
Added a version of discard at the Python level that discards a Sequence[Base]. This makes discarding lists or tuples of objects dervied from Base simpler. See the discard function for details.
Enhancements
Now advanceTo() methods for CVode and ArkODE returns right away if new time is the same as the current time. See advanceTo() documentation.
The UniformGravity and PointMassGravity models have been updated to take a SubTree rather than a Multibody. This now means these models can be used on an individual SubTree rather than restricting them to just be used on a Multibody. See UniformGravity and PointMassGravity for details.
Switched to pybind11-stubgen for stub generation. This brough to light many typing issues that have been fixed. See Karana.Scene.ProxySceneNode as an example (now has the correct types for the scene argument).
The kdflex cmake files were updated with find_dependency calls for Boost and OpenSSL. See this issue for details.
KModels created directly in Python have been modified to use Generics when deriving from the KModel base class. This prevents false postivies from LSPs. See the KModel section for details.
The KModel class and associated classes have been moved to the Models namespace. See the KModel section for details.
Updated IdMixin to hold weak references to objects rather than objects themselves. This keeps DataStructs from interfeering with discard calls. See IdMixin for details.
Updated evalTAForwardDynamics to throw an error if there is very bad acceleration residue. See evalTAForwardDynamics for details.
Added sourceNode and targetNode getter methods to the SpringDamper model class. See sourceNode and targetNode for details
Modified the Karana.KUtils.visjs frontend to display a button to save a standalone HTML copy of the page.
Added a block method to Karana.KUtils.visjs.HybridServerBase which can be used to block the main thread and keep the server running. See block for details.
Added a coloring argument to Karana.KUtils.visjs.framesToGraph to control whether the nodes and edges are colored based on their derived type or based on node valency. See framesToGraph for details.
Added chains argument to Karana.KUtils.visjs.framesToGraph to also display edges for ChainedFrame2Frame instances. See framesToGraph for details.
Added FrameContainer::chainedFrame2Frames to get a list of all ChainedFrame2Frame instances. See chainedFrame2Frames for details.
Add a buttons argument to Subgraph.showBodiesGraph to specify extra buttons to be displayed in the frontend. See showBodiesGraph for details.
Added the static method WebUI::Server::canFindLocalClientExecutable to check whether the electron-based graphics frontend is installed. See canFindLocalClientExecutable for details.
Updated Karana.Dynamics.setupGraphics to open the graphics in a browser tab if the electron client isn’t installed. See setupGraphics for details.
Bug Fixes
Fixed bug in SubTree::sanitizedCoords() so all subhinges needed sanitization get processed. See sanitizedCoords() documentation.
Fixed operator+/- methods in SpatialInertial to properly handle 0 mass values. See SpatialInertia documentation.
Fixed a bug in the scheduler where an index was not reset correctly, leading events to be rescheduled incorrectly in certain cases.
Fixed bug related to internal cache dependencies of pnodes and sensor nodes.
The kdflex cmake files were udpated to use Eigen version 5.0. See this issue for details.