tf(Transform Frame)变换

ROS的tf库用于处理坐标系间的转换,简化了广播和监听坐标变换的过程。广播tf涉及设置坐标原点和旋转角度,监听tf常用函数有lookupTransform()和transformPoint()。lookupTransform()用于获取坐标系间转换关系,transformPoint()用于点坐标在不同坐标系间的转换。tf::Stamped<T>是包含多种数据结构的类型,常用于存储带有时间戳的转换信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

tf是ROS中建立坐标系,并且使用各个坐标间转换关系的一个很好的工具。虽然官网的资料很复杂,但在

一、广播tf

    就是发布你建立的坐标系,步骤如下

   1. 定义一个广播,相当于发布话题时定义一个发布器。       

tf::TransformBroadcaster br;

 2. 定义存放转换信息(平动,转动)的变量 transform  

tf::Transform transform;//这里transform为一个类

3.通过调用类transform的成员函数设置坐标原点

transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) );

需要注意:

(1)setOrigin()函数的参数类型需要为tf::Vector3类型

 (2) 假设是需要发布一个子坐标系为小车base_link,父坐标系为 map,那么其中(msg->x, msg->y, 0.0)是指子坐标系base_link的坐标原点在父坐标系map坐标下的坐标

4.定义旋转

tf::Quaternion q;//Quaternion是一个类
q.setRPY(0.0, 0.0, laser_scan->angle_min);//setRPY是类Quaternion的一个成员函数
transform.setRotation(q);

需要注意:

 (1)setRPY()函数的参数为小车base_link在map坐标系下的roll(绕x轴),pitch(绕y轴),yaw(绕z轴),

  问题,我们一般用的是2d坐标系,为什么还会有一个绕z轴旋转的角呢?

 5. 将变换广播出去

br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "map", ”base_link“));

其中,

(1)transform:存储变换关系的变量

(2)ros::Time::now():广播tf使用的时间戳

(3)map, 父坐标系的名称

(4) base_link:子坐标系的名称。

备注:sendTransform函数有很多重载

name
### ROS2 中 `tf_transform` 出现 `.nan` 的错误原因及解决方案 在处理ROS2中的TF变换时,`.nan`(Not a Number)通常意味着某些数值计算出现了异常。这可能是由于多种因素引起的。 #### 变换数据不一致或缺失 当调用 `tf_buffer.lookup_transform()` 查找两个坐标系间的变换关系时,如果其中一个或多个坐标系的数据不存在于缓冲区中,则可能导致返回的结果包含未定义值即NaN[^2]。因此,在执行任何转换之前应确保所有必要的坐标系都已经广播并更新到了最新的状态。 #### 时间同步问题 时间戳的不同步也会引发此类情况的发生。例如,请求的时间点超出了缓存窗口范围外或者是未来时刻的数据。为了防止这种情况发生,可以设置合理的等待时间和容差参数来获取最近的有效变换: ```python try: transform = tf_buffer.lookup_transform( target_frame='target', source_frame='source', time=rclpy.time.Time(), timeout=rclpy.duration.Duration(seconds=0.5), rospy_timeout=rclpy.duration.Duration(nanoseconds=int(1e8)) ) except (LookupException, ConnectivityException, ExtrapolationException) as e: get_logger().error(f'Failed to look up transform: {str(e)}') ``` #### 广播频率过低 较低的发布速率可能会使接收端接收到陈旧甚至无效的消息副本,从而造成浮点数溢出为 NaN 。提高帧间传输速度有助于缓解这一现象;另外也可以考虑增加队列长度以减少丢包率。 #### 初始化不当 对于刚启动节点而言,可能因为尚未完成初始化而导致第一次查询得到的是非法数值。可以在程序逻辑里加入适当的延时机制或者循环重试策略直到成功取得有效结果为止。 通过以上措施能够有效地降低乃至消除因上述几种常见情形所造成的 `.nan` 错误。当然还需要结合实际应用场景进一步排查其他潜在隐患。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值