NASA Astrobee Robot Software  0.19.1
Flight software for the Astrobee robots operating inside the International Space Station.
msg_conversions.h
Go to the documentation of this file.
1 /* Copyright (c) 2017, United States Government, as represented by the
2  * Administrator of the National Aeronautics and Space Administration.
3  *
4  * All rights reserved.
5  *
6  * The Astrobee platform is licensed under the Apache License, Version 2.0
7  * (the "License"); you may not use this file except in compliance with the
8  * License. You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15  * License for the specific language governing permissions and limitations
16  * under the License.
17  */
18 
19 #ifndef MSG_CONVERSIONS_MSG_CONVERSIONS_H_
20 #define MSG_CONVERSIONS_MSG_CONVERSIONS_H_
21 
23 
24 #include <eigen3/Eigen/Core>
25 #include <eigen3/Eigen/Geometry>
26 
27 #include <geometry_msgs/Pose.h>
28 #include <geometry_msgs/PoseWithCovarianceStamped.h>
29 #include <geometry_msgs/Point.h>
30 #include <geometry_msgs/Quaternion.h>
31 #include <geometry_msgs/Transform.h>
32 #include <geometry_msgs/TransformStamped.h>
33 #include <geometry_msgs/Vector3.h>
34 
35 // TF2 support
36 #include <tf2_geometry_msgs/tf2_geometry_msgs.h>
37 
38 #include <string>
39 
40 // Helper macro to automatically load a parameter for a basic type (int/bool/double).
41 // Assumes function is called as LOAD_PARAM(param.val, config, prefix) and assumes the format of
42 // param.y for the variable name (passing simply y will fail.)
43 #define LOAD_PARAM(val, config, prefix) \
44  msg_conversions::Load((config), (val), std::string(#val).substr(std::string(#val).find_last_of(".") + 1), (prefix))
45 
46 namespace msg_conversions {
47 
48 Eigen::Vector3d ros_point_to_eigen_vector(const geometry_msgs::Point& p);
49 Eigen::Vector3d ros_to_eigen_vector(const geometry_msgs::Vector3& v);
50 geometry_msgs::Vector3 eigen_to_ros_vector(const Eigen::Vector3d& v);
51 void eigen_to_array_vector(const Eigen::Vector3d& v, float* array);
52 void ros_to_array_vector(const geometry_msgs::Vector3& v, float* array);
53 geometry_msgs::Vector3 array_to_ros_vector(float* array);
54 
55 geometry_msgs::Point eigen_to_ros_point(const Eigen::Vector3d& v);
56 void ros_to_array_point(const geometry_msgs::Point& p, float* array);
57 geometry_msgs::Point array_to_ros_point(float* array);
58 
59 Eigen::Quaterniond ros_to_eigen_quat(const geometry_msgs::Quaternion& q);
60 geometry_msgs::Quaternion eigen_to_ros_quat(const Eigen::Quaterniond& q);
61 geometry_msgs::Quaternion eigen_to_ros_quat(const Eigen::Vector4d& v);
62 geometry_msgs::Quaternion tf2_quat_to_ros_quat(const tf2::Quaternion& q);
63 void eigen_to_array_quat(const Eigen::Quaterniond& q, float* array);
64 void ros_to_array_quat(const geometry_msgs::Quaternion& q, float* array);
65 geometry_msgs::Quaternion array_to_ros_quat(float* array);
66 
67 Eigen::Affine3d ros_pose_to_eigen_transform(const geometry_msgs::Pose& p);
69 geometry_msgs::Pose ros_transform_to_ros_pose(const geometry_msgs::Transform& p);
70 geometry_msgs::Pose tf2_transform_to_ros_pose(const tf2::Transform& p);
71 geometry_msgs::Pose eigen_transform_to_ros_pose(const Eigen::Affine3d& p);
74 tf2::Transform ros_pose_to_tf2_transform(const geometry_msgs::Pose& p);
75 
76 // load from config file
77 bool config_read_quat(config_reader::ConfigReader* config, const char* name, Eigen::Quaterniond* quat);
79 bool config_read_array(config_reader::ConfigReader* config, const char* name, int length, float* dest);
80 bool config_read_matrix(config_reader::ConfigReader* config, const char* name, int rows, int cols, float* dest);
82  Eigen::Quaterniond* quat);
83 bool config_read_transform(config_reader::ConfigReader* config, const char* name, geometry_msgs::Vector3* vec,
84  geometry_msgs::Quaternion* quat);
85 bool config_read_transform(config_reader::ConfigReader* config, const char* name, Eigen::Affine3d* transform);
87 
88 bool config_read_quat(config_reader::ConfigReader::Table* t, Eigen::Quaterniond* quat);
90 bool config_read_quat(config_reader::ConfigReader::Table* t, geometry_msgs::Quaternion* quat);
91 bool config_read_vector(config_reader::ConfigReader::Table* t, geometry_msgs::Vector3* vec);
92 bool config_read_vector(config_reader::ConfigReader::Table* t, geometry_msgs::Point* point);
93 
94 bool SingleBoolTrue(const std::initializer_list<bool>& bools);
95 
96 // Alternative format for loading configs
97 Eigen::Isometry3d LoadEigenTransform(config_reader::ConfigReader& config, const std::string& transform_config_name,
98  const std::string& prefix = "");
99 double LoadDouble(config_reader::ConfigReader& config, const std::string& config_name, const std::string& prefix = "");
100 float LoadFloat(config_reader::ConfigReader& config, const std::string& config_name, const std::string& prefix = "");
101 int LoadInt(config_reader::ConfigReader& config, const std::string& config_name, const std::string& prefix = "");
102 bool LoadBool(config_reader::ConfigReader& config, const std::string& config_name, const std::string& prefix = "");
103 std::string LoadString(config_reader::ConfigReader& config, const std::string& config_name,
104  const std::string& prefix = "");
105 // Overloads for parameter loading that enable LOAD_PARAM macro to work
106 void Load(config_reader::ConfigReader& config, float& val, const std::string& config_name,
107  const std::string& prefix = "");
108 void Load(config_reader::ConfigReader& config, double& val, const std::string& config_name,
109  const std::string& prefix = "");
110 void Load(config_reader::ConfigReader& config, int& val, const std::string& config_name,
111  const std::string& prefix = "");
112 void Load(config_reader::ConfigReader& config, bool& val, const std::string& config_name,
113  const std::string& prefix = "");
114 void Load(config_reader::ConfigReader& config, std::string& val, const std::string& config_name,
115  const std::string& prefix = "");
116 
117 void EigenPoseToMsg(const Eigen::Isometry3d& pose, geometry_msgs::Pose& msg_pose);
118 void EigenPoseToMsg(const Eigen::Isometry3d& pose, geometry_msgs::Transform& msg_transform);
119 void VariancesToCovDiag(const Eigen::Vector3d& variances, float* const cov_diag);
120 Eigen::Vector3d CovDiagToVariances(const float* const cov_diag);
121 void EigenPoseCovarianceToMsg(const Eigen::Isometry3d& pose, const Eigen::Matrix<double, 6, 6>& covariance,
122  geometry_msgs::PoseWithCovarianceStamped& pose_cov_msg);
123 void EigenPoseCovarianceToMsg(const Eigen::Isometry3d& pose, const Eigen::Matrix<double, 6, 6>& covariance,
124  geometry_msgs::PoseWithCovariance& pose_cov_msg);
125 
126 template <typename VectorType, typename MsgVectorType>
127 VectorType VectorFromMsg(const MsgVectorType& msg_vector) {
128  return VectorType(msg_vector.x, msg_vector.y, msg_vector.z);
129 }
130 
131 template <typename VectorType, typename MsgVectorType>
132 VectorType Vector2dFromMsg(const MsgVectorType& msg_vector) {
133  return VectorType(msg_vector.x, msg_vector.y);
134 }
135 
136 template <typename VectorType, typename MsgVectorType>
137 void VectorToMsg(const VectorType& vector, MsgVectorType& msg_vector) {
138  msg_vector.x = vector.x();
139  msg_vector.y = vector.y();
140  msg_vector.z = vector.z();
141 }
142 
143 template <typename VectorType, typename MsgVectorType>
144 void Vector2dToMsg(const VectorType& vector, MsgVectorType& msg_vector) {
145  msg_vector.x = vector.x();
146  msg_vector.y = vector.y();
147 }
148 
149 template <typename RotationType, typename MsgRotationType>
150 RotationType RotationFromMsg(const MsgRotationType& msg_rotation) {
151  return RotationType(msg_rotation.w, msg_rotation.x, msg_rotation.y, msg_rotation.z);
152 }
153 
154 template <typename RotationType, typename MsgRotationType>
155 void RotationToMsg(const RotationType& rotation, MsgRotationType& msg_rotation) {
156  msg_rotation.w = rotation.w();
157  msg_rotation.x = rotation.x();
158  msg_rotation.y = rotation.y();
159  msg_rotation.z = rotation.z();
160 }
161 
162 template <typename ArrayType, int Dim>
163 void EigenCovarianceToMsg(const Eigen::Matrix<double, Dim, Dim>& covariance, ArrayType& covariance_array) {
164  for (int i = 0; i < Dim; ++i) {
165  for (int j = 0; j < Dim; ++j) {
166  covariance_array[i*Dim + j] = covariance(i, j);
167  }
168  }
169 }
170 
171 template <int Dim, typename ArrayType>
172 Eigen::Matrix<double, Dim, Dim> EigenCovarianceFromMsg(const ArrayType& covariance_array) {
173  Eigen::Matrix<double, Dim, Dim> covariance;
174  for (int i = 0; i < Dim; ++i) {
175  for (int j = 0; j < Dim; ++j) {
176  covariance(i, j) = covariance_array[i*Dim + j];
177  }
178  }
179  return covariance;
180 }
181 } // namespace msg_conversions
182 
183 #endif // MSG_CONVERSIONS_MSG_CONVERSIONS_H_
msg_conversions::tf2_transform_to_ros_pose
geometry_msgs::Pose tf2_transform_to_ros_pose(const tf2::Transform &p)
Definition: msg_conversions.cc:266
msg_conversions::Load
void Load(config_reader::ConfigReader &config, float &val, const std::string &config_name, const std::string &prefix="")
Definition: msg_conversions.cc:361
msg_conversions::config_read_matrix
bool config_read_matrix(config_reader::ConfigReader *config, const char *name, int rows, int cols, float *dest)
Definition: msg_conversions.cc:138
msg_conversions::EigenPoseCovarianceToMsg
void EigenPoseCovarianceToMsg(const Eigen::Isometry3d &pose, const Eigen::Matrix< double, 6, 6 > &covariance, geometry_msgs::PoseWithCovarianceStamped &pose_cov_msg)
Definition: msg_conversions.cc:398
msg_conversions::ros_to_array_vector
void ros_to_array_vector(const geometry_msgs::Vector3 &v, float *array)
Definition: msg_conversions.cc:86
msg_conversions::tf2_quat_to_ros_quat
geometry_msgs::Quaternion tf2_quat_to_ros_quat(const tf2::Quaternion &q)
Definition: msg_conversions.cc:260
msg_conversions::Vector2dToMsg
void Vector2dToMsg(const VectorType &vector, MsgVectorType &msg_vector)
Definition: msg_conversions.h:144
msg_conversions
Definition: msg_conversions.h:46
msg_conversions::array_to_ros_vector
geometry_msgs::Vector3 array_to_ros_vector(float *array)
Definition: msg_conversions.cc:61
msg_conversions::Vector2dFromMsg
VectorType Vector2dFromMsg(const MsgVectorType &msg_vector)
Definition: msg_conversions.h:132
msg_conversions::LoadString
std::string LoadString(config_reader::ConfigReader &config, const std::string &config_name, const std::string &prefix="")
Definition: msg_conversions.cc:355
msg_conversions::ros_to_eigen_vector
Eigen::Vector3d ros_to_eigen_vector(const geometry_msgs::Vector3 &v)
Definition: msg_conversions.cc:27
msg_conversions::RotationFromMsg
RotationType RotationFromMsg(const MsgRotationType &msg_rotation)
Definition: msg_conversions.h:150
msg_conversions::LoadFloat
float LoadFloat(config_reader::ConfigReader &config, const std::string &config_name, const std::string &prefix="")
Definition: msg_conversions.cc:328
msg_conversions::EigenCovarianceToMsg
void EigenCovarianceToMsg(const Eigen::Matrix< double, Dim, Dim > &covariance, ArrayType &covariance_array)
Definition: msg_conversions.h:163
msg_conversions::eigen_to_ros_quat
geometry_msgs::Quaternion eigen_to_ros_quat(const Eigen::Quaterniond &q)
Definition: msg_conversions.cc:49
msg_conversions::ros_to_eigen_quat
Eigen::Quaterniond ros_to_eigen_quat(const geometry_msgs::Quaternion &q)
Definition: msg_conversions.cc:45
msg_conversions::ros_pose_to_eigen_transform
Eigen::Affine3d ros_pose_to_eigen_transform(const geometry_msgs::Pose &p)
Definition: msg_conversions.cc:236
msg_conversions::ros_tf_to_tf2_transform
tf2::Transform ros_tf_to_tf2_transform(const geometry_msgs::Transform &p)
Definition: msg_conversions.cc:287
msg_conversions::array_to_ros_point
geometry_msgs::Point array_to_ros_point(float *array)
Definition: msg_conversions.cc:69
msg_conversions::array_to_ros_quat
geometry_msgs::Quaternion array_to_ros_quat(float *array)
Definition: msg_conversions.cc:77
localization_common::Isometry3d
Eigen::Isometry3d Isometry3d(const Eigen::Vector3d &translation, const RotationType &rotation)
Definition: utilities.h:226
localization_common::Transform
std::vector< T > Transform(const std::vector< T > &a_T_elements, const Eigen::Isometry3d &b_T_a)
Definition: utilities.h:252
name
std::string name
Definition: eps_simulator.cc:48
msg_conversions::VectorToMsg
void VectorToMsg(const VectorType &vector, MsgVectorType &msg_vector)
Definition: msg_conversions.h:137
point_cloud_common::Vector3d
Eigen::Vector3d Vector3d(const PointType &point)
Definition: utilities.h:328
msg_conversions::config_read_quat
bool config_read_quat(config_reader::ConfigReader *config, const char *name, Eigen::Quaterniond *quat)
Definition: msg_conversions.cc:118
msg_conversions::ros_pose_to_tf2_transform
tf2::Transform ros_pose_to_tf2_transform(const geometry_msgs::Pose &p)
Definition: msg_conversions.cc:301
msg_conversions::eigen_to_array_quat
void eigen_to_array_quat(const Eigen::Quaterniond &q, float *array)
Definition: msg_conversions.cc:111
msg_conversions::LoadDouble
double LoadDouble(config_reader::ConfigReader &config, const std::string &config_name, const std::string &prefix="")
Definition: msg_conversions.cc:335
msg_conversions::eigen_to_array_vector
void eigen_to_array_vector(const Eigen::Vector3d &v, float *array)
Definition: msg_conversions.cc:105
msg_conversions::LoadInt
int LoadInt(config_reader::ConfigReader &config, const std::string &config_name, const std::string &prefix="")
Definition: msg_conversions.cc:342
msg_conversions::ros_point_to_eigen_vector
Eigen::Vector3d ros_point_to_eigen_vector(const geometry_msgs::Point &p)
Definition: msg_conversions.cc:25
msg_conversions::ros_to_eigen_transform
Eigen::Affine3d ros_to_eigen_transform(const geometry_msgs::Transform &p)
Definition: msg_conversions.cc:244
msg_conversions::LoadBool
bool LoadBool(config_reader::ConfigReader &config, const std::string &config_name, const std::string &prefix="")
Definition: msg_conversions.cc:348
msg_conversions::VectorFromMsg
VectorType VectorFromMsg(const MsgVectorType &msg_vector)
Definition: msg_conversions.h:127
config_reader::ConfigReader
Definition: config_reader.h:48
msg_conversions::LoadEigenTransform
Eigen::Isometry3d LoadEigenTransform(config_reader::ConfigReader &config, const std::string &transform_config_name, const std::string &prefix="")
Definition: msg_conversions.cc:315
msg_conversions::config_read_array
bool config_read_array(config_reader::ConfigReader *config, const char *name, int length, float *dest)
Definition: msg_conversions.cc:128
msg_conversions::EigenCovarianceFromMsg
Eigen::Matrix< double, Dim, Dim > EigenCovarianceFromMsg(const ArrayType &covariance_array)
Definition: msg_conversions.h:172
msg_conversions::eigen_transform_to_ros_pose
geometry_msgs::Pose eigen_transform_to_ros_pose(const Eigen::Affine3d &p)
Definition: msg_conversions.cc:273
msg_conversions::ros_transform_to_ros_pose
geometry_msgs::Pose ros_transform_to_ros_pose(const geometry_msgs::Transform &p)
Definition: msg_conversions.cc:251
config_reader.h
msg_conversions::config_read_transform
bool config_read_transform(config_reader::ConfigReader *config, const char *name, Eigen::Vector3d *vec, Eigen::Quaterniond *quat)
Definition: msg_conversions.cc:153
optimization_common::Affine3d
Eigen::Affine3d Affine3d(const Eigen::Matrix< double, 7, 1 > &affine_vector)
Definition: utilities.cc:43
msg_conversions::ros_to_array_quat
void ros_to_array_quat(const geometry_msgs::Quaternion &q, float *array)
Definition: msg_conversions.cc:98
config_reader::ConfigReader::Table
Definition: config_reader.h:54
msg_conversions::config_read_vector
bool config_read_vector(config_reader::ConfigReader *config, const char *name, Eigen::Vector3d *vec)
Definition: msg_conversions.cc:123
msg_conversions::eigen_to_ros_vector
geometry_msgs::Vector3 eigen_to_ros_vector(const Eigen::Vector3d &v)
Definition: msg_conversions.cc:29
msg_conversions::RotationToMsg
void RotationToMsg(const RotationType &rotation, MsgRotationType &msg_rotation)
Definition: msg_conversions.h:155
msg_conversions::eigen_transform_to_ros_transform
geometry_msgs::Transform eigen_transform_to_ros_transform(const Eigen::Affine3d &p)
Definition: msg_conversions.cc:280
msg_conversions::eigen_to_ros_point
geometry_msgs::Point eigen_to_ros_point(const Eigen::Vector3d &v)
Definition: msg_conversions.cc:37
msg_conversions::EigenPoseToMsg
void EigenPoseToMsg(const Eigen::Isometry3d &pose, geometry_msgs::Pose &msg_pose)
Definition: msg_conversions.cc:378
msg_conversions::CovDiagToVariances
Eigen::Vector3d CovDiagToVariances(const float *const cov_diag)
Definition: msg_conversions.cc:394
msg_conversions::ros_to_array_point
void ros_to_array_point(const geometry_msgs::Point &p, float *array)
Definition: msg_conversions.cc:92
msg_conversions::VariancesToCovDiag
void VariancesToCovDiag(const Eigen::Vector3d &variances, float *const cov_diag)
Definition: msg_conversions.cc:388
msg_conversions::SingleBoolTrue
bool SingleBoolTrue(const std::initializer_list< bool > &bools)
Definition: msg_conversions.cc:227