35template <
typename Po
intT>
38 Eigen::Vector3d point3d(point_in.x, point_in.y, point_in.z);
39 point3d = pose * point3d;
40 point_out->x =
static_cast<typename PointT::Type
>(point3d.x());
41 point_out->y =
static_cast<typename PointT::Type
>(point3d.y());
42 point_out->z =
static_cast<typename PointT::Type
>(point3d.z());
47template <
typename Po
intT>
49 const Eigen::Affine3d &pose,
51 if (cloud_out->
size() < cloud_in.
size()) {
54 for (
size_t i = 0; i < cloud_in.
size(); ++i) {
55 TransformPoint<PointT>(cloud_in.
at(i), pose, &(cloud_out->
at(i)));
61template <
typename Po
intT>
64 TransformPointCloud<PointT>(*cloud_in_out, pose, cloud_in_out);
69template <
typename Po
intCloudT>
71 const std::vector<int> &indices,
72 std::shared_ptr<PointCloudT> trans_cloud) {
73 if (trans_cloud->size() != indices.size()) {
74 trans_cloud->resize(indices.size());
76 for (
size_t i = 0; i < indices.size(); ++i) {
77 const auto &p = cloud->at(indices[i]);
78 auto &tp = trans_cloud->at(i);
82 tp.intensity = p.intensity;
88template <
typename Po
intT>
91 Eigen::Matrix<typename PointT::Type, 4, 1> *min_p,
92 Eigen::Matrix<typename PointT::Type, 4, 1> *max_p) {
93 using T =
typename PointT::Type;
94 (*min_p)[0] = (*min_p)[1] = (*min_p)[2] = std::numeric_limits<T>::max();
95 (*max_p)[0] = (*max_p)[1] = (*max_p)[2] = -std::numeric_limits<T>::max();
98 for (
size_t i = 0; i < range; ++i) {
99 const auto &pt = cloud.
at(i);
100 if (std::isnan(pt.x) || std::isnan(pt.y) || std::isnan(pt.z)) {
103 (*min_p)[0] = std::min((*min_p)[0],
static_cast<T
>(pt.x));
104 (*max_p)[0] = std::max((*max_p)[0],
static_cast<T
>(pt.x));
105 (*min_p)[1] = std::min((*min_p)[1],
static_cast<T
>(pt.y));
106 (*max_p)[1] = std::max((*max_p)[1],
static_cast<T
>(pt.y));
107 (*min_p)[2] = std::min((*min_p)[2],
static_cast<T
>(pt.z));
108 (*max_p)[2] = std::max((*max_p)[2],
static_cast<T
>(pt.z));
114template <
typename Po
intT>
117 Eigen::Matrix<typename PointT::Type, 4, 1> *min_p,
118 Eigen::Matrix<typename PointT::Type, 4, 1> *max_p) {
119 GetMinMaxIn3DWithRange<PointT>(cloud, indices.
indices.size(), min_p, max_p);
124template <
typename Po
intT>
126 Eigen::Matrix<typename PointT::Type, 4, 1> *min_p,
127 Eigen::Matrix<typename PointT::Type, 4, 1> *max_p) {
128 GetMinMaxIn3DWithRange<PointT>(cloud, cloud.
size(), min_p, max_p);
136 size_t point_num = cloud.size();
137 Eigen::Matrix<T, 3, 1> centroid(0.0, 0.0, 0.0);
138 for (
const auto &pt : cloud.points()) {
144 centroid[0] /=
static_cast<T
>(point_num);
145 centroid[1] /=
static_cast<T
>(point_num);
146 centroid[2] /=
static_cast<T
>(point_num);
154 size_t point_num = cloud.size();
155 Eigen::Matrix<T, 3, 1> centroid(0.0, 0.0, 0.0);
156 for (
const auto &pt : cloud.points()) {
162 centroid[0] /=
static_cast<T
>(point_num);
163 centroid[1] /=
static_cast<T
>(point_num);
164 centroid[2] /=
static_cast<T
>(point_num);
const PointT * at(size_t col, size_t row) const
virtual void resize(size_t size)
void GetMinMaxIn3DWithRange(const base::AttributePointCloud< PointT > &cloud, const size_t range, Eigen::Matrix< typename PointT::Type, 4, 1 > *min_p, Eigen::Matrix< typename PointT::Type, 4, 1 > *max_p)
void TransformPoint(const PointT &point_in, const Eigen::Affine3d &pose, PointT *point_out)
void TransformPointCloud(const base::PointCloud< PointT > &cloud_in, const Eigen::Affine3d &pose, base::PointCloud< PointT > *cloud_out)
Eigen::Matrix< T, 3, 1 > CalculateCentroid(const base::AttributePointCloud< base::Point< T > > &cloud)
void ExtractIndicedCloud(const std::shared_ptr< const PointCloudT > cloud, const std::vector< int > &indices, std::shared_ptr< PointCloudT > trans_cloud)
void GetMinMaxIn3D(const base::AttributePointCloud< PointT > &cloud, const base::PointIndices &indices, Eigen::Matrix< typename PointT::Type, 4, 1 > *min_p, Eigen::Matrix< typename PointT::Type, 4, 1 > *max_p)
Eigen::Matrix< T, 3, 1 > CalculateRadarCentroid(const base::AttributeRadarPointCloud< base::RadarPoint< T > > &cloud)
std::vector< int > indices