Skip to content

Commit 6b6da02

Browse files
authored
Merge pull request #2415 from abussy-aldebaran/feature/doc_null_space
doc - Add explanations for null space projection.
2 parents 8c0d8f0 + f8f84f1 commit 6b6da02

File tree

1 file changed

+23
-1
lines changed

1 file changed

+23
-1
lines changed

doc/d-practical-exercises/3-invkine.md

+23-1
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,29 @@ the null space of task 1 is:
152152

153153
\f$P_1 = I_9 - J_1^+ J_1\f$
154154

155-
\f$vq_2 = vq_1 + P_1 (J_2 P_1)^+ ( v_2^* - J_2 vq_1)\f$
155+
\f$vq_2 = vq_1 + P_1 (J_2 P_1)^+ (v_2^* - J_2 vq_1)\f$
156+
157+
With the mathematical property
158+
159+
\f$(J_2 P_1)^+ = P_1 (J_2 P_1)^+\f$
160+
161+
we can save a matrix multiplication:
162+
163+
\f$vq_2 = vq_1 + (J_2 P_1)^+ (v_2^* - J_2 vq_1)\f$
164+
165+
It is important to note that the null space of `J1` is defined up to a numeric
166+
threshold on its eigen values. A low threshold will lead to a trivial null space
167+
of `J1`, and task 2 could numerically interfere with task 1. It translates into
168+
setting an appropriate `rcond` or `rtol` when computing the pseudo-inverse of
169+
`J2 P1`:
170+
171+
```py
172+
pinv_J2_P1 = pinv(J2 @ P1, rcond=1e-3)
173+
```
174+
175+
Tuning `rcond` is a tradeoff: if `rcond` is too low (its default is `1e-15`),
176+
task 2 could interfere with task 1. If it is too high, there won't be enough
177+
DoFs to complete task 2.
156178

157179
#### Question 2
158180

0 commit comments

Comments
 (0)