2.将两个坐标系的坐标变换发布到新的topic进行并进行保存

  1. 首先需要知道是否已经发布了坐标,以及需要提取哪两个坐标系的变换
    tf树

  2. 创建一个pkg

cd catkin_ws
cd src
catkin_creat_pkg tf_listener_odom_and_laser roscpp rospy tf geometry_msgs
  1. 对/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;
};
  1. 配置CMakeList.txt的编译规则
    xx代表你的cpp文件名
add_executable(listener_laser_odom src/listener_laser_odom.cpp) 
target_link_libraries(listener_laser_odom ${catkin_LIBRARIES}) 
  1. catkin_make

  2. 运行仿真环境
    仿真环境

  3. 运行上述代码

  4. 查看topic
    在这里插入图片描述

  5. 查看此topic上的信息
    在这里插入图片描述

到此为止,则实现了对两个坐标之间变换信息的获取。

可以采用rosbag record /topic_name1 /topic_name2 /topic_name3对topic进行记录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值