Skip to main content
Ctrl+K
kdFlex 1.1.1 documentation - Home
  • Chatbot

Contents:

  • Chatbot
  • Installation
  • Examples
    • Importing a robot arm multibody model from a URDF file
    • 2-link Pendulum
    • Load Mars 2020 rover model from a URDF file
    • n-link Pendulum
    • Spice Frames
    • Import/Export Multibodies
    • Graphics demo
    • Data Logging
    • Slider crank example
    • Double-Wishbone
    • 2-link Pendulum Collision Example
    • Procedural n-link pendulum collision example
    • Flexible Slider-Crank
    • Flexible Double-Wishbone
    • \(n\)-link Pendulum Benchmark Comparison
    • Fully Augmented \(n\)-link Pendulum Benchmark Comparison
    • ATRVjr Driving
    • Cart Pole Reinforcement Learning
    • ATRVjr Reinforcement Learning
    • ATRVjr ROS Integration
  • Key concepts
  • Usage Guide
  • Recipes
  • Program skeletons
  • API
    • kdFlex Python API
      • Karana
        • Karana.Collision
        • Karana.Core
        • Karana.Dynamics
        • Karana.Frame
        • Karana.KUtils
        • Karana.Math
        • Karana.Models
        • Karana.Scene
        • Karana.WebUI
        • Karana.version
    • kdFlex C++ API
      • Namespace coal
      • Namespace Eigen
      • Namespace Karana
      • Namespace Karana::Collision
      • Namespace Karana::Core
      • Namespace Karana::Dynamics
      • Namespace Karana::Frame
      • Namespace Karana::KUtils
      • Namespace Karana::Math
      • Namespace Karana::Models
      • Namespace Karana::Scene
      • Namespace Karana::WebUI
      • Namespace KaranaTest
      • Namespace KaranaTest::Dynamics
      • Namespace kf
      • Namespace kf::Frame
      • Namespace LockingBase
      • Namespace pybind11
      • Namespace pybind11::detail
      • Namespace pybind11::typing
      • Namespace spdlog
      • Namespace spdlog::sinks
      • Namespace std
      • Template Struct has_pybind11_caster
      • Struct FrameContact
      • Struct Base::DumpOptions
      • Struct BasicDAGImpl::Node
      • Struct BasicTreeImpl::Node
      • Struct DebugManager
      • Struct EdgeHash
      • Struct LockingBase::DumpOptions
      • Struct NestedVars
      • Struct CompoundBody::ATBIDataCaches
      • Struct CompoundBody::DumpOptions
      • Struct CompoundBody::InvDynVectors
      • Struct CompoundSubhinge::ATBIFilterVectors
      • Struct CompoundSubhinge::ATBIMatrices
      • Struct CoordBase::ATBIFilterVectors
      • Struct CoordBase::ATBIMatrices
      • Struct CoordData::CoordOffset
      • Struct DynamicFunctor
      • Struct DynamicFunctorNoJac
      • Template Struct Functor
      • Struct HingeBase::HingeParams
      • Struct HingeNode::DumpOptions
      • Struct HingeOnodeATBIDataCaches
      • Struct HingeOnodeATBIFilterVectors
      • Struct HingeOnodeATBIMatrices
      • Struct HingeOnodeATBISmootherVectors
      • Struct HingeOnodeInvDynVectors
      • Struct HingeOnodeUpsilonMatrices
      • Struct HingePnode::ATBIDataCaches
      • Struct HingePnode::ATBIFilterVectors
      • Struct HingePnode::ATBIMatrices
      • Struct HingePnode::ATBISmootherVectors
      • Struct HingePnode::InvDynVectors
      • Struct HingePnode::UpsilonMatrices
      • Struct LoopConstraintBase::QMats
      • Struct ModalAnalysis
      • Struct ModalNodeDeformationProvider::DeformationParams
      • Struct ModelManager::MMFunctions
      • Struct NodeDeformationProvider::DeformationParams
      • Struct Physical1DofSubhinge::PhysicalSubhingeParams
      • Struct PhysicalBody::DumpOptions
      • Struct PhysicalBody::GatherSweepFlags
      • Struct PhysicalBody::InvDynVectors
      • Struct PhysicalBodyParams
      • Struct PhysicalModalBody::ATBIFilterVectors
      • Struct PhysicalModalBody::ATBIMatrices
      • Struct PhysicalModalBody::ATBISmootherVectors
      • Struct PhysicalModalBody::ModalUpsilonMatrices
      • Struct PhysicalModalBody::SZNodeMatrices
      • Struct PhysicalModalBodyParams
      • Struct PhysicalSubhinge::PhysicalSubhingeParams
      • Struct PhysicalSubhinge_T::ATBIFilterVectors
      • Struct PhysicalSubhinge_T::ATBIMatrices
      • Struct ScrewSubhinge::PhysicalSubhingeParams
      • Struct SphericalSubhinge::PhysicalSubhingeParams
      • Struct StatePropagator::Counters
      • Struct StickPartsConfig
      • Struct SubTree::DumpTreeOptions
      • Struct Frame::DumpFrameTreeOptions
      • Struct FrameContainer::DumpOptions
      • Struct FrameToFrame::DumpOptions
      • Struct OrientedChainedFrameToFrame::DumpOptions
      • Template Struct extract_matrix_dimensions
      • Template Struct extract_matrix_dimensions< Eigen::Matrix< double, _rows, 1 > >
      • Template Struct extract_matrix_dimensions< Eigen::Matrix< double, _rows, _cols, Eigen::RowMajor > >
      • Template Struct extract_rows
      • Template Struct extract_rows< Eigen::Matrix< double, rows, 1 > >
      • Template Struct is_eigen_int_type
      • Template Struct is_eigen_int_type< Eigen::Matrix< int, Rows, 1 > >
      • Template Struct is_eigen_type
      • Template Struct is_eigen_type< Eigen::Matrix< double, Rows, 1 > >
      • Template Struct is_eigen_type< Eigen::Matrix< double, Rows, Cols, Eigen::RowMajor > >
      • Template Struct is_eigen_vector
      • Template Struct is_eigen_vector< Eigen::Matrix< double, Rows, 1 > >
      • Struct SinglePlotData
      • Struct Angle
      • Struct ArkExplicitIntegrator::IntegratorOptions
      • Struct CVodeIntegrator::IntegratorOptions
      • Struct FloatQuantityHelper
      • Struct IdaIntegrator::IntegratorOptions
      • Struct Integrator::IntegratorOptions
      • Struct Length
      • Struct Length3
      • Template Struct NumDiffBaseFunctor
      • Struct NumDiffFunctor
      • Struct StateSpace::SS
      • Struct Vec3QuantityHelper
      • Struct GravityOutput
      • Struct ClientSceneData
      • Struct CollisionInfo
      • Struct Contact
      • Struct DistanceInfo
      • Struct ImportResult
      • Struct OrthographicProjection
      • Struct PerspectiveProjection
      • Struct PhongMaterialInfo
      • Struct PhysicalMaterialInfo
      • Struct RGBABuffer
      • Struct ScenePartSpec
      • Struct TextParameters
      • Struct LocalClientOptions
      • Struct TreeView::Node
      • Template Struct handle_type_name< typing::Sequence< T > >
      • Template Struct PyStateTypeWrapper
      • Template Struct PyTypeWrapper
      • Template Class duration_caster
      • Class ContactForceBase
      • Class ContactForceManager
      • Class FrameCollider
      • Class HuntCrossley
      • Class HuntCrossley::HuntCrossleyParams
      • Class HuntCrossley::HuntCrossleyScratch
      • Class Base
      • Class BaseContainer
      • Class BaseVars
      • Class BaseWithVars
      • Template Class BasicDAGImpl
      • Template Class BasicTreeImpl
      • Template Class CallbackRegistry
      • Template Class DAG
      • Template Class DataCache
      • Class IdGenerator
      • Class IdHashStruct
      • Class JsonLogger
      • Class LockingBase
      • Class LockingBaseVars
      • Class MsgLogger
      • Class my_formatter_flag
      • Template Class RegistryList
      • Class SideEffect
      • Class StderrLog
      • Class StdoutLog
      • Template Class Tree
      • Template Class UsageTrackingMap
      • Class Var
      • Template Class Var_T
      • Class Algorithms
      • Class BilateralConstraintBase
      • Class BilateralConstraintBaseVars
      • Class BodyBase
      • Class CECompoundBody
      • Class CECompoundBodyVars
      • Class CECompoundSubhinge
      • Class CELoopKinematicsBase
      • Class CELoopKinematicsBaseVars
      • Class CELoopKinematicsNumeric
      • Class CELoopKinematicsNumericVars
      • Class CELoopKinematicsPlanar4Bar
      • Class CompoundBody
      • Class CompoundBodyVars
      • Class CompoundHinge
      • Class CompoundSubhinge
      • Class ConstraintKinematicsSolver
      • Class ConstraintKinematicsSolverVars
      • Class ConstraintNode
      • Class CoordBase
      • Template Class CoordBase_T
      • Class CoordData
      • Class CoordDataVars
      • Class CoordinateConstraint
      • Class CoordinateConstraintVars
      • Class FramePairHinge
      • Class FramePairHingeVars
      • Class FrameToFrameJacobianGenerator
      • Class HingeBase
      • Class HingeNode
      • Class HingeOnode
      • Class HingePnode
      • Class Linear3Subhinge
      • Class LinearSubhinge
      • Class LockedSubhinge
      • Class LoopConstraintBase
      • Class LoopConstraintBaseVars
      • Class LoopConstraintConVel
      • Class LoopConstraintConVelVars
      • Class LoopConstraintCutJoint
      • Class LoopConstraintCutJointVars
      • Class ModalNodeDeformationProvider
      • Class ModelManager
      • Class ModelManager::MMOptions
      • Class Multibody
      • Class MultiJacobianGenerator
      • Class Node
      • Class NodeDeformationProvider
      • Class NodeVars
      • Class NonlinearSolver
      • Class Physical1DofSubhinge
      • Class PhysicalBody
      • Class PhysicalBodyVars
      • Class PhysicalHinge
      • Class PhysicalModalBody
      • Class PhysicalModalBodyVars
      • Class PhysicalSubhinge
      • Template Class PhysicalSubhinge_T
      • Class PhysicalSubhingeVars
      • Class PinSubhinge
      • Class Scheduler
      • Class ScrewSubhinge
      • Class SphericalQuatSubhinge
      • Class SphericalSubhinge
      • Class StatePropagator
      • Class StatePropagator::SpOptions
      • Class SubGraph
      • Class SubGraphVars
      • Class SubhingeBase
      • Class SubTree
      • Class SubTreeVars
      • Class TimedEvent
      • Class TimeKeeper
      • Class ChainedFrameToFrame
      • Class ChainedFrameToFrameVars
      • Class EdgeFrameToFrame
      • Class Frame
      • Class FrameContainer
      • Class FrameToFrame
      • Class FrameToFrameVars
      • Class FrameVars
      • Class OrientedChainedFrameToFrame
      • Class OrientedChainedFrameToFrameVars
      • Class PrescribedFrameToFrame
      • Class SpiceFrame
      • Class SpiceFrameToFrame
      • Class H5Writer
      • Class PacketTableConfig
      • Class PlotData
      • Class WsClient
      • Class AABB
      • Class AkimaSplineInterpolator
      • Class ArkExplicitIntegrator
      • Class BaseInterpolator
      • Class ConstantInterpolator
      • Class CubicHermiteInterpolator
      • Class CVodeIntegrator
      • Class EulerIntegrator
      • Class HomTran
      • Class IdaIntegrator
      • Class Integrator
      • Class Jacobian
      • Class LinearInterpolator
      • Class NearestNeighborInterpolator
      • Class NoopIntegrator
      • Class Ray
      • Class RK4Integrator
      • Class RotationMatrix
      • Class RotationVector
      • Class SimTran
      • Class SpatialInertia
      • Class SpatialVector
      • Class StateSpace
      • Class UnitQuaternion
      • Class BaseKModel
      • Class ComputedTorque
      • Template Class ConstantProfileGenerator
      • Template Class CubicSplineProfileGenerator
      • Class DataLogger
      • Class DataLoggerParams
      • Class DataPlotter
      • Class DataPlotterParams
      • Class GraphicalSceneMovie
      • Class GraphicalSceneMovieParams
      • Class Gravity
      • Class GravityInterface
      • Template Class KModel
      • Class KModelContinuousStates
      • Class KModelDiscreteStates
      • Class KModelParams
      • Class KModelScratch
      • Template Class LinearProfileGenerator
      • Class NoContinuousStates
      • Class NoDiscreteStates
      • Class NoParams
      • Class NoScratch
      • Class PenaltyContact
      • Class PID
      • Class PIDParams
      • Class PinJointLimits
      • Class PinJointLimitsParams
      • Class PointMassGravity
      • Template Class ProfileGenerator
      • Class ProjectConstraintError
      • Class ProjectConstraintErrorParams
      • Class SpringDamper
      • Class SpringDamperParams
      • Class SpringDamperScratch
      • Class SubhingeForceLimits
      • Class SubhingeForceLimitsParams
      • Class SubhingeSpringDamper
      • Class SubhingeSpringDamperParams
      • Class SyncRealTime
      • Class TimeDisplay
      • Class TimeDisplayParams
      • Class UniformGravity
      • Class UpdateProxyScene
      • Class AbstractImporter
      • Class AbstractStaticGeometry
      • Class AssimpImporter
      • Class BoxGeometry
      • Class CapsuleGeometry
      • Class ClientRegistry
      • Class CoalGeometryCache
      • Class CoalScene
      • Class CoalSceneNode
      • Class CoalScenePart
      • Class CollisionScene
      • Class CollisionSceneNode
      • Class CollisionScenePart
      • Class Color
      • Class ConeGeometry
      • Class CylinderGeometry
      • Class ExtMime
      • Class GraphicalScene
      • Class GraphicalSceneCamera
      • Class GraphicalSceneNode
      • Class GraphicalScenePart
      • Class GrayscaleTexture
      • Class ImplDatabase
      • Class PhongMaterial
      • Class PhysicalMaterial
      • Class ProxyScene
      • Class ProxySceneNode
      • Class ProxyScenePart
      • Class ProxyScenePartVars
      • Class ProxySceneVars
      • Class RoundFrustumGeometry
      • Class Scene
      • Class SceneNode
      • Class SceneNodeVars
      • Class ScenePart
      • Class ScenePartSpecVars
      • Class ScenePartVars
      • Class SceneVars
      • Class SphereGeometry
      • Class StaticMeshGeometry
      • Class Texture
      • Class WebResourceManager
      • Class WebScene
      • Class WebSceneCamera
      • Class WebSceneNode
      • Class WebScenePart
      • Class Button
      • Class Channel
      • Class ClientApp
      • Class Connection
      • Class ContentSource
      • Class Dock
      • Class HttpWsServer
      • Class IFrame
      • Class Layout
      • Class Markdown
      • Class Router
      • Class Server
      • Class State
      • Class TreeView
      • Class Widget
      • Template Class Sequence
      • Template Class type_caster< std::chrono::duration< Rep, Period > >
      • Template Class type_caster< std::chrono::time_point< Clock, Duration > >
      • Enum VarType
      • Enum BilateralConstraintType
      • Enum CKFrozenCoordType
      • Enum HingeType
      • Enum MMSolverType
      • Enum NeedsStateReset
      • Enum SolverType
      • Enum SpStatusEnum
      • Enum SubhingeType
      • Enum DumpFormatType
      • Enum IntegratorType
      • Enum OutputUpdateType
      • Enum Alignment
      • Function ADD_TO_DS_METHOD_CASTER
      • Function addToDSMethod< Gravity >
      • Function addToDSMethod< GravityInterface >
      • Function addToDSMethod< PointMassGravity >
      • Function addToDSMethod< SpringDamper >
      • Function addToDSMethod< SubhingeSpringDamper >
      • Function addToDSMethod< SyncRealTime >
      • Function addToDSMethod< UniformGravity >
      • Function addToDSMethod< UpdateProxyScene >
      • Function cast
      • Function def(“getGravity”, &GravityInterface::getGravity, DOC(Karana, Models, GravityInterface, getGravity))
      • Function def(py::init<>&::create, py::arg(“name”), DOC(Karana, Models, UniformGravity, create))
      • Function def(py::init<>&::create, py::arg(“name”), py::arg(“st”), py::arg(“central_body”), DOC(Karana, Models, PointMassGravity, create))
      • Function def(“getQ”, &ProfileGenerator<double>::getQ, py::arg(“t”), DOC(Karana, Models, ProfileGenerator, getQ))
      • Function def(“getQ”, &ProfileGenerator<km::ArrayVec>::getQ, py::arg(“t”), DOC(Karana, Models, ProfileGenerator, getQ))
      • Function def(“getQ”, &ProfileGenerator<km::UnitQuaternion>::getQ, py::arg(“t”), DOC(Karana, Models, ProfileGenerator, getQ))
      • Function def(py::init<>&<>::create, py::arg(“name”), py::arg(“t_i”), py::arg(“q_i”), py::arg(“t_f”), py::arg(“q_f”), DOC(Karana, Models, LinearProfileGenerator, create))
      • Function def(py::init<>&<::>::create, py::arg(“name”), py::arg(“t_i”), py::arg(“q_i”), py::arg(“t_f”), py::arg(“q_f”), DOC(Karana, Models, LinearProfileGenerator, create))
      • Function def(py::init<>&<>::create, py::arg(“name”), py::arg(“q”), DOC(Karana, Models, ConstantProfileGenerator, create))
      • Function def(py::init<>&<::>::create, py::arg(“name”), py::arg(“q”), DOC(Karana, Models, ConstantProfileGenerator, create))
      • Function def(py::init<>&<>::create, py::arg(“name”), py::arg(“t_i”), py::arg(“q_i”), py::arg(“u_i”), py::arg(“t_f”), py::arg(“q_f”), py::arg(“u_f”), DOC(Karana, Models, CubicSplineProfileGenerator, create))
      • Function def(py::init<>&<::>::create, py::arg(“name”), py::arg(“t_i”), py::arg(“q_i”), py::arg(“u_i”), py::arg(“t_f”), py::arg(“q_f”), py::arg(“u_f”), DOC(Karana, Models, CubicSplineProfileGenerator, create))
      • Function def(py::init<>&::create, py::arg(“name”), py::arg(“mm”), py::arg(“nd1”), py::arg(“nd2”), DOC(Karana, Models, SpringDamper, create))
      • Function def(py::init<>&::create, py::arg(“name”), py::arg(“mm”), py::arg(“sh”), DOC(Karana, Models, SubhingeSpringDamper, create))
      • Function def(py::init<>&::create, py::arg(“name”), py::arg(“mm”), py::arg(“scene”), DOC(Karana, Models, UpdateProxyScene, create))
      • Function def(py::init<>&::create, py::arg(“name”), py::arg(“mm”), py::arg(“rt_speed”), DOC(Karana, Models, SyncRealTime, create))
      • Function def_readwrite
      • Function DOC(Karana, Models, GravityInterface, setGravity)
      • Function DOC(Karana, Models, GravityInterface, isReady)
      • Function DOC(Karana, Models, UniformGravity, create)
      • Function DOC(Karana, Models, PointMassGravity, create)
      • Function DOC(Karana, Models, PointMassGravity, mu)
      • Function DOC(Karana, Models, PointMassGravity, getObjIds)
      • Function DOC(Karana, Models, ProfileGenerator, getU)
      • Function DOC(Karana, Models, ProfileGenerator, getUdot)
      • Function DOC(Karana, Models, LinearProfileGenerator, create)
      • Function DOC(Karana, Models, LinearProfileGenerator, t_i)
      • Function DOC(Karana, Models, LinearProfileGenerator, t_f)
      • Function DOC(Karana, Models, LinearProfileGenerator, q_i)
      • Function DOC(Karana, Models, LinearProfileGenerator, q_f)
      • Function DOC(Karana, Models, ConstantProfileGenerator, create)
      • Function DOC(Karana, Models, ConstantProfileGenerator, q)
      • Function DOC(Karana, Models, CubicSplineProfileGenerator, create)
      • Function DOC(Karana, Models, CubicSplineProfileGenerator, setValues)
      • Function DOC(Karana, Models, SpringDamperParams, isReady)
      • Function DOC(Karana, Models, SpringDamperParams, unsprung_length)
      • Function DOC(Karana, Models, SpringDamperParams, d)
      • Function DOC(Karana, Models, SpringDamperParams, k)
      • Function DOC(Karana, Models, SpringDamperScratch, offset)
      • Function DOC(Karana, Models, SpringDamperScratch, position_error)
      • Function DOC(Karana, Models, SpringDamperScratch, velocity_error)
      • Function DOC(Karana, Models, SpringDamperScratch, stiffness_force)
      • Function DOC(Karana, Models, SpringDamperScratch, damping_force)
      • Function DOC(Karana, Models, SpringDamperScratch, total_force)
      • Function DOC(Karana, Models, SpringDamper, create)
      • Function DOC(Karana, Models, SpringDamper, preDeriv)
      • Function DOC(Karana, Models, SpringDamper, sourceNode)
      • Function DOC(Karana, Models, SpringDamper, targetNode)
      • Function DOC(Karana, Models, PinJointLimitsParams, isReady)
      • Function DOC(Karana, Models, PinJointLimitsParams, upper_limit)
      • Function DOC(Karana, Models, PinJointLimitsParams, lower_limit)
      • Function DOC(Karana, Models, PinJointLimitsParams, d)
      • Function DOC(Karana, Models, PinJointLimitsParams, k)
      • Function DOC(Karana, Models, SubhingeSpringDamperParams, isReady)
      • Function DOC(Karana, Models, SubhingeSpringDamperParams, setpoint)
      • Function DOC(Karana, Models, SubhingeSpringDamperParams, d)
      • Function DOC(Karana, Models, SubhingeSpringDamperParams, k)
      • Function DOC(Karana, Models, SubhingeSpringDamper, create)
      • Function DOC(Karana, Models, SubhingeSpringDamper, preDeriv)
      • Function DOC(Karana, Models, SubhingeSpringDamper, getSubhinge)
      • Function DOC(Karana, Models, SubhingeForceLimitsParams, isReady)
      • Function DOC(Karana, Models, SubhingeForceLimitsParams, lower_limits)
      • Function DOC(Karana, Models, SubhingeForceLimitsParams, upper_limits)
      • Function DOC(Karana, Models, PIDParams, isReady)
      • Function DOC(Karana, Models, PIDParams, kp)
      • Function DOC(Karana, Models, PIDParams, kd)
      • Function DOC(Karana, Models, PIDParams, ki)
      • Function DOC(Karana, Models, UpdateProxyScene, create)
      • Function DOC(Karana, Models, UpdateProxyScene, postHop)
      • Function DOC(Karana, Models, UpdateProxyScene, getProxyScene)
      • Function DOC(Karana, Models, SyncRealTime, create)
      • Function DOC(Karana, Models, SyncRealTime, preHop)
      • Function DOC(Karana, Models, SyncRealTime, postHop)
      • Function DOC(Karana, Models, SyncRealTime, getRealTimeSpeed)
      • Function DOC(Karana, Models, TimeDisplayParams, isReady)
      • Function DOC(Karana, Models, TimeDisplayParams, color)
      • Function DOC(Karana, Models, GraphicalSceneMovieParams, isReady)
      • Function DOC(Karana, Models, GraphicalSceneMovieParams, dir)
      • Function DOC(Karana, Models, GraphicalSceneMovieParams, filename_prefix)
      • Function DOC(Karana, Models, ProjectConstraintErrorParams, isReady)
      • Function DOC(Karana, Models, ProjectConstraintErrorParams, tol)
      • Function DOC(Karana, Models, DataLoggerParams, isReady)
      • Function DOC(Karana, Models, DataLoggerParams, log_first_step)
      • Function DOC(Karana, Models, DataPlotterParams, isReady)
      • Function DOC(Karana, Models, DataPlotterParams, log_first_step)
      • Function Karana::Core::_dummy
      • Function Karana::Core::_ensureRegisteredPy
      • Function Karana::Core::_numTraceCheck
      • Function Karana::Core::_numTraceInt(std::string_view)
      • Function Karana::Core::_numTraceInt(msg_f)
      • Template Function Karana::Core::_numTraceInt(spdlog::format_string_t<Args…>, Args&&…)
      • Template Function Karana::Core::addToDSMethod
      • Template Function Karana::Core::addToStateDSMethod
      • Template Function Karana::Core::addVarsToStruct
      • Function Karana::Core::allDestroyed
      • Function Karana::Core::allHealthy
      • Function Karana::Core::allReady
      • Template Function Karana::Core::CallbackRegistryPybind11
      • Template Function Karana::Core::const_pointer_cast
      • Template Function Karana::Core::createSharedPtrDiscard
      • Function Karana::Core::debug(std::string_view)
      • Function Karana::Core::debug(msg_f)
      • Template Function Karana::Core::debug(spdlog::format_string_t<Args…>, Args&&…)
      • Function Karana::Core::debugJson(const nlohmann::ordered_json&, OrderedJsonToString)
      • Function Karana::Core::debugJson(const nlohmann::json&, JsonToString)
      • Function Karana::Core::defaultJsonToString
      • Function Karana::Core::defaultOrderedJsonToString
      • Function Karana::Core::deprecated
      • Template Function Karana::Core::deprecatedWrapper
      • Template Function Karana::Core::discard
      • Template Function Karana::Core::dynamic_pointer_cast
      • Function Karana::Core::error(std::string_view)
      • Function Karana::Core::error(msg_f)
      • Template Function Karana::Core::error(spdlog::format_string_t<Args…>, Args&&…)
      • Function Karana::Core::findShareDir
      • Function Karana::Core::getVarType
      • Function Karana::Core::info(std::string_view)
      • Function Karana::Core::info(msg_f)
      • Template Function Karana::Core::info(spdlog::format_string_t<Args…>, Args&&…)
      • Function Karana::Core::sharedPtrClearPyVariable
      • Function Karana::Core::sharedPtrDiscard
      • Function Karana::Core::sharedPtrDiscardVec
      • Template Function Karana::Core::static_pointer_cast
      • Function Karana::Core::trace(std::string_view)
      • Function Karana::Core::trace(msg_f)
      • Template Function Karana::Core::trace(spdlog::format_string_t<Args…>, Args&&…)
      • Function Karana::Core::traceJson(const nlohmann::ordered_json&, OrderedJsonToString)
      • Function Karana::Core::traceJson(const nlohmann::json&, JsonToString)
      • Function Karana::Core::warn(std::string_view)
      • Function Karana::Core::warn(msg_f)
      • Template Function Karana::Core::warn(spdlog::format_string_t<Args…>, Args&&…)
      • Function Karana::Math::buildNaNWithPayload
      • Template Function Karana::Math::dump
      • Template Function Karana::Math::dumpString
      • Template Function Karana::Math::getIndepColIndices
      • Template Function Karana::Math::getIndepRowColIndices
      • Template Function Karana::Math::getRank
      • Template Function Karana::Math::getSingularValues
      • Function Karana::Math::isNaNWithPayload
      • Function Karana::Math::isNotReadyNaN
      • Function Karana::Math::isReady(const Ktime&)
      • Template Function Karana::Math::isReady(const Eigen::MatrixBase<Derived>&)
      • Template Function Karana::Math::isReady(const Eigen::ArrayBase<Derived>&)
      • Function Karana::Math::ktimeToSeconds
      • Function Karana::Math::makeNotReady(Ktime&)
      • Template Function Karana::Math::makeNotReady(Eigen::DenseBase<Derived>&)
      • Function Karana::Math::secondsToKtime
      • Function Karana::Math::solveLcpPgs
      • Function Karana::Math::solveLcpPsor
      • Function Karana::Math::strToIntegratorType
      • Function Karana::Math::tilde
      • Template Function Karana::Models::KModelPybind11
      • Function Karana::Scene::defaultGeometry
      • Function Karana::Scene::defaultMaterial
      • Function Karana::WebUI::uuidv4
      • Function load
      • Function localtime_thread_safe
      • Function operator<<
      • Function py::class_< DataLoggerParams, kc::ks_ptr< DataLoggerParams > >
      • Function py::class_< DataPlotterParams, kc::ks_ptr< DataPlotterParams > >
      • Function py::class_< GraphicalSceneMovieParams, kc::ks_ptr< GraphicalSceneMovieParams > >
      • Function py::class_< PIDParams, kc::ks_ptr< PIDParams > >
      • Function py::class_< PinJointLimitsParams, kc::ks_ptr< PinJointLimitsParams > >
      • Function py::class_< ProjectConstraintErrorParams, kc::ks_ptr< ProjectConstraintErrorParams > >
      • Function py::class_< SpringDamperParams, kc::ks_ptr< SpringDamperParams > >
      • Function py::class_< SpringDamperScratch, kc::ks_ptr< SpringDamperScratch > >
      • Function py::class_< SubhingeForceLimitsParams, kc::ks_ptr< SubhingeForceLimitsParams > >
      • Function py::class_< SubhingeSpringDamperParams, kc::ks_ptr< SubhingeSpringDamperParams > >
      • Function py::class_< TimeDisplayParams, kc::ks_ptr< TimeDisplayParams > >
      • Function PyArrayVecProfileGenerator
      • Function pybind11::detail::FLOAT_QUANTITY(Karana::Math::Length, Karana.Math.Ktyping., length)
      • Function pybind11::detail::FLOAT_QUANTITY(Karana::Math::Angle, Karana.Math.Ktyping., angle)
      • Function pybind11::detail::VEC3_QUANTITY
      • Function PYBIND11_DECLARE_HOLDER_TYPE
      • Function PYBIND11_TYPE_CASTER
      • Function PyFloatConstantProfileGenerator
      • Function PyFloatCubicSplineProfileGenerator
      • Function PyFloatLinearProfileGenerator
      • Function PyFloatProfileGenerator
      • Function PyGravityInterface
      • Function PyPointMassGravity
      • Function PySpringDamper
      • Function PySubhingeSpringDamper
      • Function PySyncRealTime
      • Function PyUniformGravity
      • Function PyUnitQuaternionConstantProfileGenerator
      • Function PyUnitQuaternionProfileGenerator
      • Function PyUpdateProxyScene
      • Function PyVecConstantProfileGenerator
      • Function PyVecCubicSplineProfileGenerator
      • Function PyVecLinearProfileGenerator
      • Template Variable ConstantProfileGenerator< double >::create
      • Template Variable ConstantProfileGenerator< double >::q
      • Template Variable ConstantProfileGenerator< km::ArrayVec >::create
      • Template Variable ConstantProfileGenerator< km::ArrayVec >::q
      • Template Variable ConstantProfileGenerator< km::UnitQuaternion >::create
      • Template Variable ConstantProfileGenerator< km::UnitQuaternion >::q
      • Template Variable CubicSplineProfileGenerator< double >::create
      • Template Variable CubicSplineProfileGenerator< double >::setValues
      • Template Variable CubicSplineProfileGenerator< km::ArrayVec >::create
      • Template Variable CubicSplineProfileGenerator< km::ArrayVec >::setValues
      • Variable has_pybind11_caster_v
      • Variable Karana::KUtils::extract_cols_v
      • Variable Karana::KUtils::extract_rows_v
      • Variable Karana::KUtils::extract_vector_rows_v
      • Variable Karana::KUtils::is_eigen_int_type_v
      • Variable Karana::KUtils::is_eigen_type_v
      • Variable Karana::KUtils::is_eigen_vector_v
      • Variable Karana::Math::notReadyNaN
      • Variable Karana::Math::notReadyPayload
      • Variable Karana::Scene::LAYER_ALL
      • Variable Karana::Scene::LAYER_COLLISION
      • Variable Karana::Scene::LAYER_CUSTOM0
      • Variable Karana::Scene::LAYER_CUSTOM1
      • Variable Karana::Scene::LAYER_CUSTOM10
      • Variable Karana::Scene::LAYER_CUSTOM11
      • Variable Karana::Scene::LAYER_CUSTOM12
      • Variable Karana::Scene::LAYER_CUSTOM13
      • Variable Karana::Scene::LAYER_CUSTOM14
      • Variable Karana::Scene::LAYER_CUSTOM15
      • Variable Karana::Scene::LAYER_CUSTOM16
      • Variable Karana::Scene::LAYER_CUSTOM17
      • Variable Karana::Scene::LAYER_CUSTOM18
      • Variable Karana::Scene::LAYER_CUSTOM19
      • Variable Karana::Scene::LAYER_CUSTOM2
      • Variable Karana::Scene::LAYER_CUSTOM20
      • Variable Karana::Scene::LAYER_CUSTOM21
      • Variable Karana::Scene::LAYER_CUSTOM22
      • Variable Karana::Scene::LAYER_CUSTOM23
      • Variable Karana::Scene::LAYER_CUSTOM3
      • Variable Karana::Scene::LAYER_CUSTOM4
      • Variable Karana::Scene::LAYER_CUSTOM5
      • Variable Karana::Scene::LAYER_CUSTOM6
      • Variable Karana::Scene::LAYER_CUSTOM7
      • Variable Karana::Scene::LAYER_CUSTOM8
      • Variable Karana::Scene::LAYER_CUSTOM9
      • Variable Karana::Scene::LAYER_FLUIDS
      • Variable Karana::Scene::LAYER_GRAPHICS
      • Variable Karana::Scene::LAYER_NONE
      • Variable Karana::Scene::LAYER_ORNAMENTAL
      • Variable Karana::Scene::LAYER_PHYSICAL
      • Variable Karana::Scene::LAYER_PHYSICAL_GRAPHICS
      • Variable Karana::Scene::LAYER_RESERVED0
      • Variable Karana::Scene::LAYER_RESERVED1
      • Variable Karana::Scene::LAYER_RESERVED2
      • Variable Karana::Scene::LAYER_RESERVED3
      • Variable Karana::Scene::LAYER_RESERVED4
      • Variable Karana::Scene::LAYER_RESERVED5
      • Variable Karana::Scene::LAYER_RESERVED6
      • Variable Karana::Scene::LAYER_RESERVED7
      • Variable Karana::Scene::LAYER_STICK_FIGURE
      • Template Variable LinearProfileGenerator< double >::create
      • Template Variable LinearProfileGenerator< double >::q_f
      • Template Variable LinearProfileGenerator< double >::q_i
      • Template Variable LinearProfileGenerator< double >::t_f
      • Template Variable LinearProfileGenerator< double >::t_i
      • Template Variable LinearProfileGenerator< km::ArrayVec >::create
      • Template Variable LinearProfileGenerator< km::ArrayVec >::q_f
      • Template Variable LinearProfileGenerator< km::ArrayVec >::q_i
      • Template Variable LinearProfileGenerator< km::ArrayVec >::t_f
      • Template Variable LinearProfileGenerator< km::ArrayVec >::t_i
      • Variable m
      • Template Variable ProfileGenerator< double >::getU
      • Template Variable ProfileGenerator< double >::getUdot
      • Template Variable ProfileGenerator< km::ArrayVec >::getU
      • Template Variable ProfileGenerator< km::ArrayVec >::getUdot
      • Template Variable ProfileGenerator< km::UnitQuaternion >::getU
      • Template Variable ProfileGenerator< km::UnitQuaternion >::getUdot
      • Variable PyKmodelComputedTorque
      • Variable PyKmodelDataLogger
      • Variable PyKmodelDataPlotter
      • Variable PyKmodelGraphicalSceneMovie
      • Variable PyKmodelPID
      • Variable PyKmodelPinJointLimits
      • Variable PyKmodelProjectConstraintError
      • Variable PyKmodelSpringDamper
      • Variable PyKmodelSubhingeForceLimits
      • Variable PyKmodelSubhingeSpringDamper
      • Variable PyKmodelSyncRealTime
      • Variable PyKmodelTimeDisplay
      • Variable PyKmodelUniformGrav
      • Variable PyKmodelUpdateProxyScene
      • Variable self
      • Define ADD_TO_DS_METHOD_CASTER
      • Define ADD_TO_STATE_DS_METHOD_CASTER
      • Define FLOAT_QUANTITY
      • Define KARANA_MODIFIED
      • Define KARANA_VERSION_MAJOR
      • Define KARANA_VERSION_MINOR
      • Define KARANA_VERSION_PATCH
      • Define KARANA_VERSION_STRING
      • Define MATH_EPSILON
      • Define numTrace
      • Define VEC3_QUANTITY
      • Typedef Karana::Core::Allocator
      • Typedef Karana::Core::id_t
      • Typedef Karana::Core::JsonToString
      • Typedef Karana::Core::ks_ptr
      • Typedef Karana::Core::msg_f
      • Typedef Karana::Core::OrderedJsonToString
      • Typedef Karana::Dynamics::cost_fn
      • Typedef Karana::Dynamics::DynamicFunctorNumJac
      • Typedef Karana::Dynamics::f
      • Typedef Karana::Dynamics::functor_type
      • Typedef Karana::Dynamics::jac_fn
      • Typedef Karana::Dynamics::solver_type
      • Typedef Karana::KUtils::PlotDataFnType
      • Typedef Karana::KUtils::PlotDataType
      • Typedef Karana::KUtils::XDataFnType
      • Typedef Karana::Math::Array
      • Typedef Karana::Math::ArrayVec
      • Typedef Karana::Math::ConstMatSlice
      • Typedef Karana::Math::ConstVec3Slice
      • Typedef Karana::Math::ConstVecSlice
      • Typedef Karana::Math::DerivativeFunction
      • Typedef Karana::Math::fn
      • Typedef Karana::Math::Ktime
      • Typedef Karana::Math::lin_fn
      • Typedef Karana::Math::Mat
      • Typedef Karana::Math::Mat33
      • Typedef Karana::Math::Mat44
      • Typedef Karana::Math::Mat66
      • Typedef Karana::Math::Mat6n
      • Typedef Karana::Math::MatSlice
      • Typedef Karana::Math::num_diff_functor_type
      • Typedef Karana::Math::ResidualsFunction
      • Typedef Karana::Math::Vec
      • Typedef Karana::Math::Vec3
      • Typedef Karana::Math::Vec3Slice
      • Typedef Karana::Math::Vec4
      • Typedef Karana::Math::Vec6
      • Typedef Karana::Math::VecInt
      • Typedef Karana::Math::VecSlice
      • Typedef Karana::Scene::layer_t
      • Typedef Karana::Scene::TextureCache
      • Typedef Karana::Scene::TextureData
      • Typedef Karana::Scene::VarMaterial
      • Typedef Karana::Scene::VarProjection
      • Typedef Karana::Scene::VarStaticGeometry
      • Typedef Karana::WebUI::HeaderList
      • Typedef Karana::WebUI::StateMap
      • Typedef Karana::WebUI::StyleMap
      • Typedef SUNComm
      • Typedef sunrealtype
      • Typedef type
  • Conventions
  • Glossary
  • .ipynb

n-link Pendulum Benchmark Comparison

Contents

  • Define a Method to Create the Multibody
  • Run the Simulation With Increasing Number of Links
  • Benchmark Simulation Runtimes
  • Summary
  • Further Readings

\(n\)-link Pendulum Benchmark Comparison#

In this notebook we benchmark the n-link pendulum example. This notebook is similar to the \(n\)-link pendulum but is designed for benchmarking kdFlex’s simulation performance and demonstrating how kdFlex’s multibody simulation performance scales.

Requirements:

  • n-link Pendulum

In this tutorial we will:

  • Define a method to create the multibody

  • Run the simulation with increasing number of links

  • Benchmark simulation runtimes

For a more in-depth descriptions of kdflex concepts see usage.

import os
import gc
import numpy as np
import time
from typing import cast
import pandas as pd
import plotly.express as px

import Karana.Core as kc
import Karana.Math as km
import Karana.Frame as kf
import Karana.Dynamics as kd
import Karana.Models as kmdl

Define a Method to Create the Multibody#

Define a method that procedurally creates a n-link multibody for use when we run simulations with increasing number of links. This is the same as in the n-link Pendulum

See Multibody or Frames for more information relating to this step.

def createMbody(fc: kf.FrameContainer, n_links: int):
    """Create the multibody.

    Parameters
    ----------
    n_links : int
        The number of pendulum links to use.
    """
    mb = kd.Multibody("mb", fc)

    # Here, we use the addSerialChain method to add multiple instances of the same body
    # connected in a chain. We add n instances of the pendulum link with the following parameters:
    params = kd.PhysicalBodyParams(
        km.SpatialInertia(2.0, np.zeros(3), np.diag([3, 2, 1])),
        [np.array([0.0, 1.0, 0.0])],
        km.HomTran(np.array([0, 0, 0.5])),
        km.HomTran(np.array([0, 0, -0.5])),
    )
    kd.PhysicalBody.addSerialChain(
        "link",
        n_links,
        cast(kd.PhysicalBody, mb.virtualRoot()),
        htype=kd.HingeType.REVOLUTE,
        params=params,
    )

    # finalize and verify the multibody
    mb.ensureHealthy()
    mb.resetData()
    assert kc.allReady()

    return mb

Because we run multiple simulations, we write a method ahead of time to cleanup everything whenever the simulation ends. This requires us to delete local variables and discard our containers and scene.

def cleanup():
    """Cleanup the simulation."""
    global integrator, bd1
    del integrator, bd1
    kc.discard(sp)

    gc.collect()

    kc.discard(mb)
    kc.discard(fc)

Run the Simulation With Increasing Number of Links#

Below is the run loop for each simulation. It loops through each sim with an increasing number of links and collects the time it takes to complete.

# Number of links we will run at
n_links_list = [3, 4, 5, 7, 8, 10, 13, 16, 20, 25, 30, 40, 50, 70, 95]

runtimes = []
deriv_calls = []

for n_links in n_links_list:
    # initialization
    fc = kf.FrameContainer("root")
    mb = createMbody(fc, n_links)

    # Set up state propagator and select integrator type: rk4 or cvode
    sp = kd.StatePropagator(mb, integrator_type=km.IntegratorType.RK4)
    integrator = sp.getIntegrator()

    # add a gravitational model to the state propagator
    ug = kmdl.Gravity("grav_model", sp, kmdl.UniformGravity("uniform_gravity"), mb)
    ug.getGravityInterface().setGravity(np.array([0, 0, -9.81]), 0.0, kmdl.OutputUpdateType.PRE_HOP)
    del ug

    # Modify the initial multibody state. Here we will set the first pendulum to 0.5 radians.
    bd1 = mb.getBody("link_0")
    bd1.parentHinge().subhinge(0).setQ([0.5])
    bd1.parentHinge().subhinge(0).setU([0.0])

    # Initialize integrator state
    t_init = np.timedelta64(0, "ns")
    x_init = sp.assembleState()
    sp.setTime(t_init)
    sp.setState(x_init)

    # register the timed event
    h = np.timedelta64(int(1e7), "ns")
    t = kd.TimedEvent("hop_size", h, lambda _: None, False)
    t.period = h
    sp.registerTimedEvent(t)
    del t

    print(f"Number of links: {n_links}")
    start_time = time.time()
    sp.advanceTo(2.0)
    end_time = time.time()
    run_time = end_time - start_time
    runtimes.append(run_time)
    derivs = sp.counters().derivs
    deriv_calls.append(derivs)
    print(f"Time to run: {run_time}, derivs={derivs}")

    # Cleanup
    cleanup()
Number of links: 3
Time to run: 0.5467288494110107, derivs=800
Number of links: 4
Time to run: 0.7317540645599365, derivs=800
Number of links: 5
Time to run: 0.9253365993499756, derivs=800
Number of links: 7
Time to run: 1.257965326309204, derivs=800
Number of links: 8
Time to run: 1.4570167064666748, derivs=800
Number of links: 10
Time to run: 1.7869832515716553, derivs=800
Number of links: 13
Time to run: 2.430913209915161, derivs=800
Number of links: 16
Time to run: 2.9342973232269287, derivs=800
Number of links: 20
Time to run: 3.652416467666626, derivs=800
Number of links: 25
Time to run: 4.744343280792236, derivs=800
Number of links: 30
Time to run: 5.59398341178894, derivs=800
Number of links: 40
Time to run: 7.155922174453735, derivs=800
Number of links: 50
Time to run: 8.69689679145813, derivs=800
Number of links: 70
Time to run: 12.202042818069458, derivs=800
Number of links: 95
Time to run: 16.73291850090027, derivs=800

Benchmark Simulation Runtimes#

Below the benchmark results are plotted for normalized simulation run times with respect to the number of links. This is the time the simulation takes to run divided by the number of bodies. The Fully Augmented model is compared to the normal simulation style.

normalized_times = np.array(runtimes) / np.array(n_links_list)

run_data_df = pd.DataFrame(
    {
        "NLinks": n_links_list,
        "RunTimes": runtimes,
        "NormalizedTimes": normalized_times,
    }
)

# Create scatter plot
fig = px.scatter(
    run_data_df,
    x="NLinks",
    y="NormalizedTimes",
    title="Computational Time vs Number of Bodies",
    labels={"NLinks": "Number of Bodies", "NormalizedTimes": "Time per Body"},
    log_x=True,
)

# Show plot if not running in a test environment
if not os.getenv("DTEST_RUNNING", False):
    fig.show()
../../../_images/1185ea62cadf4667a0d856a51542b95bf28d2024bf13986df0bd3d200a6c3ba6.png

Summary#

Awesome! By running multiple simulations with a varying number of links, you can see that the runtime scales linearly with the number of links.

Further Readings#

Benchmark the n-link pendulum against conventional methods
Simulate collisions with a n-link pendulum

previous

Flexible Double-Wishbone

next

Fully Augmented \(n\)-link Pendulum Benchmark Comparison

Contents
  • Define a Method to Create the Multibody
  • Run the Simulation With Increasing Number of Links
  • Benchmark Simulation Runtimes
  • Summary
  • Further Readings

By Karana Dynamics Inc.

© Copyright 2025, Karana Dynamics Inc. Generated on 25 March 2026 18:59 UTC.