22 RCLCPP_ERROR(rclcpp::get_logger(
"planning"),
"Not enough cones to perform ICP alignment.");
23 return Eigen::Matrix4f::Identity();
27 pcl::PointCloud<pcl::PointXYZ> cloud_source;
28 cloud_source.reserve(cone_array.size());
29 for (
const auto& cone : cone_array) {
30 (void)cloud_source.emplace_back(cone.position.x, cone.position.y, 0.0);
34 pcl::PointCloud<pcl::PointXYZ> cloud_target;
37 (void)cloud_target.emplace_back(x, y, 0.0);
41 pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp;
42 icp.setInputSource(cloud_source.makeShared());
43 icp.setInputTarget(cloud_target.makeShared());
45 icp.setMaximumIterations(std::numeric_limits<int>::max());
46 icp.setTransformationEpsilon(1e-6);
47 icp.setEuclideanFitnessEpsilon(1e-3);
49 pcl::PointCloud<pcl::PointXYZ> Final;
52 if (!icp.hasConverged()) {
53 RCLCPP_ERROR(rclcpp::get_logger(
"planning"),
"ICP did not converge.");
54 return Eigen::Matrix4f::Identity();
57 return icp.getFinalTransformation();
61 const std::vector<PathPoint>& path,
64 double min_dist = std::numeric_limits<double>::max();
65 size_t closest_index = 0;
67 for (
size_t i = 0; i < path.size(); ++i) {
68 double dx = path[i].position.x - pose.
position.
x;
69 double dy = path[i].position.y - pose.
position.
y;
70 double dist = std::sqrt(dx * dx + dy * dy);
72 if (dist > min_dist) {
76 if (dist < min_dist) {
87 std::vector<PathPoint> result;
91 const std::string file =
"./src/planning/src/utils/skidpad.txt";
92 const std::string conesfile =
"./src/planning/src/utils/skidpadcones1.txt";
95 std::ifstream cfile(conesfile);
98 while (std::getline(cfile, line)) {
99 std::istringstream iss(line);
100 double x = 0.0, y = 0.0, z = 0.0;
101 if (iss >> x >> y >> z) {
110 std::ifstream infile(file);
111 while (std::getline(infile, line)) {
112 std::istringstream iss(line);
113 double x = 0.0, y = 0.0, v = 0.0;
114 if (iss >> x >> y >> v) {
127 if (icp_transform.isIdentity()) {
133 Eigen::Matrix4f map_to_lidar_transform = icp_transform.inverse();
135 for (
auto& point : result) {
136 Eigen::Vector4f p(point.position.x, point.position.y, 0.0f, 1.0f);
137 Eigen::Vector4f transformed = map_to_lidar_transform * p;
138 point.position.x = transformed[0];
139 point.position.y = transformed[1];
147 RCLCPP_ERROR(rclcpp::get_logger(
"planning"),
"Predefined path is empty.");
153 RCLCPP_INFO(rclcpp::get_logger(
"planning"),
154 "predefined path size is %zu, closest index is %zu \n Hardcoded path size is %zu",
163 if (path_size < 70) {