-
首先需要知道是否已经发布了坐标,以及需要提取哪两个坐标系的变换
-
创建一个pkg
cd catkin_ws
cd src
catkin_creat_pkg tf_listener_odom_and_laser roscpp rospy tf geometry_msgs
- 对/odom以及/laser的坐标变换进行查找和发布(创建文件名为listener_laser_odom.cpp)
/**
* 该例程监听tf数据,并发布到一个topic上
*/
#include <ros/ros.h>
#include <tf/transform_listener.h>
#include <geometry_msgs/Twist.h>
int main(int argc, char** argv)
{
// 初始化ROS节点
ros::init(argc, argv, "my_tf_listener");
// 创建节点句柄
ros::NodeHandle node;
//创建发布odom和laser坐标变换的发布者
ros::Publisher transform_odom_laser = node.advertise<geometry_msgs::Transform>("transform_odom_laser", 10);
// 创建tf的监听器
tf::TransformListener listener;//通过listener来监听TF中任意两个坐标系的位置关系
ros::Rate rate(10.0);
while (node.ok())
{
// 获取odom与laser坐标系之间的tf数据
tf::StampedTransform transform;
try
{
//等待变换;若过TF中存在/odom和/laser两个坐标系,则往下执行;ros::Duration(3.0)——等待3秒过后产生错误;ros::Time(0)保存当前时间
listener.waitForTransform("/odom", "/laser", ros::Time(0), ros::Duration(3.0));
//查询变换;查询当前两个坐标系的关系,结果保存到transform中
listener.lookupTransform("/odom", "/laser", ros::Time(0), transform);
}
catch (tf::TransformException &ex)
{
ROS_ERROR("%s",ex.what());
ros::Duration(1.0).sleep();
continue;
}
//发布坐标变换
geometry_msgs::Transform buffer;
tf::transformTFToMsg(transform, buffer);
transform_odom_laser.publish(buffer);
rate.sleep();
}
return 0;
};
- 配置CMakeList.txt的编译规则
xx代表你的cpp文件名
add_executable(listener_laser_odom src/listener_laser_odom.cpp)
target_link_libraries(listener_laser_odom ${catkin_LIBRARIES})
-
catkin_make
-
运行仿真环境
-
运行上述代码
-
查看topic
-
查看此topic上的信息
到此为止,则实现了对两个坐标之间变换信息的获取。
可以采用rosbag record /topic_name1 /topic_name2 /topic_name3
对topic进行记录