16 #ifndef NAV2_ROS_COMMON__VALIDATE_MESSAGES_HPP_
17 #define NAV2_ROS_COMMON__VALIDATE_MESSAGES_HPP_
22 #include "nav_msgs/msg/occupancy_grid.hpp"
23 #include "nav_msgs/msg/odometry.hpp"
24 #include "geometry_msgs/msg/pose_with_covariance_stamped.hpp"
47 bool validateMsg(
const double & num)
54 if (std::isinf(num)) {
return false;}
55 if (std::isnan(num)) {
return false;}
60 bool validateMsg(
const std::array<double, N> & msg)
66 for (
const auto & element : msg) {
67 if (!validateMsg(element)) {
return false;}
73 const int NSEC_PER_SEC = 1e9;
74 bool validateMsg(
const builtin_interfaces::msg::Time & msg)
76 if (msg.nanosec >= NSEC_PER_SEC) {
82 bool validateMsg(
const std_msgs::msg::Header & msg)
85 if (!validateMsg(msg.stamp)) {
return false;}
92 if (msg.frame_id.empty()) {
return false;}
96 bool validateMsg(
const geometry_msgs::msg::Point & msg)
99 if (!validateMsg(msg.x)) {
return false;}
100 if (!validateMsg(msg.y)) {
return false;}
101 if (!validateMsg(msg.z)) {
return false;}
105 const double epsilon = 1e-4;
106 bool validateMsg(
const geometry_msgs::msg::Quaternion & msg)
109 if (!validateMsg(msg.x)) {
return false;}
110 if (!validateMsg(msg.y)) {
return false;}
111 if (!validateMsg(msg.z)) {
return false;}
112 if (!validateMsg(msg.w)) {
return false;}
114 if (abs(msg.x * msg.x + msg.y * msg.y + msg.z * msg.z + msg.w * msg.w - 1.0) >= epsilon) {
121 bool validateMsg(
const geometry_msgs::msg::Pose & msg)
124 if (!validateMsg(msg.position)) {
return false;}
125 if (!validateMsg(msg.orientation)) {
return false;}
129 bool validateMsg(
const geometry_msgs::msg::PoseWithCovariance & msg)
132 if (!validateMsg(msg.pose)) {
return false;}
133 if (!validateMsg(msg.covariance)) {
return false;}
138 bool validateMsg(
const geometry_msgs::msg::PoseWithCovarianceStamped & msg)
141 if (!validateMsg(msg.header)) {
return false;}
142 if (!validateMsg(msg.pose)) {
return false;}
148 bool validateMsg(
const nav_msgs::msg::MapMetaData & msg)
151 if (!validateMsg(msg.origin)) {
return false;}
152 if (!validateMsg(msg.resolution)) {
return false;}
156 if (msg.height == 0 || msg.width == 0) {
return false;}
161 bool validateMsg(
const nav_msgs::msg::OccupancyGrid & msg)
164 if (!validateMsg(msg.header)) {
return false;}
166 if (!validateMsg(msg.info)) {
return false;}
169 if (msg.data.size() != msg.info.width * msg.info.height) {