理解ROS2的坐标转换模块tf2
tf2是ROS的核心库之一,它记录了所有坐标系的转换关系,包括动态坐标转换tf,和静态坐标转换tf_static;
首先,介绍tf2库(即,geometry2)编译/调试环境的搭建步骤;然后,介绍部分的类图结构,和调用时序;
1 搭建ROS2的编译环境
参考:http://docs.ros.org/en/iron/Installation/Ubuntu-Install-Debians.html
2 搭建tf2的编译环境
2.1 编译tf2
tf2模块的代码在:https://github.com/ros2/geometry2
下载代码到服务器后,编译步骤如下:
colcon build
# 可以指定要编译的包:colcon build --packages-select tf2
2.2 静态坐标转换的发布节点
uav@uav-mt:/tmp/geometry2$ build/tf2_ros/static_transform_publisher --frame-id "world" --child-frame-id "robot"
2.3 查看静态坐标转换
每次订阅/tf_static 都会收到1次全量的静态tf 关系;
. /tmp/geometry2/install/setup.bash
ros2 topic list
ros2 topic echo /tf_static
3 坐标转换的发布者的类图
3.1 静态坐标转换
在StaticTransformBroadcaster::sendTransform 中,通过判断net_message_ 中是否已经存在入参的tf(根据child_frame_id),决定在net_message_ 中更新或追加该tf;
之后,发布net_message_;
3.2 动态坐标转换
与StaticTransformBroadcaster 相比,TransformBroadcaster 的区别如下,
StaticTransformBroadcaster | TransformBroadcaster | |
---|---|---|
构造函数中的qos 选项 | 无rclcpp::QosPolicyKind::Durability | 有rclcpp::QosPolicyKind::Durability |
发布的topic 名 | /tf_static | /tf |
sendTransform 的实现 | 维护了net_message_(内含tf_static 数组),如果存在与输入的tf 相同child_frame_id 的tf,更新该tf | 直接发布输入的tf |
4 坐标转换的监听器的类图
在TransformListener 的构造函数中,完成对"/tf_static" 和"/tf" 的订阅,注册回调函数subscription_callback;
subscription_callback 通过TimeCacheInterface::insertData 接口,往成员变量frames_ 中,写入静态,或者动态tf;
5 时序图
以运动补偿节点Compensator 为例,如下:
x 参考
x.1 https://zhuanlan.zhihu.com/p/28288871
x.2 http://dev.ros2.fishros.com/doc/Tutorials/Tf2/Learning-About-Tf2-And-Time-Cpp.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)