1. 代码获取 tf 树相对位姿
// 获取tf树中两个坐标系的相对位姿(末端相对于基座标)并转为topic
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
ros::init(argc, argv, "Franka_tool_pose_pub");
ros::NodeHandle nh;
ROS_INFO("create node successfully!");
ros::Publisher tool_pose_pub = nh.advertise<geometry_msgs::PoseStamped>("/franka_tool_pose", 1);
tf2_ros::Buffer tfBuffer;
tf2_ros::TransformListener tfListener(tfBuffer);
ros::Rate rate(30.0);
bool tf_error=false;
while (nh.ok()){
geometry_msgs::TransformStamped transformStamped;
try{
transformStamped = tfBuffer.lookupTransform("panda_link0", "panda_link8", ros::Time(0), ros::Duration(1.0));
}
catch (tf2::TransformException &ex) {
ROS_WARN("%s",ex.what());
tf_error=true;
}
if (!tf_error) {
ROS_INFO_STREAM_ONCE("tf no error....");
geometry_msgs::PoseStamped msg;
msg.header.stamp = transformStamped.header.stamp;
msg.pose.position.x = transformStamped.transform.translation.x;
msg.pose.position.y = transformStamped.transform.translation.y;
msg.pose.position.z = transformStamped.transform.translation.z;
msg.pose.orientation.x =transformStamped.transform.rotation.x;
msg.pose.orientation.y =transformStamped.transform.rotation.y;
msg.pose.orientation.z =transformStamped.transform.rotation.z;
msg.pose.orientation.w =transformStamped.transform.rotation.w;
tool_pose_pub.publish(msg);
}
ros::spinOnce();
rate.sleep();
}
return 0;
}
2. TF程序包相关的命令行使用
-
用命令行显示当前所有frame的方法:
rosrun tf tf_monitor #显示当前坐标变换树的信息,主要是名称和实时的时间延时
rostopic echo /tf #以TransformStamped消息类型的数组显示所有父子frame的位姿转换关系
以上主要是数据显示
-
据当前的tf树创建一个pdf图:
$ rosrun tf view_frames
这个工具首先订阅
/tf
,订阅5秒钟,根据这段时间接受到的tf信息,绘制成一张tf tree,然后创建成一个pdf图。
将会以图形的形式显示出TF树中所有的frame和两个frame 的父子关系及其Broadcaster、Average rate等 -
查看当前的tf树:
$ rosrun rqt_tf_tree rqt_tf_tree
该命令同样是查询tf tree的,但是与第一个命令的区别是该命令是动态的查询当前的tf tree,当前的任何变化都能当即看到,例如何时断开何时连接,捕捉到这些然后通过rqt插件显示出来。
-
查看两个frame之间的变换关系:
$ rosrun tf tf_echo[source_frame][target_frame]
将会持续的显示源坐标系和目标坐标系的位姿变换关系。
该指令可以查询任意两个frame的转换关系。