Skip to content

Commit e02348d

Browse files
committed
Update
Signed-off-by: Barış Zeren <[email protected]>
1 parent 4572933 commit e02348d

File tree

10 files changed

+149
-76
lines changed

10 files changed

+149
-76
lines changed

launch/tier4_map_launch/launch/map.launch.xml

-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
<arg name="pointcloud_map_path"/>
44
<arg name="pointcloud_map_metadata_path"/>
55
<arg name="lanelet2_map_path"/>
6-
<arg name="lanelet2_map_folder_path"/>
76
<arg name="lanelet2_map_metadata_path"/>
87
<arg name="map_projector_info_path"/>
98

@@ -41,7 +40,6 @@
4140
<composable_node pkg="map_loader" plugin="Lanelet2MapLoaderNode" name="lanelet2_map_loader">
4241
<param from="$(var lanelet2_map_loader_param_path)"/>
4342
<param name="lanelet2_map_path" value="$(var lanelet2_map_path)"/>
44-
<param name="lanelet2_map_folder_path" value="[$(var lanelet2_map_folder_path)]"/>
4543
<param name="lanelet2_map_metadata_path" value="$(var lanelet2_map_metadata_path)"/>
4644
<remap from="output/lanelet2_map" to="vector_map"/>
4745
<remap from="service/get_differential_lanelet_map" to="/map/get_differential_lanelet_map"/>

map/autoware_dynamic_lanelet_provider/config/dynamic_lanelet_provider.param.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
ros__parameters:
33
dynamic_map_loading_grid_size: 50.0 # [m]
44
dynamic_map_loading_update_distance: 100.0 # [m]
5-
dynamic_map_loading_map_radius: 150.0 # [m]
5+
dynamic_map_loading_map_radius: 200.0 # [m]

map/autoware_dynamic_lanelet_provider/include/autoware/dynamic_lanelet_provider/dynamic_lanelet_provider.hpp

+4-8
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@ namespace dynamic_lanelet_provider
2424
struct Lanelet2FileMetaData
2525
{
2626
int id;
27-
double origin_lat;
28-
double origin_lon;
29-
std::string mgrs_code;
27+
double min_x;
28+
double max_x;
29+
double min_y;
30+
double max_y;
3031
};
3132

3233
class DynamicLaneletProviderNode : public rclcpp::Node
@@ -47,9 +48,6 @@ class DynamicLaneletProviderNode : public rclcpp::Node
4748

4849
rclcpp::Subscription<nav_msgs::msg::Odometry>::SharedPtr odometry_sub_;
4950

50-
component_interface_utils::Subscription<map_interface::MapProjectorInfo>::SharedPtr
51-
sub_map_projector_info_;
52-
5351
component_interface_utils::Subscription<map_interface::LaneletMapMetaData>::SharedPtr
5452
lanelet_map_meta_data_sub_;
5553

@@ -68,8 +66,6 @@ class DynamicLaneletProviderNode : public rclcpp::Node
6866
const double dynamic_map_loading_map_radius_;
6967

7068
std::vector<Lanelet2FileMetaData> lanelet_map_meta_data_list_;
71-
72-
std::optional<tier4_map_msgs::msg::MapProjectorInfo> projector_info_;
7369
};
7470
} // namespace dynamic_lanelet_provider
7571
} // namespace autoware

map/autoware_dynamic_lanelet_provider/src/dynamic_lanelet_provider.cpp

+14-29
Original file line numberDiff line numberDiff line change
@@ -63,23 +63,17 @@ DynamicLaneletProviderNode::DynamicLaneletProviderNode(const rclcpp::NodeOptions
6363
"input/odometry", 100,
6464
std::bind(&DynamicLaneletProviderNode::onOdometry, this, std::placeholders::_1));
6565

66-
const auto projector_info_adaptor = component_interface_utils::NodeAdaptor(this);
67-
projector_info_adaptor.init_sub(
68-
sub_map_projector_info_,
69-
[this](const map_interface::MapProjectorInfo::Message::ConstSharedPtr msg) {
70-
projector_info_ = *msg;
71-
});
72-
7366
const auto metadata_adaptor = component_interface_utils::NodeAdaptor(this);
7467
metadata_adaptor.init_sub(
7568
lanelet_map_meta_data_sub_,
7669
[this](const autoware_map_msgs::msg::LaneletMapMetaData::SharedPtr msg) {
7770
for (const auto & data : msg->metadata_list) {
7871
Lanelet2FileMetaData metadata;
7972
metadata.id = data.tile_id;
80-
metadata.origin_lat = data.origin_lat;
81-
metadata.origin_lon = data.origin_lon;
82-
metadata.mgrs_code = data.mgrs_code;
73+
metadata.min_x = data.min_x;
74+
metadata.max_x = data.max_x;
75+
metadata.min_y = data.min_y;
76+
metadata.max_y = data.max_y;
8377
lanelet_map_meta_data_list_.push_back(metadata);
8478
}
8579
});
@@ -102,8 +96,9 @@ void DynamicLaneletProviderNode::mapUpdateTimerCallback()
10296
return;
10397
}
10498

105-
if (projector_info_ == std::nullopt || lanelet_map_meta_data_list_.empty()) {
99+
if (lanelet_map_meta_data_list_.empty()) {
106100
RCLCPP_ERROR_ONCE(get_logger(), "Check your lanelet map metadata and projector info.");
101+
return;
107102
}
108103

109104
if (should_update_map()) {
@@ -117,25 +112,15 @@ void DynamicLaneletProviderNode::mapUpdateTimerCallback()
117112
void DynamicLaneletProviderNode::updateMap(const geometry_msgs::msg::Point & pose)
118113
{
119114
std::vector<int> cache_ids;
120-
if (projector_info_.value().projector_type != tier4_map_msgs::msg::MapProjectorInfo::LOCAL) {
121-
std::unique_ptr<lanelet::Projector> projector =
122-
geography_utils::get_lanelet2_projector(projector_info_.value());
123-
124-
for (const auto & metadata : lanelet_map_meta_data_list_) {
125-
lanelet::GPSPoint gps_point;
126-
gps_point.lat = metadata.origin_lat;
127-
gps_point.lon = metadata.origin_lon;
128-
gps_point.ele = 0;
129-
130-
lanelet::BasicPoint3d point = projector->forward(gps_point);
131-
132-
double distance = norm_xy(point, pose);
133-
if (distance < dynamic_map_loading_map_radius_) {
134-
cache_ids.push_back(metadata.id);
135-
}
115+
for (const auto & metadata : lanelet_map_meta_data_list_) {
116+
geometry_msgs::msg::Point point;
117+
point.x = (metadata.min_x + metadata.max_x) / 2;
118+
point.y = (metadata.min_y + metadata.max_y) / 2;
119+
120+
double distance = norm_xy(point, pose);
121+
if (distance < dynamic_map_loading_map_radius_) {
122+
cache_ids.push_back(metadata.id);
136123
}
137-
} else {
138-
// TODO: cannot reach LocalProjector here
139124
}
140125

141126
if (cache_ids.empty()) {

map/map_loader/include/map_loader/lanelet2_differential_loader_module.hpp

+8-2
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,15 @@ class Lanelet2DifferentialLoaderModule
4848
public:
4949
explicit Lanelet2DifferentialLoaderModule(
5050
rclcpp::Node * node,
51-
const std::map<std::string, Lanelet2FileMetaData> & lanelet2_file_metadata_dict);
51+
const std::map<std::string, Lanelet2FileMetaData> & lanelet2_file_metadata_dict, double & x_res,
52+
double & y_res);
5253

5354
private:
5455
rclcpp::Logger logger_;
5556
rclcpp::Clock::SharedPtr clock_;
5657

58+
rclcpp::Publisher<HADMapBin>::SharedPtr pub_whole_map_bin_;
59+
5760
std::map<std::string, Lanelet2FileMetaData> lanelet2_file_metadata_dict_;
5861

5962
rclcpp::Service<GetDifferentialLanelet2Map>::SharedPtr get_differential_lanelet2_maps_service_;
@@ -70,11 +73,14 @@ class Lanelet2DifferentialLoaderModule
7073
GetDifferentialLanelet2Map::Request::SharedPtr req,
7174
GetDifferentialLanelet2Map::Response::SharedPtr res);
7275

76+
autoware_auto_mapping_msgs::msg::HADMapBin loadWholeMap();
77+
7378
bool differentialLanelet2Load(
7479
GetDifferentialLanelet2Map::Request::SharedPtr & request,
7580
GetDifferentialLanelet2Map::Response::SharedPtr & response);
7681

77-
autoware_map_msgs::msg::LaneletMapMetaData getLaneletMapMetaDataMsg() const;
82+
autoware_map_msgs::msg::LaneletMapMetaData getLaneletMapMetaDataMsg(
83+
const double & x_res, const double & y_res) const;
7884
};
7985

8086
#endif // MAP_LOADER__LANELET2_DIFFERENTIAL_LOADER_MODULE_HPP_

map/map_loader/include/map_loader/lanelet2_map_loader_node.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ class Lanelet2MapLoaderNode : public rclcpp::Node
5858
std::vector<std::string> getLanelet2Paths(
5959
const std::vector<std::string> & lanelet2_paths_or_directory) const;
6060
std::map<std::string, Lanelet2FileMetaData> getLanelet2Metadata(
61-
const std::string & lanelet2_metadata_path,
62-
const std::vector<std::string> & lanelet2_paths) const;
61+
const std::string & lanelet2_metadata_path, const std::vector<std::string> & lanelet2_paths,
62+
double & x_resolution, double & y_resolution) const;
6363
};
6464

6565
#endif // MAP_LOADER__LANELET2_MAP_LOADER_NODE_HPP_

map/map_loader/include/map_loader/utils.hpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,10 @@ struct Lanelet2FileMetaData
2626
int id;
2727
double origin_lat;
2828
double origin_lon;
29-
std::string mgrs_code;
3029
};
3130

3231
std::map<std::string, Lanelet2FileMetaData> loadLanelet2Metadata(
33-
const std::string & lanelet2_metadata_path);
32+
const std::string & lanelet2_metadata_path, double & x_resolution, double & y_resolution);
3433
std::map<std::string, Lanelet2FileMetaData> replaceWithAbsolutePath(
3534
const std::map<std::string, Lanelet2FileMetaData> & lanelet2_metadata_path,
3635
const std::vector<std::string> & lanelet2_paths);

map/map_loader/src/lanelet2_map_loader/lanelet2_differential_loader_module.cpp

+89-13
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,35 @@
1919

2020
Lanelet2DifferentialLoaderModule::Lanelet2DifferentialLoaderModule(
2121
rclcpp::Node * node,
22-
const std::map<std::string, Lanelet2FileMetaData> & lanelet2_file_metadata_dict)
22+
const std::map<std::string, Lanelet2FileMetaData> & lanelet2_file_metadata_dict, double & x_res,
23+
double & y_res)
2324
: logger_(node->get_logger()),
2425
clock_(node->get_clock()),
2526
lanelet2_file_metadata_dict_(lanelet2_file_metadata_dict)
2627
{
27-
// Publish lanelet2 map meta data
28-
{
29-
const auto msg = getLaneletMapMetaDataMsg();
28+
pub_whole_map_bin_ =
29+
node->create_publisher<HADMapBin>("output/lanelet2_map", rclcpp::QoS{1}.transient_local());
3030

31-
const auto metadata_adaptor = component_interface_utils::NodeAdaptor(node);
32-
metadata_adaptor.init_pub(pub_lanelet_map_meta_data_);
33-
pub_lanelet_map_meta_data_->publish(msg);
34-
}
31+
const auto metadata_adaptor = component_interface_utils::NodeAdaptor(node);
32+
metadata_adaptor.init_pub(pub_lanelet_map_meta_data_);
3533

3634
const auto adaptor = component_interface_utils::NodeAdaptor(node);
3735
adaptor.init_sub(
3836
sub_map_projector_info_,
39-
[this](const map_interface::MapProjectorInfo::Message::ConstSharedPtr msg) {
37+
[this, &x_res, &y_res](const map_interface::MapProjectorInfo::Message::ConstSharedPtr msg) {
4038
projector_info_ = *msg;
39+
40+
// load whole map once when projector info is available
41+
{
42+
const auto map = loadWholeMap();
43+
pub_whole_map_bin_->publish(map);
44+
}
45+
46+
// publish lanelet2 map metadata when projector info is available
47+
{
48+
const auto msg = getLaneletMapMetaDataMsg(x_res, y_res);
49+
pub_lanelet_map_meta_data_->publish(msg);
50+
}
4151
});
4252

4353
get_differential_lanelet2_maps_service_ = node->create_service<GetDifferentialLanelet2Map>(
@@ -60,6 +70,57 @@ bool Lanelet2DifferentialLoaderModule::onServiceGetDifferentialLanelet2Map(
6070
return true;
6171
}
6272

73+
autoware_auto_mapping_msgs::msg::HADMapBin Lanelet2DifferentialLoaderModule::loadWholeMap()
74+
{
75+
std::vector<std::string> lanelet2_paths;
76+
for (const auto & file : lanelet2_file_metadata_dict_) {
77+
if (!std::filesystem::exists(file.first)) {
78+
continue;
79+
}
80+
lanelet2_paths.push_back(file.first);
81+
}
82+
83+
if (projector_info_.value().projector_type != tier4_map_msgs::msg::MapProjectorInfo::LOCAL) {
84+
std::unique_ptr<lanelet::Projector> projector =
85+
geography_utils::get_lanelet2_projector(projector_info_.value());
86+
87+
lanelet::ErrorMessages errors{};
88+
lanelet::io_handlers::MultiOsmParser parser(*projector);
89+
lanelet::LaneletMapPtr map = parser.parse(lanelet2_paths, errors);
90+
91+
if (!errors.empty()) {
92+
for (const auto & error : errors) {
93+
RCLCPP_ERROR_STREAM(rclcpp::get_logger("map_loader"), error);
94+
}
95+
}
96+
97+
lanelet::utils::overwriteLaneletsCenterline(map, 5.0, false);
98+
99+
const auto map_bin_msg =
100+
Lanelet2MapLoaderNode::create_map_bin_msg(map, lanelet2_paths[0], rclcpp::Clock().now());
101+
102+
return map_bin_msg;
103+
} else {
104+
const lanelet::projection::LocalProjector projector;
105+
lanelet::ErrorMessages errors{};
106+
lanelet::io_handlers::MultiOsmParser parser(projector);
107+
lanelet::LaneletMapPtr map = parser.parse(lanelet2_paths, errors);
108+
109+
if (!errors.empty()) {
110+
for (const auto & error : errors) {
111+
RCLCPP_ERROR_STREAM(rclcpp::get_logger("map_loader"), error);
112+
}
113+
}
114+
115+
lanelet::utils::overwriteLaneletsCenterline(map, 5.0, false);
116+
117+
const auto map_bin_msg =
118+
Lanelet2MapLoaderNode::create_map_bin_msg(map, lanelet2_paths[0], rclcpp::Clock().now());
119+
120+
return map_bin_msg;
121+
}
122+
}
123+
63124
bool Lanelet2DifferentialLoaderModule::differentialLanelet2Load(
64125
GetDifferentialLanelet2Map::Request::SharedPtr & request,
65126
GetDifferentialLanelet2Map::Response::SharedPtr & response)
@@ -126,15 +187,30 @@ bool Lanelet2DifferentialLoaderModule::differentialLanelet2Load(
126187
}
127188

128189
autoware_map_msgs::msg::LaneletMapMetaData
129-
Lanelet2DifferentialLoaderModule::getLaneletMapMetaDataMsg() const
190+
Lanelet2DifferentialLoaderModule::getLaneletMapMetaDataMsg(
191+
const double & x_res, const double & y_res) const
130192
{
193+
std::unique_ptr<lanelet::Projector> projector;
194+
if (projector_info_.value().projector_type != tier4_map_msgs::msg::MapProjectorInfo::LOCAL) {
195+
projector = geography_utils::get_lanelet2_projector(projector_info_.value());
196+
} else {
197+
projector = std::make_unique<lanelet::projection::LocalProjector>();
198+
}
199+
131200
autoware_map_msgs::msg::LaneletMapMetaData metadata;
132201
for (const auto & file : lanelet2_file_metadata_dict_) {
202+
lanelet::GPSPoint gps_point;
203+
gps_point.lat = file.second.origin_lat;
204+
gps_point.lon = file.second.origin_lon;
205+
gps_point.ele = 0;
206+
lanelet::BasicPoint3d point = projector->forward(gps_point);
207+
133208
autoware_map_msgs::msg::LaneletMapTileMetaData tile_msg;
134209
tile_msg.tile_id = file.second.id;
135-
tile_msg.mgrs_code = file.second.mgrs_code;
136-
tile_msg.origin_lat = file.second.origin_lat;
137-
tile_msg.origin_lon = file.second.origin_lon;
210+
tile_msg.min_x = point.x();
211+
tile_msg.min_y = point.y();
212+
tile_msg.max_x = point.x() + x_res;
213+
tile_msg.max_y = point.y() + y_res;
138214

139215
metadata.metadata_list.push_back(tile_msg);
140216
}

map/map_loader/src/lanelet2_map_loader/lanelet2_map_loader_node.cpp

+20-15
Original file line numberDiff line numberDiff line change
@@ -73,31 +73,35 @@ bool isOsmFile(const std::string & f)
7373
Lanelet2MapLoaderNode::Lanelet2MapLoaderNode(const rclcpp::NodeOptions & options)
7474
: Node("lanelet2_map_loader", options)
7575
{
76-
const auto adaptor = component_interface_utils::NodeAdaptor(this);
77-
78-
// subscription
79-
adaptor.init_sub(
80-
sub_map_projector_info_,
81-
[this](const MapProjectorInfo::Message::ConstSharedPtr msg) { on_map_projector_info(msg); });
82-
8376
declare_parameter<std::string>("lanelet2_map_path");
8477
declare_parameter<double>("center_line_resolution");
8578

86-
if (declare_parameter<bool>("enabled_dynamic_lanelet_loading")) {
87-
std::vector<std::string> lanelet2_paths_or_directory =
88-
declare_parameter<std::vector<std::string>>("lanelet2_map_folder_path");
79+
if (isOsmFile(get_parameter("lanelet2_map_path").as_string())) {
80+
RCLCPP_INFO(get_logger(), "Single osm file provided. Dynamic loading is disabled.");
81+
82+
const auto adaptor = component_interface_utils::NodeAdaptor(this);
83+
adaptor.init_sub(
84+
sub_map_projector_info_,
85+
[this](const MapProjectorInfo::Message::ConstSharedPtr msg) { on_map_projector_info(msg); });
86+
} else {
87+
RCLCPP_INFO(get_logger(), "Multiple osm file provided. Dynamic loading is enabled.");
88+
89+
std::vector<std::string> lanelet2_paths_or_directory = {
90+
get_parameter("lanelet2_map_path").as_string()};
8991
std::string lanelet2_map_metadata_path =
9092
declare_parameter<std::string>("lanelet2_map_metadata_path");
93+
double x_resolution, y_resolution;
9194

9295
std::map<std::string, Lanelet2FileMetaData> lanelet2_metadata_dict;
9396
try {
9497
lanelet2_metadata_dict = getLanelet2Metadata(
95-
lanelet2_map_metadata_path, getLanelet2Paths(lanelet2_paths_or_directory));
98+
lanelet2_map_metadata_path, getLanelet2Paths(lanelet2_paths_or_directory), x_resolution,
99+
y_resolution);
96100
} catch (std::runtime_error & e) {
97101
RCLCPP_ERROR_STREAM(get_logger(), "Failed to load lanelet2 metadata");
98102
}
99-
differential_loader_module_ =
100-
std::make_unique<Lanelet2DifferentialLoaderModule>(this, lanelet2_metadata_dict);
103+
differential_loader_module_ = std::make_unique<Lanelet2DifferentialLoaderModule>(
104+
this, lanelet2_metadata_dict, x_resolution, y_resolution);
101105
}
102106
}
103107

@@ -221,14 +225,15 @@ std::vector<std::string> Lanelet2MapLoaderNode::getLanelet2Paths(
221225
}
222226

223227
std::map<std::string, Lanelet2FileMetaData> Lanelet2MapLoaderNode::getLanelet2Metadata(
224-
const std::string & lanelet2_metadata_path, const std::vector<std::string> & lanelet2_paths) const
228+
const std::string & lanelet2_metadata_path, const std::vector<std::string> & lanelet2_paths,
229+
double & x_resolution, double & y_resolution) const
225230
{
226231
std::map<std::string, Lanelet2FileMetaData> lanelet2_metadata_dict;
227232
if (!std::filesystem::exists(lanelet2_metadata_path)) {
228233
throw std::runtime_error("Lanelet2 metadata file not found: " + lanelet2_metadata_path);
229234
}
230235

231-
lanelet2_metadata_dict = loadLanelet2Metadata(lanelet2_metadata_path);
236+
lanelet2_metadata_dict = loadLanelet2Metadata(lanelet2_metadata_path, x_resolution, y_resolution);
232237
lanelet2_metadata_dict = replaceWithAbsolutePath(lanelet2_metadata_dict, lanelet2_paths);
233238
RCLCPP_INFO_STREAM(get_logger(), "Loaded Lanelet2 metadata: " << lanelet2_metadata_path);
234239

0 commit comments

Comments
 (0)