16 #ifndef NAV2_UTIL__VALIDATE_MESSAGES_HPP_
17 #define NAV2_UTIL__VALIDATE_MESSAGES_HPP_
23 #include "nav_msgs/msg/occupancy_grid.hpp"
24 #include "nav_msgs/msg/odometry.hpp"
25 #include "geometry_msgs/msg/pose_with_covariance_stamped.hpp"
48 bool validateMsg(
const double & num)
55 if (std::isinf(num)) {
return false;}
56 if (std::isnan(num)) {
return false;}
61 bool validateMsg(
const std::array<double, N> & msg)
67 for (
const auto & element : msg) {
68 if (!validateMsg(element)) {
return false;}
74 const int NSEC_PER_SEC = 1e9;
75 bool validateMsg(
const builtin_interfaces::msg::Time & msg)
77 if (msg.nanosec >= NSEC_PER_SEC) {
83 bool validateMsg(
const std_msgs::msg::Header & msg)
86 if (!validateMsg(msg.stamp)) {
return false;}
93 if (msg.frame_id.empty()) {
return false;}
97 bool validateMsg(
const geometry_msgs::msg::Point & msg)
100 if (!validateMsg(msg.x)) {
return false;}
101 if (!validateMsg(msg.y)) {
return false;}
102 if (!validateMsg(msg.z)) {
return false;}
106 const double epsilon = 1e-4;
107 bool validateMsg(
const geometry_msgs::msg::Quaternion & msg)
110 if (!validateMsg(msg.x)) {
return false;}
111 if (!validateMsg(msg.y)) {
return false;}
112 if (!validateMsg(msg.z)) {
return false;}
113 if (!validateMsg(msg.w)) {
return false;}
115 if (abs(msg.x * msg.x + msg.y * msg.y + msg.z * msg.z + msg.w * msg.w - 1.0) >= epsilon) {
122 bool validateMsg(
const geometry_msgs::msg::Pose & msg)
125 if (!validateMsg(msg.position)) {
return false;}
126 if (!validateMsg(msg.orientation)) {
return false;}
130 bool validateMsg(
const geometry_msgs::msg::PoseWithCovariance & msg)
133 if (!validateMsg(msg.pose)) {
return false;}
134 if (!validateMsg(msg.covariance)) {
return false;}
139 bool validateMsg(
const geometry_msgs::msg::PoseWithCovarianceStamped & msg)
142 if (!validateMsg(msg.header)) {
return false;}
143 if (!validateMsg(msg.pose)) {
return false;}
144 if (!validateMsg(msg.pose.covariance)) {
return false;}
148 const double MIN_MAP_RESOLUTION = 1e-6;
151 bool validateMsg(
const nav_msgs::msg::MapMetaData & msg)
154 if (!validateMsg(msg.origin)) {
return false;}
155 if (!validateMsg(msg.resolution)) {
return false;}
158 if (msg.resolution <= MIN_MAP_RESOLUTION) {
return false;}
162 if (msg.height == 0 || msg.width == 0) {
return false;}
167 bool validateMsg(
const nav_msgs::msg::OccupancyGrid & msg)
170 if (!validateMsg(msg.header)) {
return false;}
172 if (!validateMsg(msg.info)) {
return false;}
174 if (msg.data.size() != msg.info.width * msg.info.height) {
179 if (msg.info.width > INT16_MAX || msg.info.height > INT16_MAX) {
184 if (__builtin_mul_overflow(msg.info.width, msg.info.height, &num_cells)) {