TF变换
一、
world 坐标系
二、广播TF变换
1、广播tf变换
向系统中广播参考系之间的坐标变换关系。系统中更可能会存在多个不同部分的tf变换广播,每个广播都可以直接将参考系变换关系直接插入tf树中,不需要再进行同步。
2、代码实例
//<target_frame> 相对于 world坐标系的 tf 变换
#include <ros/ros.h>
#include <tf/transform_broadcaster.h>
#include <turtlesim/Pose.h>
std::string turtle_name;
void poseCallback(const turtlesim::PoseConstPtr& msg)
{
//source_frame 为world坐标系;target_frame 为turtle1坐标系
static tf::TransformBroadcaster br; //创建TransformBroadcaster的对象来发送变换
tf::Transform transform; //命名空间::类名
transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) ); //设置tf变换的 坐标变换
tf::Quaternion q; // 欧拉角类
q.setRPY(0, 0, msg->theta); //target_frame相对于source_frame的欧拉角
transform.setRotation(q); //设置tf变换的 欧拉角
//发送 turtle_name 相对于 “world”的欧拉变换 到 TF树
br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name));
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "my_tf_broadcaster");
if (argc != 2){ROS_ERROR("need turtle name as argument"); return -1;}; // 数组的第二个元素为 <target_frame>
turtle_name = argv[1];
ros::NodeHandle node;
ros::Subscriber sub = node.subscribe(turtle_name+"/pose", 10, &poseCallback); //订阅到<target_frame>就发一次tf变换
ros::spin();
return 0;
};
3、运行指令
rosrun learning_tf tf_broad <target_frame>
//广播 world 坐标系下 turtle1的 tf 变换 (先确保有 turtle1坐标系)
rosrun learning_tf tf_broad rosrun turtle1
三、
四、常见指令
1、查看 TF树中坐标系的状态
//<target_frame>相对于<source_frame>的变换(坐标及旋转)
rosrun tf tf_monitor <source_frame> <target_frame>
rosrun tf tf_monitor world turtle1
rosrun tf_echo <source_frame> <target_frame>
rosrun tf tf_echo world turtle1
版权声明:本文为u013013280原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。