All Projects → petercorke → Spatialmath Python

petercorke / Spatialmath Python

Licence: mit
Create, manipulate and convert representations of position and orientation in 2D or 3D using Python

Programming Languages

python
139335 projects - #7 most used programming language

Projects that are alternatives of or similar to Spatialmath Python

spatialmath-matlab
Create, manipulate and convert representations of position and orientation in 2D or 3D using Python
Stars: ✭ 142 (+82.05%)
Mutual labels:  robot, math, transform, 2d
Sophus
C++ implementation of Lie Groups using Eigen.
Stars: ✭ 1,048 (+1243.59%)
Mutual labels:  graphics, 3d, 2d, math
Mathc
Pure C math library for 2D and 3D programming
Stars: ✭ 504 (+546.15%)
Mutual labels:  graphics, 3d, 2d, math
Unitymathreference
Math reference for games and more. All visualized in Unity3D.
Stars: ✭ 166 (+112.82%)
Mutual labels:  3d, 2d, math
Css Transform
CSS Transform Playground. Online tool to visualize 2D & 3D CSS3 Transform functions.
Stars: ✭ 113 (+44.87%)
Mutual labels:  3d, 2d, transform
Mathnet Spatial
Math.NET Spatial
Stars: ✭ 246 (+215.38%)
Mutual labels:  3d, 2d, math
Wechart
Create all the [ch]arts by cax or three.js - Cax 和 three.js 创造一切图[表]
Stars: ✭ 152 (+94.87%)
Mutual labels:  graphics, 3d, 2d
Ugm
Ubpa Graphics Mathematics
Stars: ✭ 178 (+128.21%)
Mutual labels:  graphics, math, transform
Worldwindjava
The NASA WorldWind Java SDK (WWJ) is for building cross-platform 3D geospatial desktop applications in Java.
Stars: ✭ 526 (+574.36%)
Mutual labels:  graphics, 3d
Silk.net
The high-speed OpenAL, OpenGL, Vulkan, and GLFW bindings library your mother warned you about.
Stars: ✭ 534 (+584.62%)
Mutual labels:  graphics, 3d
Fauxgl
Software-only 3D renderer written in Go.
Stars: ✭ 658 (+743.59%)
Mutual labels:  graphics, 3d
Handmade Math
A simple math library for games and computer graphics. Compatible with both C and C++.
Stars: ✭ 517 (+562.82%)
Mutual labels:  graphics, math
Cglm
📽 Highly Optimized Graphics Math (glm) for C
Stars: ✭ 887 (+1037.18%)
Mutual labels:  3d, math
Im3d
Immediate mode rendering and 3d gizmos.
Stars: ✭ 561 (+619.23%)
Mutual labels:  graphics, 3d
Manif
A small C++11 header-only library for Lie theory.
Stars: ✭ 494 (+533.33%)
Mutual labels:  3d, 2d
Draw2d
2D rendering for different output (raster, pdf, svg)
Stars: ✭ 799 (+924.36%)
Mutual labels:  graphics, 2d
Renderhelp
⚡️ 可编程渲染管线实现,帮助初学者学习渲染
Stars: ✭ 494 (+533.33%)
Mutual labels:  graphics, 3d
Anki 3d Engine
AnKi 3D Engine - Vulkan backend, modern renderer, scripting, physics and more
Stars: ✭ 688 (+782.05%)
Mutual labels:  graphics, 3d
Xeogl
A WebGL-based 3D engine for technical visualization. Not actively maintained.
Stars: ✭ 920 (+1079.49%)
Mutual labels:  graphics, 3d
Jglm
Java OpenGL Mathematics Library
Stars: ✭ 44 (-43.59%)
Mutual labels:  graphics, math

Spatial Maths for Python

PyPI version PyPI - Python Version License: MIT QUT Centre for Robotics Open Source

Build Status Coverage Language grade: Python PyPI - Downloads GitHub stars

A Python implementation of the Spatial Math Toolbox for MATLAB®

Spatial mathematics capability underpins all of robotics and robotic vision where we need to describe the position, orientation or pose of objects in 2D or 3D spaces.

Recent changes

  • @ operator for pose objects, like * but does an explicit normalization
  • interp has changed quite a bit:
    • now X1.interp(X2, s) rather than X2.interp(s, start=X1)
    • new interp1 method interpolates between null and X, eg. X.interp1(s)
    • integer value of s is interpretted as s even steps between 0 and 1
  • UnitQuaternions now always have a positive scalar part
  • base functions plot_point, plot_text, plot_box like their MATLAB cousins
  • tranimate works in Jupyter with notebook backend, lots of internal improvements with animation
  • trplot now has an implemented anaglyph mode. Have a play and give feedback.
  • SE3 and SO3 constructors Eul and RPY can now accept the angles as 3 positional arguments rather than just a vector, eg. SO3.RPY(1,2,3)
  • There is a prototype UnitDualQuaternion class

What it does

The package provides classes to represent pose and orientation in 3D and 2D space:

Represents in 3D in 2D
pose SE3 Twist3 UnitDualQuaternion SE2 Twist2
orientation SO3 UnitQuaternion SO2

More specifically:

  • SE3 matrices belonging to the group SE(3) for position and orientation (pose) in 3-dimensions
  • SO3 matrices belonging to the group SO(3) for orientation in 3-dimensions
  • UnitQuaternion belonging to the group S3 for orientation in 3-dimensions
  • Twist3 vectors belonging to the group se(3) for pose in 3-dimensions
  • UnitDualQuaternion maps to the group SE(3) for position and orientation (pose) in 3-dimensions
  • SE2 matrices belonging to the group SE(2) for position and orientation (pose) in 2-dimensions
  • SO2 matrices belonging to the group SO(2) for orientation in 2-dimensions
  • Twist2 vectors belonging to the group se(2) for pose in 2-dimensions

These classes provide convenience and type safety, as well as methods and overloaded operators to support:

  • composition, using the * operator
  • point transformation, using the * operator
  • exponent, using the ** operator
  • normalization
  • inversion
  • connection to the Lie algebra via matrix exponential and logarithm operations
  • conversion of orientation to/from Euler angles, roll-pitch-yaw angles and angle-axis forms.
  • list operations such as append, insert and get

These are layered over a set of base functions that perform many of the same operations but represent data explicitly in terms of numpy arrays.

The class, method and functions names largely mirror those of the MATLAB toolboxes, and the semantics are quite similar.

trplot

animation video

Installation

Using pip

Install a snapshot from PyPI

pip install spatialmath-python

From GitHub

Install the current code base from GitHub and pip install a link to that cloned copy

git clone https://github.com/petercorke/spatialmath-python.git
cd spatialmath-python
pip install -e .

Dependencies

numpy, scipy, matplotlib, ffmpeg (if rendering animations as a movie)

Examples

High-level classes

These classes abstract the low-level numpy arrays into objects that obey the rules associated with the mathematical groups SO(2), SE(2), SO(3), SE(3) as well as twists and quaternions.

Using classes ensures type safety, for example it stops us mixing a 2D homogeneous transformation with a 3D rotation matrix -- both of which are 3x3 matrices. It also ensures that the internal matrix representation is always a valid member of the relevant group.

For example, to create an object representing a rotation of 0.3 radians about the x-axis is simply

>>> R1 = SO3.Rx(0.3)
>>> R1
   1         0         0          
   0         0.955336 -0.29552    
   0         0.29552   0.955336         

while a rotation of 30 deg about the z-axis is

>>> R2 = SO3.Rz(30, 'deg')
>>> R2
   0.866025 -0.5       0          
   0.5       0.866025  0          
   0         0         1    

and the composition of these two rotations is

>>> R = R1 * R2
   0.866025 -0.5       0          
   0.433013  0.75     -0.5        
   0.25      0.433013  0.866025 

We can find the corresponding Euler angles (in radians)

>> R.eul()
array([-1.57079633,  0.52359878,  2.0943951 ])

Frequently in robotics we want a sequence, a trajectory, of rotation matrices or poses. These pose classes inherit capability from the list class

>>> R = SO3()   # the identity
>>> R.append(R1)
>>> R.append(R2)
>>> len(R)
 3
>>> R[1]
   1         0         0          
   0         0.955336 -0.29552    
   0         0.29552   0.955336             

and this can be used in for loops and list comprehensions.

An alternative way of constructing this would be (R1, R2 defined above)

>>> R = SO3( [ SO3(), R1, R2 ] )       
>>> len(R)
 3

Many of the constructors such as .Rx, .Ry and .Rz support vectorization

>>> R = SO3.Rx( np.arange(0, 2*np.pi, 0.2))
>>> len(R)
 32

which has created, in a single line, a list of rotation matrices.

Vectorization also applies to the operators, for instance

>>> A = R * SO3.Ry(0.5)
>>> len(R)
 32

will produce a result where each element is the product of each element of the left-hand side with the right-hand side, ie. R[i] * SO3.Ry(0.5).

Similarly

>>> A = SO3.Ry(0.5) * R 
>>> len(R)
 32

will produce a result where each element is the product of the left-hand side with each element of the right-hand side , ie. SO3.Ry(0.5) * R[i].

Finally

>>> A = R * R 
>>> len(R)
 32

will produce a result where each element is the product of each element of the left-hand side with each element of the right-hand side , ie. R[i] * R[i].

The underlying representation of these classes is a numpy matrix, but the class ensures that the structure of that matrix is valid for the particular group represented: SO(2), SE(2), SO(3), SE(3). Any operation that is not valid for the group will return a matrix rather than a pose class, for example

>>> SO3.Rx(0.3) * 2
array([[ 2.        ,  0.        ,  0.        ],
       [ 0.        ,  1.91067298, -0.59104041],
       [ 0.        ,  0.59104041,  1.91067298]])

>>> SO3.Rx(0.3) - 1
array([[ 0.        , -1.        , -1.        ],
       [-1.        , -0.04466351, -1.29552021],
       [-1.        , -0.70447979, -0.04466351]])

We can print and plot these objects as well

>>> T = SE3(1,2,3) * SE3.Rx(30, 'deg')
>>> T.print()
   1         0         0         1          
   0         0.866025 -0.5       2          
   0         0.5       0.866025  3          
   0         0         0         1          

>>> T.printline()
t =        1,        2,        3; rpy/zyx =       30,        0,        0 deg

>>> T.plot()

trplot

printline is a compact single line format for tabular listing, whereas print shows the underlying matrix and for consoles that support it, it is colorised, with rotational elements in red and translational elements in blue.

For more detail checkout the shipped Python notebooks:

You can browse it statically through the links above, or clone the toolbox and run them interactively using Jupyter or JupyterLab.

Low-level spatial math

Import the low-level transform functions

>>> import spatialmath.base as tr

We can create a 3D rotation matrix

>>> tr.rotx(0.3)
array([[ 1.        ,  0.        ,  0.        ],
       [ 0.        ,  0.95533649, -0.29552021],
       [ 0.        ,  0.29552021,  0.95533649]])

>>> tr.rotx(30, unit='deg')
array([[ 1.       ,  0.       ,  0.       ],
       [ 0.       ,  0.8660254, -0.5      ],
       [ 0.       ,  0.5      ,  0.8660254]])

The results are numpy arrays so to perform matrix multiplication you need to use the @ operator, for example

rotx(0.3) @ roty(0.2)

We also support multiple ways of passing vector information to functions that require it:

  • as separate positional arguments
transl2(1, 2)
array([[1., 0., 1.],
       [0., 1., 2.],
       [0., 0., 1.]])
  • as a list or a tuple
transl2( [1,2] )
array([[1., 0., 1.],
       [0., 1., 2.],
       [0., 0., 1.]])

transl2( (1,2) )
Out[444]: 
array([[1., 0., 1.],
       [0., 1., 2.],
       [0., 0., 1.]])
  • or as a numpy array
transl2( np.array([1,2]) )
Out[445]: 
array([[1., 0., 1.],
       [0., 1., 2.],
       [0., 0., 1.]])

There is a single module that deals with quaternions, unit or not, and the representation is a numpy array of four elements. As above, functions can accept the numpy array, a list, dict or numpy row or column vectors.

>>> from spatialmath.base.quaternion import *
>>> q = qqmul([1,2,3,4], [5,6,7,8])
>>> q
array([-60,  12,  30,  24])
>>> qprint(q)
-60.000000 < 12.000000, 30.000000, 24.000000 >
>>> qnorm(q)
72.24956747275377

Graphics

trplot

The functions support various plotting styles

trplot( transl(1,2,3), frame='A', rviz=True, width=1, dims=[0, 10, 0, 10, 0, 10])
trplot( transl(3,1, 2), color='red', width=3, frame='B')
trplot( transl(4, 3, 1)@trotx(math.pi/3), color='green', frame='c', dims=[0,4,0,4,0,4])

Animation is straightforward

tranimate(transl(4, 3, 4)@trotx(2)@troty(-2), frame=' arrow=False, dims=[0, 5], nframes=200)

and it can be saved to a file by

tranimate(transl(4, 3, 4)@trotx(2)@troty(-2), frame=' arrow=False, dims=[0, 5], nframes=200, movie='out.mp4')

animation video

At the moment we can only save as an MP4, but the following incantation will covert that to an animated GIF for embedding in web pages

ffmpeg -i out -r 20 -vf "fps=10,scale=640👎flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" out.gif

Symbolic support

Some functions have support for symbolic variables, for example

import sympy

theta = sym.symbols('theta')
print(rotx(theta))
[[1 0 0]
 [0 cos(theta) -sin(theta)]
 [0 sin(theta) cos(theta)]]

The resulting numpy array is an array of symbolic objects not numbers – the constants are also symbolic objects. You can read the elements of the matrix

a = T[0,0]

a
Out[258]: 1

type(a)
Out[259]: int

a = T[1,1]
a
Out[256]: 
cos(theta)
type(a)
Out[255]: cos

We see that the symbolic constants are converted back to Python numeric types on read.

Similarly when we assign an element or slice of the symbolic matrix to a numeric value, they are converted to symbolic constants on the way in.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].