25 namespace perception {
59 bool IsValid() {
return (
ISqrt(IQquaresum3(p)) > static_cast<T>(0)); }
70 sf = -(
IDot3(npi, p) + npi[3]);
71 q[0] = p[0] + sf * npi[0];
72 q[1] = p[1] + sf * npi[1];
73 q[2] = p[2] + sf * npi[2];
101 template <
typename T>
103 return IDot3(pi, p) + pi[3];
108 template <
typename T>
114 template <
typename T>
116 T normal_p[3], normal_q[3];
121 if (normal_p[2] < static_cast<T>(0.0)) {
124 if (normal_q[2] < static_cast<T>(0.0)) {
139 template <
typename T>
146 T mat_a[9], eigv[3], mat_q[9];
148 T xm =
static_cast<T
>(0.0);
149 T ym =
static_cast<T
>(0.0);
150 T zm =
static_cast<T
>(0.0);
151 for (i = 0, j = 0; i < n; i++) {
156 xm /=
static_cast<T
>(n);
157 ym /=
static_cast<T
>(n);
158 zm /=
static_cast<T
>(n);
159 for (i = 0, j = 0; i < n; i++) {
172 pi[3] = -(pi[0] * xm + pi[1] * ym + pi[2] * zm);
181 template <
typename T>
188 T xm = (X[0] + X[3] + X[6]) / 3;
189 T ym = (X[1] + X[4] + X[7]) / 3;
190 T zm = (X[2] + X[5] + X[8]) / 3;
208 pi[3] = -(pi[0] * xm + pi[1] * ym + pi[2] * zm);
216 template <
typename T>
218 T *centroid, T *err_stat) {
220 if (centroid !=
nullptr) {
223 if (err_stat !=
nullptr) {
230 int i, j, n3 = n * 3;
231 T mat_a[9], eigv[3], mat_q[9],
t[3];
233 T xm =
static_cast<T
>(0.0);
234 T ym =
static_cast<T
>(0.0);
235 T zm =
static_cast<T
>(0.0);
236 for (i = 0, j = 0; i < n; i++) {
244 for (i = 0; i < n3; i += 3) {
245 ISub3(X + i, t, Xp + i);
247 IMultAtANx3(Xp, mat_a, n);
256 pi[3] = -
IDot3(pi, t);
258 if (centroid !=
nullptr) {
263 if (err_stat !=
nullptr) {
264 const T *cptr_data = X;
265 for (i = 0; i < n; ++i) {
269 err_stat[0] =
IMean(Xp, n);
270 err_stat[1] =
ISdv(Xp, err_stat[0], n);
280 template <
typename T>
283 if (n < 3 || n > m) {
288 T mat_a[9], eigv[3], mat_q[9];
290 T xm =
static_cast<T
>(0.0);
291 T ym =
static_cast<T
>(0.0);
292 T zm =
static_cast<T
>(0.0);
293 for (i = 0, j = 0; i < n; i++) {
301 for (i = 0, j = 0; i < n; i++) {
306 IMultAtANx3(X, mat_a, n);
314 pi[3] = -(pi[0] * xm + pi[1] * ym + pi[2] * zm);
323 template <
typename T>
327 if (n < 3 || n > m) {
332 T mat_a[9], eigv[3], mat_q[9];
334 T xm =
static_cast<T
>(0.0);
335 T ym =
static_cast<T
>(0.0);
336 T zm =
static_cast<T
>(0.0);
337 for (i = 0, j = 0; i < n; i++) {
345 for (i = 0, j = 0; i < n; i++) {
350 IMultAtANx3(X, mat_a, n);
358 pi[3] = -(pi[0] * xm + pi[1] * ym + pi[2] * zm);
360 if (centroid !=
nullptr) {
371 template <
typename T>
375 if (n < 3 || n > m) {
379 T *xp = IAlloc<T>(n * 3);
380 for (i = 0; i < n; i++) {
382 ICopy3(X + j * 3, xp + i * 3);
384 T mat_a[9], eigv[3], mat_q[9];
386 T xm =
static_cast<T
>(0.0);
387 T ym =
static_cast<T
>(0.0);
388 T zm =
static_cast<T
>(0.0);
389 for (i = 0, j = 0; i < n; i++) {
397 for (i = 0, j = 0; i < n; i++) {
402 IMultAtANx3(xp, mat_a, n);
414 para[3] = -
IDot3(para, para + 4);
417 for (i = 0; i < n; ++i) {
421 para[7] =
IMean(xp, n);
422 para[8] =
ISdv(xp, para[7], n);
428 template <
typename T>
429 inline void IPlaneFit(
const T *X1,
const T *X2,
const T *X3, T *pi) {
430 T mat_a[9] = {X1[0], X1[1], X1[2], X2[0], X2[1], X2[2], X3[0], X3[1], X3[2]};
436 template <
typename T>
446 template <
typename T>
453 template <
typename T>
455 T mat_a[9], mat_ap[9];
void IZero3(T a[3])
Definition: i_blas.h:334
void IMultAtAnx3(const T *A, T AtA[9], int n)
Definition: i_blas.h:4840
float IAbs(float a)
Definition: i_basic.h:29
T ISdv(const T *x, T mean, int n)
Definition: i_blas.h:2500
T IPlaneToPlaneNormalDeltaDegreeZUp(const T *pi_p, const T *pi_q)
Definition: i_plane.h:115
PlanePara & operator=(const PlanePara< T > &pi)
Definition: i_plane.h:37
void IScale4(T x[4], T sf)
Definition: i_blas.h:1874
T IL2Norm3(const T x[3])
Definition: i_blas.h:2812
T data_stat[2]
Definition: i_plane.h:48
void IPlaneFitTotalLeastSquareAdv(T *X, int *indices, T *para, int m, int n)
Definition: i_plane.h:372
void Assign(const T *pi)
Definition: i_plane.h:54
PlanningContext is the runtime context in planning. It is persistent across multiple frames...
Definition: atomic_hash_map.h:25
PlanePara(const PlanePara< T > &pi)
Definition: i_plane.h:32
void ICopy3(const T src[3], T dst[3])
Definition: i_blas.h:40
float IRec(float a)
Definition: i_basic.h:69
void IPlaneFitDestroyed(T *Xs, T *pi)
Definition: i_plane.h:447
void IPlaneFitTotalLeastSquare(T *X, T *pi, int n)
Definition: i_plane.h:140
T IPlaneToPointSignedDistanceWUnitNorm(const T *pi, const T *p)
Definition: i_plane.h:102
float IRadiansToDegree(float r)
Definition: i_basic.h:260
T IPlaneToPointDistanceWNormalizedPlaneNorm(const T *pi, const T *p)
Definition: i_plane.h:109
T IMean(const T *x, int n)
Definition: i_blas.h:2434
void IPointOnPlaneProjection(const T *pi, const T *p, T *q)
Definition: i_plane.h:65
void Clear()
Definition: i_plane.h:49
void IPlaneFitAdv(const T *Xs, T *para)
Definition: i_plane.h:454
void IEigSymmetric3x3Closed(const T *A, T *EV, T *Q)
Definition: i_util.h:56
void ISub3(const T x[3], const T y[3], T z[3])
Definition: i_blas.h:1405
void IZero9(T a[9])
Definition: i_blas.h:358
void ICopy2(const T src[2], T dst[2])
Definition: i_blas.h:35
float IDiv(float a, float b)
Definition: i_basic.h:35
PlanePara()
Definition: i_plane.h:60
void IZero4(T a[4])
Definition: i_blas.h:338
void IPlaneFitTotalLeastSquare3(T *X, T *pi)
Definition: i_plane.h:182
float IAcos(float alpha)
Definition: i_basic.h:239
void IPlaneFit(const T *X1, const T *X2, const T *X3, T *pi)
Definition: i_plane.h:429
void IMultAtA3x3(const T A[9], T AtA[9])
Definition: i_blas.h:4830
T p[4]
Definition: i_plane.h:44
void INeg3(T x[3])
Definition: i_blas.h:415
T t[3]
Definition: i_plane.h:45
T IDot3(const T x[3], const T y[3])
Definition: i_blas.h:2260
float ISqrt(float a)
Definition: i_basic.h:76
void IUnitize3(T x[3])
Definition: i_blas.h:2955
void IIndexedShuffle(T *a, int *indices, int n, int element_size, int nr_indexed_elements, bool is_sort_indices=true)
Definition: i_sort.h:80
T IPlaneToPointDistanceWUnitNorm(const T *pi, const T *p)
Definition: i_plane.h:93
T IPlaneToPointDistance(const T *pi, const T *p)
Definition: i_plane.h:79
void IZero2(T a[2])
Definition: i_blas.h:330
void IScale3(T x[3], T sf)
Definition: i_blas.h:1868
bool IsValid()
Definition: i_plane.h:59
void ICopy9(const T src[9], T dst[9])
Definition: i_blas.h:91
void ICopy4(const T src[4], T dst[4])
Definition: i_blas.h:46