tf 與 eigen === ###### tags: `tools` `C++` ``` C++= #include <ros/ros.h> #include <tf/transform_broadcaster.h> #include <eigen3/Eigen/Dense> #include <Eigen/Dense> #include <math.h> #include <iostream> // Callback of timer // Broadcaster transform from A to B and B to C void broadcastTF(const ros::TimerEvent& timer_event) { static tf::TransformBroadcaster br; Eigen::Quaterniond q_C_B(std::sqrt(3)/2,0,0,0.5); //Eigen::Quaterniond q_C_B(1,0,0,0); Eigen::Vector3d v_C_B(1,0,0); tf::Transform tf_C_B; tf::Quaternion tf_q_C_B(q_C_B.x(),q_C_B.y(),q_C_B.z(),q_C_B.w()); tf::Vector3 tf_v_C_B(v_C_B(0),v_C_B(1),v_C_B(2)); tf_C_B.setOrigin(tf_v_C_B); tf_C_B.setRotation(tf_q_C_B); br.sendTransform(tf::StampedTransform(tf_C_B,ros::Time::now(),"C","B")); Eigen::Quaterniond q_B_A(cos(90.0*M_PI/180.0/2),0,0,sin(90*M_PI/180.0/2)); //Eigen::Quaterniond q_C_B(1,0,0,0); Eigen::Vector3d v_B_A(1,0,0); tf::Transform tf_B_A; tf::Quaternion tf_q_B_A(q_B_A.x(),q_B_A.y(),q_B_A.z(),q_B_A.w()); tf::Vector3 tf_v_B_A(v_B_A(0),v_B_A(1),v_B_A(2)); tf_B_A.setOrigin(tf_v_B_A); tf_B_A.setRotation(tf_q_B_A); br.sendTransform(tf::StampedTransform(tf_B_A,ros::Time::now(),"B","A")); tf::Transform tf_C_A = tf_C_B*tf_B_A; br.sendTransform(tf::StampedTransform(tf_C_A,ros::Time::now(),"C","A1")); tf::Vector3 tf_v_C_A = tf_C_A.getOrigin(); std::cout << "x:" <<tf_v_C_A[0] <<" y:"<< tf_v_C_A[1]<<" z:"<< tf_v_C_A[2]<<std::endl; } int main(int argc, char** argv) { ros::init(argc, argv, "answer_1"); ros::NodeHandle nh; // Create timer with 2.0 Hz ros::Timer timer = nh.createTimer(ros::Duration(0.5), broadcastTF); while (ros::ok()){ros::spinOnce();} return 0; } ``` ``` C++= #include <ros/ros.h> #include <tf/transform_broadcaster.h> #include <eigen3/Eigen/Dense> #include <Eigen/Dense> #include <math.h> // Callback of timer // Broadcaster transform from A to B and B to C void broadcastTF(const ros::TimerEvent& timer_event) { static tf::TransformBroadcaster br; Eigen::Quaterniond q_A_B(1,0,0,0); //Eigen::Quaterniond q_C_B(1,0,0,0); Eigen::Vector3d v_A_B(1,0,0); tf::Transform tf_A_B; tf::Quaternion tf_q_A_B(q_A_B.x(),q_A_B.y(),q_A_B.z(),q_A_B.w()); tf::Vector3 tf_v_A_B(v_A_B(0),v_A_B(1),v_A_B(2)); tf_A_B.setOrigin(tf_v_A_B); tf_A_B.setRotation(tf_q_A_B); br.sendTransform(tf::StampedTransform(tf_A_B,ros::Time::now(),"A","B")); Eigen::Quaterniond q_A_C(1,0,0,0); //Eigen::Quaterniond q_C_B(1,0,0,0); Eigen::Vector3d v_A_C(0,1,0); tf::Transform tf_A_C; tf::Quaternion tf_q_A_C(q_A_C.x(),q_A_C.y(),q_A_C.z(),q_A_C.w()); tf::Vector3 tf_v_A_C(v_A_C(0),v_A_C(1),v_A_C(2)); tf_A_C.setOrigin(tf_v_A_C); tf_A_C.setRotation(tf_q_A_C); br.sendTransform(tf::StampedTransform(tf_A_C,ros::Time::now(),"A","C")); tf::Transform tf_C_B = tf_A_C.inverse()*tf_A_B; br.sendTransform(tf::StampedTransform(tf_C_B,ros::Time::now(),"C","B1")); } int main(int argc, char** argv) { ros::init(argc, argv, "answer_2"); ros::NodeHandle nh; // Create timer with 2.0 Hz ros::Timer timer = nh.createTimer(ros::Duration(0.5), broadcastTF); while (ros::ok()){ros::spinOnce();} return 0; } ```