10namespace perception_msgs {
11namespace object_access {
28inline void transformPoseWithCovariance(
29 const gm::PoseWithCovarianceStamped& input, gm::PoseWithCovarianceStamped& output,
30 const gm::TransformStamped& transform)
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;
44 tf2::doTransform(numerical, output, transform);
45 if (!has_markers)
return;
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) {
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];
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;