Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

Rigid transform using Lie groups and Dual Quaternions, written in CasADi!

License

NotificationsYou must be signed in to change notification settings

ami-iit/liecasadi

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

liecasadi

liecasadi implements Lie groups operation written in CasADi, mainly directed to optimization problem formulation.

Inspired byA micro Lie theory for state estimation in robotics and the libraryManif.

🐍 Install

Conda

Create aconda environment

conda create -n liecasadienv

and install the library

conda install liecasadi

Pip

Create avirtual environment, if you prefer. For example:

pip install virtualenvpython3 -m venv your_virtual_envsource your_virtual_env/bin/activate

Inside the virtual environment, install the library from pip:

pip install liecasadi

If you want the last version:

pip install"liecasadi @ git+https://github.com/ami-iit/lie-casadi.git"

Implemented Groups

GroupDescription
SO33D Rotations
SE33D Rigid Transform

🚀 Operations

Being:

  • $X, Y \in SO3, \ SE3$

  • $w \in \text{SO3Tangent}, \ \text{SE3Tangent}$

  • $v \in \mathbb{R}^3$

OperationCode
Inverse$X^{-1}$X.inverse()
Composition$X \circ Y$X*Y
Exponential$\text{exp}(w)$phi.exp()
Act on vector$X \circ v$X.act(v)
Logarithm$\text{log}(X)$X.log()
Manifold right plus$X \oplus w = X \circ \text{exp}(w)$X + phi
Manifold left plus$w \oplus X = \text{exp}(w) \circ X$phi + X
Manifold minus$X-Y = \text{log}(Y^{-1} \circ X)$X-Y

🦸‍♂️ Example

fromliecasadiimportSE3,SO3,SE3Tangent,SO3Tangent# Random quaternion + normalizationquat= (np.random.rand(4)-0.5)*5quat=quat/np.linalg.norm(quat)# Random vectorvector3d= (np.random.rand(3)-0.5)*2*np.pi# Create SO3 objectrotation=SO3(quat)# Create Identityidentity=SO3.Identity()# Create SO3Tangent objecttangent=SO3Tangent(vector3d)# Random translation vectorpos= (np.random.rand(3)-0.5)*5# Create SE3 objecttransform=SE3(pos=pos,xyzw=quat)# Random vectorvector6d= (np.random.rand(3)-0.5)*5# Create SE3Tangent objecttangent=SO3Tangent(vector6d)

Dual Quaternion example

fromliecasadiimportSE3,DualQuaternionfromnumpyimportnp# orientation quaternion generationquat1= (np.random.rand(4)-0.5)*5quat1=quat1/np.linalg.norm(quat1)quat2= (np.random.rand(4)-0.5)*5quat2=quat2/np.linalg.norm(quat2)# translation vector generationpos1= (np.random.rand(3)-0.5)*5pos2= (np.random.rand(3)-0.5)*5dual_quaternion1=DualQuaternion(quat1,pos1)dual_quaternion2=DualQuaternion(quat2,pos2)# from a homogenous matrix# (using liecasadi.SE3 to generate the corresponding homogenous matrix)H=SE3.from_position_quaternion(pos,quat).as_matrix()dual_quaternion1=DualQuaternion.from_matrix(H)# Concatenation of rigid transformsq1xq2=dual_quaternion1*dual_quaternion2# to homogeneous matrixprint(q1xq2.as_matrix())# obtain translationprint(q1xq2.translation())# obtain rotationprint(q1xq2.rotation().as_matrix())# transform a pointpoint=np.random.randn(3,1)transformed_point=dual_quaternion1.transform_point(point)# create an identity dual quaternionI=DualQuaternion.Identity()

🦸‍♂️ Contributing

liecasadi is an open-source project. Contributions are very welcome!

Open an issue with your feature request or if you spot a bug. Then, you can also proceed with a Pull-requests! 🚀


[8]ページ先頭

©2009-2025 Movatter.jp