71 std::void_t<decltype(Action::type),
72 decltype(Action::generator(
73 std::declval<const typename traits<G>::TangentVector&>()))>>
74 : std::bool_constant<std::is_base_of_v<GroupAction<Action, G, H>, Action> &&
75 std::is_default_constructible_v<Action> &&
76 Action::type == ActionType::Left> {};
92class SemidirectLieGroup
93 :
public std::pair<G, H>,
94 public LieGroup<SemidirectLieGroup<G, H, Action>,
95 internal::dimensionSum(traits<G>::dimension,
96 traits<H>::dimension)> {
103 using This = SemidirectLieGroup<G, H, Action>;
104 using Base = std::pair<G, H>;
111 inline constexpr static bool firstDynamic = n == Eigen::Dynamic;
115 "SemidirectLieGroup requires a default-constructible left "
116 "GroupAction, a fixed-size Eigen vector H, and "
117 "Action::generator(u)");
121 using LieBase::dimension;
122 using TangentVector =
typename LieBase::TangentVector;
123 using ChartJacobian =
typename LieBase::ChartJacobian;
124 using Jacobian =
typename LieBase::Jacobian;
128 using ActionJacobianG =
129 std::conditional_t<firstDynamic, Matrix, Eigen::Matrix<double, m, n>>;
134 SemidirectLieGroup(
const G& g,
const H& h) : Base(g, h) {}
135 SemidirectLieGroup(
const Base& base) : Base(base) {}
137 static SemidirectLieGroup Identity() {
return SemidirectLieGroup(); }
138 size_t dim()
const {
return firstDim() + secondDim(); }
140 SemidirectLieGroup operator*(
const SemidirectLieGroup& other)
const;
141 SemidirectLieGroup inverse()
const;
142 using LieBase::between;
143 using LieBase::compose;
145 using LieBase::inverse;
148 SemidirectLieGroup retract(
const TangentVector& v, ChartJacobian H1 = {},
149 ChartJacobian H2 = {})
const;
150 TangentVector localCoordinates(
const SemidirectLieGroup& other,
151 ChartJacobian H1 = {},
152 ChartJacobian H2 = {})
const;
153 static SemidirectLieGroup Expmap(
const TangentVector& xi,
154 ChartJacobian D = {});
155 static SemidirectLieGroup Expmap(
160 static TangentVector Logmap(
const SemidirectLieGroup& p,
161 ChartJacobian D = {});
162 static TangentVector LocalCoordinates(
const SemidirectLieGroup& p,
163 ChartJacobian D = {}) {
166 Jacobian AdjointMap()
const;
167 static Jacobian adjointMap(
const TangentVector& xi);
169 void print(
const std::string& s =
"")
const;
170 bool equals(
const SemidirectLieGroup& other,
double tol = 1e-9)
const {
176 template <
typename T>
177 static T defaultIdentity();
180 void checkMatchingDimensions(
const SemidirectLieGroup& other,
181 const char* operation)
const;
183 template <typename T, int D = traits<T>::dimension>
185 const TangentVector& xi,
size_t start,
size_t d);
186 static TangentVector makeTangentVector(
189 static Jacobian zeroJacobian(
size_t d);
190 static Jacobian identityJacobian(
size_t d);
192 struct Phi1KernelResult {
196 static Phi1KernelResult phi1Kernel(
const Jacobian2& A);
198 const Jacobian2& A,
const Jacobian2& B,
200 static Jacobian rightJacobian(
const TangentVector& xi);