16 #ifndef NAV2_ROS_COMMON__VALIDATE_MESSAGES_HPP_
17 #define NAV2_ROS_COMMON__VALIDATE_MESSAGES_HPP_
23 #include "nav_msgs/msg/occupancy_grid.hpp"
24 #include "nav_msgs/msg/odometry.hpp"
25 #include "nav2_msgs/msg/costmap.hpp"
26 #include "nav2_msgs/msg/costmap_meta_data.hpp"
27 #include "geometry_msgs/msg/pose_with_covariance_stamped.hpp"
28 #include "map_msgs/msg/occupancy_grid_update.hpp"
29 #include "sensor_msgs/msg/range.hpp"
52 bool validateMsg(
const double & num)
59 if (std::isinf(num)) {
return false;}
60 if (std::isnan(num)) {
return false;}
64 const double MAX_COVARIANCE = 1e9;
65 const double MIN_COVARIANCE = 0;
66 const double MIN_MAP_RESOLUTION = 1e-6;
67 const double MAX_RANGE_FIELD_OF_VIEW = M_PI;
70 bool validateMsg(
const std::array<double, N> & msg)
76 for (
const auto & element : msg) {
77 if (!validateMsg(element)) {
return false;}
79 if (std::abs(element) > MAX_COVARIANCE || element < MIN_COVARIANCE) {
87 const int NSEC_PER_SEC = 1e9;
88 bool validateMsg(
const builtin_interfaces::msg::Time & msg)
90 if (msg.nanosec >= NSEC_PER_SEC) {
96 bool validateMsg(
const std_msgs::msg::Header & msg)
99 if (!validateMsg(msg.stamp)) {
return false;}
106 if (msg.frame_id.empty()) {
return false;}
110 bool validateMsg(
const geometry_msgs::msg::Point & msg)
113 if (!validateMsg(msg.x)) {
return false;}
114 if (!validateMsg(msg.y)) {
return false;}
115 if (!validateMsg(msg.z)) {
return false;}
119 const double epsilon = 1e-4;
120 bool validateMsg(
const geometry_msgs::msg::Quaternion & msg)
123 if (!validateMsg(msg.x)) {
return false;}
124 if (!validateMsg(msg.y)) {
return false;}
125 if (!validateMsg(msg.z)) {
return false;}
126 if (!validateMsg(msg.w)) {
return false;}
128 if (abs(msg.x * msg.x + msg.y * msg.y + msg.z * msg.z + msg.w * msg.w - 1.0) >= epsilon) {
135 bool validateMsg(
const geometry_msgs::msg::Pose & msg)
138 if (!validateMsg(msg.position)) {
return false;}
139 if (!validateMsg(msg.orientation)) {
return false;}
143 bool validateMsg(
const geometry_msgs::msg::PoseWithCovariance & msg)
146 if (!validateMsg(msg.pose)) {
return false;}
147 if (!validateMsg(msg.covariance)) {
return false;}
152 bool validateMsg(
const geometry_msgs::msg::PoseWithCovarianceStamped & msg)
155 if (!validateMsg(msg.header)) {
return false;}
156 if (!validateMsg(msg.pose)) {
return false;}
157 if (!validateMsg(msg.pose.covariance)) {
return false;}
163 bool validateMsg(
const nav_msgs::msg::MapMetaData & msg)
166 if (!validateMsg(msg.origin)) {
return false;}
167 if (!validateMsg(msg.resolution)) {
return false;}
169 if (msg.resolution < MIN_MAP_RESOLUTION) {
return false;}
173 if (msg.height == 0 || msg.width == 0) {
return false;}
178 bool validateMsg(
const nav_msgs::msg::OccupancyGrid & msg)
181 if (!validateMsg(msg.header)) {
return false;}
183 if (!validateMsg(msg.info)) {
return false;}
185 if (msg.info.width > INT16_MAX || msg.info.height > INT16_MAX) {
192 if (__builtin_mul_overflow(msg.info.width, msg.info.height, &num_cells)) {
198 if (msg.data.size() !=
static_cast<size_t>(num_cells)) {
206 bool validateMsg(
const map_msgs::msg::OccupancyGridUpdate & msg)
209 if (!validateMsg(msg.header)) {
return false;}
212 if (msg.data.size() !=
static_cast<size_t>(msg.width) * msg.height) {
217 if (msg.x < 0 || msg.y < 0) {
return false;}
219 if (msg.x > INT16_MAX || msg.y > INT16_MAX ||
220 msg.width > INT16_MAX || msg.height > INT16_MAX)
227 if (__builtin_mul_overflow(msg.width, msg.height, &num_cells)) {
235 bool validateMsg(
const sensor_msgs::msg::Range & msg)
237 if (!validateMsg(msg.header)) {
return false;}
238 if (!validateMsg(
static_cast<double>(msg.field_of_view))) {
return false;}
239 if (!validateMsg(
static_cast<double>(msg.min_range))) {
return false;}
240 if (!validateMsg(
static_cast<double>(msg.max_range))) {
return false;}
241 if (!validateMsg(
static_cast<double>(msg.range))) {
return false;}
243 if (msg.field_of_view <= 0.0 || msg.field_of_view > MAX_RANGE_FIELD_OF_VIEW) {
247 if (msg.min_range < 0.0 || msg.max_range <= msg.min_range) {
254 bool validateMsg(
const nav2_msgs::msg::CostmapMetaData & msg)
256 if (!validateMsg(msg.origin)) {
return false;}
257 if (!validateMsg(msg.resolution)) {
return false;}
259 if (msg.resolution < MIN_MAP_RESOLUTION) {
return false;}
260 if (msg.size_x == 0 || msg.size_y == 0) {
return false;}
265 bool validateMsg(
const nav2_msgs::msg::Costmap & msg)
267 if (!validateMsg(msg.header)) {
return false;}
268 if (!validateMsg(msg.metadata)) {
return false;}
271 if (__builtin_mul_overflow(msg.metadata.size_x, msg.metadata.size_y, &num_cells)) {
275 if (msg.data.size() !=
static_cast<size_t>(num_cells)) {