Skip to content

Commit 319f489

Browse files
authored
Merge pull request #18 from fmrico/headers_in_conversions
Add headers in conversions
2 parents 3231eff + 04139b2 commit 319f489

4 files changed

Lines changed: 200 additions & 25 deletions

File tree

navmap_ros/include/navmap_ros/conversions.hpp

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
#include <pcl/point_cloud.h>
4242
#include <pcl/point_types.h>
4343

44+
#include "std_msgs/msg/header.hpp"
4445
#include "sensor_msgs/msg/point_cloud2.hpp"
4546
#include "navmap_ros_interfaces/msg/nav_map.hpp"
4647
#include "navmap_ros_interfaces/msg/nav_map_layer.hpp"
@@ -81,6 +82,7 @@ constexpr uint8_t FREE_SPACE = 0;
8182
* @brief Convert a core `navmap::NavMap` into its compact ROS transport message.
8283
*
8384
* @param[in] nm Core NavMap to be serialized into a ROS message.
85+
* @param[in] header Header to assign to the resulting message.
8486
* @return A `navmap_ros_interfaces::msg::NavMap` containing geometry (vertices, triangles),
8587
* surfaces metadata and user-defined layers.
8688
*
@@ -91,12 +93,20 @@ constexpr uint8_t FREE_SPACE = 0;
9193
* @note This function does not perform IO; it only builds the message in-memory.
9294
*/
9395
navmap_ros_interfaces::msg::NavMap to_msg(
94-
const navmap::NavMap & nm);
96+
const navmap::NavMap & nm, const std_msgs::msg::Header & header);
97+
98+
/**
99+
* @brief Backward-compatible overload (no header provided).
100+
*
101+
* The returned message header will be default-constructed.
102+
*/
103+
navmap_ros_interfaces::msg::NavMap to_msg(const navmap::NavMap & nm);
95104

96105
/**
97106
* @brief Reconstruct a core `navmap::NavMap` from the ROS transport message.
98107
*
99108
* @param[in] msg Input `navmap_ros_interfaces::msg::NavMap` message.
109+
* @param[out] header Header extracted from the message.
100110
* @return A core `navmap::NavMap` equivalent to the content of @p msg.
101111
*
102112
* @details
@@ -105,13 +115,21 @@ navmap_ros_interfaces::msg::NavMap to_msg(
105115
*
106116
* @throw std::runtime_error If the message describes inconsistent geometry or layer sizes.
107117
*/
118+
navmap::NavMap from_msg(
119+
const navmap_ros_interfaces::msg::NavMap & msg,
120+
std_msgs::msg::Header & header);
121+
122+
/**
123+
* @brief Backward-compatible overload (ignores message header).
124+
*/
108125
navmap::NavMap from_msg(const navmap_ros_interfaces::msg::NavMap & msg);
109126

110127
/**
111128
* @brief Convert a single layer from a NavMap into a ROS message.
112129
*
113130
* @param[in] nm Input NavMap.
114131
* @param[in] layer Name of the layer to export.
132+
* @param[in] header Header to assign to the resulting message.
115133
* @return A NavMapLayer message containing the layer values and metadata.
116134
*
117135
* @details
@@ -121,6 +139,14 @@ navmap::NavMap from_msg(const navmap_ros_interfaces::msg::NavMap & msg);
121139
*
122140
* @throw std::runtime_error If the layer does not exist or has an unsupported type.
123141
*/
142+
navmap_ros_interfaces::msg::NavMapLayer to_msg(
143+
const navmap::NavMap & nm,
144+
const std::string & layer,
145+
const std_msgs::msg::Header & header);
146+
147+
/**
148+
* @brief Backward-compatible overload (no header provided).
149+
*/
124150
navmap_ros_interfaces::msg::NavMapLayer to_msg(
125151
const navmap::NavMap & nm,
126152
const std::string & layer);
@@ -133,6 +159,7 @@ navmap_ros_interfaces::msg::NavMapLayer to_msg(
133159
*
134160
* @param[in] msg Input NavMapLayer message.
135161
* @param[in,out] nm Destination NavMap (must already have navcels sized correctly).
162+
* @param[out] header Header extracted from the message.
136163
*
137164
* @details
138165
* - The function verifies that the length of the populated data array matches
@@ -141,6 +168,14 @@ navmap_ros_interfaces::msg::NavMapLayer to_msg(
141168
*
142169
* @throw std::runtime_error If sizes are inconsistent or the message is ill-formed.
143170
*/
171+
void from_msg(
172+
const navmap_ros_interfaces::msg::NavMapLayer & msg,
173+
navmap::NavMap & nm,
174+
std_msgs::msg::Header & header);
175+
176+
/**
177+
* @brief Backward-compatible overload (ignores message header).
178+
*/
144179
void from_msg(
145180
const navmap_ros_interfaces::msg::NavMapLayer & msg,
146181
navmap::NavMap & nm);
@@ -152,6 +187,7 @@ void from_msg(
152187
* using a regular triangular surface with shared vertices.
153188
*
154189
* @param[in] grid Input ROS OccupancyGrid (row-major, width×height, resolution and origin).
190+
* @param[out] header Header to assign to the resulting message.
155191
* @return A core `navmap::NavMap` with:
156192
* - Vertices: `(W+1) * (H+1)` laid on the grid plane, with `Z = grid.info.origin.position.z`.
157193
* - Triangles: `2 * W * H` (two per cell), using diagonal pattern = 0.
@@ -167,6 +203,13 @@ void from_msg(
167203
* @note The grid origin pose may contain a rotation. The vertex Z is taken from the origin Z;
168204
* handling of non-zero yaw/roll/pitch (if any) is implementation-defined in the builder.
169205
*/
206+
navmap::NavMap from_occupancy_grid(
207+
const nav_msgs::msg::OccupancyGrid & grid,
208+
std_msgs::msg::Header & header);
209+
210+
/**
211+
* @brief Backward-compatible overload (ignores grid header).
212+
*/
170213
navmap::NavMap from_occupancy_grid(const nav_msgs::msg::OccupancyGrid & grid);
171214

172215
/**
@@ -192,6 +235,13 @@ navmap::NavMap from_occupancy_grid(const nav_msgs::msg::OccupancyGrid & grid);
192235
* @warning If the map does not carry grid metadata or the `"occupancy"` layer is missing,
193236
* the result may be incomplete or implementation-defined.
194237
*/
238+
nav_msgs::msg::OccupancyGrid to_occupancy_grid(
239+
const navmap::NavMap & nm,
240+
const std_msgs::msg::Header & header);
241+
242+
/**
243+
* @brief Backward-compatible overload.
244+
*/
195245
nav_msgs::msg::OccupancyGrid to_occupancy_grid(const navmap::NavMap & nm);
196246

197247
/**

navmap_ros/src/navmap_ros/conversions.cpp

Lines changed: 60 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,10 @@ static inline navmap::NavCelId tri_index_for_cell(uint32_t i, uint32_t j, uint32
6767

6868
// ----------------- NavMap <-> ROS message -----------------
6969

70-
NavMap to_msg(const navmap::NavMap & nm)
70+
NavMap to_msg(const navmap::NavMap & nm, const std_msgs::msg::Header & header)
7171
{
7272
NavMap out;
73+
out.header = header;
7374

7475
// positions
7576
out.positions_x.assign(nm.positions.x.begin(), nm.positions.x.end());
@@ -135,8 +136,14 @@ NavMap to_msg(const navmap::NavMap & nm)
135136
return out;
136137
}
137138

138-
navmap::NavMap from_msg(const NavMap & msg)
139+
NavMap to_msg(const navmap::NavMap & nm)
139140
{
141+
return to_msg(nm, std_msgs::msg::Header());
142+
}
143+
144+
navmap::NavMap from_msg(const NavMap & msg, std_msgs::msg::Header & header)
145+
{
146+
header = msg.header;
140147
navmap::NavMap nm;
141148

142149
// positions
@@ -203,11 +210,19 @@ navmap::NavMap from_msg(const NavMap & msg)
203210
return nm;
204211
}
205212

213+
navmap::NavMap from_msg(const NavMap & msg)
214+
{
215+
std_msgs::msg::Header unused;
216+
return from_msg(msg, unused);
217+
}
218+
206219
navmap_ros_interfaces::msg::NavMapLayer to_msg(
207220
const navmap::NavMap & nm,
208-
const std::string & layer_name)
221+
const std::string & layer_name,
222+
const std_msgs::msg::Header & header)
209223
{
210224
navmap_ros_interfaces::msg::NavMapLayer msg;
225+
msg.header = header;
211226
msg.name = layer_name;
212227

213228
auto base = nm.layers.get(layer_name);
@@ -241,10 +256,19 @@ navmap_ros_interfaces::msg::NavMapLayer to_msg(
241256
return msg;
242257
}
243258

259+
navmap_ros_interfaces::msg::NavMapLayer to_msg(
260+
const navmap::NavMap & nm,
261+
const std::string & layer_name)
262+
{
263+
return to_msg(nm, layer_name, std_msgs::msg::Header());
264+
}
265+
244266
void from_msg(
245267
const navmap_ros_interfaces::msg::NavMapLayer & msg,
246-
navmap::NavMap & nm)
268+
navmap::NavMap & nm,
269+
std_msgs::msg::Header & header)
247270
{
271+
header = msg.header;
248272
switch (msg.type) {
249273
case navmap_ros_interfaces::msg::NavMapLayer::U8: {
250274
auto dst = nm.add_layer<uint8_t>(msg.name, /*desc*/"", /*unit*/"", uint8_t{});
@@ -276,10 +300,21 @@ void from_msg(
276300
}
277301
}
278302

303+
void from_msg(
304+
const navmap_ros_interfaces::msg::NavMapLayer & msg,
305+
navmap::NavMap & nm)
306+
{
307+
std_msgs::msg::Header unused;
308+
from_msg(msg, nm, unused);
309+
}
310+
279311
// ----------------- OccupancyGrid <-> NavMap -----------------
280312

281-
navmap::NavMap from_occupancy_grid(const nav_msgs::msg::OccupancyGrid & grid)
313+
navmap::NavMap from_occupancy_grid(
314+
const nav_msgs::msg::OccupancyGrid & grid,
315+
std_msgs::msg::Header & header)
282316
{
317+
header = grid.header;
283318
navmap::NavMap nm;
284319

285320
const uint32_t W = grid.info.width;
@@ -349,10 +384,21 @@ navmap::NavMap from_occupancy_grid(const nav_msgs::msg::OccupancyGrid & grid)
349384
return nm;
350385
}
351386

352-
nav_msgs::msg::OccupancyGrid to_occupancy_grid(const navmap::NavMap & nm)
387+
navmap::NavMap from_occupancy_grid(const nav_msgs::msg::OccupancyGrid & grid)
388+
{
389+
std_msgs::msg::Header unused;
390+
return from_occupancy_grid(grid, unused);
391+
}
392+
393+
nav_msgs::msg::OccupancyGrid to_occupancy_grid(
394+
const navmap::NavMap & nm,
395+
const std_msgs::msg::Header & header)
353396
{
354397
nav_msgs::msg::OccupancyGrid g;
355-
g.header.frame_id = (nm.surfaces.empty() ? std::string() : nm.surfaces[0].frame_id);
398+
g.header = header;
399+
if (g.header.frame_id.empty() && !nm.surfaces.empty()) {
400+
g.header.frame_id = nm.surfaces[0].frame_id;
401+
}
356402

357403
auto base = nm.layers.get("occupancy");
358404
if (!base || base->type() != navmap::LayerType::U8) {
@@ -449,6 +495,13 @@ nav_msgs::msg::OccupancyGrid to_occupancy_grid(const navmap::NavMap & nm)
449495
return g;
450496
}
451497

498+
nav_msgs::msg::OccupancyGrid to_occupancy_grid(const navmap::NavMap & nm)
499+
{
500+
std_msgs::msg::Header h;
501+
h.frame_id = (nm.surfaces.empty() ? std::string() : nm.surfaces[0].frame_id);
502+
return to_occupancy_grid(nm, h);
503+
}
504+
452505
bool build_navmap_from_mesh(
453506
const pcl::PointCloud<pcl::PointXYZ> & cloud,
454507
const std::vector<Eigen::Vector3i> & triangles,

0 commit comments

Comments
 (0)