5.4 坐标变换监听
5.4 坐标变换监听
监听可以实现坐标点在不同坐标系之间的变换,或者不同坐标系之间的变换。当然,前提是必须要广播不同坐标系关系,而至于是静态广播或动态广播则无要求。
5.4.1 坐标系变换案例以及分析
1.案例需求
案例1:在5.3 坐标变换广播中发布了laser相对于base_link和camra相对于base_link的坐标系关系,请求解laser相对于camera的坐标系关系。

案例2:在5.3 坐标变换广播中发布了laser相对于base_link的坐标系关系且发布了laser坐标系下的障碍物的坐标点数据,请求解base_link坐标系下该障碍物的坐标。

2.案例分析
在上述案例中,案例1是多坐标系的场景下实现不同坐标系之间的变换,案例2则是要实现同一坐标点在不同坐标系下的变换,虽然需求不同,但是相关算法都被封装好了,我们只需要调用相关 API 即可。
3.流程简介
两个案例的实现流程类似,主要步骤如下:
编写坐标变换程序实现;
编辑配置文件;
编译;
执行。
案例我们会采用 C++ 和 Python 分别实现,二者都遵循上述实现流程。
4.准备工作
终端下进入工作空间的src目录,调用如下两条命令分别创建C++功能包和Python功能包。
ros2 pkg create cpp04_tf_listener --build-type ament_cmake --dependencies rclcpp tf2 tf2_ros geometry_msgs
ros2 pkg create py04_tf_listener --build-type ament_python --dependencies rclpy tf_transformations tf2_ros geometry_msgs
5.4.2 坐标系变换(C++)
1.坐标系变换实现
功能包 cpp04_tf_listener 的 src 目录下,新建 C++ 文件 demo01_tf_listener.cpp,并编辑文件,输入如下内容:

在创建功能包时,所依赖的功能包已经自动配置了,配置内容如下:

2.CMakeLists.txt
CMakeLists.txt 中发布和订阅程序核心配置如下:

3.编译
终端中进入当前工作空间,编译功能包:

4.执行
当前工作空间下,启动三个终端,终端1输入如下命令发布雷达(laser)相对于底盘(base_link)的静态坐标变换:

5.4.3 坐标系变换(Python)
1.坐标系变换实现
功能包 py04_tf_listener 的 py04_tf_listener 目录下,新建 Python 文件 demo01_tf_listener_py.py,并编辑文件,输入如下内容:

2.编辑配置文件
1.package.xml
在创建功能包时,所依赖的功能包已经自动配置了,配置内容如下:

2.setup.py
entry_points
字段的console_scripts
中添加如下内容:

3.编译
终端中进入当前工作空间,编译功能包:

4.执行
当前工作空间下,启动两个终端,终端1输入如下命令发布雷达(laser)相对于底盘(base_link)的静态坐标变换:

5.4.4 坐标点变换(C++)
1.坐标点变换实现
功能包 cpp04_tf_listener 的 src 目录下,新建 C++ 文件 demo02_message_filter.cpp,并编辑文件,输入如下内容:

在创建功能包时,所依赖的部分功能包已经自动配置了,不过为了实现坐标点变换,还需要添加依赖包tf2_geometry_msgs
和
message_filters
,修改后的配置内容如下:

2.CMakeLists.txt
CMakeLists.txt 文件修改后的内容如下:

3.编译
终端中进入当前工作空间,编译功能包:
colcon build --packages-select cpp04_tf_listener

5.4.5 坐标点变换(Python)
暂无。

B站有完整的ros系列教程视频,可以观看完整内容ros课程ROS2理论与实践
更多内容将在猛狮知识星球社区更新最新课程,后续将推出更多优质内容——详情可关注猛狮集训营公众号和猛狮集训营官方网站。