Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

ExtendedPose3

The ExtendedPose3<K> class is the generic matrix Lie group SEK(3)SE_K(3): the semi-direct product of SO(3) with K copies of R3\mathbb{R}^3.

This notebook focuses on Python usage of ExtendedPose36 (the K=6 instantiation), including construction, group operations, and manifold/Lie operations.

Open In Colab

Lie Group Math Overview

An element of SEK(3)SE_K(3) is X=(R,x1,…,xK)X=(R, x_1, \ldots, x_K) with R∈SO(3)R \in SO(3) and xi∈R3x_i \in \mathbb{R}^3.

Group composition is:

(R,xi)⋅(S,yi)=(RS,xi+Ryi).(R, x_i) \cdot (S, y_i) = (RS, x_i + R y_i).

Group inverse is:

(R,xi)−1=(RT,−RTxi).(R, x_i)^{-1} = (R^T, -R^T x_i).

The tangent vector is ordered as ξ=[ω,ρ1,…,ρK]∈R3+3K\xi=[\omega, \rho_1, \ldots, \rho_K] \in \mathbb{R}^{3+3K}. The exponential and logarithm maps are:

X=Exp⁡(ξ),ξ=Log⁡(X).X = \operatorname{Exp}(\xi), \quad \xi = \operatorname{Log}(X).

For the matrix-Lie-group view, Hat⁡(ξ)\operatorname{Hat}(\xi) maps tangent vectors to Lie algebra matrices and Vee⁡(⋅)\operatorname{Vee}(\cdot) is the inverse map:

Vee⁡(Hat⁡(ξ))=ξ.\operatorname{Vee}(\operatorname{Hat}(\xi)) = \xi.

The adjoint map transports perturbations between frames:

Ad⁡Xη=AdjointMap⁡(X)  η.\operatorname{Ad}_X \eta = \operatorname{AdjointMap}(X) \; \eta.

As a manifold, local updates use retraction and local coordinates:

X′=X⊕δ=Retract⁡X(δ),δ=Local⁡X(X′).X' = X \oplus \delta = \operatorname{Retract}_X(\delta), \quad \delta = \operatorname{Local}_X(X').

Constructing ExtendedPose36

ExtendedPose36 stores one Rot3 and six 3-vectors x1,…,x6x_1,\dots,x_6. The manifold dimension is 3 + 3*K = 21, and the homogeneous matrix is (3+K) x (3+K) = 9 x 9.

k = 6, dim = 21, Dim = 21
matrix shape: (9, 9)
[[1. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 1. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 1. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 1. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 1. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 1. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 1.]]

Construct from rotation + 3xK block

x(0): [1. 2. 3.]
xMatrix: [[ 1.   4.  -1.   0.5  2.1 -0.3]
 [ 2.   5.   0.5 -1.2  3.3  0.8]
 [ 3.   6.   2.   1.4 -2.7  0.6]]

Construct from homogeneous matrix

equals: True

Group operations

Composition, inverse, and between follow the same Pose3-style API.

compose == matrix multiply: True
between == inverse-compose: True

Expmap / Logmap and tangent vectors

log(exp(xi)) ~= xi: True

Hat / Vee

vee(hat(xi)) ~= xi: True

Manifold operations

As with Pose3, optimization-facing operations are retract and localCoordinates.

localCoordinates(retract(delta)) ~= delta: True

Adjoint

AdjointMap shape: (21, 21)
Adjoint(eta) == AdjointMap @ eta: True

Notes and references

ExtendedPose3<K> is meaning-agnostic: it only defines the group structure. Semantic interpretation of each xix_i (e.g., position, velocity, bias, contact points) is left to derived/application-level code.

For an invariant-filter application context (including walking-robot style state design ideas), see:

For Pose3-specific behavior and conventions, see: