@@ -81,6 +81,13 @@ void doTransform(
8181 const sensor_msgs::msg::PointCloud2 & p_in, sensor_msgs::msg::PointCloud2 & p_out,
8282 const geometry_msgs::msg::TransformStamped & t_in)
8383{
84+ bool normals = std::find_if (
85+ p_in.fields .begin (),
86+ p_in.fields .end (),
87+ [](const sensor_msgs::msg::PointField & fname) {
88+ return fname.name == std::string (" normal_x" );
89+ }) != p_in.fields .end ();
90+
8491 p_out = p_in;
8592 p_out.header = t_in.header ;
8693 // FIXME(clalancette): The static casts to float aren't ideal; the incoming
@@ -98,6 +105,7 @@ void doTransform(
98105 static_cast <float >(t_in.transform .rotation .z ));
99106
100107 Eigen::Transform<float , 3 , Eigen::Affine> t = translation * quaternion;
108+ Eigen::Transform<float , 3 , Eigen::Affine> r = Eigen::Translation3f (0 , 0 , 0 ) * quaternion;
101109
102110 sensor_msgs::PointCloud2ConstIterator<float > x_in (p_in, std::string (" x" ));
103111 sensor_msgs::PointCloud2ConstIterator<float > y_in (p_in, std::string (" y" ));
@@ -108,11 +116,36 @@ void doTransform(
108116 sensor_msgs::PointCloud2Iterator<float > z_out (p_out, std::string (" z" ));
109117
110118 Eigen::Vector3f point;
111- for (; x_in != x_in.end (); ++x_in, ++y_in, ++z_in, ++x_out, ++y_out, ++z_out) {
112- point = t * Eigen::Vector3f (*x_in, *y_in, *z_in);
113- *x_out = point.x ();
114- *y_out = point.y ();
115- *z_out = point.z ();
119+
120+ if (!normals) {
121+ for (; x_in != x_in.end (); ++x_in, ++y_in, ++z_in, ++x_out, ++y_out, ++z_out) {
122+ point = t * Eigen::Vector3f (*x_in, *y_in, *z_in);
123+ *x_out = point.x ();
124+ *y_out = point.y ();
125+ *z_out = point.z ();
126+ }
127+ } else {
128+ Eigen::Vector3f normal;
129+ sensor_msgs::PointCloud2ConstIterator<float > x_n_in (p_in, std::string (" normal_x" ));
130+ sensor_msgs::PointCloud2ConstIterator<float > y_n_in (p_in, std::string (" normal_y" ));
131+ sensor_msgs::PointCloud2ConstIterator<float > z_n_in (p_in, std::string (" normal_z" ));
132+ sensor_msgs::PointCloud2Iterator<float > x_n_out (p_out, std::string (" normal_x" ));
133+ sensor_msgs::PointCloud2Iterator<float > y_n_out (p_out, std::string (" normal_y" ));
134+ sensor_msgs::PointCloud2Iterator<float > z_n_out (p_out, std::string (" normal_z" ));
135+
136+ for (; x_in != x_in.end ();
137+ ++x_in, ++y_in, ++z_in, ++x_out, ++y_out, ++z_out,
138+ ++x_n_in, ++y_n_in, ++z_n_in, ++x_n_out, ++y_n_out, ++z_n_out)
139+ {
140+ point = t * Eigen::Vector3f (*x_in, *y_in, *z_in);
141+ normal = r * Eigen::Vector3f (*x_n_in, *y_n_in, *z_n_in);
142+ *x_out = point.x ();
143+ *y_out = point.y ();
144+ *z_out = point.z ();
145+ *x_n_out = normal.x ();
146+ *y_n_out = normal.y ();
147+ *z_n_out = normal.z ();
148+ }
116149 }
117150}
118151inline
0 commit comments