Skip to content

Commit 906b659

Browse files
authored
Add normals rotation in PointCloud2 doTransform (#792)
Signed-off-by: Patrick Roncagliolo <[email protected]>
1 parent d43b197 commit 906b659

File tree

1 file changed

+38
-5
lines changed

1 file changed

+38
-5
lines changed

tf2_sensor_msgs/include/tf2_sensor_msgs/tf2_sensor_msgs.hpp

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}
118151
inline

0 commit comments

Comments
 (0)