ROS学习之tf基本用法

主要细节参见wiki,这里我写一下它的broadcaster和listener做个记录:

tf_broadcaster.cpp:

#include<ros/ros.h>
#include<tf/transform_broadcaster.h>

int main(int argc, char** argv){
	ros::init(argc, argv, "robot_tf_publisher");
	ros::NodeHandle node;
	
	ros::Rate rate(100);

	tf::TransformBroadcaster broadcaster;
	while(node.ok()){
		broadcaster.sendTransform(
			tf::StampedTransform(
				tf::Transform(
					tf::Quaternion(0,0,0,1),
					tf::Vector3(0.1,0.0,0.2)
				),
				ros::Time::now(),
				"base_link",
				"base_laser"
			)
		);
		rate.sleep();
	}
}

在broadcaster中我们主要描述的是两个坐标frame之间的位置关系,这里是base_link与base_laser之间的位置关系,表base_laser在base_link的x=0.1,y=0.0,z=0.2的位置,旋转方面quaternion置0,没有变化。


tf_listener.cpp:

#include<ros/ros.h>
#include<tf/transform_liste
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ROS中,使用TF库来处理坐标系变换。首先,在你的ROS包中创建一个订阅器(Subscriber)来订阅TF话题,并在回调函数中将TF消息转换为Pose消息。 以下是一个示例代码: ```cpp #include <ros/ros.h> #include <tf/transform_listener.h> #include <geometry_msgs/PoseStamped.h> void tfCallback(const tf::tfMessage::ConstPtr& tfMsg) { // 创建一个TransformListener对象 tf::TransformListener listener; // 获取两个坐标系之间的变换 tf::StampedTransform transform; try{ listener.lookupTransform("map", "base_link", ros::Time(0), transform); } catch (tf::TransformException ex){ ROS_ERROR("%s",ex.what()); return; } // 将变换转换为Pose消息 geometry_msgs::PoseStamped poseMsg; poseMsg.header.stamp = ros::Time::now(); poseMsg.header.frame_id = "map"; poseMsg.pose.position.x = transform.getOrigin().x(); poseMsg.pose.position.y = transform.getOrigin().y(); poseMsg.pose.position.z = transform.getOrigin().z(); poseMsg.pose.orientation.x = transform.getRotation().x(); poseMsg.pose.orientation.y = transform.getRotation().y(); poseMsg.pose.orientation.z = transform.getRotation().z(); poseMsg.pose.orientation.w = transform.getRotation().w(); // 发布Pose消息 // ... } int main(int argc, char** argv) { ros::init(argc, argv, "tf_to_pose"); ros::NodeHandle nh; // 创建一个订阅器来订阅TF话题 ros::Subscriber sub = nh.subscribe("/tf", 10, tfCallback); // 创建一个发布器来发布Pose消息 // ... ros::spin(); return 0; } ``` 在回调函数中,我们首先创建了一个TransformListener对象,然后调用`lookupTransform()`方法获取两个坐标系之间的变换。注意,`lookupTransform()`方法的第一个参数是目标坐标系,第二个参数是源坐标系。在这个例子中,我们将获取从`base_link`坐标系到`map`坐标系的变换。 一旦我们获取了变换,我们就可以将其转换为Pose消息,并发布出去。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值