31
31
*
32
32
*/
33
33
34
- #include " lanelet2_map_loader_node.hpp"
35
-
36
34
#include " lanelet2_local_projector.hpp"
37
35
38
36
#include < ament_index_cpp/get_package_prefix.hpp>
39
37
#include < autoware/geography_utils/lanelet2_projector.hpp>
38
+ #include < autoware/map_loader/lanelet2_map_loader_node.hpp>
40
39
#include < autoware/map_loader/lanelet2_map_loader_utils.hpp>
41
40
#include < autoware_lanelet2_extension/io/autoware_osm_parser.hpp>
42
41
#include < autoware_lanelet2_extension/projection/mgrs_projector.hpp>
50
49
#include < lanelet2_io/Io.h>
51
50
#include < lanelet2_projection/UTM.h>
52
51
52
+ #include < algorithm>
53
53
#include < filesystem>
54
+ #include < limits>
54
55
#include < map>
55
56
#include < memory>
56
57
#include < stdexcept>
@@ -134,7 +135,7 @@ void Lanelet2MapLoaderNode::on_map_projector_info(
134
135
// because the loaded lanelets will be expired when map is destructed
135
136
std::vector<lanelet::LaneletMapPtr> maps;
136
137
for (const auto & path : lanelet2_paths) {
137
- auto map_tmp = utils:: load_map (path, *msg);
138
+ auto map_tmp = load_map (path, *msg);
138
139
if (!map_tmp) {
139
140
RCLCPP_ERROR (get_logger (), " Failed to load lanelet2_map, %s" , path.c_str ());
140
141
return ;
@@ -212,7 +213,7 @@ void Lanelet2MapLoaderNode::on_map_projector_info(
212
213
}
213
214
214
215
// create map bin msg
215
- const auto map_bin_msg = utils:: create_map_bin_msg (map, lanelet2_paths[0 ], now ());
216
+ const auto map_bin_msg = create_map_bin_msg (map, lanelet2_paths[0 ], now ());
216
217
217
218
// create publisher and publish
218
219
pub_map_bin_ =
@@ -221,6 +222,74 @@ void Lanelet2MapLoaderNode::on_map_projector_info(
221
222
RCLCPP_INFO (get_logger (), " Succeeded to load lanelet2_map. Map is published." );
222
223
}
223
224
225
+ lanelet::LaneletMapPtr Lanelet2MapLoaderNode::load_map (
226
+ const std::string & lanelet2_filename,
227
+ const autoware_map_msgs::msg::MapProjectorInfo & projector_info)
228
+ {
229
+ lanelet::ErrorMessages errors{};
230
+ if (projector_info.projector_type != autoware_map_msgs::msg::MapProjectorInfo::LOCAL) {
231
+ std::unique_ptr<lanelet::Projector> projector =
232
+ autoware::geography_utils::get_lanelet2_projector (projector_info);
233
+ lanelet::LaneletMapPtr map = lanelet::load (lanelet2_filename, *projector, &errors);
234
+ if (errors.empty ()) {
235
+ return map;
236
+ }
237
+ } else {
238
+ const autoware::map_loader::LocalProjector projector;
239
+ lanelet::LaneletMapPtr map = lanelet::load (lanelet2_filename, projector, &errors);
240
+
241
+ if (!errors.empty ()) {
242
+ for (const auto & error : errors) {
243
+ RCLCPP_ERROR_STREAM (rclcpp::get_logger (" map_loader" ), error);
244
+ }
245
+ }
246
+
247
+ // overwrite local_x, local_y
248
+ for (lanelet::Point3d point : map->pointLayer ) {
249
+ if (point.hasAttribute (" local_x" )) {
250
+ point.x () = point.attribute (" local_x" ).asDouble ().value ();
251
+ }
252
+ if (point.hasAttribute (" local_y" )) {
253
+ point.y () = point.attribute (" local_y" ).asDouble ().value ();
254
+ }
255
+ }
256
+
257
+ // realign lanelet borders using updated points
258
+ for (lanelet::Lanelet lanelet : map->laneletLayer ) {
259
+ auto left = lanelet.leftBound ();
260
+ auto right = lanelet.rightBound ();
261
+ std::tie (left, right) = lanelet::geometry::align (left, right);
262
+ lanelet.setLeftBound (left);
263
+ lanelet.setRightBound (right);
264
+ }
265
+
266
+ return map;
267
+ }
268
+
269
+ for (const auto & error : errors) {
270
+ RCLCPP_ERROR_STREAM (rclcpp::get_logger (" map_loader" ), error);
271
+ }
272
+ return nullptr ;
273
+ }
274
+
275
+ autoware_map_msgs::msg::LaneletMapBin Lanelet2MapLoaderNode::create_map_bin_msg (
276
+ const lanelet::LaneletMapPtr map, const std::string & lanelet2_filename, const rclcpp::Time & now)
277
+ {
278
+ std::string format_version{};
279
+ std::string map_version{};
280
+ lanelet::io_handlers::AutowareOsmParser::parseVersions (
281
+ lanelet2_filename, &format_version, &map_version);
282
+
283
+ autoware_map_msgs::msg::LaneletMapBin map_bin_msg;
284
+ map_bin_msg.header .stamp = now;
285
+ map_bin_msg.header .frame_id = " map" ;
286
+ map_bin_msg.version_map_format = format_version;
287
+ map_bin_msg.version_map = map_version;
288
+ lanelet::utils::conversion::toBinMsg (map, &map_bin_msg);
289
+
290
+ return map_bin_msg;
291
+ }
292
+
224
293
/* *
225
294
* @brief Get list of lanelet2 map file paths from input paths/directories
226
295
* @param lanelet2_paths_or_directory Vector of paths that can be either lanelet2 map files or
0 commit comments