LIDAR とカメラの間の剛体変換を見つけようとしています。変換を dx、dy、dz、yaw、pitch、roll (rad) として見つけたら、ROS 静的変換パブリッシャーを起動ファイルと共に使用して、次のように変換をパブリッシュします。
<launch>
<node pkg="tf" type="static_transform_publisher"
name="transformation_velodyne_to_camera"
args=" -0.100586794 0.000107629 -0.10208744 -1.51199 0.0741937 -1.59904 velodyne camera 100"/>
</launch>
次に、その変換を聞きます。
Eigen::Matrix4d mat_velo_to_cam;
geometry_msgs::TransformStamped trans_velo_to_cam;
try {
trans_velo_to_cam = tfBuffer.lookupTransform("camera", "velodyne", ros::Time::now());
}
catch (tf2::TransformException &ex) {
ROS_WARN("%s", ex.what());
ros::Duration(0.1).sleep();
}
Eigen::Affine3d affine_velo_to_cam_ = tf2::transformToEigen(trans_velo_to_cam);
mat_velo_to_cam = affine_velo_to_cam_.matrix();
std::cerr << "Transformation matrix lidar to camera: " << std::endl;
std::cout << mat_velo_to_cam.matrix() << std::endl;
出力は次のとおりです。
Transformation matrix lidar to camera:
0.0586108 -0.995525 -0.0741256 -0.00156468
-0.0325459 0.0723083 -0.996851 -0.105047
0.99775 0.0608387 -0.0281622 0.0974789
0 0 0 1
私の最初の質問は、翻訳値が互いに異なるのはなぜですか?
2 番目の質問: 同じ 6DoF から 4x4 変換行列を取得するために以下のコードを使用する場合
Eigen::Matrix<double,4,4> mat_lidar_to_cam; Eigen::AngleAxisd rollAngle(roll, Eigen::Vector3d::UnitX()); Eigen::AngleAxisd pitchAngle(pitch, Eigen::Vector3d::UnitY()); Eigen::AngleAxisd yawAngle(yaw, Eigen::Vector3d::UnitZ()); Eigen::Quaternion<double> q = yawAngle*pitchAngle*rollAngle; Eigen::Matrix3d rotationMatrix = q.matrix(); mat_lidar_to_cam.topLeftCorner(3,3) = rotationMatrix; mat_lidar_to_cam(0,3) = dx; mat_lidar_to_cam(1,3) = dy; mat_lidar_to_cam(2,3) = dz;
出力行列は次のとおりです。
0.0606101 -0.0324357 0.997634 -0.1
-0.995708 0.06807 0.0627062 0.0001
-0.0699428 -0.997153 -0.0281708 -0.102
0 0 0 1
この時点で、平行移動も真ですが、ROS tf static transform publisher が提供する行列と回転値が異なるのはなぜですか?