ROS 进阶之 tf变换

TF变换

一、

http://www.guyuehome.com/355

http://www.guyuehome.com/279

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版权协议,转载请附上原文出处链接和本声明。