Skip to content

Commit 15546f6

Browse files
committed
fix: misalignment when tranform back output
Signed-off-by: badai-nguyen <dai.nguyen@tier4.jp>
1 parent 106514e commit 15546f6

File tree

4 files changed

+91
-39
lines changed

4 files changed

+91
-39
lines changed

perception/autoware_compare_map_segmentation/CMakeLists.txt

+33-33
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ include_directories(
2222
)
2323

2424
add_library(${PROJECT_NAME} SHARED
25-
src/distance_based_compare_map_filter/node.cpp
26-
src/voxel_based_approximate_compare_map_filter/node.cpp
25+
# src/distance_based_compare_map_filter/node.cpp
26+
# src/voxel_based_approximate_compare_map_filter/node.cpp
2727
src/voxel_based_compare_map_filter/node.cpp
28-
src/voxel_distance_based_compare_map_filter/node.cpp
29-
src/compare_elevation_map_filter/node.cpp
28+
# src/voxel_distance_based_compare_map_filter/node.cpp
29+
# src/compare_elevation_map_filter/node.cpp
3030
src/voxel_grid_map_loader/voxel_grid_map_loader.cpp
3131
)
3232

@@ -56,31 +56,31 @@ if(OPENMP_FOUND)
5656
)
5757
endif()
5858

59-
# ========== Compare Map Filter ==========
60-
# -- Distance Based Compare Map Filter --
61-
rclcpp_components_register_node(${PROJECT_NAME}
62-
PLUGIN "autoware::compare_map_segmentation::DistanceBasedCompareMapFilterComponent"
63-
EXECUTABLE distance_based_compare_map_filter_node)
59+
# # ========== Compare Map Filter ==========
60+
# # -- Distance Based Compare Map Filter --
61+
# rclcpp_components_register_node(${PROJECT_NAME}
62+
# PLUGIN "autoware::compare_map_segmentation::DistanceBasedCompareMapFilterComponent"
63+
# EXECUTABLE distance_based_compare_map_filter_node)
6464

65-
# -- Voxel Based Approximate Compare Map Filter --
66-
rclcpp_components_register_node(${PROJECT_NAME}
67-
PLUGIN "autoware::compare_map_segmentation::VoxelBasedApproximateCompareMapFilterComponent"
68-
EXECUTABLE voxel_based_approximate_compare_map_filter_node)
65+
# # -- Voxel Based Approximate Compare Map Filter --
66+
# rclcpp_components_register_node(${PROJECT_NAME}
67+
# PLUGIN "autoware::compare_map_segmentation::VoxelBasedApproximateCompareMapFilterComponent"
68+
# EXECUTABLE voxel_based_approximate_compare_map_filter_node)
6969

7070
# -- Voxel Based Compare Map Filter --
7171
rclcpp_components_register_node(${PROJECT_NAME}
7272
PLUGIN "autoware::compare_map_segmentation::VoxelBasedCompareMapFilterComponent"
7373
EXECUTABLE voxel_based_compare_map_filter_node)
7474

75-
# -- Voxel Distance Based Compare Map Filter --
76-
rclcpp_components_register_node(${PROJECT_NAME}
77-
PLUGIN "autoware::compare_map_segmentation::VoxelDistanceBasedCompareMapFilterComponent"
78-
EXECUTABLE voxel_distance_based_compare_map_filter_node)
75+
# # -- Voxel Distance Based Compare Map Filter --
76+
# rclcpp_components_register_node(${PROJECT_NAME}
77+
# PLUGIN "autoware::compare_map_segmentation::VoxelDistanceBasedCompareMapFilterComponent"
78+
# EXECUTABLE voxel_distance_based_compare_map_filter_node)
7979

80-
# -- Compare Elevation Map Filter --
81-
rclcpp_components_register_node(${PROJECT_NAME}
82-
PLUGIN "autoware::compare_map_segmentation::CompareElevationMapFilterComponent"
83-
EXECUTABLE compare_elevation_map_filter_node)
80+
# # -- Compare Elevation Map Filter --
81+
# rclcpp_components_register_node(${PROJECT_NAME}
82+
# PLUGIN "autoware::compare_map_segmentation::CompareElevationMapFilterComponent"
83+
# EXECUTABLE compare_elevation_map_filter_node)
8484

8585
install(
8686
TARGETS ${PROJECT_NAME}
@@ -97,20 +97,20 @@ if(BUILD_TESTING)
9797
)
9898
target_link_libraries(test_voxel_based_compare_map_filter ${PROJECT_NAME})
9999

100-
ament_auto_add_gtest(test_distance_based_compare_map_filter
101-
test/test_distance_based_compare_map_filter.cpp
102-
)
103-
target_link_libraries(test_distance_based_compare_map_filter ${PROJECT_NAME})
100+
# ament_auto_add_gtest(test_distance_based_compare_map_filter
101+
# test/test_distance_based_compare_map_filter.cpp
102+
# )
103+
# target_link_libraries(test_distance_based_compare_map_filter ${PROJECT_NAME})
104104

105-
ament_auto_add_gtest(test_voxel_based_approximate_compare_map_filter
106-
test/test_voxel_based_approximate_compare_map_filter.cpp
107-
)
108-
target_link_libraries(test_voxel_based_approximate_compare_map_filter ${PROJECT_NAME})
105+
# ament_auto_add_gtest(test_voxel_based_approximate_compare_map_filter
106+
# test/test_voxel_based_approximate_compare_map_filter.cpp
107+
# )
108+
# target_link_libraries(test_voxel_based_approximate_compare_map_filter ${PROJECT_NAME})
109109

110-
ament_auto_add_gtest(test_voxel_distance_based_compare_map_filter
111-
test/test_voxel_distance_based_compare_map_filter.cpp
112-
)
113-
target_link_libraries(test_voxel_distance_based_compare_map_filter ${PROJECT_NAME})
110+
# ament_auto_add_gtest(test_voxel_distance_based_compare_map_filter
111+
# test/test_voxel_distance_based_compare_map_filter.cpp
112+
# )
113+
# target_link_libraries(test_voxel_distance_based_compare_map_filter ${PROJECT_NAME})
114114

115115
endif()
116116
ament_auto_package(

perception/autoware_compare_map_segmentation/src/voxel_based_compare_map_filter/node.cpp

+54-3
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#endif
3030
#include <memory>
3131
#include <string>
32+
#include <utility>
3233
#include <vector>
3334

3435
namespace autoware::compare_map_segmentation
@@ -71,9 +72,10 @@ VoxelBasedCompareMapFilterComponent::VoxelBasedCompareMapFilterComponent(
7172
RCLCPP_INFO(this->get_logger(), "tf_map_input_frame: %s", tf_input_frame_.c_str());
7273
}
7374

74-
// TODO(badai-nguyen): Temporary Implementation: Delete this override function when autoware_utils
75-
// refactor (https://github.com/autowarefoundation/autoware_utils/pull/50) or new
76-
// ManagedTransformBuffer lib is deployed for autoware
75+
// TODO(badai-nguyen): Temporary Implementation of input_indices_callback and convert_output_costly
76+
// functions; Delete this override function when autoware_utils refactor
77+
// (https://github.com/autowarefoundation/autoware_utils/pull/50) or new ManagedTransformBuffer lib
78+
// is deployed for autoware
7779
void VoxelBasedCompareMapFilterComponent::input_indices_callback(
7880
const sensor_msgs::msg::PointCloud2::ConstSharedPtr cloud, const PointIndicesConstPtr indices)
7981
{
@@ -126,6 +128,55 @@ void VoxelBasedCompareMapFilterComponent::input_indices_callback(
126128
computePublish(cloud_tf, vindices);
127129
}
128130

131+
bool VoxelBasedCompareMapFilterComponent::convert_output_costly(
132+
std::unique_ptr<PointCloud2> & output)
133+
{
134+
if (!output || output->data.empty() || output->fields.empty()) {
135+
RCLCPP_ERROR(this->get_logger(), "Invalid output point cloud!");
136+
return false;
137+
}
138+
if (
139+
pcl::getFieldIndex(*output, "x") == -1 || pcl::getFieldIndex(*output, "y") == -1 ||
140+
pcl::getFieldIndex(*output, "z") == -1) {
141+
RCLCPP_ERROR(this->get_logger(), "Input pointcloud does not have xyz fields");
142+
return false;
143+
}
144+
if (!tf_output_frame_.empty() && output->header.frame_id != tf_output_frame_) {
145+
auto cloud_transformed = std::make_unique<PointCloud2>();
146+
try {
147+
geometry_msgs::msg::TransformStamped transform_stamped = tf_buffer_.lookupTransform(
148+
tf_output_frame_, output->header.frame_id, rclcpp::Time(output->header.stamp),
149+
rclcpp::Duration::from_seconds(0.0));
150+
tf2::doTransform(*output, *cloud_transformed, transform_stamped);
151+
cloud_transformed->header.frame_id = tf_output_frame_;
152+
output = std::move(cloud_transformed);
153+
} catch (tf2::TransformException & e) {
154+
RCLCPP_WARN_THROTTLE(
155+
this->get_logger(), *this->get_clock(), 5000, "Could not transform pointcloud: %s",
156+
e.what());
157+
return false;
158+
}
159+
}
160+
161+
if (tf_output_frame_.empty() && output->header.frame_id != tf_input_orig_frame_) {
162+
auto cloud_transformed = std::make_unique<PointCloud2>();
163+
try {
164+
geometry_msgs::msg::TransformStamped transform_stamped = tf_buffer_.lookupTransform(
165+
tf_input_orig_frame_, output->header.frame_id, rclcpp::Time(output->header.stamp),
166+
rclcpp::Duration::from_seconds(0.0));
167+
tf2::doTransform(*output, *cloud_transformed, transform_stamped);
168+
cloud_transformed->header.frame_id = tf_input_orig_frame_;
169+
output = std::move(cloud_transformed);
170+
} catch (tf2::TransformException & e) {
171+
RCLCPP_WARN_THROTTLE(
172+
this->get_logger(), *this->get_clock(), 5000, "Could not transform pointcloud: %s",
173+
e.what());
174+
return false;
175+
}
176+
}
177+
return true;
178+
}
179+
129180
void VoxelBasedCompareMapFilterComponent::filter(
130181
const PointCloud2ConstPtr & input, [[maybe_unused]] const IndicesPtr & indices,
131182
PointCloud2 & output)

perception/autoware_compare_map_segmentation/src/voxel_based_compare_map_filter/node.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ class VoxelBasedCompareMapFilterComponent : public autoware::pointcloud_preproce
4040
void input_indices_callback(
4141
const PointCloud2ConstPtr cloud, const PointIndicesConstPtr indices) override;
4242

43+
bool convert_output_costly(std::unique_ptr<PointCloud2> & output) override;
44+
4345
private:
4446
// pcl::SegmentDifferences<pcl::PointXYZ> impl_;
4547
std::unique_ptr<VoxelGridMapLoader> voxel_grid_map_loader_;

sensing/autoware_pointcloud_preprocessor/include/autoware/pointcloud_preprocessor/filter.hpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -206,10 +206,11 @@ class Filter : public rclcpp::Node
206206
* \param input the input point cloud dataset.
207207
* \param indices a pointer to the vector of point indices to use.
208208
*/
209-
void computePublish(const PointCloud2ConstPtr & input, const IndicesPtr & indices);
209+
virtual void computePublish(const PointCloud2ConstPtr & input, const IndicesPtr & indices);
210210
/** \brief PointCloud2 + Indices data callback. */
211211
virtual void input_indices_callback(
212212
const PointCloud2ConstPtr cloud, const PointIndicesConstPtr indices);
213+
virtual bool convert_output_costly(std::unique_ptr<PointCloud2> & output);
213214

214215
//////////////////////
215216
// from PCLNodelet //
@@ -287,8 +288,6 @@ class Filter : public rclcpp::Node
287288
const std::string & target_frame, const sensor_msgs::msg::PointCloud2 & from,
288289
TransformInfo & transform_info /*output*/);
289290

290-
bool convert_output_costly(std::unique_ptr<PointCloud2> & output);
291-
292291
// TODO(sykwer): Temporary Implementation: Remove this interface when all the filter nodes conform
293292
// to new API.
294293
void faster_input_indices_callback(

0 commit comments

Comments
 (0)