Package: dynkin
pydynkin - A python version ofdynkinA toolkit for 3D dynamics and kinematics of rigid bodies using the YPR euler angle convention.--> Docs <--Note:dynkinis also available in a C++ version, available here:https://github.com/freol35241/dynkinGeneraldynkinis a set of tools for handling the dynamics and kinematics of rigid bodies in 3 dimensions (6DOFs). Some features:Homogenous transformation matricesChained reference framesIdealized rigid body implementationThe fundamentals of reference frames and the kinematic relations of these are based onTheory of Applied Robotics (Reza N. Jazar), the idealized rigid body implementation follows the outline suggested in the lectures byFossen.Installationpip install dynkinTheory introSome basic notions:A referenceFrameis defined indynkinas an object whichpositions,vectors,velocities,accelerationsetc can be decomposed in.dynkinrepresents referenceFrames by (4x4) homogenous transformation matrices. AFrameis aligned (positioned, rotated) and moves (linear and angular velocity) in relation to anotherFrameor the inertial frame (represented byNone).Theposeof aFrameis its generalized position and thetwistof aFrameis its generalized velocity, both in relation to the inertial frame.All rotations indynkinare internally represented by rotation matrices but the external API, so far, deals only with Euler angles of the YPR (Yaw-Pitch-Roll) convention.Akinematic chainis a single-linked list ofFrames, where eachFrameholds a reference to its closest parent. Any number ofFrames may be attached into such a chain and the chain may also have any number of branches, it is however the user´s responsibility to ensure no kinematic loops occur.Atransformis an object relating twoFrames enabling transformation ofpositions,vectors,velocitiesetc from oneFrameto the other. TheFrames do not need to be part of the samekinematic chain.ARigidBodyis a 3D body with arbitrary extent that may be described by a generalized inertia matrix (6x6). It accelerates when subject to generalized external forces (wrenches) and rotational velocities give rise to inertial forces (coriolis and centripetal contributions).ExamplesSingle framefromdynkinimportFrame,transformframe1=Frame(position=[1,2,3],attitude=[0,0,90],degrees=True)# Find transformation from the inertial frame to frame1ti1=transform(None,frame1)# Transformation of vectorv1_decomposed_in_frame1=ti1.apply_vector(v1_decomposed_in_inertial_frame)# Transformation of positionp1_decomposed_in_frame1=ti1.apply_position(p1_decomposed_in_inertial_frame)# Transformation of wrenchw1_decomposed_in_frame1=ti1.apply_wrench(w1_decomposed_in_inertial_frame)# Find the inverse transformationt1i=ti1.inv()# Pose of this frame, decomposed in inertial frameframe1.get_pose()# Twist of this frame, decomposed in inertial frameframe.get_twist()Two framesfromdynkinimportFrame,transformframe1=Frame(position=[1,2,3],attitude=[0,0,90],degrees=True)frame2=Frame(position=[3,2,1],attitude=[0,0,-90],degrees=True)# Find transformation from frame1 to frame2t12=transform(frame1,frame2)# Transformation of vectorv1_decomposed_in_frame2=t12.apply_vector(v1_decomposed_in_frame1)# Transformation of positionp1_decomposed_in_frame2=t12.apply_position(p1_decomposed_in_frame1)# Transformation of wrenchw1_decomposed_in_frame2=t12.apply_wrench(w1_decomposed_in_frame1)# Find the inverse transformationt21=t12.inv()Kinematic chainsfromdynkinimportFrame,transformframe1=Frame(position=[1,2,3],attitude=[0,0,90],degrees=True)frame2=frame1.align_child(position=[3,2,1],attitude=[0,0,-90],degrees=True)frame3=frame2.align_child(position=[1,1,1],attitude=[0,0,0],degrees=True)# Find transformation from inertial frame to frame3ti3=transform(None,frame3)# Transformation from frame3 and frame1t31=transform(frame3,frame1)...TODO: RigidBody exampleLicenseDistributed under the terms of the MIT license,dynkinis free and open source software