perception_interfaces 1.2.0
Loading...
Searching...
No Matches
covariance_transform.hpp
1// Copyright Institute for Automotive Engineering (ika), RWTH Aachen University
2// SPDX-License-Identifier: MIT
3
4#pragma once
5
6#include <cmath>
7#include <array>
9
10namespace perception_msgs {
11namespace object_access {
12
28inline void transformPoseWithCovariance(
29 const gm::PoseWithCovarianceStamped& input, gm::PoseWithCovarianceStamped& output,
30 const gm::TransformStamped& transform)
31{
32 auto numerical = input;
33 std::array<bool, 36> invalid{}, unknown{};
34 bool has_markers = false;
35 for (int k = 0; k < 36; ++k) {
36 const double value = input.pose.covariance[k];
37 invalid[k] = k % 7 == 0 && value == CONTINUOUS_STATE_COVARIANCE_INVALID;
38 unknown[k] = value == CONTINUOUS_STATE_COVARIANCE_UNKNOWN;
39 if (invalid[k] || unknown[k]) {
40 numerical.pose.covariance[k] = 0.0;
41 has_markers = true;
42 }
43 }
44 tf2::doTransform(numerical, output, transform);
45 if (!has_markers) return;
46
47 tf2::Transform tf_transform;
48 tf2::fromMsg(transform.transform, tf_transform);
49 const auto& rotation = tf_transform.getBasis();
50 for (int i = 0; i < 6; ++i) {
51 for (int j = 0; j < 6; ++j) {
52 bool invalid_contribution = false, unknown_contribution = false;
53 for (int k = 0; k < 3; ++k) {
54 // Ignore rounding residue at exact axis rotations (e.g. pi/2).
55 if (std::abs(rotation[i % 3][k]) <= 1e-12) continue;
56 for (int l = 0; l < 3; ++l) {
57 if (std::abs(rotation[j % 3][l]) <= 1e-12) continue;
58 const int index = 6 * (3 * (i / 3) + k) + 3 * (j / 3) + l;
59 invalid_contribution = invalid_contribution || invalid[index];
60 unknown_contribution = unknown_contribution || unknown[index];
61 }
62 }
63 if (i == j && invalid_contribution)
64 output.pose.covariance[6 * i + j] = CONTINUOUS_STATE_COVARIANCE_INVALID;
65 else if (invalid_contribution || unknown_contribution)
66 output.pose.covariance[6 * i + j] = CONTINUOUS_STATE_COVARIANCE_UNKNOWN;
67 }
68 }
69}
70
71} // namespace object_access
72} // namespace perception_msgs
Object state constants.